diff --git a/.gitignore b/.gitignore index 38e0dc58..99f4db88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ +######################################### +# keep version files in and manually update if needed +GIT_SHA +VERSION + ######################################### # Editor temporary/working/backup files # .#* @@ -10,6 +15,7 @@ .project .pydevproject .pdm-python +.python-version /.ropeproject/config.py /.ropeproject/history /.ropeproject/objectdb @@ -19,6 +25,7 @@ /.cache /.idea /.untitled.py +scratch.py # Compiled source # ################### @@ -32,6 +39,7 @@ *.so *.egg .eggs +psychopy/app/locale/**/LC_MESSAGE/messages.mo # Python files # ################ @@ -47,6 +55,7 @@ dist *.egg-info # tox testing tool .tox +.venv # Moves icons from res to component folders /dropoff/dropoff_dark.py /dropoff/dropoff_light.py @@ -67,9 +76,8 @@ nonSVN # Things specific to this project # ################################### -PsyScope* -psychopy1 -psychojs.zip +# pdm.lock will include platform-specific libs so not portable +# pdm.lock psychopy/demos/coder/misc/frame* psychopy/demos/**/data/*.psydat @@ -106,9 +114,14 @@ gource_psychopy.mkv *.hdf5 *.7z +# NSIS temp compilation files # +############################### +uninstallFiles.nsi + # Documentation generated files # ################################# .coverage #nonSphinx /venv*/ +/.venv*/ !psychopy diff --git a/LICENSE b/LICENSE index e6f3e5a2..f288702d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,674 @@ -MIT License - -Copyright (c) 2023 PsychoPy - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index b6dcd2d5..1aac4277 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,44 @@ -# psychopy-lib +# PsychoPy -This repo is a test of deploying just the lib for PsychoPy (without the application) for the sake of runtime environments that may want to run a PsychoPy study without the application. +[![PyPI version](https://img.shields.io/pypi/v/psychopy.svg)](https://pypi.python.org/pypi/PsychoPy) +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v1.4%20adopted-ff69b4.svg)](code-of-conduct.md) -As a result of not bundling the application this no longer depends on wxPython making it easier to install. +--- -This is a work in progress and may not currently be synchronised with the main code in the psychopy repository. +PsychoPy is an open-source package for creating experiments in behavioral science. It aims to provide a single package that is: + +* precise enough for psychophysics +* easy enough for teaching +* flexible enough for everything else +* able to run experiments in a local Python script or online in JavaScript + +To meet these goals PsychoPy provides a choice of interface - you can use a +simple graphical user interface called Builder, or write your experiments in +Python code. The entire application and library are written in Python and is +platform independent. + +There is a range of documentation at: + +* [PsychoPy Homepage](https://www.psychopy.org) +* [Youtube](https://www.youtube.com/playlist?list=PLFB5A1BE51964D587) +* The textbook, [Building Experiments in PsychoPy](https://uk.sagepub.com/en-gb/eur/building-experiments-in-psychopy/book253480) +* [The discourse user forum](https://discourse.psychopy.org) + +## Contributions + +To contribute, please fork the repository, hack in a feature branch, and send a +pull request. For more, see [CONTRIBUTING.md](CONTRIBUTING.md) +and the developers documentation at [https://www.psychopy.org/developers](https://psychopy.org/developers) + +## Code Status + +Dev branch: [![GH tests dev](https://github.com/psychopy/psychopy/actions/workflows/pytests.yaml/badge.svg?branch=dev)](https://github.com/psychopy/psychopy/actions/workflows/pytests.yaml?query=branch%3Adev) [![CodeQL (dev)](https://github.com/psychopy/psychopy/actions/workflows/CodeQL.yaml/badge.svg?branch=dev)](https://github.com/psychopy/psychopy/actions/workflows/CodeQL.yaml?query=branch%3Adev) + +Release branch: [![GH tests release](https://github.com/psychopy/psychopy/actions/workflows/pytests.yaml/badge.svg?branch=release)](https://github.com/psychopy/psychopy/actions/workflows/pytests.yaml?query=branch%3Arelease) [![CodeQL (release)](https://github.com/psychopy/psychopy/actions/workflows/CodeQL.yaml/badge.svg?branch=release)](https://github.com/psychopy/psychopy/actions/workflows/CodeQL.yaml?query=branch%3Arelease) + +## More information + +* Homepage: https://www.psychopy.org +* Forum: https://discourse.psychopy.org +* Issue tracker: https://github.com/psychopy/psychopy/issues +* Changelog: https://www.psychopy.org/changelog.html diff --git a/installPsychoPy.py b/installPsychoPy.py deleted file mode 100644 index 1eeee7ed..00000000 --- a/installPsychoPy.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Part of the PsychoPy library -# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. -# Distributed under the terms of the MIT License. -""" -Python script to install psychopy including dependencies - -NB: At present, for windows and MacOS you may as well just use `pip install psychopy` but -in the future we may add some additional functionality here, like adding application -shortcuts, checking/recommending virtual envs etc. -""" - -# Author: Jonathan Peirce, based on work of Flavio Bastos and Florian Osmani - -import os -import pathlib -import platform -import subprocess -import sys - -_linux_installer = None # will be apt-get or yum depending on system - -print( - "This `install_psychopy.py` script is EXPERIMENTAL and may not work!" - " PsychoPy users have many different systems and it's hard to maintain them all. " - " Let us know how you get on!\n" -) -if sys.version_info[:2] != (3,10): - print( - "PsychoPy is designed for Python 3.10.x " - f"You are running Python {sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}. " - "PsychoPy may not work and may not even install!\n" - ) - -print( - "This `install_psychopy.py` script is EXPERIMENTAL and may not work!" - " PsychoPy users have many different systems and it's hard to maintain them all. " - " Let us know how you get on!\n" -) - -def pip_install(*packages): - """Install packages using pip.""" - print('Installing packages:', packages) - subprocess.run([sys.executable, '-m', 'pip', 'install', '--upgrade'] + list(packages)) - -def check_venv(): - """Check if this is a virtual environment. If not, recommend quitting and creating one. - """ - # If this is not a venv then recommend quitting to create one - if not hasattr(sys, 'real_prefix'): - print( - 'You should install PsychoPy in a virtual environment,' - ' to avoid conflicts with other packages, or damaging your system.' - ' To create a virtual environment in the current directory, run:') - print(' python3 -m venv .') - print('Then activate the virtual environment with:') - print(' source bin/activate') - print('Then run this script again.') - response = input('Shall we QUIT now? [y]/n: ') - if response.lower() != 'n': - sys.exit(1) - -def apt_install(*packages): - """Install packages using apt, yum, or similar""" - global _linux_installer - # check if using this system has apt-get or yum - if _linux_installer is None: - for installer in ['apt', 'yum', 'dnf', 'zypper', 'apt-cyg']: - out = subprocess.run(['which', installer], stdout=subprocess.PIPE) - if out.returncode == 0: - _linux_installer = installer - break - if _linux_installer is None: - print('On Linux systems, this script requires either apt-get or yum.') - sys.exit(1) - - def find_package(package): - # check pacakage name according to apt/yum - packages_lookup = { - 'python3-dev': {'apt':'python3.' + str(sys.version_info[1]) + '-dev', 'yum':'gtk3-devel'}, - 'libgtk-3-dev': {'apt':'libgtk-3-dev', 'yum':'gtk3-devel'}, - 'libwebkit2gtk-4.0-dev': {'apt':'libwebkit2gtk-4.*-dev', 'yum':'webkit2gtk3-devel'}, - 'libxcb-xinerama0': {'apt':'libxcb-xinerama0', 'yum':'libxcb-xinerama'}, - 'libegl1-mesa-dev': {'apt':'libegl1-mesa-dev', 'yum':'mesa-libEGL-devel'}, - } - if package in packages_lookup: - if _linux_installer in packages_lookup[package]: - return packages_lookup[package][_linux_installer] - else: - return packages_lookup[package]['yum'] # default to yum for dnf, zypper, apt-cyg - else: - return package - packages = [find_package(p) for p in packages] - - print('Installing packages (will require sudo):', packages) - subprocess.run(['sudo', _linux_installer, 'update']) - subprocess.run(['sudo', _linux_installer, 'install', '-y'] + list(packages)) - -if __name__ == "__main__": - # Check/install builds requirements - if platform.system() == 'Linux': - # Install system dependencies - apt_install( - 'python3-dev', # need dev in case of compiling C extensions - 'libgtk-3-dev', 'libwebkit2gtk-4.0-dev', # for wxPython - 'libxcb-xinerama0', 'libegl1-mesa-dev', # for OpenGL needs - 'git', # for push/pull to Pavlovia - ) - pip_install('-U', 'pip', 'setuptools', 'attrdict') - print("Next we build wxPython (from source) which takes the longest time." - " The rest of the installation will automatically continue after and be" - " much faster.") - pip_install('wxPython') - - # Install PsychoPy using pip - pip_install('psychopy') - - print("\nPsychoPy has been installed (or at least attempted). You can now try run it by typing:") - print(" psychopy") - print("or:") - print(" python -m psychopy.app.psychopyApp") - print("You may need to activate the virtual environment first though.") diff --git a/pdm_build.py b/pdm_build.py deleted file mode 100644 index affbd15e..00000000 --- a/pdm_build.py +++ /dev/null @@ -1,32 +0,0 @@ -import polib -import pathlib - -root = pathlib.Path(__file__).absolute().parent / 'psychopy/app/locale' - -def compilePoFiles(root=root, errIfEmpty=True): - """Looks for all paths matching **/*.po and compiles to a .mo file using - python polib - - :param: root - """ - po_files = list(pathlib.Path(root).glob('**/*.po')) - - for popath in po_files: - mopath = popath.with_suffix(".mo") - po = polib.pofile(popath) - po.save_as_mofile(mopath) - if len(po_files)<1: - if root.exists(): - raise FileNotFoundError( - f"Found no po files to compile to mo. Was this the right folder to search? \n" - f" {root}" - ) - else: - # if app folder doesn't exist, there's nothing to translate - print("No .po files to compile as this is a library-only installation.") - else: - print(f"compiled {len(po_files)} .po files to .mo in {root.absolute()}") - return len(po_files) - -if __name__ in ("__main__", "_local"): - n_files = compilePoFiles(root) diff --git a/psychopy/VERSION b/psychopy/VERSION index 4df38dcc..58e202cf 100644 --- a/psychopy/VERSION +++ b/psychopy/VERSION @@ -1 +1 @@ -2026.1.0 +2026.2.2 diff --git a/psychopy/alerts/alertsCatalogue/4215.yaml b/psychopy/alerts/alertsCatalogue/4215.yaml new file mode 100644 index 00000000..7676dd5c --- /dev/null +++ b/psychopy/alerts/alertsCatalogue/4215.yaml @@ -0,0 +1,19 @@ + +code: 4215 +cat: Coding +msg: quitPsychoJS needs to be returned + +# The following are typically used for online help pages, and support reStructured Text. +label: quitPsychoJS needs to be returned + +synopsis: | + The `quitPsychoJS` function needs to be preceeded by `return`, otherwise data will not be saved + +details: | + In PsychoJS, each part of your experiment is inside of a function, and the values returned by these functions tell PsychoJS how to proceed once each one is done. Calling `quitPsychoJS` will end your experiment, but if the function you're in doesn't return anything then PsychoJS doesn't know to save your data. + +solutions: | + Instead of calling `quitPsychoJS()`, you need to call `return quitPsychoJS()`. + +versions: | + All versions. \ No newline at end of file diff --git a/psychopy/alerts/alertsCatalogue/alertCategories.yaml b/psychopy/alerts/alertsCatalogue/alertCategories.yaml index be84c7aa..03fdfc36 100644 --- a/psychopy/alerts/alertsCatalogue/alertCategories.yaml +++ b/psychopy/alerts/alertsCatalogue/alertCategories.yaml @@ -54,6 +54,7 @@ cat: Code component syntax 4205: Python syntax error 4210: JavaScript syntax error + 4215: quitPsychoJS needs to be returned 4300: cat: Components 4305: Component disabled diff --git a/psychopy/alerts/alerttools.py b/psychopy/alerts/alerttools.py index e05844fd..0e873ecf 100644 --- a/psychopy/alerts/alerttools.py +++ b/psychopy/alerts/alerttools.py @@ -1,4 +1,5 @@ import ast +import re from numpy import array from esprima import parseScript @@ -314,9 +315,17 @@ def checkJavaScriptSyntax(component, tab): tab: str The name of the code component tab being tested """ + content = str(component.params[tab].val) + # check that value is valid syntax try: - parseScript(str(component.params[tab].val)) + parseScript(content) except Exception as err: strFields = {'codeTab': tab, 'lineNumber': err.message} # Dont sent traceback because strFields gives better localisation of error alert(4210, component, strFields) + # if quitPsychoJS is called, make sure it's returned + if re.match( + r"(? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/psychopy/demos/builder/Design Templates/dualWindow/readme.md b/psychopy/demos/builder/Design Templates/dualWindow/readme.md new file mode 100644 index 00000000..70cc01fa --- /dev/null +++ b/psychopy/demos/builder/Design Templates/dualWindow/readme.md @@ -0,0 +1,62 @@ +# PsychoPy Demo: Dual-Window Experiment Setup + +This demo shows how to run a PsychoPy experiment with **two separate windows**: + +- **Participant window** – the main experiment display. +- **Experimenter window** – a monitoring display showing trial progress and accuracy. + +This is useful when an experimenter needs to observe performance without interrupting the participant's task. + +The task used in the demo is a Stroop task, but you can adapt the demo as needed to be used in any task! + +--- + +## How it works + +At the start of the task, PsychoPy creates two windows. +The experimenter window updates in real time with: + +- Current progress +- Accuracy (overall performance) + +The participant window functions as a standard stimulus display. + +--- + +## Screen assignment + +By default: + +| Window | Screen index | Behaviour | +|----------------------|--------------|-----------| +| Experimenter window | `screen=0` | Uses the same screen where PsychoPy is running. | +| Participant window | `screen=1` | Uses the next available screen (if connected). | + +> If only **one screen** is available, both windows will appear on that screen. + +--- + +## Full-screen behaviour + +The participant window is **not fullscreen by default** (useful while testing locally). + +To enable fullscreen: + +1. Open **Experiment Settings** +2. Go to the **Screen** tab +3. Tick **Full-screen window** + +--- + +## Online compatibility + +> **Note:** This demo works **locally only**. + +--- + +## Requirements + +- Local desktop / laptop (not browser) +- Optional: second display for separate experimenter/participant screens + +--- \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/BART/README.md b/psychopy/demos/builder/Experiments/BART/README.md index 289a2a4b..941cb447 100644 --- a/psychopy/demos/builder/Experiments/BART/README.md +++ b/psychopy/demos/builder/Experiments/BART/README.md @@ -1,17 +1,30 @@ -# Balloon Analogue Risk Task (BART) - -## The experiment: - -This is a simplified (and prettified) version of the BART task by Lejuez et al (2002). Participants have to blow up a balloon that they know will burst at some point. They 'earn' rewards for getting the balloons to be larger, but increase the risk of bursting it, in which case they earn no reward for that balloon. The question is, how many times does someone pump each balloon trying to optimise their rewards. +Balloon Analogue Risk Task (BART) +------------------------------------------------------------------ + +Task description +----------------- + +This is a simplified (and prettified) version of the BART task by +Lejuez et al (2002). Participants have to blow up a balloon that they know +will burst at some point. They 'earn' rewards for getting the balloons to be +larger, but increase the risk of bursting it, in which case they earn no +reward for that balloon. The question is, how many times does someone pump +each balloon trying to optimise their rewards. The measure is designed to quantify individual differences in risk-taking. -## Analysing your data: +Analysing your data +--------------------- -You should filter out data where the balloon burst and measure the number of pumps made for the remaining trials. +You should filter out data where the balloon burst and measure the number of +pumps made for the remaining trials. -## Notes: +Notes: + +This could be extended to be more similar to the original paper by adding +further colours of balloons with different bursting profiles. -> **WARNING**: This is an advanced demo involving lots of code components +References +------------ -This can be extended to be more similar to the original paper by adding further colours of balloons with different bursting profiles. +Lejuez CW, Read JP, Kahler CW, Richards JB, Ramsey SE, Stuart GL, Strong DR, Brown RA. Evaluation of a behavioral measure of risk taking: the Balloon Analogue Risk Task (BART). J Exp Psychol Appl. 2002 Jun;8(2):75-84. doi: 10.1037//1076-898x.8.2.75. PMID: 12075692. \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/adaptiveDecisionMaking/README.md b/psychopy/demos/builder/Experiments/adaptiveDecisionMaking/README.md deleted file mode 100644 index 4b77dd96..00000000 --- a/psychopy/demos/builder/Experiments/adaptiveDecisionMaking/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# DARC Toolbox Demo: Decision making experiments using Bayesian Adaptive Design - -This is a demo PsychoPy experiment. When you run the experiment you will get a few GUI menu options. Here you can pick the type of experiment: -- delayed choice, also known as inter-temporal choice -- risky choice -- both delayed and risky choice - -You will also get to choose which cognitive model you want to estimate the parameters for in your experiment. The choice of options here will depend upon the kind of experiment you are running. - -## The experiment: -Participants get an information screen. In each trial they will choose between two prospects. These consist of a reward, a delay, and a probability of occurring. Participants choose using the left or right keys. - -The clever thing about the experiment is that the (reward, delay, probability) attributes for each prospect is chosen in real time, using Bayesian Adaptive Design. This will mean each trial will reduce our uncertainty in the model parameters quicker than other approaches. - -If you use this experiment, or adapt it, please cite our pre-print (full paper forthcoming): - -> Vincent, B. T., & Rainforth, T. (2017, October 20). The DARC Toolbox: automated, flexible, and efficient delayed and risky choice experiments using Bayesian adaptive design. https://doi.org/10.31234/osf.io/yehjb \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/adaptiveHyperbolicDiscounting/README.md b/psychopy/demos/builder/Experiments/adaptiveHyperbolicDiscounting/README.md deleted file mode 100644 index 94b6910b..00000000 --- a/psychopy/demos/builder/Experiments/adaptiveHyperbolicDiscounting/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Hyperbolic discounting experiment, using Bayesian Adaptive Design - -We use Bayesian Adaptive Design to run a highly efficient experiment in order to get a very precise measure of the parameters of a hyperbolic discounting model. - -## The experiment: - -Participants get an information screen. In each trial they will choose between two prospects. These consist of a reward, a delay, and a probability of occurring. Participants choose using the left or right keys. - -If you use this experiment, or adapt it, please cite our pre-print (full paper forthcoming): - -> Vincent, B. T., & Rainforth, T. (2017, October 20). The DARC Toolbox: automated, flexible, and efficient delayed and risky choice experiments using Bayesian adaptive design. https://doi.org/10.31234/osf.io/yehjb \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/adaptiveRiskyChoice/README.md b/psychopy/demos/builder/Experiments/adaptiveRiskyChoice/README.md deleted file mode 100644 index c6226d7d..00000000 --- a/psychopy/demos/builder/Experiments/adaptiveRiskyChoice/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Risky choice experiment, using Bayesian Adaptive Design - -We use Bayesian Adaptive Design to run a highly efficient experiment in order to get a very precise measure of the parameters of the Linear In Log Odds probability weighting function. - -## The experiment: -Participants get an information screen. In each trial they will choose between two prospects. These consist of a reward, a delay, and a probability of occurring. Participants choose using the left or right keys. - -If you use this experiment, or adapt it, please cite our pre-print (full paper forthcoming): - -> Vincent, B. T., & Rainforth, T. (2017, October 20). The DARC Toolbox: automated, flexible, and efficient delayed and risky choice experiments using Bayesian adaptive design. https://doi.org/10.31234/osf.io/yehjb \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/dragAndDrop/README.md b/psychopy/demos/builder/Experiments/dragAndDrop/README.md index c92e9309..f0312ebd 100644 --- a/psychopy/demos/builder/Experiments/dragAndDrop/README.md +++ b/psychopy/demos/builder/Experiments/dragAndDrop/README.md @@ -1,30 +1,5 @@ -# Drag and drop demonstration +Drag and Drop Demo +================== +The demonstration uses the `draggable` attribute of all Components in the "Stimuli" category to create a drag and drop puzzle game. The game will save the position of each shape for easy comparison after the fact. -This task shows you the drag and drop capabilities of PsychoPy and PsychoJS. The demonstration uses a drag and drop puzzle game. - -The task requires you to drag and drop the black and white pieces into the empty square in order to match the puzzle presented above the empty square. When you have finished, press the "Continue" button to see whether or not you were correct, and how long the trial took. - -To generate more designs, you can run the `shapeMaker.psyexp` task from Builder. When you run the `shapeMaker` task, you will be asked for a number of rows. You can choose either 2 or 3 rows for 4 or 9 piece shapes, respectively. Each shape consists of a grid in the following orders: - -### For 4 piece shapes -``` -| 1 | 2 | -| 3 | 4 | -``` - -### For 9 piece shapes -``` -| 1 | 2 | 3 | -| 4 | 5 | 6 | -| 7 | 8 | 9 | -``` - -The answers for each new shape need to be added the the conditions file, where columns -a1 to a9 relate to the shape grid locations as described above. e.g. `a1` relates to space 1 -in the grid. So, for an all white shape created using 2 rows (so a 4 piece shape), -you would enter "white.png" in columns a1 to a4 in the conditions file, -and leave the rest of the cells for that row blank. - -You can run this task from Pavlovia by going to: - -https://run.pavlovia.org/demos/draganddrop/html/ \ No newline at end of file +To change the answers to this game, see the `make_shapes` experiment in the `stimuli` folder. **Top Tip:** Press ALT + SHIFT + R from Builder to open the folder containing the current experiment. \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/mentalRotation/README.md b/psychopy/demos/builder/Experiments/mentalRotation/README.md index ee8e7577..8ce80a21 100644 --- a/psychopy/demos/builder/Experiments/mentalRotation/README.md +++ b/psychopy/demos/builder/Experiments/mentalRotation/README.md @@ -1,4 +1,5 @@ -# Mental Rotation +Mental Rotation +------------------ Letter version of a classic cognitive task. Works well in individual subjects, and group settings; classroom-tested 2013. @@ -10,9 +11,13 @@ result is a peak-shape graph of RT as a function of rotation angle. Illustrates saving data into a temporary file, parsing it at the end of the run (using pandas), display results in a plot (using `matplotlib`). -> Authors: Jeremy R. Gray & Nathaniel R. Pasmanter -> Copyright (c) 2013 MICHIGAN STATE UNIVERSITY BOARD OF TRUSTEES -> All rights reserved. -> Released under a licence quite compatible with GPL. See "license" (it's in a routine). +Attributions +--------------- +This Demo was contributed to the PsychoPy application by: -> Updated by Rebecca J. Hirst 15.06.2021 +Authors: Jeremy R. Gray & Nathaniel R. Pasmanter +Copyright (c) 2013 MICHIGAN STATE UNIVERSITY BOARD OF TRUSTEES +All rights reserved. +Released under a licence quite compatible with GPL. See "license" (it's in a routine). + +Updated by Rebecca J. Hirst 13.12.2023 diff --git a/psychopy/demos/builder/Experiments/sternberg/README.md b/psychopy/demos/builder/Experiments/sternberg/README.md index a6492ba5..ce51b619 100644 --- a/psychopy/demos/builder/Experiments/sternberg/README.md +++ b/psychopy/demos/builder/Experiments/sternberg/README.md @@ -1,12 +1,14 @@ -# Sternberg (1968) - serial/parallel search of short-term memory -## The experiment: +Sternberg Working Memory Task +---------------------------------------------------------------- -In this task subjects must report whether or not a given target was present in a previous set of items. The set of values varies in length and the target can occur at any position in the set (or not at all). If participants search their memory of the set in a 'serial' fashion then their average response time will increase with increasing set size. If memory can be searched in a 'parallel' fashion then RT will be independent of set size. -## Analysing your data: +This task is adapted from the memory tasks described by Sternberg (1969). In this task participants must report whether or not a given target was present in a previous set of items. The set of values varies in length and the target can occur at any position in the set (or not at all). If participants search their memory of the set in a 'serial' fashion then their average response time will increase with increasing set size. If memory can be searched in a 'parallel' fashion then RT will be independent of set size. -In the Excel file, in the data/folder after running the experiment, sort the data by set size. Take the RT (the column `resp.rt_mean`) for all the rows with a given set size and calculate the mean. Compare these means for different set sizes. You could also break the data down by trials where the target was actually present or actually absent to investigate whether the search was 'self-terminating'. +Analysing your data: +----------------------- +In the Excel file, in the data/folder after running the experiment, sort the data by set size. Take the RT (the column `resp.rt`) for all the rows with a given set size and calculate the mean. Compare these means for different set sizes. You could also break the data down by trials where the target was actually present or actually absent to investigate whether the search was 'self-terminating'. -## Notes: +References +------------- -This study provides a slightly more rich temporal setup; multiple objects must be manipulated and presented at different times on each trial and with a precise time. \ No newline at end of file +STERNBERG, S. (1969). MEMORY-SCANNING: MENTAL PROCESSES REVEALED BY REACTION-TIME EXPERIMENTS. American Scientist, 57(4), 421–457. http://www.jstor.org/stable/27828738 \ No newline at end of file diff --git a/psychopy/demos/builder/Experiments/stroopVoice/README.md b/psychopy/demos/builder/Experiments/stroopVoice/README.md index d94fa86b..259973c6 100644 --- a/psychopy/demos/builder/Experiments/stroopVoice/README.md +++ b/psychopy/demos/builder/Experiments/stroopVoice/README.md @@ -5,6 +5,23 @@ In this task subjects must speak the letters spelling each word, ignoring the word that they spell! -Note that PsychoPy can use various different "backends" to achieve the transcription. -Locally you can use the engine that is built-in (called Sphinx CMU) but online you -need either Google or Microsoft and, for that, you need a key from those sites. +Note that PsychoPy can use various different engines ()"backends") to achieve the transcription. Locally you can use the psychopy-whisper but online you need either Google or Microsoft and, for that, you need an "API key" from those sites. + +To use Whisper locally you will need the `psychopy-whisper` plugin which can be installed from + >Tools>Plugin/packages manager... + +## How is (local Whisper) transcription achieved? + +Whisper is built on the OpenAI large language model (LLM) using the same technology that brought you ChatGPT. This is NOT sending any information to OpenAI/ChatGPT, however, and does not require any subscription or user account. In fact after the first operation, where the language model is downloaded, you won't even need a network connection to run the transcription. + +In the micResp/Transcription settings of the demo, you'll see an option to select the transcription engine (Google is another option which has the advantage that it can be used online but requires a username/API key). When Whisper is seleced as the transcription engine, there is also a setting to choose which language model to use. There are several sized models (large models give more accuracy but are slower and we've found the small mdels to be very good) and the option to use and English-only model (with .en in the name) whereas the standard models are multi-lingual. + +## When does transcription occur and how long does it take? + +If the Mic is set to perform transcription then it will be performed during the end of the current Routine, and it could take several seconds during which the experiment won't progress, so do bear that in mind when designing your study. + +The transcription time depends on the duration of the speech in the response, the size of the model selected, and on the computer that you use. 10 seconds of speaking may take 5-10 seconds to transcribe on the small model on a decent PC. + +If you have a powerful nVidia graphics card then you may be able to install the CUDA libraries and, if these are available, then psychopy-whisper will make use of the graphics card and the transcription will run much faster. + +See https://github.com/guillaumekln/faster-whisper for more details about the underlying lib that PsychoPy is using (called `faster-whisper`) diff --git a/psychopy/demos/builder/Experiments/stroopEEG_EGI/README.md b/psychopy/demos/builder/Hardware/EGI_netstation/README.md similarity index 100% rename from psychopy/demos/builder/Experiments/stroopEEG_EGI/README.md rename to psychopy/demos/builder/Hardware/EGI_netstation/README.md diff --git a/psychopy/demos/builder/Feature Demos/pump/README.md b/psychopy/demos/builder/Hardware/pump/README.md similarity index 93% rename from psychopy/demos/builder/Feature Demos/pump/README.md rename to psychopy/demos/builder/Hardware/pump/README.md index 620880c1..d906c5fd 100644 --- a/psychopy/demos/builder/Feature Demos/pump/README.md +++ b/psychopy/demos/builder/Hardware/pump/README.md @@ -1,5 +1,7 @@ # Syringe Pump Operation: "Bubble Cycle" +**Note: From version 2023s, you would need to first install the plugin Qmix Syringe Pump Support.** + These routines will guide the user through the process of filling a set of Cetoni neMESYS syringe pumps and the removal of air bubbles. For instructions how to set up the syringe pump system, please refer to the procedure works as follows: diff --git a/psychopy/demos/builder/Tools/clockFace/README.md b/psychopy/demos/builder/Helper Tools/clockFace/README.md similarity index 100% rename from psychopy/demos/builder/Tools/clockFace/README.md rename to psychopy/demos/builder/Helper Tools/clockFace/README.md diff --git a/psychopy/demos/builder/Understanding PsychoPy/colors/README.md b/psychopy/demos/builder/Helper Tools/colors/README.md similarity index 100% rename from psychopy/demos/builder/Understanding PsychoPy/colors/README.md rename to psychopy/demos/builder/Helper Tools/colors/README.md diff --git a/psychopy/demos/builder/Tools/drawPolygon/README.md b/psychopy/demos/builder/Helper Tools/drawPolygon/README.md similarity index 100% rename from psychopy/demos/builder/Tools/drawPolygon/README.md rename to psychopy/demos/builder/Helper Tools/drawPolygon/README.md diff --git a/psychopy/demos/builder/Understanding PsychoPy/keyNameFinder/README.md b/psychopy/demos/builder/Helper Tools/keyNameFinder/README.md similarity index 100% rename from psychopy/demos/builder/Understanding PsychoPy/keyNameFinder/README.md rename to psychopy/demos/builder/Helper Tools/keyNameFinder/README.md diff --git a/psychopy/demos/builder/Understanding PsychoPy/spatialUnits/README.md b/psychopy/demos/builder/Helper Tools/spatialUnits/README.md similarity index 100% rename from psychopy/demos/builder/Understanding PsychoPy/spatialUnits/README.md rename to psychopy/demos/builder/Helper Tools/spatialUnits/README.md diff --git a/psychopy/demos/builder/Tools/progressBar/README.md b/psychopy/demos/builder/Tools/progressBar/README.md deleted file mode 100644 index 5d2d8214..00000000 --- a/psychopy/demos/builder/Tools/progressBar/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Progress Bar - -This demo contains an easily reusable progress bar, which shows how far the participant has got through the current loop. Please feel free to copy this to your own experiments! - -## How it works - -The important parts are the Variable component `progress` and the Polygon component `progBar`. Each repeat, the variable `progress` is set to equal the current trial number divided by the number of trials - in other words, how far the participant has gotten, as a decimal. The width the `progBar` is set to the value `progress` each repeat, so it grows as trials progress. `progBar`'s x position also changes to be half of this value, meaning that the bar is essentially anchored by its left side. \ No newline at end of file diff --git a/psychopy/demos/coder/__init__.py b/psychopy/demos/coder/__init__.py index e69de29b..65ff4f3c 100644 --- a/psychopy/demos/coder/__init__.py +++ b/psychopy/demos/coder/__init__.py @@ -0,0 +1,96 @@ +from pathlib import Path + + +__all__ = [ + "assetsFolder", + "PluginDemos", + "scanFolder", + "listDemos", +] + + +# reference to assets folder (importable from demos) +assetsFolder = Path(__file__).parent / "_assets" + + +class PluginDemos: + """ + Use this class in a plugin to add demos to PsychoPy: + - Create a subclass of PluginDemos in your plugin + - Overload the `demos` attribute with a dict of demos added by your plugin, like the output + of `listDemos` + - Overload the `label` attribute with a label for the subheading your demos will be displayed + under (e.g. the name of your plugin) + - Create an entry point connecting your subclass of PluginDemos to "psychopy.demos.coder" + + The easiest way to make sure your `demos` attribute is formatted properly is to import + `psychopy.demos.coder:scanFolder` and use that on the folder with your demos in. + """ + label = None + demos = {} + + def __init_subclass__(cls): + # if subclass doesn't have a label, use its name + if cls.label is None: + cls.label = cls.__name__ + # add demos + PluginDemos.demos[cls.label] = cls.demos + + +def scanFolder(folder): + """ + Scan a given folder recursively for Coder demos + + Parameters + ---------- + folder : str or Path + Folder to look in + + Returns + ------- + dict[str: str or dict] + Dict of demo files against their file paths; demo categories (i.e. folders) will be a dict of the demos within against the folder name + """ + # path-ise folder + folder = Path(folder) + # start with blank output + output = {} + # iterate through entries in this folder + for file in folder.iterdir(): + # ignore files starting with _ (__init__, __pycache__, etc.) + if file.stem.startswith("_"): + continue + # if looking at a category, recur + if file.is_dir(): + output[file.stem] = scanFolder(file) + continue + # skip non-Python files + if file.suffix != ".py": + continue + # add Python scripts + output[file.stem] = str(file.absolute()) + # remove empty entries + output = {key: val for key, val in output.items() if len(val)} + + return output + + +def listDemos(): + """ + List all coder demos + + Returns + ------- + dict[str: str or dict] + Dict of demo files against their file paths; demo categories (i.e. folders) will be a dict of the demos within against the folder name + """ + # get demos from the demos folder + demos = scanFolder( + Path(__file__).parent + ) + # get demos from plugins + demos.update( + PluginDemos.demos + ) + + return demos diff --git a/psychopy/demos/coder/_assets/NotoSansSymbols2.ttf b/psychopy/demos/coder/_assets/NotoSansSymbols2.ttf new file mode 100644 index 00000000..78162689 Binary files /dev/null and b/psychopy/demos/coder/_assets/NotoSansSymbols2.ttf differ diff --git a/psychopy/demos/coder/basic/hello_world.py b/psychopy/demos/coder/basic/hello_world.py index 6ba57555..88ab9693 100644 --- a/psychopy/demos/coder/basic/hello_world.py +++ b/psychopy/demos/coder/basic/hello_world.py @@ -1,37 +1,42 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ -Demo: show a very basic program: hello world +Show a very basic program: hello world. + +The contents of this file are in the public domain. """ -# Import key parts of the PsychoPy library: +# import key parts of the PsychoPy library: from psychopy import visual, core -# Create a visual window: -win = visual.Window(units="height") +# create a visual window: +win = visual.Window( + size=[800, 800], + units="height" +) -# Create (but not yet display) some text: +# create (but not yet display) some text: msg1 = visual.TextBox2(win, - text=u"Hello world!", - font="Open Sans", letterHeight=0.1, - pos=(0, 0.2)) + text="Hello world!", + letterHeight=0.08, + # position this one slightly above the middle of the screen + pos=(0, 0.2) +) msg2 = visual.TextBox2(win, - text=u"\u00A1Hola mundo!", - font="Open Sans", letterHeight=0.1, - pos=(0, -0.2)) + text="¡Hola mundo!", + letterHeight=0.08, + # position this one slightly below the middle of the screen + pos=(0, -0.2) +) -# Draw the text to the hidden visual buffer: +# draw the text to the hidden visual buffer: msg1.draw() msg2.draw() -# Show the hidden buffer--everything that has been drawn since the last win.flip(): +# show the hidden buffer - everything that has been drawn since the last win.flip(): win.flip() -# Wait 3 seconds so people can see the message, then exit gracefully: +# wait 3 seconds so people can see the message core.wait(3) +# exit gracefully win.close() core.quit() - -# The contents of this file are in the public domain. diff --git a/psychopy/demos/coder/experiment control/TrialHandler.py b/psychopy/demos/coder/experiment control/TrialHandler.py index 4fb5c200..1a1a7432 100644 --- a/psychopy/demos/coder/experiment control/TrialHandler.py +++ b/psychopy/demos/coder/experiment control/TrialHandler.py @@ -1,64 +1,72 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ -Demo of TrialHandler +Shows how to use a TrialHandler object to manage running a trials loop in an experiment. The contents of this file are in the public domain. - """ -from random import random -from psychopy import data +from psychopy import data, logging +from numpy import random + +# set logging level to "EXP" so we can see updates as each trial rolls past +logging.console.setLevel(logging.EXP) -# create your list of stimuli -# NB as of version 1.62 you could simply import an excel spreadsheet with this -# using data.importConditions('someFile.xlsx') -stimList = [] +# create your list of stimuli; if you prefer, you could also create a spreadsheet file and load +# it with data.importConditions +conditions = [] for ori in range(90, 180, 30): for sf in [0.5, 1.0, 2.0]: - # append a python 'dictionary' to the list - stimList.append({'sf': sf, 'ori': ori}) - -# organize them with the trial handler -trials = data.TrialHandler(stimList, 10, - extraInfo={'participant': "Nobody", 'session':'001'}) - -# run the experiment -nDone = 0 -for thisTrial in trials: # handler can act like a for loop - # simulate some data - thisReactionTime = random() + float(thisTrial['sf']) / 2.0 - thisChoice = round(random()) - trials.data.add('RT', thisReactionTime) # add the data to our set - trials.data.add('choice', thisChoice) - nDone += 1 # just for a quick reference - - msg = 'trial %i had position %s in the list (sf=%.1f)' - print(msg % (nDone, trials.thisIndex, thisTrial['sf'])) - -# After the experiment, print a new line -print('\n') - -# Write summary data to screen -trials.printAsText(stimOut=['sf', 'ori'], - dataOut=['RT_mean', 'RT_std', 'choice_raw']) - -# Write summary data to a text file ... -trials.saveAsText(fileName='testData', - stimOut=['sf', 'ori'], - dataOut=['RT_mean', 'RT_std', 'choice_raw']) + # each condition is a dict; this functions like a row of a spreadsheet with headers + conditions.append({ + 'sf': sf, + 'ori': ori + }) -# ... or an xlsx file (which supports sheets) -trials.saveAsExcel(fileName='testData', - sheetName='rawData', - stimOut=['sf', 'ori'], - dataOut=['RT_mean', 'RT_std', 'choice_raw']) +# create a TrialHandler object from these conditions +trials = data.TrialHandler( + # our list of conditions from above + trialList=conditions, + # this tells the trial handler to run through the full list of conditions 10 times + # we have 9 conditions, so this means 90 trials + nReps=10, + # these keys will be added to each row of the data file + extraInfo={ + 'participant': "Nobody", + 'session':'001' + } +) -# Save a copy of the whole TrialHandler object, which can be reloaded later to -# re-create the experiment. -trials.saveAsPickle(fileName='testData') +# use a `for` loop to run the trials... +for thisTrial in trials: + # let's add some data (and pretend it came from a participant...) + trials.data.add( + "RT", random.random() + float(thisTrial['sf']) / 2.0 + ) + trials.data.add( + "choice", str(random.choice(["right", "right"])) + ) + # flush the log so we can see the trial + logging.flush() -# Wide format is useful for analysis with R or SPSS. -df = trials.saveAsWideText('testDataWide.txt') +# save data to a CSV file +trials.saveAsText( + fileName="TrialHandler_demo.csv", + stimOut=["sf", "ori"], + dataOut=["RT_mean", "RT_std", "choice_raw"] +) +# save data to an Excel file +trials.saveAsExcel( + fileName="TrialHandler_demo.xlsx", + sheetName="rawData", + stimOut=["sf", "ori"], + dataOut=["RT_mean", "RT_std", "choice_raw"] +) +# save a copy of the whole TrialHandler object, which can be reloaded later to re-create the +# experiment +trials.saveAsPickle( + fileName="trialHandler_demo" +) +# wide text format is useful for analysis in R, SPSS, Jasp, etc. +df = trials.saveAsWideText( + fileName="trialHandler_demo.csv" +) diff --git a/psychopy/demos/coder/experiment control/TrialHandler2.py b/psychopy/demos/coder/experiment control/TrialHandler2.py index bb13f8d0..bb1bcdc4 100644 --- a/psychopy/demos/coder/experiment control/TrialHandler2.py +++ b/psychopy/demos/coder/experiment control/TrialHandler2.py @@ -1,42 +1,67 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ -Demo of TrialHandler +Shows how to use a TrialHandler2 object to manage running a trials loop in an experiment. + +TrialHandler2 is similar to TrialHandler, but with more advanced experiment control features and +capability to calculate upcoming trials on-the-fly. + +The contents of this file are in the public domain. """ -from random import random from psychopy import data +from numpy import random -# create your list of stimuli -# NB as of version 1.62 you could simply import an excel spreadsheet with this -# using data.importConditions('someFile.xlsx') -stimList = [] +# create your list of stimuli; if you prefer, you could also create a spreadsheet file and load +# it with data.importConditions +conditions = [] for ori in range(90, 180, 30): for sf in [0.5, 1.0, 2.0]: - # append a python 'dictionary' to the list - stimList.append({'sf':sf, 'ori':ori}) - -# organize them with the trial handler -trials = data.TrialHandler2(stimList, 10, - extraInfo= {'participant':"Nobody", 'session':'001'}) - -# run the experiment -nDone = 0 -for thisTrial in trials: # handler can act like a for loop - # simulate some data - thisReactionTime = random() + float(thisTrial['sf']) / 2.0 - thisChoice = round(random()) - trials.addData('RT', thisReactionTime) # add the data to our set - trials.addData('choice', thisChoice) - nDone += 1 # just for a quick reference + # each condition is a dict; this functions like a row of a spreadsheet with headers + conditions.append({ + 'sf': sf, + 'ori': ori + }) - msg = 'trial %i had position %s in the list (sf=%.1f)' - print(msg % (nDone, trials.thisIndex, thisTrial['sf'])) +# create a TrialHandler object from these conditions +trials = data.TrialHandler2( + # our list of conditions from above + trialList=conditions, + # this tells the trial handler to run through the full list of conditions 10 times + # we have 9 conditions, so this means 90 trials + nReps=10, + # these keys will be added to each row of the data file + extraInfo={ + 'participant': "Nobody", + 'session':'001' + } +) -# after the experiment -print('\n') -trials.saveAsPickle(fileName = 'testData') # this saves a copy of the whole object -df = trials.saveAsWideText("testDataWide.csv") # wide is useful for analysis with R or SPSS. Also returns dataframe df +# use a `for` loop to run the trials... +for thisTrial in trials: + # TrialHandler2 lets us skip and rewind trials, so let's show what happens if we skip ahead 5 trials at trial 20... + if thisTrial.thisN == 20: + trials.skipTrials(5) + print( + f"Skipped trials {thisTrial.thisN}-{thisTrial.thisN + 4}" + ) + continue + # let's add some data (and pretend it came from a participant...) + trials.addData( + "RT", random.random() + float(thisTrial['sf']) / 2.0 + ) + trials.addData( + "choice", str(random.choice(["right", "right"])) + ) + # print information on this trial + print( + f"Trial {thisTrial.thisN} is number {thisTrial.thisTrialN} in the list, on repeat {thisTrial.thisRepN} (sf={thisTrial.data['sf']}, ori={thisTrial.data['ori']})" + ) -# The contents of this file are in the public domain. +# save a copy of the whole TrialHandler2 object, which can be reloaded later to re-create the +# experiment +trials.saveAsPickle( + fileName="trialHandler2_demo" +) +# wide text format is useful for analysis in R, SPSS, Jasp, etc. +df = trials.saveAsWideText( + fileName="trialHandler2_demo.csv" +) \ No newline at end of file diff --git a/psychopy/demos/coder/experiment control/autoDraw_autoLog.py b/psychopy/demos/coder/experiment control/autoDraw_autoLog.py index b87892fe..3f797620 100644 --- a/psychopy/demos/coder/experiment control/autoDraw_autoLog.py +++ b/psychopy/demos/coder/experiment control/autoDraw_autoLog.py @@ -1,50 +1,76 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ One easy way to handle stimuli that are drawn repeatedly is to setAutoDraw(True) for that stimulus. It will continue to be drawn until stim.setAutoDraw(False) is called. By default a logging message of level EXP will be created when the setAutoDraw is called. -This can be turned off for each call with stim.setAutoDraw(True, autoLog=False) +This can be turned off for each call with stim.setAutoDraw(True, autoLog=False). + +The contents of this file are in the public domain. """ from psychopy import visual, core -win = visual.Window([800, 800]) +# create a window +win = visual.Window( + size=[800, 800], + units="height" +) -# a stim's name is used in log entries -stim1 = visual.GratingStim(win, pos=[-0.5, -0.5], name='stim1') -stim2 = visual.TextStim(win, pos=[0.5, 0.5], text='stim2', name='textStim') +# create some stimuli +stim1 = visual.GratingStim( + win, + pos=[-0.25, 0], + size=[0.3, 0.3], + name='stim1' +) +stim2 = visual.TextBox2( + win, + "Stim 2", + pos=[0.25, 0], + size=[0.3, 0.3], + name='textStim' +) -# no need to log the fixation point info, use autoLog=False -fixation = visual.GratingStim(win, mask='gauss', tex=None, size=0.02, - name='fixation', autoLog=False) +# create a fixation point +fixation = visual.GratingStim( + win, + mask='gauss', + tex=None, + size=0.02, + name='fixation', + # we don't need to log info about the fixation point, so use autoLog=False + autoLog=False +) +# set everything to autodraw fixation.setAutoDraw(True) stim1.setAutoDraw(True) stim2.setAutoDraw(True) -# both on -for frameN in range(20): # run 20 frames like this +# run 20 frames like this +for frameN in range(20): win.flip() +# only draw stim1 and the fixation point stim2.setAutoDraw(False) -# will draw only stim1 (and fixation) -for frameN in range(20): # run 20 frames like this +# run 20 frames like this +for frameN in range(20): win.flip() +# only draw stim2 and the fixation point stim1.setAutoDraw(False) stim2.setAutoDraw(True) -# will draw only stim2 (and fixation) -for frameN in range(20): # run 20 frames like this +# run 20 frames like this +for frameN in range(20): win.flip() -for stim in [stim1, stim2, fixation]: - stim.setAutoDraw(False) -win.flip() # will cause the 'off' log messages to be sent +# set everything to not autodraw +fixation.setAutoDraw(False) +stim1.setAutoDraw(False) +stim2.setAutoDraw(False) +# the first flip with autodraw off for a stimulus will cause the 'off' log messages to be sent +win.flip() +# exit win.close() -core.quit() - -# The contents of this file are in the public domain. +core.quit() \ No newline at end of file diff --git a/psychopy/demos/coder/experiment control/experimentHandler.py b/psychopy/demos/coder/experiment control/experimentHandler.py index ba8d3a1c..210ee57d 100644 --- a/psychopy/demos/coder/experiment control/experimentHandler.py +++ b/psychopy/demos/coder/experiment control/experimentHandler.py @@ -1,57 +1,87 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ -Demo of class data.ExperimentHandler +Shows how to use an ExperimentHandler object to manage running an experiment. + +The contents of this file are in the public domain. """ from psychopy import data, logging from numpy import random logging.console.setLevel(logging.DEBUG) -exp = data.ExperimentHandler(name='testExp', - version='0.1', - extraInfo={'participant':'jwp', 'ori':45}, - runtimeInfo=None, - originPath=None, - savePickle=True, - saveWideText=True, - dataFileName='testExp') - -# a first loop (like training?) -conds = data.createFactorialTrialList( - {'faceExpression':['happy', 'sad'], 'presTime':[0.2, 0.3]}) -training = data.TrialHandler(trialList=conds, nReps=3, name='train', - method='random', - seed=100) # this will set the global seed - for the whole exp +# create an object which manages the whole experiment +exp = data.ExperimentHandler( + name="testExp", + version="0.1", + extraInfo={ + 'participant': "jwp", + 'ori': 45 + }, + runtimeInfo=None, + originPath=None, + savePickle=True, + saveWideText=True, + dataFileName="testExp" +) + +# this is an easy way to make conditions with every combination of multiple factors +# if you prefer, you could also create a spreadsheet file and load it with data.importConditions +conds = data.createFactorialTrialList({ + 'faceExpression': ['happy', 'sad'], + 'presTime': [0.2, 0.3] +}) + +# create our first loop - a training step +training = data.TrialHandler( + trialList=conds, + nReps=3, + name='train', + method='random', + # beware: this sets the global seed for all random functions + seed=100 +) exp.addLoop(training) -# run those trials + +# run those trials... for trial in training: + # let's add some data (and pretend it came from a participant...) training.addData('training.rt', random.random() * 0.5 + 0.5) if random.random() > 0.5: training.addData('training.key', 'left') else: training.addData('training.key', 'right') + # this tells the ExperimentHandler to move on to the next row in your output data exp.nextEntry() -# then run 3 repeats of a staircase -outerLoop = data.TrialHandler(trialList=[], nReps=3, name='stairBlock', - method='random') +# this loop handles repeating the blocks inside it +outerLoop = data.TrialHandler( + trialList=[], + nReps=3, + name='stairBlock', + method='random' +) exp.addLoop(outerLoop) -for thisRep in outerLoop: # the outer loop doesn't save any data - staircase = data.StairHandler(startVal=10, name='staircase', nTrials=5) +# run the outer loop... +for thisRep in outerLoop: + # each repetition, create a staircase + staircase = data.StairHandler( + startVal=10, + name='staircase', + nTrials=5 + ) exp.addLoop(staircase) + # run the staircase... for thisTrial in staircase: - id=random.random() + # create a random id for this trial + id = random.random() + exp.addData('id', id) + # more "participant data" if random.random() > 0.5: staircase.addData(1) else: staircase.addData(0) - exp.addData('id', id) + # next row exp.nextEntry() + +# now that the experiment is finished, show the results for e in exp.entries: print(e) -print("Done. 'exp' experimentHandler will now (end of script) save data to testExp.csv") -print(" and also to testExp.psydat, which is a pickled version of `exp`") - -# The contents of this file are in the public domain. diff --git a/psychopy/demos/coder/experiment control/logFiles.py b/psychopy/demos/coder/experiment control/logFiles.py index 6dcb55c0..5715ee74 100644 --- a/psychopy/demos/coder/experiment control/logFiles.py +++ b/psychopy/demos/coder/experiment control/logFiles.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- """ PsychoPy's log module is mostly a simple wrapper of the python logging module. @@ -17,17 +15,26 @@ 20: INFO 10: DEBUG So setting to DEBUG level will include all possible messages, setting to ERROR will include only the absolutely essential messages. + +The contents of this file are in the public domain. """ from psychopy import logging, core, visual -globalClock = core.Clock() # if this isn't provided the log times will reflect secs since python started +# if this isn't provided the log times will reflect secs since python started +globalClock = core.Clock() logging.setDefaultClock(globalClock) -logging.console.setLevel(logging.DEBUG) # receive nearly all messages -logDat = logging.LogFile('logLastRun.log', - filemode='w', # if you set this to 'a' it will append instead of overwriting - level=logging.WARNING) # errors, data and warnings will be sent to this logfile +# set console to receive nearly all messages +logging.console.setLevel(logging.DEBUG) +# create a log file object +logDat = logging.LogFile( + 'logLastRun.log', + # if you set this to 'a' it will append instead of overwriting + filemode='w', + # errors, data and warnings will be sent to this logfile + level=logging.WARNING +) # the following will go to any files with the appropriate minimum level set logging.info('Something fairly unimportant') @@ -36,7 +43,7 @@ logging.error("You might have done something that PsychoPy can't handle! But hopefully this gives you some idea what.") # some things should be logged timestamped on the next video frame -# For instance the time of a stimulus appearing is related to the flip: +# for instance the time of a stimulus appearing is related to the flip: win = visual.Window([400, 400]) for n in range(5): win.logOnFlip('frame %i occured' %n, level=logging.EXP) @@ -51,5 +58,3 @@ win.close() core.quit() - -# The contents of this file are in the public domain. diff --git a/psychopy/demos/coder/experiment control/piloting.py b/psychopy/demos/coder/experiment control/piloting.py index 33f53855..a6acc61a 100644 --- a/psychopy/demos/coder/experiment control/piloting.py +++ b/psychopy/demos/coder/experiment control/piloting.py @@ -6,6 +6,8 @@ See below for some examples of behaviour you may wish to change according to piloting mode. + +The contents of this file are in the public domain. """ from psychopy import core, visual, logging diff --git a/psychopy/demos/coder/experiment control/runtimeInfo.py b/psychopy/demos/coder/experiment control/runtimeInfo.py index aabf5c58..d1a6ed8d 100644 --- a/psychopy/demos/coder/experiment control/runtimeInfo.py +++ b/psychopy/demos/coder/experiment control/runtimeInfo.py @@ -1,77 +1,132 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - """ -Demo of some ways to use class psychopy.info.RunTimeInfo() -to obtain current system and other data at run-time. +Demo of some ways to use class psychopy.info.RunTimeInfo() to obtain current system and other +data at run-time. + +The contents of this file are in the public domain. """ from psychopy import visual, logging, core import psychopy.info -# author and version are used in the demo, in the way you might in your experiment. -# They are expected to be at the top of the script that calls RunTimeInfo()), -# with a string literal assigned to them (no variables). -# double-quotes will be silently removed, single quotes will be left, eg, O'Connor +# author and version are used in the demo, in the way you might in your experiment. They are +# expected to be at the top of the script that calls RunTimeInfo()), with a string literal +# assigned to them (no variables). Double-quotes will be silently removed, single quotes will be +# left, eg, O'Connor __author__ = """Jeremy "R." Gray""" __version__ = "v1.0.a" -# When creating an experiment, first define your window (& monitor): -win = visual.Window(fullscr=False, size=[200, 200], monitor='testMonitor') -win.recordFrameIntervals = True -logging.console.setLevel(logging.DEBUG) - -# Then gather run-time info. All parameters are optional: -runInfo = psychopy.info.RunTimeInfo( - # if you specify author and version here, it overrides the automatic detection of __author__ and __version__ in your script - # author=' < your name goes here, plus whatever you like, e.g., your lab or contact info > ', - # version="2025.2.0", - win=win, # # a psychopy.visual.Window() instance; None = default temp window used; False = no win, no win.flips() - refreshTest='grating', # # None, True, or 'grating' (eye-candy to avoid a blank screen) - verbose=True, # # True means report on everything - userProcsDetailed=True, # # if verbose and userProcsDetailed, return (command, process-ID) of the user's processes - ) -win.close() +# create your window (& monitor), same as any other experiment +win = visual.Window( + fullscr=False, + size=[200, 200], + monitor='testMonitor' +) -print(""" -System and other run-time details are now saved in "runInfo", a dict-like object. You have to decide -what to do with it. +# you may not want to run hardware tests with a participant sat there, so let's limit it to only +# run in pilot mode +PILOTING = core.setPilotModeFromArgs() -"print(runInfo)" will give you the same as "print(str(runInfo))". This format is intended to be useful -for writing to a data file in a human readable form:""") -print(runInfo) +if PILOTING: + # tell the window to record the time between frames + win.recordFrameIntervals = True + # log as much to the console as possible + logging.console.setLevel(logging.DEBUG) + # gather some runtime info! (all parameters are optional) + runInfo = psychopy.info.RunTimeInfo( + # setting author and version here overrides __author__ and __version__ from earlier + author="Jeremy R. Gray", + version="2025.2.0", + # a psychopy.visual.Window() instance; None = default temp window used; False = no win, no + # win.flips() + win=win, + # None, True, or 'grating' (eye-candy to avoid a blank screen) + refreshTest='grating', + # True means report on everything + verbose=True, + # if verbose and userProcsDetailed, return (command, process-ID) of the user's processes + userProcsDetailed=True, + ) + # print the runtime info - check your console for this output + print( + """ +System and other run-time details are now saved in "runInfo", a dict-like object. You have +to decide what to do with it. -print("If that's more detail than you want, try: runInfo = info.RunTimeInfo(..., verbose=False, ...).") +"print(runInfo)" will give you the same as "print(str(runInfo))". This format is intended +to be useful for writing to a data file in a human readable form: + """ + ) + print(runInfo) + print( + """ +If that's more detail than you want, try: + runInfo = info.RunTimeInfo(..., verbose=False, ...) -# To get the same info in python syntax, use "print(repr(info))". -# You could write this format into a data file, and it's fairly readable. -# And because its python syntax you could later simply -# import your data file into python to reconstruct the dict. - -print("\nYou can extract single items from info, using keys, e.g.:") -print(" psychopyVersion = %s" % runInfo['psychopyVersion']) -if "windowRefreshTimeAvg_ms" in runInfo: - print("or from the test of the screen refresh rate:") - print(" %.2f ms = average refresh time" % runInfo["windowRefreshTimeAvg_ms"]) - print(" %.3f ms = standard deviation" % runInfo["windowRefreshTimeSD_ms"]) - - # Once you have run-time info, you can fine-tune things with the values, prior to running your experiment. - refreshSDwarningLevel_ms = 0.20 # ms - if runInfo["windowRefreshTimeSD_ms"] > refreshSDwarningLevel_ms: - print("\nThe variability of the refresh rate is sort of high (SD > %.2f ms)." % (refreshSDwarningLevel_ms)) - # and here you could prompt the user with suggestions, possibly based on other info: +To get the same info in python syntax, use "print(repr(info))". You could write this format +into a data file, and it's fairly readable. Because its python syntax, you could later +simply import your data file into python to reconstruct the dict. + """ + ) + # you can also use Python string formatting to show the info in whatever format you prefer + print( + """ +You can extract single items from info, using keys, e.g.: + psychopyVersion = %(psychopyVersion)s + """ % runInfo + ) + if "windowRefreshTimeAvg_ms" in runInfo: + print( + """ +...or from the test of the screen refresh rate: + average refresh time = %(windowRefreshTimeAvg_ms).2f ms + standard deviation = %(windowRefreshTimeSD_ms).3f ms + """ % runInfo + ) + # once you have run-time info, you can fine-tune things with the values, prior to + # running your experiment. + refreshSDwarningLevel_ms = 0.20 # ms + if runInfo["windowRefreshTimeSD_ms"] > refreshSDwarningLevel_ms: + print( + """ +The variability of the refresh rate is sort of high (SD > %.2f ms). + """ % refreshSDwarningLevel_ms + ) + # and here you could prompt the user with suggestions, possibly based on other info if runInfo["windowIsFullScr"]: - print("Your window is full-screen, which is good for timing.") - print('Possible issues: internet / wireless? bluetooth? recent startup (not finished)?') - if len(runInfo['systemUserProcFlagged']): - print('other programs running? (command, process-ID):' + str(runInfo['systemUserProcFlagged'])) + print( + """ +Your window is full-screen, which is good for timing. + """ + ) + else: - print("""Try defining the window as full-screen (it's not currently), i.e. at the top of the demo change to: - win = visual.Window((800, 600), fullscr=True, ... -and re-run the demo.""") + print( + """ +Try defining the window as full-screen (it's not currently), i.e. at the top of the demo change to: + win = visual.Window((800, 600), fullscr=True, ...) +and re-run the demo. + """ + ) + print( + """ +Possible issues: +- Internet/wireless? +- Bluetooth? +- Recent startup (not finished)? + """ + ) + if len(runInfo['systemUserProcFlagged']): + print( + """ +- Other programs running? (command, process-ID): %(systemUserProcFlagged)s + """ % runInfo + ) -print(""" -(NB: The visual is not the demo! Scroll up to see the text output.)""") + print( + """ +(NB: The visual is not the demo! Scroll up to see the text output.) + """ + ) win.close() core.quit() diff --git a/psychopy/demos/coder/experiment control/stairHandler.py b/psychopy/demos/coder/experiment control/stairHandler.py new file mode 100644 index 00000000..6e020673 --- /dev/null +++ b/psychopy/demos/coder/experiment control/stairHandler.py @@ -0,0 +1,53 @@ +""" +Shows how to use a StairHandler object to manage running a staircase loop in an experiment. + +The contents of this file are in the public domain. +""" + +from psychopy import data +from numpy import random + +staircase = data.StairHandler( + # value to start the staircase at + startVal=10, + # the number of "incorrect" responses before the staircase increases + nUp=1, + # the number of "correct" responses before the staircase decreases + nDown=1, + # how to step up and down; "lin" (linear) for a simple addition/subtraction, "log" to + # increase/decrease in log units + stepType="lin", + # how much to increase/decrease by - as this is a list, it will start with the first value and move on each reversal + stepSizes=[8, 4, 2, 1], + # minimum number of trials; the staircase can't finish until at least this many trials have run + nTrials=5, + # the smallest and largest values allowed; it cannot increase/decrease beyond these + minVal=0, + maxVal=90 +) + +# use a `for` loop to run the staircase... +for value in staircase: + # define a correct answer - in your actual experiment, this is up to you + corr = str(random.choice(["left", "right"])) + staircase.addData("corr", corr) + # pretent we got a response from the participant... + resp = str(random.choice(["left", "right"])) + staircase.addData("resp", resp) + # store correct (1) or incorrect (0) for this trial + staircase.addResponse(resp == corr) + # print whether the participant was correct, and how this changed the value + print( + f"Correct: {resp == corr}, increment: {value}" + ) + +# save a copy of the whole StairHandler object, which can be reloaded later to re-create the +# experiment +df = staircase.saveAsPickle( + fileName="stairHandler_demo" +) +# save data as a CSV file +df = staircase.saveAsText( + fileName="stairHandler_demo.csv" +) + diff --git a/psychopy/demos/coder/experiment control/fMRI_launchScan.py b/psychopy/demos/coder/hardware/fMRI_launchScan.py similarity index 100% rename from psychopy/demos/coder/experiment control/fMRI_launchScan.py rename to psychopy/demos/coder/hardware/fMRI_launchScan.py diff --git a/psychopy/demos/coder/experiment control/gammaMotionAnalysis.py b/psychopy/demos/coder/hardware/gammaMotionAnalysis.py similarity index 100% rename from psychopy/demos/coder/experiment control/gammaMotionAnalysis.py rename to psychopy/demos/coder/hardware/gammaMotionAnalysis.py diff --git a/psychopy/demos/coder/experiment control/gammaMotionNull.py b/psychopy/demos/coder/hardware/gammaMotionNull.py similarity index 100% rename from psychopy/demos/coder/experiment control/gammaMotionNull.py rename to psychopy/demos/coder/hardware/gammaMotionNull.py diff --git a/psychopy/demos/coder/input/GUI.py b/psychopy/demos/coder/input/GUI.py index f9a37f57..625a1511 100644 --- a/psychopy/demos/coder/input/GUI.py +++ b/psychopy/demos/coder/input/GUI.py @@ -2,51 +2,74 @@ # -*- coding: utf-8 -*- """ -Demo to illustrate Dialog (Dlg) classes and usage. +Shows how to use the psychopy.gui to present the users with a dialog box to get info from them. + +The contents of this file are in the public domain. """ from psychopy import gui # Fetch default gui handler (qt if available) from psychopy import __version__ # Get the PsychoPy version currently in use +from numpy import random ## You can explicitly choose one of the qt/wx backends like this: ## from psychopy.gui import wxgui as gui ## from psychopy.gui import qtgui as gui -# Specify fields for dlg as a dict -info = {'Observer':'jwp', - 'Condition':['A', 'B'], +# specify fields for dlg as a dict +info = { + # strings and numbers will show as an editable text field + 'Observer': "jwp", 'Grating Orientation': 45, - 'PsychoPy Version': __version__, - 'Debug Mode': True} -# Use this dict to create the dlg -infoDlg = gui.DlgFromDict(dictionary=info, - title='TestExperiment', - order=['PsychoPy Version', 'Observer'], - tip={'Observer': 'trained visual observer, initials'}, - fixed=['PsychoPy Version']) # This attribute can't be changed by the user -# Script will now wait for the dlg to close... - -if infoDlg.OK: # This will be True if user hit OK... + # lists will show as a dropdown of choices + 'Condition': ["A", "B"], + # using a | symbol in the field name lets you tell PsychoPy that the field is... + # ...required (|req) + 'Session ID|req': "", + # ...fixed, so the user can't change the value + 'PsychoPy Version|fix': __version__, + # ...a configuration parameter, to be hidden behind a "read more" tag (|cgf) + 'Debug Mode|cfg': True, + # ...or hidden from the user entirely (|hid) + 'uid|hid': random.randint(0, 100000) +} + +# create a dialog from the dict +infoDlg = gui.DlgFromDict( + dictionary=info, + # this sets a title in the dialog's sash + title="Test experiment", + # this dict sets tooltips which are displayed on hover + tip={ + 'Observer': "Trained visual observer, initials" + } +) + +# this will be True if the user clicked OK and False if they clicked Cancel +if infoDlg.OK: print(info) -else: # ...or False, if they hit Cancel +else: print('User Cancelled') -## You could also use a gui.Dlg and you manually extract the data, this approach gives more + +## you could also use a gui.Dlg and you manually extract the data, this approach gives more ## control, eg, text color. -# Create dlg -dlg = gui.Dlg(title="My experiment", pos=(200, 400)) -# Add each field manually -dlg.addText('Subject Info', color='Blue') -dlg.addField('Name:', tip='or subject code') + +# create dlg +dlg = gui.Dlg( + title="Test experiment", + pos=(200, 400) +) +# add each field manually +dlg.addText('Subject Info', color="Blue") +dlg.addField('Name:', tip="or subject code") dlg.addField('Age:', 21) -dlg.addText('Experiment Info', color='Blue') +dlg.addText('Experiment Info', color="Blue") dlg.addField('', 45) -# Call show() to show the dlg and wait for it to close (this was automatic with DlgFromDict +# call show() to show the dlg and wait for it to close (this was automatic with DlgFromDict) thisInfo = dlg.show() -if dlg.OK: # This will be True if user hit OK... +# this will be True if the user clicked OK and False if they clicked Cancel +if dlg.OK: print(thisInfo) else: - print('User cancelled') # ...or False, if they hit Cancel - -## The contents of this file are in the public domain. + print('User cancelled') diff --git a/psychopy/demos/coder/input/customMouse.py b/psychopy/demos/coder/input/customMouse.py index 4f8ea99f..ae38baaf 100644 --- a/psychopy/demos/coder/input/customMouse.py +++ b/psychopy/demos/coder/input/customMouse.py @@ -4,48 +4,56 @@ """ Demo of CustomMouse(), showing movement limits, click detected upon release, and ability to change the pointer. + +The contents of this file are in the public domain. """ -# authors Jeremy Gray & Todd Parsons -from psychopy import visual, event +from psychopy import core, visual, event +from psychopy.demos.coder import assetsFolder -# Create window -win = visual.Window(units="height") +# create window +win = visual.Window( + units="height" +) +# hide the default mouse +win.mouseVisible = False +# setup an experiment clock +clock = core.Clock() +# create a mouse object +mouse = event.Mouse() +# put some instructions on screen +instr = visual.TextBox2( + win, + text=( + "I, the wizard of PsychoPy, have transformed your mouse into a horse!\n" + "\n" + "Click to exit." + ), + alignment="center", + autoDraw=True +) +# this is the object to use for your pointer, it can be anything with a pos/size +# (so basically any visual stimulus) +pointer = visual.TextBox2( + win, + # let's use unicode and a custom font to draw a little horsey for our mouse marker... + text="♞", + font="Noto Sans Symbols 2", + letterHeight=0.1, + # use a center anchor and center alignment, so that the text is on the same point as .pos + alignment="center", + anchor="center", + # the mouse will use the same units as the window, so make sure the pointer uses these units too + units="height", + autoDraw=True +) +pointer.fontMGR.addFontFile( + assetsFolder / "NotoSansSymbols2.ttf" +) -# Create a virtual mouse -vm = visual.CustomMouse(win, - leftLimit=-0.2, topLimit=0, rightLimit=0.2, bottomLimit=-0.4, - showLimitBox=True, clickOnUp=True) -# Textbox for instructions -instr = visual.TextBox2(win, - text="Move the mouse around. Click to give the mouse more room to move.", - font="Open Sans", letterHeight=0.08, - pos=(0, .3)) -# Create a character to use as mouse -new_pointer = visual.TextStim(win, - text=u'\u265e', - font="Gothic A1") -print("[getPos] [getWheelRel] click time") -# Listen for clicks -while not event.getKeys(): - # Draw components - instr.draw() - vm.draw() +# start the frame loop (run until user clicks) +while not any(mouse.getPressed()): + # set the pointer object to have the same position as the mouse + pointer.pos = mouse.getPos() + # draw and flip win.flip() - # Check for clicks - if vm.getClicks(): - vm.resetClicks() - # Print click details - print("click at [%.2f, %.2f]" % (vm.getPos()[0], vm.getPos()[1])) - print(vm.getWheelRel()) - print("%.3f sec"%vm.mouseMoveTime()) - # can set some limits, others are unchanged: - vm.setLimit(leftLimit=-0.5, topLimit=0.1, rightLimit=0.5, bottomLimit=-0.4,) - instr.text = "Room to gallop! Press any key to quit." - - # can switch the pointer to anything with a .draw() and setPos() method - vm.pointer = new_pointer - -win.close() - -# The contents of this file are in the public domain. diff --git a/psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py b/psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py index 9f2d0969..5e425ff9 100644 --- a/psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +++ b/psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py @@ -84,10 +84,10 @@ def getMilliKeyDevices(): mkconf = json.loads(rx_data) mkconf['port'] = p devices.append(mkconf) - except: + except (ValueError, TypeError): raise RuntimeError("ERROR: {}".format(rx_data)) mkey_sport.close() - except: + except Exception: pass return devices diff --git a/psychopy/demos/coder/understanding psychopy/colors.py b/psychopy/demos/coder/understanding psychopy/colors.py index 358e83d0..4c3f73f4 100644 --- a/psychopy/demos/coder/understanding psychopy/colors.py +++ b/psychopy/demos/coder/understanding psychopy/colors.py @@ -55,7 +55,7 @@ # Get color space from radio slider space = spaces[int(spaceCtrl.markerPos)] col = colors.Color(val, space) - except: + except Exception: col = False # Set the color box's fill color, show text "invalid" if color is invalid if col: diff --git a/psychopy/event.py b/psychopy/event.py index 11093e3b..1fa9246e 100644 --- a/psychopy/event.py +++ b/psychopy/event.py @@ -602,6 +602,8 @@ def __init__(self, self.setVisible(visible) if newPos is not None: self.setPos(newPos) + # this is set by Builder code + self.prevButtonState = [0, 0, 0] @property def units(self): diff --git a/psychopy/experiment/_experiment.py b/psychopy/experiment/_experiment.py index 39a1d2f3..2cb75994 100644 --- a/psychopy/experiment/_experiment.py +++ b/psychopy/experiment/_experiment.py @@ -236,7 +236,11 @@ def legacyFilename(self): @property def runMode(self): - return int(self.settings.params['runMode'].val) + # handle string + if isinstance(self.settings.params['runMode'].val, str): + return self.settings.params['runMode'].val not in ("0", "False", "false") + + return bool(self.settings.params['runMode']) @runMode.setter def runMode(self, value): @@ -564,7 +568,7 @@ def saveToXML(self, filename, makeLegacy=True): with codecs.open(str(filename), 'wb', encoding='utf-8-sig') as f: f.write(pretty) # if useVersion is less than current version, create a sanitized legacy variant - if self.settings.params['Use version'].val and makeLegacy: + if self.settings.params['Use version'].val not in (None, "", "latest") and makeLegacy: # create sanitized legacy experiment object legacy = self.sanitizeForVersion(self.settings.params['Use version'].val) # construct a legacy variant of the filename diff --git a/psychopy/experiment/components/__init__.py b/psychopy/experiment/components/__init__.py index a93c5896..5da0e58d 100644 --- a/psychopy/experiment/components/__init__.py +++ b/psychopy/experiment/components/__init__.py @@ -39,7 +39,7 @@ if not os.path.isfile(filename[:-2]): try: os.remove(filename) - except: + except OSError: pass # may not have sufficient privs diff --git a/psychopy/experiment/components/_base.py b/psychopy/experiment/components/_base.py index bac4e1a7..49483cac 100644 --- a/psychopy/experiment/components/_base.py +++ b/psychopy/experiment/components/_base.py @@ -142,7 +142,7 @@ def getTemplateJSON(cls): # try to load SVG try: iconSVG = cls.iconSVG.read_text("utf-8") - except: + except (OSError, AttributeError): iconSVG = None # include basic info profile = { @@ -164,6 +164,8 @@ def getTemplateJSON(cls): # make an object for defaults exp = Experiment() defaults = cls(exp, "") + # store help link + profile['helpLink'] = getattr(defaults, 'url', None) # order params order = [ name for name in defaults.order if name in defaults.params @@ -491,6 +493,7 @@ def writeStartTestCode(self, buff, extra=""): # queue validation code = ( "# tell attached validator (%(name)s) to start looking for a start flag\n" + "%(name)s.sensor.clearResponses()\n" "%(name)s.status = STARTED\n" ) buff.writeIndentedLines(code % validator.params) diff --git a/psychopy/experiment/components/aperture/ApertureComponent.svg b/psychopy/experiment/components/aperture/ApertureComponent.svg index 51b012cb..ae4eb824 100644 --- a/psychopy/experiment/components/aperture/ApertureComponent.svg +++ b/psychopy/experiment/components/aperture/ApertureComponent.svg @@ -21,7 +21,7 @@ - + diff --git a/psychopy/experiment/components/brush/BrushComponent.svg b/psychopy/experiment/components/brush/BrushComponent.svg index d048ac28..18c32610 100644 --- a/psychopy/experiment/components/brush/BrushComponent.svg +++ b/psychopy/experiment/components/brush/BrushComponent.svg @@ -9,7 +9,7 @@ - + diff --git a/psychopy/experiment/components/button/ButtonComponent.svg b/psychopy/experiment/components/button/ButtonComponent.svg index cb8bbfb9..7405b6ca 100644 --- a/psychopy/experiment/components/button/ButtonComponent.svg +++ b/psychopy/experiment/components/button/ButtonComponent.svg @@ -17,7 +17,7 @@ - + diff --git a/psychopy/experiment/components/buttonBox/ButtonBoxComponent.svg b/psychopy/experiment/components/buttonBox/ButtonBoxComponent.svg index 26420378..86df5f01 100644 --- a/psychopy/experiment/components/buttonBox/ButtonBoxComponent.svg +++ b/psychopy/experiment/components/buttonBox/ButtonBoxComponent.svg @@ -7,16 +7,16 @@ - + - + - + - + diff --git a/psychopy/experiment/components/buttonBox/__init__.py b/psychopy/experiment/components/buttonBox/__init__.py index 1cc060e0..b6105342 100644 --- a/psychopy/experiment/components/buttonBox/__init__.py +++ b/psychopy/experiment/components/buttonBox/__init__.py @@ -147,22 +147,11 @@ def writeInitCode(self, buff): buff.writeIndentedLines(code % inits) def writeRoutineStartCode(self, buff): - # choose a clock to sync to according to component's params - if "syncScreenRefresh" in self.params and self.params['syncScreenRefresh']: - clockStr = "" - else: - clockStr = "clock=routineTimer" - # sync component start/stop timers with validator clocks - code = ( - f"# synchronise device clock for %(name)s with Routine timer\n" - f"%(name)s.resetTimer({clockStr})\n" - ) - buff.writeIndentedLines(code % self.params) # clear keys code = ( "# clear %(name)s button presses\n" "%(name)s.buttons = []\n" - "%(name)s.times = []\n" + "%(name)s.rt = []\n" "%(name)s.corr = []\n" ) buff.writeIndentedLines(code % self.params) @@ -177,6 +166,17 @@ def writeFrameCode(self, buff): # writes an if statement to determine whether to draw etc indented = self.writeStartTestCode(buff) if indented: + # sync component start/stop timers with validator clocks + if self.params['syncScreenRefresh']: + code = ( + "win.callOnFlip(%(name)s.resetTimer, core.Clock())" + ) % self.params + else: + code = ( + "%(name)s.resetTimer(core.Clock())" + ) + buff.writeIndentedLines(code % self.params) + if self.params['discardPrevious']: # dispatch and clear messages code = ( @@ -202,7 +202,7 @@ def writeFrameCode(self, buff): # if storing all, append code += ( " %(name)s.buttons.append(_thisResp.channel)\n" - " %(name)s.times.append(_thisResp.t)\n" + " %(name)s.rt.append(_thisResp.t)\n" ) # include code to get correct if self.params['storeCorrect']: @@ -216,7 +216,7 @@ def writeFrameCode(self, buff): # if storing last, replace code += ( " %(name)s.buttons = _thisResp.channel\n" - " %(name)s.times = _thisResp.t\n" + " %(name)s.rt = _thisResp.t\n" ) # include code to get correct if self.params['storeCorrect']: @@ -231,7 +231,7 @@ def writeFrameCode(self, buff): code += ( " if not %(name)s.buttons:\n" " %(name)s.buttons = _thisResp.channel\n" - " %(name)s.times = _thisResp.t\n" + " %(name)s.rt = _thisResp.t\n" ) # include code to get correct if self.params['storeCorrect']: @@ -271,7 +271,7 @@ def writeRoutineEndCode(self, buff): code = ( "# store data from %(name)s\n" "thisExp.addData('%(name)s.buttons', %(name)s.buttons)\n" - "thisExp.addData('%(name)s.times', %(name)s.times)\n" + "thisExp.addData('%(name)s.rt', %(name)s.times)\n" "thisExp.addData('%(name)s.corr', %(name)s.corr)\n" ) buff.writeIndentedLines(code % params) diff --git a/psychopy/experiment/components/camera/CameraComponent.svg b/psychopy/experiment/components/camera/CameraComponent.svg index c1da4e64..93e26e07 100644 --- a/psychopy/experiment/components/camera/CameraComponent.svg +++ b/psychopy/experiment/components/camera/CameraComponent.svg @@ -8,10 +8,10 @@ - + - + diff --git a/psychopy/experiment/components/camera/__init__.py b/psychopy/experiment/components/camera/__init__.py index 4c12142e..3aaec4f5 100644 --- a/psychopy/experiment/components/camera/__init__.py +++ b/psychopy/experiment/components/camera/__init__.py @@ -321,16 +321,6 @@ def writeDeviceCode(self, buff): buff.writeIndentedLines(code % self.params) def getParams(self): - from psychopy.hardware.camera import CameraDevice - - # get supported resolutions and framerates - resolutions = set() - frameRates = set() - for profile in CameraDevice.getAvailableDevices(best=False): - if profile['deviceName'] == self.profile['deviceName']: - resolutions.add(profile['frameSize']) - frameRates.add(profile['frameRate']) - order = [ 'frameSize', 'frameRate', @@ -338,8 +328,8 @@ def getParams(self): params = {} self.params['frameSize'] = Param( - "", valType='list', inputType="choice", - allowedVals=[""] + list(sorted(resolutions)), allowedLabels=["Default"] + list(sorted(resolutions)), + None, valType='list', inputType="choice", + allowedVals="python:///psychopy.hardware.camera:CameraDevice.getSupportedResolutions($deviceName)", hint=_translate( "Resolution (w x h) to record to, leave blank to use device default." ), @@ -347,7 +337,7 @@ def getParams(self): ) params['frameRate'] = Param( None, valType='int', inputType="choice", - allowedVals=[""] + list(frameRates), allowedLabels=["Default"] + list(frameRates), + allowedVals="python:///psychopy.hardware.camera:CameraDevice.getSupportedFrameRates($deviceName)", hint=_translate( "Frame rate (frames per second) to record at, leave blank to use device default." ), diff --git a/psychopy/experiment/components/code/CodeComponent.svg b/psychopy/experiment/components/code/CodeComponent.svg index 77e32998..b6f04c10 100644 --- a/psychopy/experiment/components/code/CodeComponent.svg +++ b/psychopy/experiment/components/code/CodeComponent.svg @@ -4,9 +4,9 @@ - + - + diff --git a/psychopy/experiment/components/dots/DotsComponent.svg b/psychopy/experiment/components/dots/DotsComponent.svg index a1afa151..e3686fba 100644 --- a/psychopy/experiment/components/dots/DotsComponent.svg +++ b/psychopy/experiment/components/dots/DotsComponent.svg @@ -7,114 +7,114 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/psychopy/experiment/components/eyetracker_marker/EyetrackerMarkerComponent.svg b/psychopy/experiment/components/eyetracker_marker/EyetrackerMarkerComponent.svg new file mode 100644 index 00000000..380d83fd --- /dev/null +++ b/psychopy/experiment/components/eyetracker_marker/EyetrackerMarkerComponent.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/psychopy/experiment/components/eyetracker_marker/__init__.py b/psychopy/experiment/components/eyetracker_marker/__init__.py new file mode 100644 index 00000000..59eef102 --- /dev/null +++ b/psychopy/experiment/components/eyetracker_marker/__init__.py @@ -0,0 +1,98 @@ +from pathlib import Path + +from psychopy.experiment.components import getInitVals +from psychopy.experiment.components._base import BaseComponent +from psychopy.experiment.params import Param +from psychopy.localization import _translate + + +class EyetrackerMarkerComponent(BaseComponent): + """ + Add a text marker in the hdf5 file + """ + categories = ['Eyetracking'] + targets = ['PsychoPy'] + version = "2026.2.0" + iconFile = Path(__file__).parent / 'EyetrackerMarkerComponent.png' + iconSVG = Path(__file__).parent / 'EyetrackerMarkerComponent.svg' + tooltip = _translate('Add a text marker in the hdf5 file') + beta = True + + def __init__( + self, + exp, + parentName, + # basic + name='etMarker', + startType='time (s)', + startVal=0.0, + startEstim='', + stopType='duration (s)', + stopVal=1.0, + durationEstim='', + message="", + category="" + ): + # initialise base class + BaseComponent.__init__( + self, + exp, + parentName, + name=name, + startType=startType, + startVal=startVal, + stopType=stopType, + stopVal=stopVal, + startEstim=startEstim, + durationEstim=durationEstim + ) + # set attributes + self.type = 'EyetrackerMarker' + self.url = "https://www.psychopy.org/builder/components/eyetracker_marker" + self.exp.requireImport( + importName="SimpleNamespace", + importFrom="types" + ) + self.exp.requirePsychopyLibs(['iohub', 'hardware']) + # remove stop params as they're not relevant + del self.params['stopVal'] + del self.params['stopType'] + self.params['durationEstim'].val = 0.01 + # reframe start as trigger time + self.params['startVal'].label = _translate("Send when...") + self.params['startVal'].hint = _translate("When to send the marker?") + + # basic params + self.params['message'] = Param( + message, valType="str", inputType="single", categ="Basic", + updates='set every frame', allowedUpdates=None, + label=_translate("Text"), + hint=_translate("Text to send to the eyetracker (128 characters max)") + ) + self.params['category'] = Param( + category, valType="str", inputType="single", categ="Basic", + updates='set every frame', allowedUpdates=None, + label=_translate("Category"), + hint=_translate("Optional grouping text for the message (32 characters max)") + ) + + def writeInitCode(self, buff): + inits = getInitVals(self.params, "PsychoPy") + # create a simple namespace for this Component + code = ( + "# simple namespace object representing the Eyetracker Marker Component %(name)s\n" + "%(name)s = SimpleNamespace()\n" + "%(name)s.status = NOT_STARTED\n" + ) + buff.writeIndentedLines(code % inits) + + def writeFrameCode(self, buff): + indented = self.writeStartTestCode(buff) + # send message + code = ( + "# send message from %(name)s\n" + "ioServer.sendMessageEvent(text=%(message)s, category=%(category)s)\n" + ) + buff.writeIndentedLines(code % self.params) + # close + buff.setIndentLevel(-indented, relative=True) diff --git a/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent.png b/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent.png new file mode 100644 index 00000000..deaa93f5 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent.png differ diff --git a/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent@2x.png b/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent@2x.png new file mode 100644 index 00000000..7812d085 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/classic/EyetrackerMarkerComponent@2x.png differ diff --git a/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent.png b/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent.png new file mode 100644 index 00000000..deaa93f5 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent.png differ diff --git a/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent@2x.png b/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent@2x.png new file mode 100644 index 00000000..7812d085 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/dark/EyetrackerMarkerComponent@2x.png differ diff --git a/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent.png b/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent.png new file mode 100644 index 00000000..85b181a6 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent.png differ diff --git a/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent@2x.png b/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent@2x.png new file mode 100644 index 00000000..003c04e0 Binary files /dev/null and b/psychopy/experiment/components/eyetracker_marker/light/EyetrackerMarkerComponent@2x.png differ diff --git a/psychopy/experiment/components/eyetracker_record/EyetrackerRecordComponent.svg b/psychopy/experiment/components/eyetracker_record/EyetrackerRecordComponent.svg index c857ad04..85ca1069 100644 --- a/psychopy/experiment/components/eyetracker_record/EyetrackerRecordComponent.svg +++ b/psychopy/experiment/components/eyetracker_record/EyetrackerRecordComponent.svg @@ -4,7 +4,7 @@ - + diff --git a/psychopy/experiment/components/form/FormComponent.svg b/psychopy/experiment/components/form/FormComponent.svg index b1aa3083..3fab5c3b 100644 --- a/psychopy/experiment/components/form/FormComponent.svg +++ b/psychopy/experiment/components/form/FormComponent.svg @@ -20,7 +20,7 @@ - + diff --git a/psychopy/experiment/components/image/ImageComponent.svg b/psychopy/experiment/components/image/ImageComponent.svg index 5b5b7963..be7b9eac 100644 --- a/psychopy/experiment/components/image/ImageComponent.svg +++ b/psychopy/experiment/components/image/ImageComponent.svg @@ -10,7 +10,7 @@ - + diff --git a/psychopy/experiment/components/joyButtons/JoyButtonsComponent.svg b/psychopy/experiment/components/joyButtons/JoyButtonsComponent.svg index 21eddfb1..60cbf350 100644 --- a/psychopy/experiment/components/joyButtons/JoyButtonsComponent.svg +++ b/psychopy/experiment/components/joyButtons/JoyButtonsComponent.svg @@ -13,16 +13,16 @@ - + - + - + - + diff --git a/psychopy/experiment/components/joystick/JoystickComponent.svg b/psychopy/experiment/components/joystick/JoystickComponent.svg index 56e6081a..863d9eb7 100644 --- a/psychopy/experiment/components/joystick/JoystickComponent.svg +++ b/psychopy/experiment/components/joystick/JoystickComponent.svg @@ -26,7 +26,7 @@ - + diff --git a/psychopy/experiment/components/keyboard/KeyboardComponent.svg b/psychopy/experiment/components/keyboard/KeyboardComponent.svg index 3c105975..59b812b5 100644 --- a/psychopy/experiment/components/keyboard/KeyboardComponent.svg +++ b/psychopy/experiment/components/keyboard/KeyboardComponent.svg @@ -10,7 +10,7 @@ - + @@ -22,10 +22,10 @@ - + - + @@ -64,7 +64,7 @@ - + diff --git a/psychopy/experiment/components/keyboard/__init__.py b/psychopy/experiment/components/keyboard/__init__.py index 605acfef..9c182722 100644 --- a/psychopy/experiment/components/keyboard/__init__.py +++ b/psychopy/experiment/components/keyboard/__init__.py @@ -151,7 +151,9 @@ def writeInitCode(self, buff): inits = getInitVals(self.params) # make Keyboard object code = ( - "%(name)s = keyboard.Keyboard(deviceName='defaultKeyboard')\n" + "%(name)s = keyboard.Keyboard(deviceName='defaultKeyboard', backend={keyboardBackend})\n" + ).format( + **self.exp.settings.params ) buff.writeIndentedLines(code % inits) diff --git a/psychopy/experiment/components/microphone/MicrophoneComponent.svg b/psychopy/experiment/components/microphone/MicrophoneComponent.svg index 830b2e37..fa0bedc4 100644 --- a/psychopy/experiment/components/microphone/MicrophoneComponent.svg +++ b/psychopy/experiment/components/microphone/MicrophoneComponent.svg @@ -5,7 +5,7 @@ - + diff --git a/psychopy/experiment/components/microphone/__init__.py b/psychopy/experiment/components/microphone/__init__.py index 4a9757cd..396323d0 100644 --- a/psychopy/experiment/components/microphone/__init__.py +++ b/psychopy/experiment/components/microphone/__init__.py @@ -77,6 +77,9 @@ def __init__( self.type = 'Microphone' self.url = "https://www.psychopy.org/builder/components/microphone.html" self.exp.requirePsychopyLibs(['sound']) + self.exp.requireImport( + importName='psychopy.hardware.microphone' + ) self.order += [] @@ -241,6 +244,24 @@ def allTranscribers(self): """ return {'None': "none", **self.localTranscribers, **self.onlineTranscribers} + def writePreCode(self, buff): + backend = self.exp.settings.params['Audio lib'].val + # figure out backend + if backend == "use prefs": + # get from prefs if requested + code = ( + "# set audio backend\n" + "hardware.microphone.MicrophoneDevice.backend = prefs.hardware['audioLib']\n" + ) + else: + # otherwise use exp settings + code = ( + f"# set audio backend\n" + f"hardware.microphone.MicrophoneDevice.backend = '{backend}'\n" + ) + # set backend (only once per exp) + buff.writeOnceIndentedLines(code) + def writeStartCode(self, buff): inits = getInitVals(self.params) # Use filename with a suffix to store recordings diff --git a/psychopy/experiment/components/mouse/__init__.py b/psychopy/experiment/components/mouse/__init__.py index 21fe0bb8..731fad8e 100644 --- a/psychopy/experiment/components/mouse/__init__.py +++ b/psychopy/experiment/components/mouse/__init__.py @@ -344,12 +344,14 @@ def writeFrameCode(self, buff): if self.params['newClicksOnly']: code += ( - "prevButtonState = %(name)s.getPressed()" - " # if button is down already this ISN'T a new click\n") + "# if button is down already this ISN'T a new click\n" + "%(name)s.prevButtonState = %(name)s.getPressed()\n" + ) else: code += ( - "prevButtonState = [0, 0, 0]" - " # if now button is down we will treat as 'new' click\n") + "# if now button is down we will treat as 'new' click\n" + "%(name)s.prevButtonState = [0, 0, 0]\n" + ) buff.writeIndentedLines(code % self.params) # to get out of the if statement @@ -377,16 +379,17 @@ def writeFrameCode(self, buff): def _buttonPressCode(buff, dedent): """Code compiler for mouse button events""" - code = ("buttons = %(name)s.getPressed()\n" - "if buttons != prevButtonState: # button state changed?") - buff.writeIndentedLines(code % self.params) - buff.setIndentLevel(1, relative=True) - dedent += 1 - buff.writeIndented("prevButtonState = buttons\n") - code = ("if sum(buttons) > 0: # state changed to a new click\n") + code = ( + "buttons = %(name)s.getPressed()\n" + "# button state changed?\n" + "if buttons != %(name)s.prevButtonState:\n" + " %(name)s.prevButtonState = buttons\n" + " # state changed to a new click\n" + " if sum(buttons) > 0:\n" + ) buff.writeIndentedLines(code % self.params) - buff.setIndentLevel(1, relative=True) - dedent += 1 + buff.setIndentLevel(2, relative=True) + dedent += 2 # keep track of whether something's been written hasContent = False # write code to check clickable stim, if there are any diff --git a/psychopy/experiment/components/movie/MovieComponent.svg b/psychopy/experiment/components/movie/MovieComponent.svg index 1d3d07ce..2ebdc01f 100644 --- a/psychopy/experiment/components/movie/MovieComponent.svg +++ b/psychopy/experiment/components/movie/MovieComponent.svg @@ -8,7 +8,7 @@ - + diff --git a/psychopy/experiment/components/panorama/PanoramaComponent.svg b/psychopy/experiment/components/panorama/PanoramaComponent.svg index 90625476..17e83add 100644 --- a/psychopy/experiment/components/panorama/PanoramaComponent.svg +++ b/psychopy/experiment/components/panorama/PanoramaComponent.svg @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ - + diff --git a/psychopy/experiment/components/parallelOut/ParallelOutComponent.svg b/psychopy/experiment/components/parallelOut/ParallelOutComponent.svg index c791bac0..f11e8720 100644 --- a/psychopy/experiment/components/parallelOut/ParallelOutComponent.svg +++ b/psychopy/experiment/components/parallelOut/ParallelOutComponent.svg @@ -8,7 +8,7 @@ - + diff --git a/psychopy/experiment/components/polygon/PolygonComponent.svg b/psychopy/experiment/components/polygon/PolygonComponent.svg index c6351808..0c1e2521 100644 --- a/psychopy/experiment/components/polygon/PolygonComponent.svg +++ b/psychopy/experiment/components/polygon/PolygonComponent.svg @@ -5,13 +5,13 @@ - + - + diff --git a/psychopy/experiment/components/progress/ProgressComponent.svg b/psychopy/experiment/components/progress/ProgressComponent.svg index 2c8da550..f78e4c31 100644 --- a/psychopy/experiment/components/progress/ProgressComponent.svg +++ b/psychopy/experiment/components/progress/ProgressComponent.svg @@ -10,7 +10,7 @@ - + diff --git a/psychopy/experiment/components/resourceManager/ResourceManagerComponent.svg b/psychopy/experiment/components/resourceManager/ResourceManagerComponent.svg index 8d58a9cc..5379216a 100644 --- a/psychopy/experiment/components/resourceManager/ResourceManagerComponent.svg +++ b/psychopy/experiment/components/resourceManager/ResourceManagerComponent.svg @@ -12,7 +12,7 @@ - + @@ -36,7 +36,7 @@ - + @@ -49,11 +49,11 @@ - + - + diff --git a/psychopy/experiment/components/roi/RegionOfInterestComponent.svg b/psychopy/experiment/components/roi/RegionOfInterestComponent.svg index 43626c0a..035ba15c 100644 --- a/psychopy/experiment/components/roi/RegionOfInterestComponent.svg +++ b/psychopy/experiment/components/roi/RegionOfInterestComponent.svg @@ -4,13 +4,13 @@ - + - + diff --git a/psychopy/experiment/components/serialOut/SerialOutComponent.svg b/psychopy/experiment/components/serialOut/SerialOutComponent.svg index 65819513..ead57236 100644 --- a/psychopy/experiment/components/serialOut/SerialOutComponent.svg +++ b/psychopy/experiment/components/serialOut/SerialOutComponent.svg @@ -8,13 +8,13 @@ - + - + diff --git a/psychopy/experiment/components/serialOut/__init__.py b/psychopy/experiment/components/serialOut/__init__.py index 3fe458af..4855eb68 100644 --- a/psychopy/experiment/components/serialOut/__init__.py +++ b/psychopy/experiment/components/serialOut/__init__.py @@ -148,8 +148,9 @@ def writeInitCode(self, buff): code = ( "\n" "# point %(name)s to device named %(deviceLabel)s and make sure it's open\n" - "%(name)s = deviceManager.getDevice(%(deviceLabel)s)\n" - "%(name)s.status = NOT_STARTED\n" + "%(name)s = SerialOut(\n" + " device=%(deviceLabel)s\n" + ")\n" "if not %(name)s.com.is_open:\n" " %(name)s.com.open()\n" ) @@ -159,8 +160,6 @@ def writeFrameCode(self, buff): params = copy(self.params) # Get containing loop params['loop'] = self.currentLoop - - # On component start, send start bits indented = self.writeStartTestCode(buff) if indented: @@ -168,7 +167,7 @@ def writeFrameCode(self, buff): if params['startDataType'] == "str": params['startData'] = params['startDataStr'] elif params['startDataType'] == "num": - params['startData'] = "bytes(chr(%(startDataNumeric)s), 'utf-8')" % params + params['startData'] = params['startDataNumeric'] elif params['startDataType'] == "binary": params['startData'] = "0b%(startDataBinary)s" % params elif params['startDataType'] == "char": @@ -189,7 +188,7 @@ def writeFrameCode(self, buff): buff.writeIndented(code % params) # store code that was sent code = ( - "%(loop)s.addData('%(name)s.stopData', %(startData)s)\n" + "%(loop)s.addData('%(name)s.startData', %(startData)s)\n" ) buff.writeIndented(code % params) # update status @@ -213,7 +212,7 @@ def writeFrameCode(self, buff): if params['stopDataType'] == "str": params['stopData'] = params['stopDataStr'] elif params['stopDataType'] == "num": - params['stopData'] = "bytes(bytearray([%(stopDataNumeric)s]))" % params + params['stopData'] = params['stopDataNumeric'] elif params['stopDataType'] == "binary": params['stopData'] = "0b%(stopDataBinary)s" % params elif params['stopDataType'] == "char": @@ -273,13 +272,53 @@ def __init__(self, profile): # define order self.order += [ "timeout", + "eol" ] self.params['timeout'] = Param( - "", valType='code', inputType="single", allowedTypes=[], + "", valType='code', inputType="single", hint=_translate("Time at which to give up listening for a response (leave blank for no limit)"), label=_translate("Timeout") ) + + self.params['eol'] = Param( + "$'\\n'", valType="str", inputType="single", categ="Basic", + label=_translate("EOL (end-of-line) character"), + hint=_translate("Character automatically added to end of each message - leave blank for no EOL") + ) + + # -- Override params --- + + self.params['overrideBaudrate'] = Param( + "", valType='code', inputType="single", + categ="Overrides", + hint=_translate("Override the device's reported baudrate"), + label=_translate("Baudrate override") + ) + self.params['overrideByteSize'] = Param( + "", valType='code', inputType="single", + categ="Overrides", + hint=_translate("Override the device's reported byte size"), + label=_translate("Byte size override") + ) + self.params['overrideStopBits'] = Param( + "", valType='code', inputType="single", + categ="Overrides", + hint=_translate("Override the device's reported stop bits"), + label=_translate("Stop bits override") + ) + self.params['overrideParity'] = Param( + None, valType='str', inputType="choice", + allowedVals=[ + None, "N", "E", "O", "M" + ], + allowedLabels=[ + "", _translate("N (none)"), _translate("E (even)"), _translate("O (odd)"), _translate("M (mask)") + ], + categ="Overrides", + hint=_translate("Override the device's reported parity settings"), + label=_translate("Parity override") + ) def writeDeviceCode(self, buff): """ @@ -291,10 +330,34 @@ def writeDeviceCode(self, buff): Text buffer to write code to. """ inits = getInitVals(self.params) - # write basic code - self.writeBaseDeviceCode(buff, close=False) - # add param and close + # replace any overridden items from profile + profile = self.profile.copy() + for key, override in [ + ("baudrate", "overrideBaudrate"), + ("byteSize", "overrideByteSize"), + ("stopBits", "overrideStopBits"), + ("parity", "overrideParity") + ]: + if self.params[override]: + profile[key] = self.params[override].val + # write init call with device label + code = ( + "# initialize %(name)s\n" + "deviceManager.addDevice(\n" + " deviceName=%(name)s,\n" + ) + buff.writeIndentedLines(code % inits) + # add options from profile + code = "" + for key, value in profile.items(): + # skip attributes already covered by a param + if key in self.params or key in ("deviceName", ): + continue + code += f" {key}={repr(value)},\n" + buff.writeIndentedLines(code) + # add pause and close code = ( + " eol=%(eol)s,\n" " pauseDuration=(%(timeout)s or 0.1) / 3,\n" ")\n" ) diff --git a/psychopy/experiment/components/settings/__init__.py b/psychopy/experiment/components/settings/__init__.py index f9b3a94f..6eaed425 100644 --- a/psychopy/experiment/components/settings/__init__.py +++ b/psychopy/experiment/components/settings/__init__.py @@ -9,7 +9,7 @@ from psychopy import logging, plugins from psychopy.preferences import prefs from psychopy.experiment.components import Param, _translate -from psychopy.experiment.components.settings.eyetracking import knownEyetrackerBackends +from psychopy.experiment.components.settings.eyetracking import knownEyetrackerBackends, MouseGazeEyetrackerBackend from psychopy.experiment.routines import Routine, BaseStandaloneRoutine from psychopy.experiment.routines.eyetracker_calibrate import EyetrackerCalibrationRoutine from psychopy.experiment import utils as exputils @@ -57,7 +57,7 @@ def readTextFile(relPath): # class ProjIDParam(Param): # @property # def allowedVals(self): -# from psychopy.app.projects import catalog +# from psychopy.projects import catalog # allowed = list(catalog.keys()) # # always allow the current val! # if self.val not in allowed: @@ -71,11 +71,6 @@ def readTextFile(relPath): # pass -def getSoundBackends(): - from psychopy.sound.sound import Sound - return list(Sound.getBackends()) - - class SettingsComponent: """This component stores general info about how to run the experiment """ @@ -143,9 +138,9 @@ def __init__( # if filename is the default value fetch the builder pref for the # folder instead if filename is None: - filename = ("u'xxxx/%s_%s_%s' % (expInfo['participant'], expName," - " expInfo['date'])") - if filename.startswith("u'xxxx"): + filename = ("'xxxx/' + expInfo['participant'] + '_' + expName + '_'" + " + expInfo['date']") + if filename.startswith("'xxxx"): folder = self.exp.prefsBuilder['savedDataFolder'].strip() filename = filename.replace("xxxx", folder) @@ -392,8 +387,9 @@ def __init__( hint=_translate("Force audio to stereo (2-channel) output"), label=_translate("Force stereo")) self.params['Audio lib'] = Param( - 'ptb', valType='str', inputType="choice", - allowedVals=getSoundBackends, + "use prefs", valType='str', inputType="choice", + allowedVals=["use prefs", "ptb", "sounddevice"], + allowedLabels=[_translate("From preferences..."), "psychtoolbox", "sounddevice"], hint=_translate("Which Python sound engine do you want to play your sounds?"), label=_translate("Audio library"), categ='Audio') @@ -539,39 +535,6 @@ def __init__( self.order += ["eyetracker", "gpAddress", "gpPort", "elModel", "elAddress", "elSimMode"] - - # Hide params when not relevant to current eyetracker - trackerParams = { - "MouseGaze": ["mgMove", "mgBlink", "mgSaccade"], - "GazePoint": ["gpAddress", "gpPort"], - "SR Research Ltd": ["elModel", "elSimMode", "elSampleRate", "elTrackEyes", "elLiveFiltering", - "elDataFiltering", "elTrackingMode", "elPupilMeasure", "elPupilAlgorithm", - "elAddress"], - "Tobii Technology": ["tbModel", "tbLicenseFile", "tbSerialNo", "tbSampleRate"], - "Pupil Labs": ["plPupillometryOnly", "plSurfaceName", "plConfidenceThreshold", - "plPupilRemoteAddress", "plPupilRemotePort", "plPupilRemoteTimeoutMs", - "plPupilCaptureRecordingLocation"], - "Pupil Labs (Neon)": ["plCompanionAddress", "plCompanionPort"], - "EyeLogic": ["ecSampleRate"], - } - for tracker in trackerParams: - for depParam in trackerParams[tracker]: - self.depends.append( - {"dependsOn": "eyetracker", # must be param name - "condition": "=='"+tracker+"'", # val to check for - "param": depParam, # param property to alter - "true": "show", # what to do with param if condition is True - "false": "hide", # permitted: hide, show, enable, disable - } - ) - self.depends.append( - {"dependsOn": "eyetracker", # must be param name - "condition": f" in {list(trackerParams)}", # val to check for - "param": "Save hdf5 file", # param property to alter - "true": "enable", # what to do with param if condition is True - "false": "disable", # permitted: hide, show, enable, disable - } - ) # arrays for eyetracker backends backendValues = ["None"] backendLabels = ["None"] @@ -586,7 +549,7 @@ def __init__( if legKey not in backendValues: backendValues.append(legKey) backendLabels.append(legLbl) - except: + except Exception: # if it doesn't work, just stick with the known backends from plugins pass @@ -618,161 +581,6 @@ def __init__( 'false': "hide", # otherwise... }) - # as users with old versions of the plugin won't have params added dynamically, add legacy - # params here manually - - # gazepoint - self.params['gpAddress'] = Param( - gpAddress, valType='str', inputType="single", - hint=_translate("IP Address of the computer running GazePoint Control."), - label=_translate("GazePoint IP address"), categ="Eyetracking" - ) - - self.params['gpPort'] = Param( - gpPort, valType='num', inputType="single", - hint=_translate("Port of the GazePoint Control server. Usually 4242."), - label=_translate("GazePoint port"), categ="Eyetracking" - ) - # eyelink - self.params['elModel'] = Param( - elModel, valType='str', inputType="choice", - allowedVals=['EYELINK 1000 DESKTOP', 'EYELINK 1000 TOWER', 'EYELINK 1000 REMOTE', - 'EYELINK 1000 LONG RANGE'], - hint=_translate("Eye tracker model."), - label=_translate("Model name"), categ="Eyetracking" - ) - self.params['elSimMode'] = Param( - elSimMode, valType='bool', inputType="bool", - hint=_translate("Set the EyeLink to run in mouse simulation mode."), - label=_translate("Mouse simulation mode"), categ="Eyetracking" - ) - self.params['elSampleRate'] = Param( - elSampleRate, valType='num', inputType="choice", - allowedVals=['250', '500', '1000', '2000'], - hint=_translate("Eye tracker sampling rate."), - label=_translate("Sampling rate"), categ="Eyetracking" - ) - self.params['elTrackEyes'] = Param( - elTrackEyes, valType='str', inputType="choice", - allowedVals=['LEFT_EYE', 'RIGHT_EYE', 'BOTH'], - hint=_translate("Select with eye(s) to track."), - label=_translate("Track eyes"), categ="Eyetracking" - ) - self.params['elLiveFiltering'] = Param( - elLiveFiltering, valType='str', inputType="choice", - allowedVals=['FILTER_LEVEL_OFF', 'FILTER_LEVEL_1', 'FILTER_LEVEL_2'], - hint=_translate("Filter eye sample data live, as it is streamed to the driving device. " - "This may reduce the sampling speed."), - label=_translate("Live sample filtering"), categ="Eyetracking" - ) - self.params['elDataFiltering'] = Param( - elDataFiltering, valType='str', inputType="choice", - allowedVals=['FILTER_LEVEL_OFF', 'FILTER_LEVEL_1', 'FILTER_LEVEL_2'], - hint=_translate("Filter eye sample data when it is saved to the output file. This will " - "not affect the sampling speed."), - label=_translate("Saved sample filtering"), categ="Eyetracking" - ) - self.params['elTrackingMode'] = Param( - elTrackingMode, valType='str', inputType="choice", - allowedVals=['PUPIL_CR_TRACKING', 'PUPIL_ONLY_TRACKING'], - hint=_translate("Track Pupil-CR or Pupil only."), - label=_translate("Pupil tracking mode"), categ="Eyetracking" - ) - self.params['elPupilAlgorithm'] = Param( - elPupilAlgorithm, valType='str', inputType="choice", - allowedVals=['ELLIPSE_FIT', 'CENTROID_FIT'], - hint=_translate("Algorithm used to detect the pupil center."), - label=_translate("Pupil center algorithm"), categ="Eyetracking" - ) - self.params['elPupilMeasure'] = Param( - elPupilMeasure, valType='str', inputType="choice", - allowedVals=['PUPIL_AREA', 'PUPIL_DIAMETER', 'NEITHER'], - hint=_translate("Type of pupil data to record."), - label=_translate("Pupil data type"), categ="Eyetracking" - ) - self.params['elAddress'] = Param( - elAddress, valType='str', inputType="single", - hint=_translate("IP Address of the EyeLink *Host* computer."), - label=_translate("EyeLink IP address"), categ="Eyetracking" - ) - - # tobii - self.params['tbModel'] = Param( - tbModel, valType='str', inputType="single", - hint=_translate("Eye tracker model."), - label=_translate("Model name"), categ="Eyetracking" - ) - self.params['tbLicenseFile'] = Param( - tbLicenseFile, valType='str', inputType="file", - hint=_translate("Eye tracker license file (optional)."), - label=_translate("License file"), categ="Eyetracking" - ) - self.params['tbSerialNo'] = Param( - tbSerialNo, valType='str', inputType="single", - hint=_translate("Eye tracker serial number (optional)."), - label=_translate("Serial number"), categ="Eyetracking" - ) - self.params['tbSampleRate'] = Param( - tbSampleRate, valType='num', inputType="single", - hint=_translate("Eye tracker sampling rate."), - label=_translate("Sampling rate"), categ="Eyetracking" - ) - - # pupil labs - self.params['plPupillometryOnly'] = Param( - plPupillometryOnly, valType='bool', inputType="bool", - hint=_translate("Subscribe to pupil data only, does not require calibration or surface setup"), - label=_translate("Pupillometry only"), - categ="Eyetracking" - ) - self.params['plSurfaceName'] = Param( - plSurfaceName, valType='str', inputType="single", - hint=_translate("Name of the Pupil Capture surface"), - label=_translate("Surface name"), categ="Eyetracking" - ) - self.params['plConfidenceThreshold'] = Param( - plConfidenceThreshold, valType='num', inputType="single", - hint=_translate("Gaze confidence threshold"), - label=_translate("Gaze confidence threshold"), categ="Eyetracking" - ) - self.params['plPupilRemoteAddress'] = Param( - plPupilRemoteAddress, valType='str', inputType="single", - hint=_translate("Pupil remote address"), - label=_translate("Pupil remote address"), categ="Eyetracking" - ) - self.params['plPupilRemotePort'] = Param( - plPupilRemotePort, valType='num', inputType="single", - hint=_translate("Pupil remote port"), - label=_translate("Pupil remote port"), categ="Eyetracking" - ) - self.params['plPupilRemoteTimeoutMs'] = Param( - plPupilRemoteTimeoutMs, valType='num', inputType="single", - hint=_translate("Pupil remote timeout (ms)"), - label=_translate("Pupil remote timeout (ms)"), categ="Eyetracking" - ) - self.params['plPupilCaptureRecordingLocation'] = Param( - plPupilCaptureRecordingLocation, valType='str', inputType="single", - hint=_translate("Pupil capture recording location"), - label=_translate("Pupil capture recording location"), categ="Eyetracking" - ) - self.params['plCompanionAddress'] = Param( - plCompanionAddress, valType='str', inputType="single", - hint=_translate("Companion address"), - label=_translate("Companion address"), categ="Eyetracking" - ) - self.params['plCompanionPort'] = Param( - plCompanionPort, valType='num', inputType="single", - hint=_translate("Companion port"), - label=_translate("Companion port"), categ="Eyetracking" - ) - - # EyeLogic - self.params['ecSampleRate'] = Param( - ecSampleRate, valType='str', inputType="single", - hint=_translate("Eyetracker sampling rate: 'default' or [Hz]. Defaults to tracking mode '0'."), - label=_translate("Sampling rate"), categ="Eyetracking" - ) - # Input self.params['keyboardBackend'] = Param( keyboardBackend, valType='str', inputType="choice", @@ -926,7 +734,7 @@ def getShortType(self): return self.getType().replace('Component', '') def writeUseVersion(self, buff): - if self.params['Use version'].val: + if self.params['Use version'].val not in (None, "", "latest"): code = ('\nimport psychopy\n' 'psychopy.useVersion({})\n\n') val = repr(self.params['Use version'].val) @@ -1351,7 +1159,7 @@ def writeDataCode(self, buff): if isinstance(colPriority, str): try: colPriority = ast.literal_eval(colPriority) - except: + except (ValueError, SyntaxError): raise ValueError(_translate( "Could not interpret value as dict: {}" ).format(colPriority)) diff --git a/psychopy/experiment/components/slider/SliderComponent.svg b/psychopy/experiment/components/slider/SliderComponent.svg index 6cf8ade4..7ebd4d39 100644 --- a/psychopy/experiment/components/slider/SliderComponent.svg +++ b/psychopy/experiment/components/slider/SliderComponent.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/psychopy/experiment/components/slider/__init__.py b/psychopy/experiment/components/slider/__init__.py index 86b8b05e..925d470a 100644 --- a/psychopy/experiment/components/slider/__init__.py +++ b/psychopy/experiment/components/slider/__init__.py @@ -366,6 +366,7 @@ def writeRoutineEndCode(self, buff): "for Slider events so doesn't know what to " "tell a StairHandler (or QuestHandler)\n") buff.writeIndented(msg) + loopName = 'thisExp' elif currLoop.type in ['TrialHandler', 'ExperimentHandler']: loopName = currLoop.params['name'] else: diff --git a/psychopy/experiment/components/sound/SoundComponent.svg b/psychopy/experiment/components/sound/SoundComponent.svg index ccf3594c..1a400b20 100644 --- a/psychopy/experiment/components/sound/SoundComponent.svg +++ b/psychopy/experiment/components/sound/SoundComponent.svg @@ -5,10 +5,10 @@ - + - + diff --git a/psychopy/experiment/components/sound/__init__.py b/psychopy/experiment/components/sound/__init__.py index b5d50ec1..37dc2ca5 100644 --- a/psychopy/experiment/components/sound/__init__.py +++ b/psychopy/experiment/components/sound/__init__.py @@ -66,6 +66,9 @@ def __init__( self.type = 'Sound' self.url = "https://www.psychopy.org/builder/components/sound.html" self.exp.requirePsychopyLibs(['sound']) + self.exp.requireImport( + importName='psychopy.hardware.speaker' + ) # --- Basic params --- self.order += [ @@ -136,13 +139,27 @@ def __init__( ) ) + def writePreCode(self, buff): + backend = self.exp.settings.params['Audio lib'].val + # figure out backend + if backend == "use prefs": + # get from prefs if requested + code = ( + "# set audio backend\n" + "sound.Sound.backend = prefs.hardware['audioLib']\n" + "hardware.speaker.SpeakerDevice.backend = prefs.hardware['audioLib']\n" + ) + else: + # otherwise use exp settings + code = ( + f"# set audio backend\n" + f"sound.Sound.backend = '{backend}'\n" + f"hardware.speaker.SpeakerDevice.backend = '{backend}'\n" + ) + # set backend (only once per exp) + buff.writeOnceIndentedLines(code) + def writeInitCode(self, buff): - # set sound backend (only once per exp) - code = ( - "# set audio backend\n" - "sound.Sound.backend = %(Audio lib)s\n" - ) - buff.writeOnceIndentedLines(code % self.exp.settings.params) # replaces variable params with sensible defaults inits = getInitVals(self.params) if not canBeNumeric(inits['stopVal'].val): diff --git a/psychopy/experiment/components/soundsensor/SoundSensorComponent.svg b/psychopy/experiment/components/soundsensor/SoundSensorComponent.svg index e26708c2..bd16421e 100644 --- a/psychopy/experiment/components/soundsensor/SoundSensorComponent.svg +++ b/psychopy/experiment/components/soundsensor/SoundSensorComponent.svg @@ -15,12 +15,12 @@ - + - + diff --git a/psychopy/experiment/components/static/StaticComponent.svg b/psychopy/experiment/components/static/StaticComponent.svg index 616f23cb..e7f17c89 100644 --- a/psychopy/experiment/components/static/StaticComponent.svg +++ b/psychopy/experiment/components/static/StaticComponent.svg @@ -4,10 +4,10 @@ - + - + diff --git a/psychopy/experiment/components/text/TextComponent.svg b/psychopy/experiment/components/text/TextComponent.svg index bb388e33..5f7fe22e 100644 --- a/psychopy/experiment/components/text/TextComponent.svg +++ b/psychopy/experiment/components/text/TextComponent.svg @@ -8,7 +8,7 @@ - + diff --git a/psychopy/experiment/components/textbox/TextboxComponent.svg b/psychopy/experiment/components/textbox/TextboxComponent.svg index ab0cc534..61e0db08 100644 --- a/psychopy/experiment/components/textbox/TextboxComponent.svg +++ b/psychopy/experiment/components/textbox/TextboxComponent.svg @@ -9,7 +9,7 @@ - + diff --git a/psychopy/experiment/components/textbox/__init__.py b/psychopy/experiment/components/textbox/__init__.py index 382c5563..00adb7d8 100644 --- a/psychopy/experiment/components/textbox/__init__.py +++ b/psychopy/experiment/components/textbox/__init__.py @@ -24,7 +24,7 @@ class TextboxComponent(BaseVisualComponent): def __init__(self, exp, parentName, name='textbox', # effectively just a display-value - text=_translate('Any text\n\nincluding line breaks'), + text=_translate('Text can be **bold**, *italic*, ***bold italic*** or [color=red]colorful[/color]. To use a regular asterisk, remember to \*escape\* it.\n\nLine breaks are allowed!'), placeholder=_translate("Type here..."), font='Arial', units='from exp settings', bold=False, italic=False, color='white', colorSpace='rgb', opacity="", @@ -35,7 +35,7 @@ def __init__(self, exp, parentName, name='textbox', startType='time (s)', startVal=0.0, stopType='duration (s)', stopVal=1.0, startEstim='', durationEstim='', - overflow="visible", languageStyle='LTR', fillColor="None", + overflow="visible", languageStyle='LTR', formattingSyntax="md", fillColor="None", borderColor="None", borderWidth=2, flipHoriz=False, flipVert=False, @@ -121,6 +121,13 @@ def __init__(self, exp, parentName, name='textbox', allowedVals=['LTR', 'RTL', 'Arabic'], hint=_translate("Handle right-to-left (RTL) languages and Arabic reshaping"), label=_translate("Language style")) + self.params['formattingSyntax'] = Param( + formattingSyntax, valType='str', inputType="choice", categ='Formatting', + allowedVals=['md', 'html', 'raw'], + allowedLabels=['Markdown', 'HTML (online only)', 'No formatting'], + hint=_translate("Syntax to use for inline text formatting"), + label=_translate("Formatting style") + ) self.params['italic'] = Param( italic, valType='bool', inputType="bool", allowedTypes=[], categ='Formatting', updates='constant', @@ -226,7 +233,9 @@ def writeInitCode(self, buff): " padding=%(padding)s, alignment=%(alignment)s,\n" " anchor=%(anchor)s, overflow=%(overflow)s,\n" " fillColor=%(fillColor)s, borderColor=%(borderColor)s,\n" - " flipHoriz=%(flipHoriz)s, flipVert=%(flipVert)s, languageStyle=%(languageStyle)s,\n" + " flipHoriz=%(flipHoriz)s, flipVert=%(flipVert)s, \n" + " languageStyle=%(languageStyle)s,\n" + " formattingSyntax=%(formattingSyntax)s,\n" " editable=%(editable)s,\n" " name='%(name)s',\n" " depth=%(depth)s, autoLog=%(autoLog)s,\n" @@ -266,6 +275,7 @@ def writeInitCodeJS(self, buff): " color: %(color)s, colorSpace: %(colorSpace)s,\n" " fillColor: %(fillColor)s, borderColor: %(borderColor)s,\n" " languageStyle: %(languageStyle)s,\n" + " formattingSyntax: %(formattingSyntax)s,\n" " bold: %(bold)s, italic: %(italic)s,\n" " opacity: %(opacity)s,\n" " padding: %(padding)s,\n" diff --git a/psychopy/experiment/components/unknown/UnknownComponent.svg b/psychopy/experiment/components/unknown/UnknownComponent.svg index 337d9947..614875f1 100644 --- a/psychopy/experiment/components/unknown/UnknownComponent.svg +++ b/psychopy/experiment/components/unknown/UnknownComponent.svg @@ -4,21 +4,21 @@ - + - ? + ? - ? + ? - ? + ? diff --git a/psychopy/experiment/components/unknownPlugin/UnknownPluginComponent.svg b/psychopy/experiment/components/unknownPlugin/UnknownPluginComponent.svg index c7cfbe7e..8f096ddb 100644 --- a/psychopy/experiment/components/unknownPlugin/UnknownPluginComponent.svg +++ b/psychopy/experiment/components/unknownPlugin/UnknownPluginComponent.svg @@ -4,10 +4,10 @@ - + - + diff --git a/psychopy/experiment/components/variable/VariableComponent.svg b/psychopy/experiment/components/variable/VariableComponent.svg index aa215d28..d6676e22 100644 --- a/psychopy/experiment/components/variable/VariableComponent.svg +++ b/psychopy/experiment/components/variable/VariableComponent.svg @@ -4,13 +4,13 @@ - + - + diff --git a/psychopy/experiment/components/variable/__init__.py b/psychopy/experiment/components/variable/__init__.py index a4ddfa20..e34234a1 100644 --- a/psychopy/experiment/components/variable/__init__.py +++ b/psychopy/experiment/components/variable/__init__.py @@ -135,7 +135,7 @@ def writeFrameCode(self, buff): # Begin string construction for end values if not self.params['stopVal'].val: - code += (':\n' % self.params) + code += ':\n' # Duration types must be calculated elif u'duration' in self.params['stopType'].val: if 'frame' in self.params['startType'].val and 'frame' in self.params['stopType'].val \ @@ -143,7 +143,7 @@ def writeFrameCode(self, buff): endTime = str((float(self.params['startVal'].val) + float(self.params['stopVal'].val))) else: # do not add mismatching value types endTime = self.params['stopVal'].val - code += (' and ' + endType + ' <= ' + endTime + ':\n' % (self.params)) + code += (' and ' + endType + ' <= ' + endTime + ':\n') elif endType == 't' : code += (' and ' + endType + ' <= %(stopVal)s:\n' % (self.params)) elif endType == 'frameN' : diff --git a/psychopy/experiment/flow.py b/psychopy/experiment/flow.py index 99c4f66b..725c900b 100644 --- a/psychopy/experiment/flow.py +++ b/psychopy/experiment/flow.py @@ -267,7 +267,7 @@ def writeBody(self, script): " " ) code += ( - "core.rush(enable=True)\n" + "core.rush(True)\n" ) script.writeIndentedLines(code) # initialisation @@ -374,7 +374,7 @@ def writeBody(self, script): if self.exp.settings.params['rush']: code = ( "# end 'rush' mode\n" - "core.rush(enable=False)\n" + "core.rush(False)\n" ) script.writeIndentedLines(code) diff --git a/psychopy/experiment/params.py b/psychopy/experiment/params.py index 2e3f1404..28702de9 100644 --- a/psychopy/experiment/params.py +++ b/psychopy/experiment/params.py @@ -267,7 +267,10 @@ def __str__(self): if self.codeWanted and valid: # If code is wanted, return code (translated to JS if needed) if utils.scriptTarget == 'PsychoJS': - valJS = py2js.expression2js(val) + if self.valType == "extendedStr" or self.inputType == 'multi': + valJS = py2js.snippet2js(val) + else: + valJS = py2js.expression2js(val) if self.val != valJS: logging.debug("Rewriting with py2js: {} -> {}".format(self.val, valJS)) return valJS diff --git a/psychopy/experiment/py2js.py b/psychopy/experiment/py2js.py index e60287bf..1a9ea3bd 100644 --- a/psychopy/experiment/py2js.py +++ b/psychopy/experiment/py2js.py @@ -86,7 +86,7 @@ def expression2js(expr): jsStr = translatePythonToJavaScript(jsStr) if jsStr.endswith(';\n'): jsStr = jsStr[:-2] - except: + except Exception: # If translation fails, just use old translation pass return jsStr diff --git a/psychopy/experiment/routines/_base.py b/psychopy/experiment/routines/_base.py index 122af9a5..6114a051 100644 --- a/psychopy/experiment/routines/_base.py +++ b/psychopy/experiment/routines/_base.py @@ -104,7 +104,7 @@ def getTemplateJSON(cls): # try to load SVG try: iconSVG = cls.iconSVG.read_text("utf-8") - except: + except (OSError, AttributeError): iconSVG = None # include basic info profile = { @@ -125,6 +125,8 @@ def getTemplateJSON(cls): # make an object for defaults exp = Experiment() defaults = cls(exp) + # store help link + profile['helpLink'] = getattr(defaults, 'url', None) # order params order = [ name for name in defaults.order if name in defaults.params diff --git a/psychopy/experiment/routines/audioValidator/AudioValidatorRoutine.svg b/psychopy/experiment/routines/audioValidator/AudioValidatorRoutine.svg index 360da06e..cb991147 100644 --- a/psychopy/experiment/routines/audioValidator/AudioValidatorRoutine.svg +++ b/psychopy/experiment/routines/audioValidator/AudioValidatorRoutine.svg @@ -5,10 +5,10 @@ - + - + @@ -16,16 +16,16 @@ - + - + - + - + diff --git a/psychopy/experiment/routines/audioValidator/__init__.py b/psychopy/experiment/routines/audioValidator/__init__.py index 44322709..d76b28c4 100644 --- a/psychopy/experiment/routines/audioValidator/__init__.py +++ b/psychopy/experiment/routines/audioValidator/__init__.py @@ -110,7 +110,7 @@ def writeRoutineStartValidationCode(self, buff, stim): # choose a clock to sync to according to component's params if "syncScreenRefresh" in stim.params and stim.params['syncScreenRefresh']: - clockStr = "" + clockStr = "clock=globalClock" else: clockStr = "clock=routineTimer" # sync component start/stop timers with validator clocks diff --git a/psychopy/experiment/routines/counterbalance/CounterbalanceRoutine.svg b/psychopy/experiment/routines/counterbalance/CounterbalanceRoutine.svg index b55ac935..fa38c5f8 100644 --- a/psychopy/experiment/routines/counterbalance/CounterbalanceRoutine.svg +++ b/psychopy/experiment/routines/counterbalance/CounterbalanceRoutine.svg @@ -10,37 +10,37 @@ - + - + - + - + - + - + - + - + - + - + - + diff --git a/psychopy/experiment/routines/eyetracker_calibrate/EyetrackerCalibrationRoutine.svg b/psychopy/experiment/routines/eyetracker_calibrate/EyetrackerCalibrationRoutine.svg index 892071ec..e18cc371 100644 --- a/psychopy/experiment/routines/eyetracker_calibrate/EyetrackerCalibrationRoutine.svg +++ b/psychopy/experiment/routines/eyetracker_calibrate/EyetrackerCalibrationRoutine.svg @@ -4,13 +4,13 @@ - + - + diff --git a/psychopy/experiment/routines/eyetracker_validate/EyetrackerValidationRoutine.svg b/psychopy/experiment/routines/eyetracker_validate/EyetrackerValidationRoutine.svg index ae4327f1..7d7ec009 100644 --- a/psychopy/experiment/routines/eyetracker_validate/EyetrackerValidationRoutine.svg +++ b/psychopy/experiment/routines/eyetracker_validate/EyetrackerValidationRoutine.svg @@ -8,23 +8,23 @@ - + - + - + - + - + diff --git a/psychopy/experiment/routines/pavlovia_survey/PavloviaSurveyRoutine.svg b/psychopy/experiment/routines/pavlovia_survey/PavloviaSurveyRoutine.svg index 83e2692a..a79f4262 100644 --- a/psychopy/experiment/routines/pavlovia_survey/PavloviaSurveyRoutine.svg +++ b/psychopy/experiment/routines/pavlovia_survey/PavloviaSurveyRoutine.svg @@ -32,7 +32,7 @@ - + @@ -52,13 +52,13 @@ - + - + - + diff --git a/psychopy/experiment/routines/unknown/UnknownRoutine.svg b/psychopy/experiment/routines/unknown/UnknownRoutine.svg index 337d9947..614875f1 100644 --- a/psychopy/experiment/routines/unknown/UnknownRoutine.svg +++ b/psychopy/experiment/routines/unknown/UnknownRoutine.svg @@ -4,21 +4,21 @@ - + - ? + ? - ? + ? - ? + ? diff --git a/psychopy/experiment/routines/visualValidator/VisualValidatorRoutine.svg b/psychopy/experiment/routines/visualValidator/VisualValidatorRoutine.svg index c7fe07c1..06d4dcc2 100644 --- a/psychopy/experiment/routines/visualValidator/VisualValidatorRoutine.svg +++ b/psychopy/experiment/routines/visualValidator/VisualValidatorRoutine.svg @@ -12,7 +12,7 @@ - + @@ -27,27 +27,27 @@ - + - + - + - + - + - + - + diff --git a/psychopy/experiment/routines/visualValidator/__init__.py b/psychopy/experiment/routines/visualValidator/__init__.py index 4929ea32..dd332e25 100644 --- a/psychopy/experiment/routines/visualValidator/__init__.py +++ b/psychopy/experiment/routines/visualValidator/__init__.py @@ -370,11 +370,10 @@ def addRequirements(self): def writeDeviceCode(self: VisualValidatorRoutine, buff): # get inits inits = getInitVals(self.params) + # write basic code + self.writeBaseDeviceCode(buff, close=False) # make ButtonGroup object code = ( - "deviceManager.addDevice(\n" - " deviceClass='psychopy.hardware.lightsensor.ScreenBufferSampler',\n" - " deviceName=%(deviceLabel)s,\n" " win=win,\n" ")\n" ) diff --git a/psychopy/hardware/base.py b/psychopy/hardware/base.py index dd1d0117..ba6a0c19 100644 --- a/psychopy/hardware/base.py +++ b/psychopy/hardware/base.py @@ -36,13 +36,13 @@ def __repr__(self): for key in self.fields: try: attrs.append(f"{key}={getattr(self, key)}") - except: + except AttributeError: continue attrs = ", ".join(attrs) # construct try: return f"<{type(self).__name__} from {self.getDeviceName()}: {attrs}>" - except: + except Exception: return f"<{type(self).__name__}: {attrs}>" def getDeviceName(self): @@ -382,7 +382,7 @@ def clearResponses(self): # try to dispatch messages try: self.dispatchMessages() - except: + except Exception: pass # clear resp list self.responses = [] diff --git a/psychopy/hardware/button.py b/psychopy/hardware/button.py index 1ec53dac..d6e6c194 100644 --- a/psychopy/hardware/button.py +++ b/psychopy/hardware/button.py @@ -34,7 +34,7 @@ def __eq__(self, other): if isinstance(other, dict): try: return ButtonResponse(**other) == self - except: + except (TypeError, KeyError): # if it can't instantiate a ButtonResponse, it's not the same as this return False diff --git a/psychopy/hardware/camera/__init__.py b/psychopy/hardware/camera/__init__.py index 2f501022..c30fc70b 100644 --- a/psychopy/hardware/camera/__init__.py +++ b/psychopy/hardware/camera/__init__.py @@ -580,6 +580,76 @@ def isSameDevice(self, other): else: return False + @staticmethod + def getSupportedFrameRates(index, resolution=None): + """ + List supported frame rate options for a given device at a given resolution. + + Parameters + ---------- + index : str + Index (name) of the camera + resolution : tuple[int] + Resolution at which to get frame rates. Leave as None to list all frame rate options. + + Returns + ------- + list[int] + List of supported frame rates; the first item will always be None (as this is an option + which tells the device to use the default) + """ + frameRates = set() + # iterate through all profiles... + for cam in CameraDevice.getAvailableDevices(best=False): + # skip non-matching devices + if index not in (cam['deviceName'], cam['device']): + continue + # skip non-matching resolutions + if resolution and not all( + resolution[i] == val for i, val in enumerate(cam['frameSize']) + ): + continue + # append if we got this far + frameRates.add(cam['frameRate']) + # sort + frameRates = sorted(frameRates) + + return [None] + frameRates + + @staticmethod + def getSupportedResolutions(index, frameRate=None): + """ + List supported frame rate options for a given device at a given resolution. + + Parameters + ---------- + index : str + Index (name) of the camera + frameRate : tuple[int] + Frame rate at which to get resolutions. Leave as None to list all frame rate options. + + Returns + ------- + list[int] + List of supported resolutions; the first item will always be None (as this is an option + which tells the device to use the default) + """ + resolutions = set() + # iterate through all profiles... + for cam in CameraDevice.getAvailableDevices(best=False): + # skip non-matching devices + if index not in (cam['deviceName'], cam['device']): + continue + # skip non-matching resolutions + if frameRate and not cam['frameRate'] == frameRate: + continue + # append if we got this far + resolutions.add(cam['frameSize']) + # sort + resolutions = sorted(resolutions, key=lambda x: x[0] * x[1]) + + return [None] + resolutions + @staticmethod def getAvailableDevices(best=True): """ @@ -600,6 +670,9 @@ def getAvailableDevices(best=True): profiles = [] # iterate through cameras for cams in CameraDevice.getCameras().values(): + # Skip devices with no available formats + if not cams: + continue # if requested, filter for best spec for each device if best: allCams = cams.copy() diff --git a/psychopy/hardware/joystick/__init__.py b/psychopy/hardware/joystick/__init__.py index 3175a5dd..866aeaee 100755 --- a/psychopy/hardware/joystick/__init__.py +++ b/psychopy/hardware/joystick/__init__.py @@ -16,8 +16,11 @@ 'Joystick', 'JoystickError', 'JoystickAxisNotAvailableError', - 'JoysticButtonNotAvailableError', - 'getJoystickInterfaces'] + 'JoystickButtonNotAvailableError', + 'getJoystickInterfaces', + 'getAllJoysticks', + 'getNumJoysticks' +] from psychopy import logging, visual from psychopy.hardware.joystick._base import BaseJoystickInterface @@ -65,7 +68,7 @@ class InvalidInputNameError(JoystickError): pass -class JoysticButtonNotAvailableError(JoystickError): +class JoystickButtonNotAvailableError(JoystickError): """Exception raised when a button is not available on the joystick. """ pass @@ -268,6 +271,18 @@ def getAvailableDevices(): # use the selected backend class to get the available devices global backend return getJoystickInterfaces()[backend].getAvailableDevices() + + @staticmethod + def getNumJoysticks(): + """Return the number of available joystick devices. + + Returns + ------- + int + The number of available joystick devices. + + """ + return len(Joystick.getAvailableDevices()) @property def inputLib(self): @@ -1110,6 +1125,7 @@ def getBackend(): The name of the joystick backend in use. """ + global backend return backend @@ -1214,5 +1230,19 @@ def getAllJoysticks(): return Joystick.getAvailableDevices() +def getNumJoysticks(): + """Return the number of available joysticks. + + Uses the presently set joystick backend to get the available joysticks. + + Returns + ------- + int + The number of available joysticks. + + """ + return Joystick.getNumJoysticks() + + if __name__ == "__main__": pass diff --git a/psychopy/hardware/keyboard.py b/psychopy/hardware/keyboard.py index 0feec45b..493c8bd2 100644 --- a/psychopy/hardware/keyboard.py +++ b/psychopy/hardware/keyboard.py @@ -452,8 +452,7 @@ def start(self): def stop(self): """Start recording from this keyboard""" if KeyboardDevice._backend == 'ptb': - logging.warning("Stopping key buffers but this could be dangerous if" - "other keyboards rely on the same.") + logging.info("Stopping keyboard key buffers.") for buffer in self._buffers.values(): buffer.stop() diff --git a/psychopy/hardware/lightsensor.py b/psychopy/hardware/lightsensor.py index 2424270b..7fd16ef9 100644 --- a/psychopy/hardware/lightsensor.py +++ b/psychopy/hardware/lightsensor.py @@ -699,8 +699,7 @@ def isSameDevice(self, other): def getAvailableDevices(): return [{ 'deviceName': "Light Sensor Emulator (Screen Buffer)", - 'deviceClass': "psychopy.hardware.lightsensor.ScreenBufferSampler", - 'win': "session.win" + 'deviceClass': "psychopy.hardware.lightsensor.ScreenBufferSampler" }] def resetTimer(self, clock=logging.defaultClock): diff --git a/psychopy/hardware/manager.py b/psychopy/hardware/manager.py index 5e02fb67..7f2e8b4c 100644 --- a/psychopy/hardware/manager.py +++ b/psychopy/hardware/manager.py @@ -166,7 +166,7 @@ def _resolveClassString(deviceClass): # import package try: pkg = importlib.import_module(pkgName) - except: + except (ImportError, ModuleNotFoundError): raise ModuleNotFoundError( f"Could not find module: {pkgName}" ) @@ -823,7 +823,7 @@ def importAllComponentDeviceClasses(): # import it so we can detect it try: DeviceManager._resolveClassString(cls.deviceClass) - except: + except Exception: logging.warn( f"Failed to load class {cls.deviceClass} from specification in " f"{cls.__name__} ({emt.__name__})" diff --git a/psychopy/hardware/microphone/__init__.py b/psychopy/hardware/microphone/__init__.py new file mode 100644 index 00000000..679b3f2a --- /dev/null +++ b/psychopy/hardware/microphone/__init__.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +"""Classes and functions managing audio capture devices +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "MicrophoneDevice", +] + +import importlib.metadata +from psychopy.preferences import prefs +from psychopy import logging + + +class MicrophoneDevice: + # selected backend + backend = None + # known backends + backends = { + 'ptb': importlib.metadata.EntryPoint( + name="ptb", + value="psychopy.hardware.microphone.microphone_psychtoolbox:PsychtoolboxMicrophoneDevice", + group="psychopy.hardware.microphone.backends" + ), + 'sounddevice': importlib.metadata.EntryPoint( + name="sounddevice", + value="psychopy.hardware.microphone.microphone_soundevice:SoundDeviceMicrophoneDevice", + group="psychopy.hardware.microphone.backends" + ) + } + # alias backend names + backends['psychtoolbox'] = backends['ptb'] + backends['sd'] = backends['sounddevice'] + + def __new__(cls, *args, **kwargs): + backend = cls.resolveBackend() + + return backend(*args, **kwargs) + + @classmethod + def resolveBackend(cls): + backend = cls.backend + # if backend is None, get from prefs + if backend is None: + backend = prefs.hardware['audioLib'] + # handle list + if isinstance(backend, (list, tuple)): + try: + # try to get the first valid backend + backend = [ + val for val in backend if val in cls.backends + ][0] + except: + # otherwise get the first backend + backend = backend[0] + # if not present, error + if backend not in cls.backends: + raise ModuleNotFoundError( + f"Invalid value '{backend}' for {cls.__name__}.backend, known backends are: {list(cls.backends)}" + ) + + # import backend + try: + return cls.backends[backend].load() + except ImportError: + # if backend fails to import, remove it from .backends + del cls.backends[backend] + # if there's no backends left, error + if not len(cls.backends): + raise ImportError( + "All audio backends failed to load." + ) + # try next option + cls.backend = list(cls.backends)[0] + # log + logging.error( + f"Failed to load {backend} backend, trying {cls.backend}..." + ) + + return cls.resolveBackend() + + @staticmethod + def getAvailableDevices(): + return MicrophoneDevice.resolveBackend().getAvailableDevices() + + @classmethod + def getBackends(cls): + """ + Get all available Sound backends (by name) + + Returns + ------- + dict[str:importlib.metadata.EntryPoint] + Dict mapping backend names to backend entry points - call `.load` on an entry point to + import the relevant module. + """ + + return cls.backends + + +# get sound backends from plugins +for ep in importlib.metadata.entry_points(group="psychopy.hardware.microphone.backends"): + MicrophoneDevice.backends[ep.name] = ep diff --git a/psychopy/hardware/microphone/_base.py b/psychopy/hardware/microphone/_base.py new file mode 100644 index 00000000..28f33a9f --- /dev/null +++ b/psychopy/hardware/microphone/_base.py @@ -0,0 +1,348 @@ +# -*- coding: utf-8 -*- + +"""Device interfaces for physical microphone devices. + +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "MicrophoneResponse", + "BaseMicrophoneDevice", +] + +import psychopy.logging as logging +from psychopy.preferences import prefs +from psychopy import logging as logging, prefs, core +from psychopy.hardware.exceptions import DeviceNotConnectedError +from psychopy.localization import _translate +from psychopy.hardware import BaseDevice, BaseResponse, BaseResponseDevice +from psychopy.sound.audiodevice import AudioDeviceInfo, AudioDeviceStatus +from psychopy.tools import systemtools as st +from psychopy.tools.audiotools import SAMPLE_RATE_48kHz + +# set the audio backend from preferences +try: + backend = prefs.hardware['audioLib'][0] +except (KeyError, IndexError): + logging.warning( + "Audio library preference not found or empty, defaulting to 'sounddevice' for " + "audio capture. To specify a different library, set the 'audioLib' preference " + "to a list with the desired library name as the first element." + ) + backend = 'sounddevice' + + +class MicrophoneResponse(BaseResponse): + """Base class for microphone responses, used by listeners attached to MicrophoneDevice + instances. + """ + pass + + +class BaseMicrophoneDevice(BaseDevice): + """Base class for microphone devices. + + This class opens a stream to a physical microphone device and passes the data to + clients of type `psychopy.sound.Microphone`. Whether samples are passed to clients + is determined by the requested start time of each client; if the current time of + the stream is before the requested start time of a client, samples will not be passed + to that client. + + """ + # other instances of MicrophoneDevice, stored by index + _streams = {} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._recording = None + self._stream = None + self._isStarted = False + + # settings for the mic interface + self._sampleRateHz = kwargs.get('sampleRateHz', SAMPLE_RATE_48kHz) + self._channels = kwargs.get('channels', 1) + + # sampling settings + self._pollingInterval = kwargs.get('pollingInterval', 0.1) + self._absStreamStartTime = -1.0 # absolute time the stream was started + + # Real-time buffer for storing the latest audio samples from the stream. This is + # used for computing various properties of the incoming audio, e.g. current volume + # level. This updates every time the stream is polled for new audio data, and is + # cleared when the stream is closed. + self._rtBuffer = [] + + # List of Microphone objects attached to this device stream. If present, the stream will + # remain open until all attached Microphone objects have been removed. When samples + # are recorded, they will be written to the recording buffer of each attached Microphone + # object according to the requested start time of each Microphone. + self._clients = [] + + # listeners for liason + self.listeners = [] + + # --- device management methods --- + + def addListener(self, listener, startLoop=False): + """ + Add a listener, which will receive all the same messages as this device. + + Parameters + ---------- + listener : str or psychopy.hardware.listener.BaseListener + Either a Listener object, or use one of the following strings to create one: + - "liaison": Create a LiaisonListener with DeviceManager.liaison as the server + - "print": Create a PrintListener with default settings + - "log": Create a LoggingListener with default settings + startLoop : bool + If True, then upon adding the listener, start up an asynchronous loop to + dispatch messages. + + """ + # add listener as normal + listener = BaseResponseDevice.addListener( + self, listener, startLoop=startLoop) + + # if we're starting a listener loop, start recording + if startLoop: + self.start() + + return listener + + def clearListeners(self): + """ + Remove any listeners from this device. + + Returns + ------- + bool + True if completed successfully + """ + # clear listeners as normal + resp = BaseResponseDevice.clearListeners(self) + + # stop recording + self.stop() + + return resp + + def dispatchMessages(self, clear=True): + """ + Dispatch current volume as a MicrophoneResponse object to any attached listeners. + + Parameters + ---------- + clear : bool + If True, will clear the recording up until now after dispatching the volume. This is + useful if you're just sampling volume and aren't wanting to store the recording. + """ + # if mic is not recording, there's nothing to dispatch + if not self.isStarted: + return + + # poll the mic now + self.poll() + # create a response object + message = MicrophoneResponse( + logging.defaultClock.getTime(), + self.getCurrentVolume(), + device=self, + ) + # dispatch to listeners + for listener in self.listeners: + listener.receiveMessage(message) + + return message + + # --- methods for managing the microphone stream --- + + @property + def isOpen(self): + """Whether the microphone stream is currently open (`bool`). + """ + return self._stream is not None + + @property + def isStarted(self): + """Whether the microphone stream is currently started and taking samples (`bool`). + """ + return self._isStarted + + def open(self): + """Open the microphone device for recording. + + This intializes a stream to the physical microphone device and prepares it + for recording. The stream will remain open until `close()` is called, or + until all attached Microphone clients have been removed. + + """ + raise NotImplementedError("open() method must be implemented by subclass") + + def close(self): + """Close the microphone device and release any resources. + """ + raise NotImplementedError("close() method must be implemented by subclass") + + def start(self, *args, **kwargs): + """Start the taking samples from the microphone. Alias of `open()`. + """ + try: + self.open() + except NotImplementedError: + NotImplementedError( + 'Called start() on a MicrophoneDevice subclass that does not ' \ + 'implement open().') + + def stop(self, *args, **kwargs): + """Stop recording audio from the microphone. Alias of `close()`. + """ + try: + self.close() + except NotImplementedError: + NotImplementedError( + 'Called stop() on a MicrophoneDevice subclass that does not ' + 'implement close().') + + def poll(self): + """Poll the microphone device for new audio data. + + This method should be called at regular intervals while the microphone stream + is open in order to process incoming audio data and pass it to attached + Microphone clients. Be aware that not all backends require polling to be done + manually. + + """ + raise NotImplementedError("poll() method must be implemented by subclass") + + # --- methods for managing attached Microphone clients --- + + @property + def clients(self): + """Microphone objects presently attached to this device stream (`list`). + + If present, the stream will remain open until all attached Microphone objects + have been removed. + + """ + return self._clients + + @property + def clientCount(self): + """The number of Microphone objects presently attached to this device + stream (`int`). + """ + return len(self._clients) + + @property + def canClose(self): + """Whether the stream can be closed, i.e. whether there are any attached + Microphone clients that are currently using this stream. + """ + return self.clientCount == 0 + + def bind(self, mic): + """Bind a Microphone object to this device stream. + + If an object of type `psychopy.sound.Microphone` is bound to this stream, + audio data will be written to the recording buffer of that object according + to the requested start time. + + Parameters + ---------- + mic : `psychopy.sound.Microphone` + The microphone object to bind. + + """ + # check if the microphone is already attached + for m in self._clients: + if m is mic: + logging.warning( + "Attempted to bind a Microphone object to a stream that " \ + "it is already bound to." + ) + return + + self._clients.append(mic) + + def unbind(self, mic): + """Unbind a Microphone object from this device stream. + + Parameters + ---------- + mic : `psychopy.sound.Microphone` + The microphone object to unbind. + + """ + # probably better to use `set()` here, maybe later we can do that + for i, m in enumerate(self._clients): + if m is mic: + del self._clients[i] + return + + logging.warning( + "Attempted to unbind a Microphone object from a stream that " \ + "it is not bound to." + ) + + def unbindAll(self): + """Unbind all Microphone objects from this device stream. + """ + self._clients.clear() + + # --- utility methods --- + + def getTime(self): + """Get the current time of the microphone stream in seconds. + + This is used for determining when to start writing audio data to attached + Microphone clients based on their requested start time. + + Returns + ------- + float + The current time of the microphone stream in seconds. + + """ + return -1.0 + + @property + def currentVolume(self): + """Get the current volume level of the microphone input. + + This method is intended to be used for visualizing the input level of + the microphone, e.g. in a volume meter. + + Returns + ------- + float + The current volume level, normalized to the range [0.0, 1.0]. + + """ + return self.getCurrentVolume() + + def getCurrentVolume(self): + """Get the current volume level of the microphone input. + + This method is intended to be used for visualizing the input level of + the microphone, e.g. in a volume meter. + + Returns + ------- + float + The current volume level, normalized to the range [0.0, 100.0]. + + """ + if self._rtBuffer is None: + return 0.0 + + # compute the root mean square (RMS) of the samples in the real-time buffer + rms = ((self._rtBuffer ** 2).mean() ** 0.5) * 10.0 + + return rms[0] if len(rms) > 1 else rms + + +if __name__ == "__main__": + pass diff --git a/psychopy/hardware/microphone.py b/psychopy/hardware/microphone/microphone_psychtoolbox.py similarity index 74% rename from psychopy/hardware/microphone.py rename to psychopy/hardware/microphone/microphone_psychtoolbox.py index a9c60d2c..483f2ed4 100644 --- a/psychopy/hardware/microphone.py +++ b/psychopy/hardware/microphone/microphone_psychtoolbox.py @@ -1,6 +1,19 @@ +# -*- coding: utf-8 -*- + +"""Psychotoolbox interface for microphones. +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "PsychtoolboxMicrophoneDevice", +] + import sys import time - +from ._base import BaseMicrophoneDevice, MicrophoneResponse import numpy as np from psychtoolbox import audio as audio from psychopy import logging as logging, prefs, core @@ -14,6 +27,7 @@ AudioStreamError, AudioRecordingBufferFullError from psychopy.tools import systemtools as st from psychopy.tools.audiotools import SAMPLE_RATE_48kHz +import threading _hasPTB = True @@ -28,11 +42,7 @@ _hasPTB = False -class MicrophoneResponse(BaseResponse): - pass - - -class MicrophoneDevice(BaseDevice, aliases=["mic", "microphone"]): +class PsychtoolboxMicrophoneDevice(BaseMicrophoneDevice, aliases=["mic", "microphone"]): """Class for recording audio from a microphone or input stream. Creating an instance of this class will open a stream using the specified @@ -83,6 +93,12 @@ class MicrophoneDevice(BaseDevice, aliases=["mic", "microphone"]): of `1` will keep the microphone running (or 'hot') with reduces latency when th recording is started. Cannot be set when after initialization at this time. + pollingInterval : float or None + Time in seconds to poll the audio stream for new samples. If `None`, the + stream will not be polled automatically and the user will need to call + `poll()` manually to update the recording buffer. This should be less than + the `streamBufferSecs` parameter to ensure that the buffer does not + overflow. By default, polling occurs every 0.1 seconds. Examples -------- @@ -119,8 +135,6 @@ class MicrophoneDevice(BaseDevice, aliases=["mic", "microphone"]): # WASAPI devices will be returned when calling static method # `Microphone.getDevices()` enforceWASAPI = True - # other instances of MicrophoneDevice, stored by index - _streams = {} def __init__( self, @@ -132,9 +146,11 @@ def __init__( policyWhenFull='warn', exclusive=False, audioRunMode=1, + pollingInterval=0.1, # legacy audioLatencyMode=None, ): + super().__init__() if not _hasPTB: # fail if PTB is not installed raise ModuleNotFoundError( @@ -156,7 +172,7 @@ def __init__( self._device = index elif index in (-1, None): # get all devices - _devices = MicrophoneDevice.getDevices() + _devices = PsychtoolboxMicrophoneDevice.getDevices() # if there are none, error if not len(_devices): raise DeviceNotConnectedError( @@ -164,7 +180,7 @@ def __init__( "Could not choose default recording device as no recording " "devices are connected." ), - deviceClass=MicrophoneDevice + deviceClass=PsychtoolboxMicrophoneDevice ) # Try and get the best match which are compatible with the user's @@ -203,7 +219,7 @@ def __init__( # if given a str that's a name from DeviceManager, get info from device device = DeviceManager.getDevice(index) # try to duplicate and fail if not found - if isinstance(device, MicrophoneDevice): + if isinstance(device, PsychtoolboxMicrophoneDevice): self._device = device._device else: # if not found, find best match @@ -264,16 +280,16 @@ def __init__( (audioRunMode == 0 or audioRunMode == 1) self._audioRunMode = int(audioRunMode) - # open stream - self._stream = None - self._opening = self._closing = False - self.open() + # polling, may be None if user doesn't want to use auto polling + self._pollingInterval = pollingInterval + self._pollingTimerThread = None # set later + self._pollingLock = threading.Lock() # lock to prevent race conditions # status flag for Builder self._statusFlag = NOT_STARTED # recording buffer information - self._recording = [] # use a list + self._recordingBuffer = [] # use a list self._totalSamples = 0 self._absRecStartTime = self._absRecStopTime = -1.0 self._recPositionSecs = 0.0 @@ -282,13 +298,13 @@ def __init__( -1 if maxRecordingSize is None else int(maxRecordingSize)) self._policyWhenFull = policyWhenFull - # internal state - self._possiblyAsleep = False - self._isStarted = False # internal state - logging.debug('Audio capture device #{} ready'.format( self._device.deviceIndex)) + # open stream + self._opening = self._closing = False + self.open() + # list to store listeners in self.listeners = [] @@ -391,7 +407,7 @@ def findBestDevice(self, index, sampleRateHz, channels): _translate( "Could not find any audio recording device with index {index}", ).format(index=index), - deviceClass=MicrophoneDevice + deviceClass=PsychtoolboxMicrophoneDevice ) return chosenDevice @@ -437,12 +453,12 @@ def getDevices(): """ try: - MicrophoneDevice.enforceWASAPI = bool(prefs.hardware["audioForceWASAPI"]) + PsychtoolboxMicrophoneDevice.enforceWASAPI = bool(prefs.hardware["audioForceWASAPI"]) except KeyError: pass # use default if option not present in settings # query PTB for devices - if MicrophoneDevice.enforceWASAPI and sys.platform == 'win32': + if PsychtoolboxMicrophoneDevice.enforceWASAPI and sys.platform == 'win32': allDevs = audio.get_devices(device_type=13) else: allDevs = audio.get_devices() @@ -511,7 +527,15 @@ def device(self): @property def recording(self): """Reference to the current recording buffer (`RecordingBuffer`).""" - return self._recording + return self._recordingBuffer + + @property + def recordingBuffer(self): + return self._recordingBuffer + + @recordingBuffer.setter + def recordingBuffer(self, value): + self._recordingBuffer = value @property def recBufferSecs(self): @@ -642,7 +666,7 @@ def testDevice(self, duration=1, testSound=None): # sleep for duration time.sleep(duration) # poll to refresh recording - self.poll() + self._pollWithLock() # get new clip clip = self.getRecording() # check that clip matches test sound @@ -666,7 +690,64 @@ def recordingTime(self): """ return self._recPositionSecs + + def _setupAutoPolling(self): + """Set up automatic polling of the stream at regular intervals. + This is used to ensure that the recording buffer is updated with new + samples from the stream even if the user does not call `poll()` manually. + """ + if self._pollingInterval is None: + logging.debug( + "No polling interval specified, user must call `poll()` manually to update " + "the recording buffer with new samples.") + return # do not set up polling if no interval specified + + class PollingTimerThread(threading.Thread): + """Thread class used to call the poll method at regular + intervals. + """ + def __init__(self, interval, function): + super().__init__() + self.interval = interval + self.function = function + self._stop_event = threading.Event() + + def run(self): + while not self._stop_event.is_set(): + time.sleep(self.interval) + self.function() + + def cancel(self): + self._stop_event.set() + + if self._pollingTimerThread is not None: + self._pollingTimerThread.cancel() + + # make sure the polling interval is a positive number + self._pollingInterval = float(self._pollingInterval) + if self._pollingInterval <= 0: + raise ValueError("Polling interval must be a positive number.") + + logging.debug( + "Setting up automatic polling of the audio stream every {} seconds.".format( + self._pollingInterval)) + + # make sure the polling interval is reasonable given the stream buffer size to avoid overflow + if self._pollingInterval >= self._streamBufferSecs: + logging.warning( + "Polling interval ({}) is greater than or equal to the stream buffer size ({}). " + "This may result in buffer overflow and lost samples. Consider reducing the polling " + "interval or increasing the stream buffer size.".format( + self._pollingInterval, self._streamBufferSecs)) + + # set up a thread to call the poll method at regular intervals + self._pollingTimerThread = PollingTimerThread( + self._pollingInterval, + self._pollWithLock) + self._pollingTimerThread.daemon = True + self._pollingTimerThread.start() + def start(self, when=None, waitForStart=0, stopTime=None): """Start an audio recording. @@ -692,35 +773,7 @@ def start(self, when=None, waitForStart=0, stopTime=None): Absolute time the stream was started. """ - # check if the stream has been - if self.isStarted: - return None - - if self._stream is None: - raise AudioStreamError("Stream not ready.") - # reset timer for possibly asleep - self._possiblyAsleep = False - # reset the recording buffer - self._recording = [] - self._totalSamples = 0 - self._recPositionSecs = 0.0 - - # reset warnings - # self._warnedRecBufferFull = False - - self._absRecStartTime = self._stream.start( - repetitions=0, - when=when, - wait_for_start=int(waitForStart), - stop_time=stopTime) - - # recording has begun or is scheduled to do so - self._isStarted = True - - logging.debug( - 'Scheduled start of audio capture for device #{} at t={}.'.format( - self._device.deviceIndex, self._absRecStartTime)) - + self.open() return self._absRecStartTime def record(self, when=None, waitForStart=0, stopTime=None): @@ -778,15 +831,19 @@ def stop(self, blockUntilStopped=True, stopTime=None): """ # This function must be idempotent since it can be invoked at any time # whether a stream is started or not. - if not self.isStarted or self._stream._closed: + if not self._isStarted or self._stream._closed: return + if self._pollingTimerThread is not None: + self._pollingTimerThread.cancel() # stop the polling thread if it's running + # poll remaining samples, if any - _ = self.poll() + _ = self._pollWithLock() startTime, endPositionSecs, xruns, estStopTime = self._stream.stop( - block_until_stopped=int(blockUntilStopped), - stopTime=stopTime) + block_until_stopped=0, + stopTime=None) + self._isStarted = False logging.debug( @@ -819,6 +876,9 @@ def pause(self, blockUntilStopped=True, stopTime=None): previously before `start()`. """ + if self._pollingTimerThread is not None: + self._pollingTimerThread.cancel() + return self.stop(blockUntilStopped=blockUntilStopped, stopTime=stopTime) def open(self): @@ -831,19 +891,19 @@ def open(self): # set flag that it's mid-open self._opening = True # search for open streams and if there is one, use it - if self._device.deviceIndex in MicrophoneDevice._streams: + if self._device.deviceIndex in PsychtoolboxMicrophoneDevice._streams: logging.debug( f"Assigning audio stream for device #{self._device.deviceIndex} to a new " f"MicrophoneDevice object." ) - self._stream = MicrophoneDevice._streams[self._device.deviceIndex] + self._stream = PsychtoolboxMicrophoneDevice._streams[self._device.deviceIndex] return # if no open streams, make one logging.debug( f"Opening new audio stream for device #{self._device.deviceIndex}." ) - self._stream = MicrophoneDevice._streams[self._device.deviceIndex] = audio.Stream( + self._stream = PsychtoolboxMicrophoneDevice._streams[self._device.deviceIndex] = audio.Stream( device_id=self._device.deviceIndex, latency_class=self._audioLatencyMode, mode=self._mode, @@ -863,26 +923,89 @@ def open(self): logging.debug( 'Allocated stream buffer to hold {} seconds of data'.format( self._streamBufferSecs)) + + # check if the stream has been + if self.isStarted: + return None + + if self._stream is None: + raise AudioStreamError("Stream not ready.") + + # reset timer for possibly asleep + self._possiblyAsleep = False + # reset the recording buffer + self._recordingBuffer = [] + self._totalSamples = 0 + self._recPositionSecs = 0.0 + + # reset warnings + # self._warnedRecBufferFull = False + + # open the stream and take audio samples + self._absRecStartTime = self._stream.start( + repetitions=0, + when=0, + wait_for_start=0, + stop_time=None) + + # recording has begun or is scheduled to do so + self._isStarted = True + + # polling, this thread calls the `poll` method at regular intervals + if self._pollingInterval is not None: + self._setupAutoPolling() + + logging.debug( + 'Scheduled start of audio capture for device #{} at t={}.'.format( + self._device.deviceIndex, self._absRecStartTime)) + # set flag that it's done opening self._opening = False def close(self): + """Close the audio stream. + + If there are any clients still using the stream, the close operation + will be deferred until all clients have released the stream. + + Parameters + ---------- + force : bool + If `True`, forces the stream to close even if there are still clients + using it. Use with caution as this may cause errors in any clients + still using the stream. + """ - Close the audio stream. - """ + if self._clients: # prevent closing until all clients have called their `close` method + logging.debug( + "Attempted to close microphone stream while there are still {} " + "client(s) using it.".format(len(self._clients)) + ) + return + + # stop polling thread if it's running + if self._pollingTimerThread is not None: + self._pollingTimerThread.cancel() + self._pollingTimerThread = None + # clear any attached listeners self.clearListeners() + # do nothing further if already closed if self._stream._closed: return + # set flag that it's mid-close self._closing = True + # remove ref to stream - if self._device.deviceIndex in MicrophoneDevice._streams: - MicrophoneDevice._streams.pop(self._device.deviceIndex) + if self._device.deviceIndex in PsychtoolboxMicrophoneDevice._streams: + PsychtoolboxMicrophoneDevice._streams.pop(self._device.deviceIndex) + # close stream self._stream.close() logging.debug('Stream closed') + # set flag that it's done closing self._closing = False @@ -909,7 +1032,7 @@ def reopen(self): def recordingEmpty(self): """`True` if the recording buffer is empty (`bool`). """ - return len(self._recording) == 0 + return len(self._recordingBuffer) == 0 @property def recordingFull(self): @@ -928,6 +1051,24 @@ def recStartTime(self): """ return self._absRecStartTime + + def _getTime(self): + """Get the current system time in seconds (`float`). + + This is used internally to timestamp recordings. It is not guaranteed to + be the same time base as the one used by the audio stream, so absolute + times returned by the stream should be used when possible. + + """ + return time.time() + + def _pollWithLock(self): + """Call `poll` with the polling lock acquired. This is used internally to + prevent race conditions when `poll` is called from the polling thread and + from user code at the same time. + """ + with self._pollingLock: + return self.poll() def poll(self): """Poll audio samples. @@ -943,7 +1084,7 @@ def poll(self): Returns ------- - int + tuple of (float, bool) Current recording position in samples (`int`) and number of overflows (`int`). If the returned position is less than zero (negative) then microphone is still starting up and wont be ready @@ -954,29 +1095,36 @@ def poll(self): buffer with `bufferSecs`. """ - if not self.isStarted: + # if not self._isStarted: + # logging.warning( + # "Attempted to poll samples from mic which hasn't started." + # ) + # return + if self._stream is None: logging.warning( - "Attempted to poll samples from mic which hasn't started." + "Attempted to poll samples from mic which has no stream." ) - return + return (None, None) if self._stream._closed: logging.warning( "Attempted to poll samples from mic which has been closed." ) - return + return (None, None) if self._opening or self._closing: action = "opening" if self._opening else "closing" logging.warning( f"Attempted to poll microphone while the stream was still {action}. Samples will be " f"lost." ) - return + return (None, None) - # figure out what to do with this other information - audioData, absRecPosition, overflow, cStartTime = \ - self._stream.get_audio_data() + # poll the buffer and get new audio samples + audioData, absRecPosition, overflow, cStartTime = self._stream.get_audio_data() + sampleCount = len(audioData) + self._rtBuffer = audioData.copy() - if len(audioData): + # detect and handle the microphone going to sleep + if sampleCount: # if we got samples, the device is awake, so stop figuring out if it's asleep self._possiblyAsleep = False elif self._possiblyAsleep is False: @@ -1004,24 +1152,30 @@ def poll(self): "with `bufferSecs`.") # add samples to recording buffer - if len(audioData): - # add samples to recording buffer - self._recording.append( - AudioClip(audioData, sampleRateHz=self._sampleRateHz)) - self._totalSamples += audioData.shape[0] - - if self.recordingFull and not self._policyWhenFull == 'ignore': - if self._policyWhenFull == 'warn': - logging.warning( - "Recording buffer is full, no more samples will be added.") - elif self._policyWhenFull == 'error': - raise AudioStreamError( - "Recording buffer is full, no more samples will be added.") + if sampleCount and self._clients: + # compute the absulute time of the end of the current recording pos + absBlockStartTime = cStartTime + (absRecPosition / self._sampleRateHz) + absBlockEndTime = cStartTime + ( + (absRecPosition + sampleCount) / self._sampleRateHz) - # update the recording position - self._absRecStopTime = absRecPosition / self._sampleRateHz - self._recPositionSecs = self._absRecStopTime - self._absRecStartTime - + # iterate over attached microphone objects and write data to their + # recording buffers if we're past the requested start time + for mic in self._clients: + reqStartTime = mic._tRecordingStartRequested + reqStopTime = mic._tRecordingStopRequested + if reqStartTime < absBlockEndTime and ( + reqStopTime is None or absBlockStartTime < reqStopTime): + mic._recordingBuffer.append(self._rtBuffer) + mic._nRecordedFrames += sampleCount + + # if self.recordingFull and not self._policyWhenFull == 'ignore': + # if self._policyWhenFull == 'warn': + # logging.warning( + # "Recording buffer is full, no more samples will be added.") + # elif self._policyWhenFull == 'error': + # raise AudioStreamError( + # "Recording buffer is full, no more samples will be added.") + return absRecPosition, overflow def _mergeAudioFragments(self): @@ -1038,29 +1192,28 @@ def _mergeAudioFragments(self): otherwise. """ - if len(self._recording) < 2: + if len(self._recordingBuffer) < 2: return False # get the sum of all audio samples in the recording buffer totalSamples = sum( - [segment.samples.shape[0] for segment in self._recording]) + [segment.samples.shape[0] for segment in self._recordingBuffer]) # create a new array to hold all samples fullSegment = np.zeros( - (totalSamples, self._recording[0].channels), + (totalSamples, self._recordingBuffer[0].channels), dtype=np.float32, order='C') # copy samples from each segment into the full segment idx = 0 - for segment in self._recording: - nSamples = segment.samples.shape[0] - fullSegment[idx:idx + nSamples, :] = segment.samples + for segment in self._recordingBuffer: + nSamples = segment.shape[0] + fullSegment[idx:idx + nSamples, :] = segment idx += nSamples # set the recording - self._recording = [ - AudioClip(fullSegment, sampleRateHz=self._sampleRateHz)] + self._recordingBuffer = [fullSegment] return True @@ -1087,20 +1240,20 @@ def _getSegment(self, start=0, end=None): self._mergeAudioFragments() # merge audio fragments - if not len(self._recording[0].samples): + if not len(self._recordingBuffer[0]): raise AudioStreamError( "Could not access recording as microphone has sent no samples." ) if start == 0 and end is None: # return full recording - return self._recording[0] + return self._recordingBuffer[0] # get a range of samples within the recording buffer idxStart = int(start * self._sampleRateHz) idxEnd = -1 if end is None else int(end * self._sampleRateHz) return AudioClip( - np.array(self._recording[0].samples[idxStart:idxEnd, :], + np.array(self._recordingBuffer[0][idxStart:idxEnd, :], dtype=np.float32, order='C'), sampleRateHz=self._sampleRateHz) @@ -1149,27 +1302,12 @@ def getCurrentVolume(self, timeframe=0.2): return 0 # poll most recent samples - self.poll() + self._pollWithLock() if self.recordingEmpty: return 0.0 - # merge last few recording fragments into a single segment - requiredSamples = int(timeframe * self._sampleRateHz) - sampleBuffers = [] - for segment in reversed(self._recording): - nSamples = segment.samples.shape[0] - requiredSamples -= nSamples - if requiredSamples < 0: - sampleBuffers.insert(0, segment.samples[requiredSamples:, :]) - break - sampleBuffers.insert(0, segment.samples) - - # merge the samples - sampleBuffer = np.concatenate( - sampleBuffers, axis=0, dtype=np.float32) - - clip = AudioClip(sampleBuffer, sampleRateHz=self._sampleRateHz) + clip = AudioClip(self._rtBuffer, sampleRateHz=self._sampleRateHz) # get average volume rms = clip.rms() * 10 @@ -1232,7 +1370,7 @@ def dispatchMessages(self, clear=True): return # poll the mic now - self.poll() + self._pollWithLock() # create a response object message = MicrophoneResponse( logging.defaultClock.getTime(), @@ -1286,7 +1424,7 @@ def _takeReading(dur): self.start() # poll while active while countdown.getTime() > 0: - self.poll() + self._pollWithLock() # get volume vol = self.getCurrentVolume(timeframe=dur) # if multi-channel, take the max @@ -1317,7 +1455,7 @@ def _takeReading(dur): # generate a sound for this speaker try: snd = sound.Sound("A", stereo=True, speaker=speaker) - except: + except Exception: # silently skip on error continue # get a baseline volume @@ -1333,298 +1471,7 @@ def _takeReading(dur): foundSpeakers.append(speaker) return foundSpeakers + - -class RecordingBuffer: - """Class for a storing a recording from a stream. - - Think of instances of this class behaving like an audio tape whereas the - `MicrophoneDevice` class is the tape recorder. Samples taken from the stream are - written to the tape which stores the data. - - Used internally by the `MicrophoneDevice` class, users usually do not create - instances of this class themselves. - - Parameters - ---------- - sampleRateHz : int - Sampling rate for audio recording in Hertz (Hz). By default, 48kHz - (``sampleRateHz=48000``) is used which is adequate for most consumer - grade microphones (headsets and built-in). - channels : int - Number of channels to record samples to `1=Mono` and `2=Stereo`. - maxRecordingSize : int - Maximum recording size in kilobytes (Kb). Since audio recordings tend to - consume a large amount of system memory, one might want to limit the - size of the recording buffer to ensure that the application does not run - out of memory. By default, the recording buffer is set to 24000 KB (or - 24 MB). At a sample rate of 48kHz, this will result in 62.5 seconds of - continuous audio being recorded before the buffer is full. - policyWhenFull : str - What to do when the recording buffer is full and cannot accept any more - samples. If 'ignore', samples will be silently dropped and the `isFull` - property will be set to `True`. If 'warn', a warning will be logged and - the `isFull` flag will be set. Finally, if 'error' the application will - raise an exception. - - """ - def __init__(self, sampleRateHz=SAMPLE_RATE_48kHz, channels=2, - maxRecordingSize=None, policyWhenFull='ignore'): - self._channels = channels - self._sampleRateHz = sampleRateHz - self._maxRecordingSize = maxRecordingSize or 64000 - self._samples = None # `ndarray` created in _allocRecBuffer` - self._offset = 0 # recording offset - self._lastSample = 0 # offset of the last sample from stream - self._spaceRemaining = None # set in `_allocRecBuffer` - self._totalSamples = None # set in `_allocRecBuffer` - - self._policyWhenFull = policyWhenFull - self._warnedRecBufferFull = False - self._loops = 0 - - self._allocRecBuffer() - - def _allocRecBuffer(self): - """Allocate the recording buffer. Called internally if properties are - changed.""" - # allocate another array - nBytes = self._maxRecordingSize * 1000 - recArraySize = int((nBytes / self._channels) / (np.float32()).itemsize) - - self._samples = np.zeros( - (recArraySize, self._channels), dtype=np.float32, order='C') - - # sanity check - assert self._samples.nbytes == nBytes - self._totalSamples = len(self._samples) - self._spaceRemaining = self._totalSamples - - @property - def samples(self): - """Reference to the actual sample buffer (`ndarray`).""" - return self._samples - - @property - def bufferSecs(self): - """Capacity of the recording buffer in seconds (`float`).""" - return self._totalSamples / self._sampleRateHz - - @property - def nbytes(self): - """Number of bytes the recording buffer occupies in memory (`int`).""" - return self._samples.nbytes - - @property - def sampleBytes(self): - """Number of bytes per sample (`int`).""" - return np.float32().itemsize - - @property - def spaceRemaining(self): - """The space remaining in the recording buffer (`int`). Indicates the - number of samples that the buffer can still add before overflowing. - """ - return self._spaceRemaining - - @property - def isFull(self): - """Is the recording buffer full (`bool`).""" - return self._spaceRemaining <= 0 - - @property - def totalSamples(self): - """Total number samples the recording buffer can hold (`int`).""" - return self._totalSamples - - @property - def writeOffset(self): - """Index in the sample buffer where new samples will be written when - `write()` is called (`int`). - """ - return self._offset - - @property - def lastSample(self): - """Index of the last sample recorded (`int`). This can be used to slice - the recording buffer, only getting data from the beginning to place - where the last sample was written to. - """ - return self._lastSample - - @property - def loopCount(self): - """Number of times the recording buffer restarted (`int`). Only valid if - `loopback` is ``True``.""" - return self._loops - - @property - def maxRecordingSize(self): - """Maximum recording size in kilobytes (`int`). - - Since audio recordings tend to consume a large amount of system memory, - one might want to limit the size of the recording buffer to ensure that - the application does not run out of memory. By default, the recording - buffer is set to 24000 KB (or 24 MB). At a sample rate of 48kHz, this - will result in 62.5 seconds of continuous audio being recorded before - the buffer is full. - - Setting this value will allocate another recording buffer of appropriate - size. Avoid doing this in any time sensitive parts of your application. - - """ - return self._maxRecordingSize - - @maxRecordingSize.setter - def maxRecordingSize(self, value): - value = int(value) - - # don't do this unless the value changed - if value == self._maxRecordingSize: - return - - # if different than last value, update the recording buffer - self._maxRecordingSize = value - self._allocRecBuffer() - - def seek(self, offset, absolute=False): - """Set the write offset. - - Use this to specify where to begin writing samples the next time `write` - is called. You should call `seek(0)` when starting a new recording. - - Parameters - ---------- - offset : int - Position in the sample buffer to set. - absolute : bool - Use absolute positioning. Use relative positioning if `False` where - the value of `offset` will be added to the current offset. Default - is `False`. - - """ - if not absolute: - self._offset += offset - else: - self._offset = absolute - - assert 0 <= self._offset < self._totalSamples - self._spaceRemaining = self._totalSamples - self._offset - - def write(self, samples): - """Write samples to the recording buffer. - - Parameters - ---------- - samples : ArrayLike - Samples to write to the recording buffer, usually of a stream. Must - have the same number of dimensions as the internal array. - - Returns - ------- - int - Number of samples overflowed. If this is zero then all samples have - been recorded, if not, the number of samples rejected is given. - - """ - nSamples = len(samples) - if self.isFull: - if self._policyWhenFull in ('warn', 'warning'): - # if policy is warn, we log a warning then proceed as if ignored - if not self._warnedRecBufferFull: - logging.warning( - f"Audio recording buffer filled! This means that no " - f"samples are saved beyond {round(self.bufferSecs, 6)} " - f"seconds. Specify a larger recording buffer next time " - f"to avoid data loss.") - logging.flush() - self._warnedRecBufferFull = True - return nSamples - elif self._policyWhenFull == 'error': - # if policy is error, we fully error - raise AudioRecordingBufferFullError( - "Cannot write samples, recording buffer is full.") - elif self._policyWhenFull == ('rolling', 'roll'): - # if policy is rolling, we clear the first half of the buffer - toSave = self._totalSamples - len(samples) - # get last 0.1s so we still have enough for volume measurement - savedSamples = self._recording._samples[-toSave:, :] - # log - if not self._warnedRecBufferFull: - logging.warning( - f"Microphone buffer reached, as policy when full is 'roll'/'rolling' the " - f"oldest samples will be cleared to make room for new samples." - ) - logging.flush() - self._warnedRecBufferFull = True - # clear samples - self._recording.clear() - # reassign saved samples - self._recording.write(savedSamples) - else: - # if policy is to ignore, we simply don't write new samples - return nSamples - - if not nSamples: # no samples came out of the stream, just return - return - - if self._spaceRemaining >= nSamples: - self._lastSample = self._offset + nSamples - audioData = samples[:, :] - else: - self._lastSample = self._offset + self._spaceRemaining - audioData = samples[:self._spaceRemaining, :] - - self._samples[self._offset:self._lastSample, :] = audioData - self._offset += nSamples - - self._spaceRemaining -= nSamples - - # Check if the recording buffer is now full. Next call to `poll` will - # not record anything. - if self._spaceRemaining <= 0: - self._spaceRemaining = 0 - - d = nSamples - self._spaceRemaining - return 0 if d < 0 else d - - def clear(self): - # reset all live attributes - self._samples = None - self._offset = 0 - self._lastSample = 0 - self._spaceRemaining = None - self._totalSamples = None - # reallocate buffer - self._allocRecBuffer() - - def getSegment(self, start=0, end=None): - """Get a segment of recording data as an `AudioClip`. - - Parameters - ---------- - start : float or int - Absolute time in seconds for the start of the clip. - end : float or int - Absolute time in seconds for the end of the clip. If `None` the time - at the last sample is used. - - Returns - ------- - AudioClip - Audio clip object with samples between `start` and `end`. - - """ - idxStart = int(start * self._sampleRateHz) - idxEnd = self._lastSample if end is None else int( - end * self._sampleRateHz) - - if not len(self._samples): - raise AudioStreamError( - "Could not access recording as microphone has sent no samples." - ) - - return AudioClip( - np.array(self._samples[idxStart:idxEnd, :], - dtype=np.float32, order='C'), - sampleRateHz=self._sampleRateHz) \ No newline at end of file +if __name__ == "__main__": + pass diff --git a/psychopy/hardware/microphone/microphone_soundevice.py b/psychopy/hardware/microphone/microphone_soundevice.py new file mode 100644 index 00000000..da0b3336 --- /dev/null +++ b/psychopy/hardware/microphone/microphone_soundevice.py @@ -0,0 +1,691 @@ +# -*- coding: utf-8 -*- + +"""SoundDevice interface for microphones. +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "SoundDeviceMicrophoneDevice", +] + +import sys +import time +from ._base import BaseMicrophoneDevice, MicrophoneResponse +import numpy as np +from psychopy import logging as logging, prefs, core +from psychopy.hardware.exceptions import DeviceNotConnectedError +from psychopy.localization import _translate +from psychopy.constants import NOT_STARTED +from psychopy.hardware import BaseDevice, BaseResponse, BaseResponseDevice +from psychopy.sound.audiodevice import AudioDeviceInfo, AudioDeviceStatus +from psychopy.sound.audioclip import AudioClip +from psychopy.sound.exceptions import AudioInvalidCaptureDeviceError, AudioInvalidDeviceError, \ + AudioStreamError, AudioRecordingBufferFullError +from psychopy.tools import systemtools as st +from psychopy.tools.audiotools import SAMPLE_RATE_48kHz +import atexit +import re + + +class SoundDeviceMicrophoneDevice(BaseMicrophoneDevice, aliases=["mic", "microphone"]): + """Microphone device class for the SoundDevice audio library. + + This class is used internally by `MicrophoneDevice` when the SoundDevice + audio library is selected. Users usually do not create instances of this + class themselves. + + """ + def __init__( + self, + index=None, + sampleRateHz=None, + channels=None, + streamBufferSecs=2.0, + maxRecordingSize=-1, + policyWhenFull='warn', + exclusive=False, + audioRunMode=1, + # legacy + audioLatencyMode=None + ): + super().__init__() + + try: + import sounddevice # load and check + except ImportError: + raise ModuleNotFoundError( + "Microphone audio capture requires package `sounddevice` to " + "be installed.") + + from psychopy.hardware import DeviceManager + + # numericise index if needed + if isinstance(index, str): + try: + index = int(index) + except ValueError: + pass + + # get information about the selected device + if isinstance(index, AudioDeviceInfo): + # if already an AudioDeviceInfo object, great! + self._device = index + elif index in (-1, None): + # get all devices + _devices = SoundDeviceMicrophoneDevice.getDevices() + # if there are none, error + if not len(_devices): + raise DeviceNotConnectedError( + _translate( + "Could not choose default recording device as no recording " + "devices are connected." + ), + deviceClass=SoundDeviceMicrophoneDevice + ) + + # Try and get the best match which are compatible with the user's + # specified settings. + if sampleRateHz is not None or channels is not None: + self._device = self.findBestDevice( + index=_devices[0].deviceIndex, # use first that shows up + sampleRateHz=sampleRateHz, + channels=channels + ) + else: + self._device = _devices[0] + + # Check if the default device settings are differnt than the ones + # specified by the user, if so, warn them that the default device + # settings are overwriting their settings. + if channels is None: + channels = self._device.inputChannels + elif channels != self._device.inputChannels: + logging.warning( + "Number of channels specified ({}) does not match the " + "default device's number of input channels ({}).".format( + channels, self._device.inputChannels)) + channels = self._device.inputChannels + + if sampleRateHz is None: + sampleRateHz = self._device.defaultSampleRate + elif sampleRateHz != self._device.defaultSampleRate: + logging.warning( + "Sample rate specified ({}) does not match the default " + "device's sample rate ({}).".format( + sampleRateHz, self._device.defaultSampleRate)) + sampleRateHz = self._device.defaultSampleRate + + elif isinstance(index, str): + # if given a str that's a name from DeviceManager, get info from device + device = DeviceManager.getDevice(index) + # try to duplicate and fail if not found + if isinstance(device, SoundDeviceMicrophoneDevice): + self._device = device._device + else: + # if not found, find best match + self._device = self.findBestDevice( + index=index, + sampleRateHz=sampleRateHz, + channels=channels + ) + else: + # get best match + self._device = self.findBestDevice( + index=index, + sampleRateHz=sampleRateHz, + channels=channels + ) + + devInfoText = ('Using audio device #{} ({}) for audio capture. ' + 'Full spec: {}').format( + self._device.deviceIndex, + self._device.deviceName, + self._device) + + logging.info(devInfoText) + + # error if specified device is not suitable for capture + if not self._device.isCapture: + raise AudioInvalidCaptureDeviceError( + 'Specified audio device not suitable for audio recording. ' + 'Has no input channels.') + + # get these values from the configured device + self._channels = self._device.inputChannels + logging.debug('Set recording channels to {} ({})'.format( + self._channels, 'stereo' if self._channels > 1 else 'mono')) + + self._sampleRateHz = self._device.defaultSampleRate + logging.debug('Set stream sample rate to {} Hz'.format( + self._sampleRateHz)) + + # set the audio latency mode + if exclusive: + self._audioLatencyMode = 2 + else: + self._audioLatencyMode = 1 + logging.debug( + 'Set audio latency mode to {}'.format(self._audioLatencyMode) + ) + + # internal recording buffer size in seconds + assert isinstance(streamBufferSecs, (float, int)) + self._streamBufferSecs = float(streamBufferSecs) + + # PTB specific stuff + self._mode = 2 # open a stream in capture mode + + # get audio run mode + assert isinstance(audioRunMode, (float, int)) and \ + (audioRunMode == 0 or audioRunMode == 1) + self._audioRunMode = int(audioRunMode) + + # open stream + self._stream = None + self._opening = self._closing = False + self._recording = False + self._tRecordingStartRequested = -1 + self._recordingBuffer = [] # list of samples + self._nRecordedFrames = 0 + self._streamReady = False # True when the mic is actually getting data + + self._microphones = [] # microphone objects bound to this device stream + + # window for timing the recording to start + self.win = None + + self.open() + + self.listeners = [] # list of microphone objects listening to this device for recording + + def __hash__(self): + # hash based on device index and name (which should be unique identifiers for the physical device) + return hash((self._device.deviceIndex, self._device.deviceName)) + + @property + def sampleRateHz(self): + """The sample rate of the audio stream in Hz. This is determined by the + device and cannot be changed by the user. + + Returns + ------- + float + Sample rate of the audio stream in Hz. + + """ + return self._sampleRateHz + + def _callback(self, indata, frames, timedat, status): + """Callback function for the sounddevice stream. This is called whenever + new audio data is available from the stream. + + Parameters + ---------- + indata : ndarray + The recorded audio data. + frames : int + The number of frames in `indata`. + timedat : CData + Timing information about the callback. + status : CallbackFlags + Status of the callback. + + """ + if self._closing or self._opening: + # if we're in the middle of opening or closing, ignore any callbacks as they may be unstable + return + + timeAtADC = timedat.inputBufferAdcTime + + if status: + logging.warning(f"SoundDevice stream callback returned with status: {status}") + + if len(indata) and self._clients: + # compute the absulute time of the end of the current recording pos + absBlockStartTime = timeAtADC + absBlockEndTime = timeAtADC + (frames / self._sampleRateHz) + + # iterate over attached microphone objects and write data to their + # recording buffers if we're past the requested start time + for mic in self._clients: + reqStartTime = mic._tRecordingStartRequested + reqStopTime = mic._tRecordingStopRequested + if reqStartTime < absBlockEndTime and ( + reqStopTime is None or absBlockStartTime < reqStopTime): + mic._recordingBuffer.append(indata.copy()) + mic._nRecordedFrames += frames + + def open(self): + """Open the stream for this microphone device. + """ + if self._stream is not None and self._stream.active: + logging.warning( + "Attempted to open microphone stream which is already open." + ) + return + + try: + import sounddevice as sd + except (ModuleNotFoundError, ImportError): + msg = ( + "Failed to open microphone stream because the 'sounddevice' library is " + "not installed." + ) + logging.error(msg) + raise DeviceNotConnectedError( + _translate(msg), + deviceClass=SoundDeviceMicrophoneDevice) from None + + # open a stream for this device + try: + self._stream = sd.InputStream( + samplerate=self._sampleRateHz, + channels=self._channels, + device=self._device.deviceIndex, + latency=self._audioLatencyMode, + callback=self._callback, + blocksize=0, # use default blocksize + dtype='float32', # use 32-bit float for recording + ) + except Exception as e: + logging.error(f"Error occurred while opening microphone stream: {e}") + raise AudioStreamError( + "An error occurred while opening the microphone stream. See logs for details." + ) from e + + self._stream.start() + + def close(self): + """Close the stream for this microphone device. + """ + # if we have microphones attached to this stream, don't close it until + # all microphones have been removed + if self._clients: + return + + if self._stream is None or not self._stream.active: + logging.warning( + "Attempted to close microphone stream which is already closed." + ) + return + + try: + self._stream.stop() + self._stream.close() + except Exception as e: + logging.error(f"Error occurred while closing microphone stream: {e}") + raise AudioStreamError( + "An error occurred while closing the microphone stream. See logs for details." + ) from e + + def _getSegment(self, startTime, endTime): + """Get a segment of the recorded audio data between `startTime` and `endTime`. + + Parameters + ---------- + startTime : float + Start time of the segment in seconds from the start of recording. + endTime : float + End time of the segment in seconds from the start of recording. + + Returns + ------- + ndarray + The audio data for the specified segment, with shape (n_samples, n_channels). + + """ + if not self._recordingBuffer: + return np.empty((0, self._channels), dtype=np.float32) + + # concatenate all recorded blocks into a single array + self._recordingBuffer = [np.concatenate(self._recordingBuffer, axis=0)] + + # calculate sample indices for the requested time range + startSample = int(startTime * self._sampleRateHz) + endSample = int(endTime * self._sampleRateHz) + + # clip to available data + startSample = max(0, min(startSample, self._nRecordedFrames)) + endSample = max(0, min(endSample, self._nRecordedFrames)) + + return self._recordingBuffer[0][startSample:endSample] + + def getRecording(self): + """Get the recorded audio data as a numpy array. + + Returns + ------- + ndarray + The recorded audio data, with shape (n_samples, n_channels). + + """ + return self._getSegment(0, self._nRecordedFrames / self._sampleRateHz) + + def _getTime(self): + """Get current time from the same timebase as the stream. + + Returns + ------- + float + Current time in seconds from the same timebase as the stream. + + """ + return time.monotonic() # sounddevice uses monotonic timebase for its callbacks + + def record(self, when=None, waitForStart=0, stopTime=None): + pass + + def start(self, when=None, waitForStart=0, stopTime=None): + """Start recording from the microphone. Alias for `record()`. + """ + self.record(when=when, waitForStart=waitForStart, stopTime=stopTime) + + def stop(self, *args, **kwargs): + """Stop recording from the microphone. + """ + self._tRecordingStartRequested = -1 + self._recording = False + + def pause(self): + """Pause recording from the microphone. Can be resumed with `record()`.""" + pass + + def poll(self): + """Poll the microphone for new data. + """ + pass # nop + + def getCurrentVolume(self): + """Get the current volume level of the microphone input. + + Returns + ------- + float + Current volume level, typically in the range [0.0, 1.0]. + + """ + if not self._recordingBuffer: + return 0.0 + + # get the most recent block of recorded audio + latestBlock = self._recordingBuffer[-1] + + # make sure we have some data to compute volume from + if latestBlock.size == 0: + return 0.0 + + # calculate RMS volume across all channels + rms = np.sqrt(np.mean(latestBlock ** 2)) + + return rms + + @staticmethod + def queryDevices(): + """Query devices using device manager. + + Returns + ------- + list of dict + List of available microphone devices where configurations are given as + dicts in a format similar to PTB. + + """ + """Query speaker devices using sounddevice. + + Returns + ------- + list of dicts + Device information. + + """ + try: + import sounddevice as sd + except (ModuleNotFoundError, ImportError): + msg = ( + "Failed to query audio output devices because the 'sounddevice' library is " + "not installed." + ) + logging.error(msg) + raise DeviceNotConnectedError( + _translate(msg), + deviceClass=SoundDeviceMicrophoneDevice) + + devices = [] + for dev in sd.query_devices(): + # skip input-only devices (microphones) + if dev['max_input_channels'] == 0: + continue + + # build a dict with the same keys as psychtoolbox for consistency + devDict = { + 'DeviceIndex': dev['index'], + 'HostAudioAPIId': dev['hostapi'], + 'HostAudioAPIName': sd.query_hostapis(dev['hostapi'])['name'], + 'DeviceName': dev['name'], + 'NrInputChannels': dev['max_input_channels'], + 'NrOutputChannels': dev['max_output_channels'], + 'LowInputLatency': dev['default_low_input_latency'], + 'HighInputLatency': dev['default_high_input_latency'], + 'LowOutputLatency': dev['default_low_output_latency'], + 'HighOutputLatency': dev['default_high_output_latency'], + 'DefaultSampleRate': dev['default_samplerate'] + } + devices.append(devDict) + + return devices + + def findBestDevice(self, index, sampleRateHz, channels): + """ + Find the closest match among the microphone profiles listed by psychtoolbox as valid. + + Parameters + ---------- + index : int + Index of the device + sampleRateHz : int + Sample rate of the device + channels : int + Number of audio channels in input stream + + Returns + ------- + AudioDeviceInfo + Device info object for the chosen configuration + + Raises + ------ + logging.Warning + If an exact match can't be found, will use the first match to the device index and + raise a warning. + KeyError + If no match is found whatsoever, will raise a KeyError + """ + # start off with no chosen device and no fallback + fallbackDevice = None + chosenDevice = None + # iterate through device profiles + for profile in self.getDevices(): + # if same index, keep as fallback + if index in (profile.deviceIndex, profile.deviceName): + fallbackDevice = profile + # if same everything, we got it! + if all(( + index in (profile.deviceIndex, profile.deviceName), + profile.defaultSampleRate == sampleRateHz, + profile.inputChannels == channels, + )): + chosenDevice = profile + + if chosenDevice is None and fallbackDevice is not None: + # if no exact match found, use fallback and raise warning + logging.warning( + f"Could not find exact match for specified parameters (index={index}, sampleRateHz=" + f"{sampleRateHz}, channels={channels}), falling back to best approximation (" + f"index={fallbackDevice.deviceIndex}, " + f"name={fallbackDevice.deviceName}," + f"sampleRateHz={fallbackDevice.defaultSampleRate}, " + f"channels={fallbackDevice.inputChannels})" + ) + chosenDevice = fallbackDevice + elif chosenDevice is None: + # if no index match found, raise error + raise DeviceNotConnectedError( + _translate( + "Could not find any audio recording device with index {index}", + ).format(index=index), + deviceClass=SoundDeviceMicrophoneDevice + ) + + return chosenDevice + + def isSameDevice(self, other): + """ + Determine whether this object represents the same physical microphone as a given other + object. + + Parameters + ---------- + other : SoundDeviceMicrophoneDevice, dict + Other SoundDeviceMicrophoneDevice to compare against, or a dict of params (which must + include `index` as a key) + + Returns + ------- + bool + True if the two objects represent the same physical device + """ + if isinstance(other, type(self)): + # if given another object, get index + index = other.index + elif isinstance(other, dict) and "index" in other: + # if given a dict, get index from key + index = other['index'] + else: + # if the other object is the wrong type or doesn't have an index, it's not this + return False + + return index in (self.index, self._device.deviceName) + + @staticmethod + def getDevices(): + """Get a `list` of audio capture device (i.e. microphones) descriptors. + On Windows, only WASAPI devices are used. + + Returns + ------- + list + List of `AudioDevice` descriptors for suitable capture devices. If + empty, no capture devices have been found. + + """ + allDevs = SoundDeviceMicrophoneDevice.queryDevices() + + # make sure we have an array of descriptors + allDevs = [allDevs] if isinstance(allDevs, dict) else allDevs + + # create list of descriptors only for capture devices + devObjs = [AudioDeviceInfo.createFromPTBDesc(dev) for dev in allDevs] + inputDevices = [desc for desc in devObjs if desc.isCapture] + + return inputDevices + + @staticmethod + def getAvailableDevices(): + """Get available microphone devices using sounddevice. + + Returns + ------- + list of dict + List of available microphone devices where configurations are given as + dicts in a format similar to PTB. + + """ + devices = [] + for profile in st.getAudioCaptureDevices(): + # get index as a name if possible + index = profile.get('device_name', None) + if index is None: + index = profile.get('index', None) + device = { + 'deviceName': profile.get('device_name', "Unknown Microphone"), + 'deviceClass': "psychopy.hardware.microphone.MicrophoneDevice", + 'index': index, + 'sampleRateHz': profile.get('defaultSampleRate', None), + 'channels': profile.get('inputChannels', None), + } + devices.append(device) + + return devices + + def addListener(self, listener, startLoop=False): + """ + Add a listener, which will receive all the same messages as this device. + + Parameters + ---------- + listener : str or psychopy.hardware.listener.BaseListener + Either a Listener object, or use one of the following strings to create one: + - "liaison": Create a LiaisonListener with DeviceManager.liaison as the server + - "print": Create a PrintListener with default settings + - "log": Create a LoggingListener with default settings + startLoop : bool + If True, then upon adding the listener, start up an asynchronous loop to dispatch messages. + """ + # add listener as normal + listener = BaseResponseDevice.addListener(self, listener, startLoop=startLoop) + # if we're starting a listener loop, start recording + if startLoop: + self.start() + + return listener + + def clearListeners(self): + """ + Remove any listeners from this device. + + Returns + ------- + bool + True if completed successfully + """ + # clear listeners as normal + resp = BaseResponseDevice.clearListeners(self) + # stop recording + self.stop() + + return resp + + def dispatchMessages(self, clear=True): + """ + Dispatch current volume as a MicrophoneResponse object to any attached listeners. + + Parameters + ---------- + clear : bool + If True, will clear the recording up until now after dispatching the volume. This is + useful if you're just sampling volume and aren't wanting to store the recording. + + """ + # if mic is not recording, there's nothing to dispatch + if not self.isStarted: + return + + # create a response object + message = MicrophoneResponse( + logging.defaultClock.getTime(), + self.getCurrentVolume(), + device=self, + ) + + # dispatch to listeners + for listener in self.listeners: + listener.receiveMessage(message) + + return message + +if __name__ == "__main__": + pass + diff --git a/psychopy/hardware/serialdevice.py b/psychopy/hardware/serialdevice.py index 933ac0f0..668db0e3 100644 --- a/psychopy/hardware/serialdevice.py +++ b/psychopy/hardware/serialdevice.py @@ -20,6 +20,8 @@ from psychopy.tools import systemtools as st from psychopy.tools.attributetools import AttributeGetSetMixin from .base import BaseDevice +from psychopy.hardware import DeviceManager +from psychopy.constants import NOT_STARTED def _findPossiblePorts(): @@ -59,6 +61,87 @@ def _findPossiblePorts(): ports = {port: None for port in _findPossiblePorts()} +class SerialOut(AttributeGetSetMixin): + """ + Wrapper around SerialDevice which handles Builder specific stuff (e.g. started/active/stopped + status) on a per-Component basis + """ + + def __init__(self, device, autolog=True): + if isinstance(device, SerialDevice): + # if given a serial device + self.device = device + # if given a string, get via DeviceManager + if isinstance(device, str): + if device in DeviceManager.devices: + self.device = DeviceManager.getDevice(device) + else: + # don't use formatted string literals in _translate() + raise ValueError(_translate( + "Could not find device named '{device}', make sure it has been set up " + "in DeviceManager." + ).format(device)) + # set an initial status + self.status = NOT_STARTED + # set autolog + self.autolog = autolog + + def __getattr__(self, name): + try: + # try as normal first + return getattr(self, name) + except AttributeError as err: + if hasattr(self.device, name): + # if this instance doesn't have the attribute but the device does, warn and use that + logging.warn( + f"SerialOut has no attribute {name}, but SerialDevice does, so using " + f"SerialDevice.{name}. To silence this message, use `.device.{name}` instead." + ) + return getattr(self.device, name) + else: + # if it just doesn't have the attribute, fail as normal + raise err + + @property + def com(self): + return self.device.com + + @property + def portString(self): + return self.device.portString + + def pause(self): + """Pause for a default period for this device + """ + self.device.pause() + + def sendMessage(self, message, autoLog=True): + return self.device.sendMessage( + message, + autoLog=autoLog + ) + + def getResponse(self, length=1, timeout=0.1, autoLog=True): + return self.device.getResponse( + length=length, + timeout=timeout, + autoLog=autoLog + ) + + def awaitResponse(self, multiline=False, timeout=None): + return self.device.awaitResponse( + self, + multiline=multiline, + timeout=timeout + ) + + def isAwake(self): + return self.device.isAwake() + + def isOpen(self): + return self.device.isOpen() + + class SerialDevice(BaseDevice, AttributeGetSetMixin): """A base class for serial devices, to be sub-classed by specific devices @@ -113,10 +196,7 @@ def __init__(self, port=None, baudrate=9600, self.com = None self.OK = False self.maxAttempts = maxAttempts - if type(eol) is bytes: - self.eol = eol - else: - self.eol = bytes(eol, 'utf-8') + self.eol = eol self.type = self.name # for backwards compatibility # try to open the port @@ -187,6 +267,18 @@ def __init__(self, port=None, baudrate=9600, ) # we aren't in a time-critical period so flush messages logging.flush() + + @property + def eol(self): + return self._eol + + @eol.setter + def eol(self, value): + # coerce to bytes + if type(value) is not bytes: + value = bytes(value, "utf-8") + # set + self._eol = value def isAwake(self): """This should be overridden by the device class @@ -216,8 +308,15 @@ def sendMessage(self, message, autoLog=True): inStr = self.com.read(self.com.inWaiting()) msg = "Sending '%s' to %s but found '%s' on the input buffer" logging.warning(msg % (message, self.name, inStr)) - if type(message) is not bytes: + # transform string input into bytes + if isinstance(message, str): message = bytes(message, 'utf-8') + # transform integers into bytes via bytearray + if isinstance(message, int): + message = bytes(bytearray([message])) + # transform arrays into bytearray + if isinstance(message, (list, tuple)): + message = bytearray(message) if not message.endswith(self.eol): message += self.eol # append a newline if necess self.com.write(message) diff --git a/psychopy/hardware/speaker/__init__.py b/psychopy/hardware/speaker/__init__.py new file mode 100644 index 00000000..45ba7fe3 --- /dev/null +++ b/psychopy/hardware/speaker/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- + +"""Classes and functions managing physical speaker devices for audio playback. +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "SpeakerDevice", +] + +import importlib.metadata +from psychopy.preferences import prefs +from psychopy import logging + + +class SpeakerDevice: + + # selected backend + backend = None + # known backends + backends = { + 'ptb': importlib.metadata.EntryPoint( + name="ptb", + value="psychopy.hardware.speaker.speaker_psychtoolbox:PsychtoolboxSpeakerDevice", + group="psychopy.hardware.speaker.backends" + ), + 'sounddevice': importlib.metadata.EntryPoint( + name="sounddevice", + value="psychopy.hardware.speaker.speaker_sounddevice:SoundDeviceSpeakerDevice", + group="psychopy.hardware.speaker.backends" + ) + } + # alias backend names + backends['psychtoolbox'] = backends['ptb'] + backends['sd'] = backends['sounddevice'] + + def __new__(cls, *args, **kwargs): + backend = cls.resolveBackend() + + return backend(*args, **kwargs) + + @classmethod + def resolveBackend(cls): + backend = cls.backend + # if backend is None, get from prefs + if backend is None: + backend = prefs.hardware['audioLib'] + # handle list + if isinstance(backend, (list, tuple)): + try: + # try to get the first valid backend + backend = [ + val for val in backend if val in cls.backends + ][0] + except: + # otherwise get the first backend + backend = backend[0] + # if not present, error + if backend not in cls.backends: + raise ModuleNotFoundError( + f"Invalid value '{backend}' for {cls.__name__}.backend, known backends are: {list(cls.backends)}" + ) + + # import backend + try: + return cls.backends[backend].load() + except ImportError: + # if backend fails to import, remove it from .backends + del cls.backends[backend] + # if there's no backends left, error + if not len(cls.backends): + raise ImportError( + "All audio backends failed to load." + ) + # try next option + cls.backend = list(cls.backends)[0] + # log + logging.error( + f"Failed to load {backend} backend, trying {cls.backend}..." + ) + + return cls.resolveBackend() + + @staticmethod + def getAvailableDevices(): + return SpeakerDevice.resolveBackend().getAvailableDevices() + + @classmethod + def __getattr__(cls, key): + return getattr(cls.resolveBackend(), key) + +# get sound backends from plugins +for ep in importlib.metadata.entry_points(group="psychopy.hardware.speaker.backends"): + SpeakerDevice.backends[ep.name] = ep diff --git a/psychopy/hardware/speaker/_base.py b/psychopy/hardware/speaker/_base.py new file mode 100644 index 00000000..42f1a183 --- /dev/null +++ b/psychopy/hardware/speaker/_base.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- + +"""Base class for speaker devices interfaces. +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +__all__ = [ + "BaseSpeakerDevice", +] + +from psychopy import logging +from psychopy.preferences import prefs +from psychopy.localization import _translate +from psychopy.hardware import BaseDevice + + +class BaseSpeakerDevice(BaseDevice): + """Base class for speaker devices. Not intended to be used directly; use one of the subclasses + instead. + """ + """Class for managing a physical speaker device for audio playback. + + Parameters + ---------- + index : int, optional + Numeric index for the physical speaker device, according to psychtoolbox. Leave as None to + find the speaker by name. + name : str, optional + String name for the physical speaker device, according to your operating system. Leave as + None to find the speaker by numeric index. + latencyClass : int + One of: + + * 0: Don't take exclusive control over the speaker, so other apps can still use it. Send + sounds via the system mixer so that sample rates are all handled, even though this + introduces latency. + + * 1: Don't take exclusive control over the speaker, so other apps can still use it. Send + sounds directly to reduce latency, so sounds will need to match the sample rate of the + speaker. **Recommended in most cases; if `resample` is True then sample rates are + already handled on load!** + + * 2: Take exclusive control over the speaker, so other apps can't use it. Send sounds + directly to reduce latency, so sounds will need to be the same sample rate as one + another, but this can be any sample rate supported by the speaker. + + * 3: Take exclusive control over the speaker, so other apps can't use it. Send sounds + directly to reduce latency, so sounds will need to be the same sample rate as one + another, but this can be any sample rate supported by the speaker. Force the system to + prioritise resources towards playing sounds on this speaker for absolute minimum + latency, but fallback to mode 2 if the system rejects this. + + * 4: Take exclusive control over the speaker, so other apps can't use it. Send sounds + directly to reduce latency, so sounds will need to be the same sample rate as one + another, but this can be any sample rate supported by the speaker. Force the system to + prioritise resources towards playing sounds on this speaker for absolute minimum + latency, and raise an error if the system rejects this. + resample : bool, optional + If the sample rate of an audio clip doesn't match the sample rate of the speaker, should + PsychoPy resample the sound on load? + + """ + # dict of extant streams, by numeric index + backend = None # set this in subclasses + streams = {} + + def __init__(self, index=None, name=None, latencyClass=1, resample=True): + if index is not None and name is not None: + logging.warn( + "Both 'index' and 'name' were provided to SpeakerDevice; ignoring 'index'" + ) + index = None + # try simple integerisation of index + if isinstance(index, str): + try: + index = float(index) + except ValueError: + pass + + # if index is default, get default speaker device + if index in (-1, None) and name is None: + index = None # set to none so we can find by name later + pref = prefs.hardware['audioDevice'] + pref = pref[0] if isinstance(pref, (list, tuple)) else pref + + if pref in ("default", "None"): + # if no pref, use first device + name = self.getAvailableDevices()[0]['deviceName'] + # warn the user, this speaker might be a virtual device with no audio or something + logging.warn( + _translate( + "No default speaker specified in Preferences / Hardware, using first speaker found: {}" + ).format(name) + ) + else: + # if pref is a name, use that + name = pref + + # store name and index + self.name = name + self.index = index + + # store playback prefs + self.resample = resample + self.latencyClass = latencyClass + + # create stream + self.createStream() + + # start off opened + self.open() + + @property + def isOpen(self): + """ + Is this speaker "open", i.e. is it active and ready for a Sound to play tracks on it + """ + return False + + @property + def exclusive(self): + """ + Returns + ------- + bool + Does PsychoPy have exclusive control of this speaker? If True then other apps will not be + able to play sounds on the same speaker. + """ + return False + + def createStream(self): + """ + Create the psychtoolbox audio stream + + Attributes + ---------- + Calling this method will set the following attributes: + + profile : dict + The profile from psychtoolbox, a dict with the following keys: Active, State, + RequestedStartTime, StartTime, CaptureStartTime, RequestedStopTime, EstimatedStopTime, + CurrentStreamTime, ElapsedOutSamples, PositionSecs, RecordedSecs, ReadSecs, + SchedulePosition, XRuns, TotalCalls, TimeFailed, BufferSize, CPULoad, PredictedLatency, + LatencyBias, SampleRate, OutDeviceIndex, InDeviceIndex + index : int + A numeric index referring to the device. This may differ from the value of `index` this + object was initialised with, as this will be the numeric index of the actual physical + speaker best matching what was requested. + name : str + A string name referring to the device. This may differ from the value of `name` this + object was initialised with, as this will be the system-reported name of the actual + physical speaker best matching what was requested. + """ + pass + + def open(self): + """ + Open the audio stream for this speaker so that sound can be played to it. + """ + pass + + def close(self): + """ + Close the audio stream for this speaker. + """ + pass + + def testDevice(self): + """ + Play a simple sound to check whether this device is working. + """ + pass + + +if __name__ == "__main__": + pass diff --git a/psychopy/hardware/speaker.py b/psychopy/hardware/speaker/speaker_psychtoolbox.py similarity index 76% rename from psychopy/hardware/speaker.py rename to psychopy/hardware/speaker/speaker_psychtoolbox.py index f6fa1b3d..69e60278 100644 --- a/psychopy/hardware/speaker.py +++ b/psychopy/hardware/speaker/speaker_psychtoolbox.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -"""Classes and functions managing physical speaker devices for audio playback. +"""Speaker device interface for `psychtoolbox` backend. """ # Part of the PsychoPy library @@ -10,21 +10,15 @@ import io import sys import contextlib -from types import SimpleNamespace -import psychtoolbox.audio as ptb from psychopy.hardware.exceptions import DeviceNotConnectedError +from psychopy.hardware.speaker._base import BaseSpeakerDevice from psychopy.localization import _translate from psychopy.preferences import prefs -from psychopy.hardware import BaseDevice from psychopy import logging from psychopy.tools import systemtools -__all__ = [ - "SpeakerDevice", -] - -class SpeakerDevice(BaseDevice): +class PsychtoolboxSpeakerDevice(BaseSpeakerDevice): """Class for managing a physical speaker device for audio playback. Parameters @@ -66,6 +60,7 @@ class SpeakerDevice(BaseDevice): If the sample rate of an audio clip doesn't match the sample rate of the speaker, should PsychoPy resample the sound on load? """ + backend = 'ptb' # dict of extant streams, by numeric index streams = {} @@ -75,12 +70,9 @@ def __init__(self, index=None, name=None, latencyClass=1, resample=True): "Both 'index' and 'name' were provided to SpeakerDevice; ignoring 'index'" ) index = None - # try simple integerisation of index + # handle string index if isinstance(index, str): - try: - index = float(index) - except ValueError: - pass + index = self.getNumericIndex(index) # if index is default, get default speaker device if index in (-1, None) and name is None: @@ -112,6 +104,25 @@ def __init__(self, index=None, name=None, latencyClass=1, resample=True): self.createStream() # start off open self.open() + + @staticmethod + def getNumericIndex(index): + """ + Get the numeric index of a device by its string index. + """ + # try simple string parse for e.g. "1" + try: + return int(float(index)) + except ValueError: + pass + # iterate through known devices + for profile in PsychtoolboxSpeakerDevice._getDevicesPsychtoolbox(): + # skip input-only devices (microphones) + if profile['NrOutputChannels'] == 0: + continue + # match name + if profile.get('DeviceName', None) == index: + return int(profile['DeviceIndex']) @property def exclusive(self): @@ -147,8 +158,9 @@ def createStream(self): object was initialised with, as this will be the system-reported name of the actual physical speaker best matching what was requested. """ - # get the devices from psychtoolbox + import psychtoolbox.audio as ptb + try: wasapiPref = prefs.hardware['audioWASAPIOnly'] except KeyError: @@ -162,7 +174,7 @@ def createStream(self): if not allFoundDevices: raise DeviceNotConnectedError( _translate("No audio devices found!"), - deviceClass=SpeakerDevice + deviceClass=PsychtoolboxSpeakerDevice ) # find ptb profile for this device @@ -186,8 +198,8 @@ def createStream(self): raise DeviceNotConnectedError( _translate( "No speaker device found with {key} '{name}'" - ).format(name=self.name, key="name" if findByName else "index"), - deviceClass=SpeakerDevice + ).format(name=self.name if findByName else self.index, key="name" if findByName else "index"), + deviceClass=PsychtoolboxSpeakerDevice ) logging.debug( @@ -195,10 +207,11 @@ def createStream(self): ) # if physical device already has a stream, use it rather than making a new one - if self.profile['DeviceIndex'] in SpeakerDevice.streams: - self.stream = SpeakerDevice.streams['DeviceIndex'] + if self.profile['DeviceIndex'] in PsychtoolboxSpeakerDevice.streams: + self.stream = PsychtoolboxSpeakerDevice.streams[self.profile['DeviceIndex']] else: self.stream = None + # try to connect using profile at various sample rates for sampleRateHz in ( # start with the rate from profile (this will usually work) @@ -225,6 +238,7 @@ def createStream(self): freq=sampleRateHz, channels=self.profile['NrOutputChannels'], latency_class=[self.latencyClass], + buffer_size=None ) # if it worked, set own parameters self.index = self.profile['DeviceIndex'] @@ -240,7 +254,7 @@ def createStream(self): logging.error(line[11:]) elif line.strip(): print(line) - except: + except Exception: pass # if everything failed, raise an error if self.stream is None: @@ -323,29 +337,92 @@ def testDevice(self): snd.play() time.sleep(1) snd.stop() + + @staticmethod + def _getDevicesSoundDevice(): + """Get a list of available speaker configurations using the sounddevice + backend. + + Returns + ------- + list[dict] + A list of dicts, each describing a speaker device. + + """ + import sounddevice as sd + + devices = [] + for dev in sd.query_devices(): + # build a dict with the same keys as psychtoolbox for consistency + devDict = { + 'DeviceIndex': dev['index'], + 'HostAudioAPIId': dev['hostapi'], + 'HostAudioAPIName': sd.query_hostapis(dev['hostapi'])['name'], + 'DeviceName': dev['name'], + 'NrInputChannels': dev['max_input_channels'], + 'NrOutputChannels': dev['max_output_channels'], + 'LowInputLatency': dev['default_low_input_latency'], + 'HighInputLatency': dev['default_high_input_latency'], + 'LowOutputLatency': dev['default_low_output_latency'], + 'HighOutputLatency': dev['default_high_output_latency'], + 'DefaultSampleRate': dev['default_samplerate'] + } + devices.append(devDict) + + return devices + + @staticmethod + def _getDevicesPsychtoolbox(): + """Get a list of available speaker configurations using the psychtoolbox + backend. + + Returns + ------- + list[dict] + A list of dicts, each describing a speaker device. + + """ + import psychtoolbox.audio as ptb + + try: + wasapiPref = prefs.hardware['audioWASAPIOnly'] + except KeyError: + wasapiPref = False + + deviceType = 13 if sys.platform == 'win32' and wasapiPref else None + + return ptb.get_devices(device_type=deviceType) @staticmethod def getAvailableDevices(): + """Get available speaker devices. + + Returns + ------- + list[dict] + A list of dicts, each describing a speaker device. Each dict has the keys `deviceName`, + `index`, and `name`. + + """ # skip in vm if systemtools.isVM_CI(): # GitHub actions VM does not have a sound device return [] - # only show WASAPI drivers for Windows - if sys.platform == 'win32': - deviceType = 13 - else: - deviceType = None - + devices = [] - for profile in ptb.get_devices(device_type=deviceType): + for profile in PsychtoolboxSpeakerDevice._getDevicesPsychtoolbox(): # skip input-only devices (microphones) if profile['NrOutputChannels'] == 0: continue # construct profile device = { 'deviceName': profile.get('DeviceName', "Unknown Speaker"), - 'index': profile.get('DeviceIndex', None), - 'name': profile.get('DeviceName', None) + 'deviceClass': "psychopy.hardware.speaker.SpeakerDevice", + 'index': profile.get('DeviceName', None) } devices.append(device) return devices + + +if __name__ == "__main__": + pass diff --git a/psychopy/hardware/speaker/speaker_sounddevice.py b/psychopy/hardware/speaker/speaker_sounddevice.py new file mode 100644 index 00000000..5e5452db --- /dev/null +++ b/psychopy/hardware/speaker/speaker_sounddevice.py @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- + +"""Speaker device interface for `sounddevice` backend. +""" + +# Part of the PsychoPy library +# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. +# Distributed under the terms of the MIT License. + +from psychopy.hardware.exceptions import DeviceNotConnectedError +from psychopy.hardware.speaker._base import BaseSpeakerDevice +from psychopy.localization import _translate +from psychopy.preferences import prefs +from psychopy import logging +from psychopy.tools import systemtools + + +class SoundDeviceSpeakerDevice(BaseSpeakerDevice): + """SpeakerDevice subclass for the sounddevice backend. + + Parameters + ---------- + index : int, optional + Numeric index for the physical speaker device, according to sounddevice. Leave as None to + find the speaker by name. + name : str, optional + String name for the physical speaker device, according to your operating system. Leave as + None to find the speaker by numeric index. + latencyClass : int + Latency class for the speaker device. This is not currently used for the sounddevice backend, + but is included for consistency with the psychtoolbox backend and potential future use. + resample : bool, optional + If the sample rate of an audio clip doesn't match the sample rate of the speaker, should + PsychoPy resample the sound on load? + + """ + backend = 'sounddevice' + # dict of extant streams, by numeric index + streams = {} + + def __init__(self, index=None, name=None, latencyClass=1, resample=True): + if index is not None and name is not None: + logging.warn( + "Both 'index' and 'name' were provided to SpeakerDevice; ignoring 'index'" + ) + index = None + # handle string index + if isinstance(index, str): + index = self.getNumericIndex(index or name) + # if index is default, get default speaker device + if index in (-1, None) and name is None: + index = None # set to none so we can find by name later + pref = prefs.hardware['audioDevice'] + pref = pref[0] if isinstance(pref, (list, tuple)) else pref + + if pref in ("default", "None"): + # if no pref, use first device + name = self.getAvailableDevices()[0]['deviceName'] + # warn the user, this speaker might be a virtual device with no audio or something + logging.warn( + _translate( + "No default speaker specified in Preferences / Hardware, using first speaker found: {}" + ).format(name) + ) + else: + # if pref is a name, use that + name = pref + + # store name and index + self.name = name + self.index = index + + # store playback prefs + self.stream = None + self.resample = resample + self.latencyClass = latencyClass + + @staticmethod + def getNumericIndex(index): + """ + Get the numeric index of a device by its string index. + """ + # try simple string parse for e.g. "1" + try: + return int(float(index)) + except ValueError: + pass + # iterate through known devices + for profile in SoundDeviceSpeakerDevice.queryDevices(): + if profile.get('DeviceName', None) == index: + return int(profile['DeviceIndex']) + + @property + def exclusive(self): + """ + Returns + ------- + bool + Does PsychoPy have exclusive control of this speaker? If True then other apps will not be + able to play sounds on the same speaker. + """ + return self.latencyClass >= 2 + + @property + def sampleRateHz(self): + """ + Sample rate of the speaker device, in Hz (`int` or `None` if not known). + + """ + if self.stream is None: + return None + + return self.stream.samplerate + + def createStream(self): + """ + Create a sounddevice stream for this speaker device. + """ + import sounddevice as sd + + # if we already have a stream for this index, reuse it + if self.index in SoundDeviceSpeakerDevice.streams: + self.stream = SoundDeviceSpeakerDevice.streams[self.index] + return + + # otherwise, create a new stream + try: + self.stream = sd.OutputStream( + device=self.index, + samplerate=None, # use default sample rate for device + channels=2, # use stereo output + dtype='float32', # use 32-bit float samples + latency='low' if self.latencyClass >= 2 else 'default', + blocksize=0, # use default block size + finished_callback=None # no callback needed for now + ) + SoundDeviceSpeakerDevice.streams[self.index] = self.stream + except Exception as e: + msg = ( + f"Failed to create audio output stream for device '{self.name}' (index {self.index}): {e}" + ) + logging.error(msg) + raise DeviceNotConnectedError( + _translate(msg), + deviceClass=SoundDeviceSpeakerDevice) + + def open(self): + """ + Open the audio stream for this speaker so that sound can be played to it. + """ + # note: for now this logic is handled in the sound module + pass + + def close(self): + """ + Close the audio stream for this speaker. + """ + pass + + @property + def isOpen(self): + """ + Is this speaker "open", i.e. is it active and ready for a Sound to play tracks on it + """ + return self.stream is not None and self.stream.active + + def isSameDevice(self, other): + """ + Determine whether this object represents the same physical speaker as a given other object. + + Parameters + ---------- + other : SpeakerDevice, dict + Other SpeakerDevice to compare against, or a dict of params (which must include + `index` as a key) + + Returns + ------- + bool + True if the two objects represent the same physical device + """ + if isinstance(other, type(self)): + # if given another object, get index + index = other.index + elif isinstance(other, dict) and "index" in other: + # if given a dict, get index from key + index = other['index'] + else: + # if the other object is the wrong type or doesn't have an index, it's not this + return False + + return index in (self.index, self.name) + + @staticmethod + def queryDevices(): + """Query speaker devices using sounddevice. + + Returns + ------- + list of dicts + Device information. + + """ + try: + import sounddevice as sd + except (ModuleNotFoundError, ImportError): + msg = ( + "Failed to query audio output devices because the 'sounddevice' library is " + "not installed." + ) + logging.error(msg) + raise DeviceNotConnectedError( + _translate(msg), + deviceClass=SoundDeviceSpeakerDevice) + + devices = [] + for dev in sd.query_devices(): + # skip input-only devices (microphones) + if dev['max_output_channels'] == 0: + continue + + # build a dict with the same keys as psychtoolbox for consistency + devDict = { + 'DeviceIndex': dev['index'], + 'HostAudioAPIId': dev['hostapi'], + 'HostAudioAPIName': sd.query_hostapis(dev['hostapi'])['name'], + 'DeviceName': dev['name'], + 'NrInputChannels': dev['max_input_channels'], + 'NrOutputChannels': dev['max_output_channels'], + 'LowInputLatency': dev['default_low_input_latency'], + 'HighInputLatency': dev['default_high_input_latency'], + 'LowOutputLatency': dev['default_low_output_latency'], + 'HighOutputLatency': dev['default_high_output_latency'], + 'DefaultSampleRate': dev['default_samplerate'] + } + devices.append(devDict) + + return devices + + @staticmethod + def getAvailableDevices(): + """Get available speaker devices. + + Returns + ------- + list[dict] + A list of dicts, each describing a speaker device. Each dict has the keys `deviceName`, + `index`, and `name`. + + """ + # skip in vm + if systemtools.isVM_CI(): # GitHub actions VM does not have a sound device + return [] + + foundeDevices = SoundDeviceSpeakerDevice.queryDevices() + if not foundeDevices: + logging.warn( + _translate("No audio output devices found when querying with sounddevice!") + ) + return [] + + # build profiles + devices = [] + for dev in foundeDevices: + profile = { + 'deviceName': dev.get('DeviceName', "Unknown Speaker"), + 'deviceClass': "psychopy.hardware.speaker.SpeakerDevice", + 'index': dev.get('DeviceName', None) + } + devices.append(profile) + + return devices + + +if __name__ == "__main__": + pass diff --git a/psychopy/hardware/triggerbox/parallel.py b/psychopy/hardware/triggerbox/parallel.py index 95d82c0f..b95501ce 100644 --- a/psychopy/hardware/triggerbox/parallel.py +++ b/psychopy/hardware/triggerbox/parallel.py @@ -17,6 +17,9 @@ 'closeAllParallelPorts' ] +import sys + +from psychopy import logging from .base import BaseTriggerBox # used to keep track of open parallel ports to avoid multiple objects accessing @@ -196,8 +199,8 @@ def setPortAddress(self, portAddress): "Cannot change the port address while the port is open.") # convert u"0x0378" into 0x0378 - if isinstance(address, str) and address.startswith('0x'): - address = int(address, 16) + if isinstance(portAddress, str) and portAddress.startswith('0x'): + portAddress = int(portAddress, 16) self._portAddress = portAddress diff --git a/psychopy/info.py b/psychopy/info.py index 1975a71f..9da3b41d 100644 --- a/psychopy/info.py +++ b/psychopy/info.py @@ -21,8 +21,6 @@ '_getUserNameUID', '_getHashGitHead', '_getSha1hexDigest', - '_getHgVersion', - '_getSvnVersion', '_thisProcess' ] @@ -42,11 +40,13 @@ except ImportError: haveCtypes = False import hashlib -import wx import locale import subprocess import psutil - +try: + import wx +except ImportError: + wx = None from psychopy import visual, logging, core, data, web from psychopy.core import shellCall from psychopy.platform_specific import rush @@ -269,22 +269,6 @@ def _setExperimentInfo(self, author, version, verbose): scriptPath = os.path.abspath(sys.argv[0]) key = 'experimentScript.digestSHA1' self[key] = _getSha1hexDigest(scriptPath, isfile=True) - # subversion revision? - try: - svnrev, last, url = _getSvnVersion(scriptPath) # svn revision - if svnrev: # or verbose: - self['experimentScript.svnRevision'] = svnrev - self['experimentScript.svnRevLast'] = last - self['experimentScript.svnRevURL'] = url - except Exception: - pass - # mercurical revision? - try: - hgChangeSet = _getHgVersion(scriptPath) - if hgChangeSet: # or verbose: - self['experimentScript.hgChangeSet'] = hgChangeSet - except Exception: - pass # when was this run? self['experimentRunTime.epoch'] = core.getAbsTime() @@ -536,7 +520,7 @@ def _setPythonInfo(self): """ self['pythonNumpyVersion'] = numpy.__version__ self['pythonScipyVersion'] = scipy.__version__ - self['pythonWxVersion'] = wx.version() + self['pythonWxVersion'] = '(no wx)' if wx is None else wx.version() self['pythonMatplotlibVersion'] = matplotlib.__version__ self['pythonPygletVersion'] = pyglet.version try: diff --git a/psychopy/iohub/client/__init__.py b/psychopy/iohub/client/__init__.py index 92e3ec9e..c51e2a2f 100644 --- a/psychopy/iohub/client/__init__.py +++ b/psychopy/iohub/client/__init__.py @@ -428,7 +428,7 @@ def clearEvents(self, device_label='all'): self._sendToHubServer(('RPC', 'clearEventBuffer', [True, ])) try: self.getDevice('keyboard')._clearLocalEvents() - except: + except Exception: pass else: d = self.devices.getDevice(device_label) @@ -439,7 +439,7 @@ def clearEvents(self, device_label='all'): self._sendToHubServer(('RPC', 'clearEventBuffer', [False, ])) try: self.getDevice('keyboard')._clearLocalEvents() - except: + except Exception: pass else: raise ValueError( diff --git a/psychopy/iohub/client/eyetracker/validation/procedure.py b/psychopy/iohub/client/eyetracker/validation/procedure.py index 2234a3f6..d64c9662 100644 --- a/psychopy/iohub/client/eyetracker/validation/procedure.py +++ b/psychopy/iohub/client/eyetracker/validation/procedure.py @@ -123,7 +123,7 @@ def contains(self, p): def innerRadius(self): try: return self.stim[1].radius - except: + except (IndexError, AttributeError): return self.stim[0].radius def create3PointGrid(): @@ -935,7 +935,7 @@ def _animateTarget(self, topos, frompos, **kwargs): start_radius = self.target.radius try: stop_radius = self.target.innerRadius - except: + except AttributeError: stop_radius = start_radius/2 print("Warning: validation target has no .innerRadius property.") while fliptime < contractedtime: diff --git a/psychopy/iohub/devices/display/__init__.py b/psychopy/iohub/devices/display/__init__.py index e1ae8d37..84edf832 100644 --- a/psychopy/iohub/devices/display/__init__.py +++ b/psychopy/iohub/devices/display/__init__.py @@ -485,7 +485,29 @@ def _createAllRuntimeInfoDicts(cls): dx, dy = default_screen.x, default_screen.y dw, dh = default_screen.width, default_screen.height dbounds = (dx, dy, dx + dw, dy + dh) - pyglet_screens = pyglet.canvas.get_display().get_screens() + is_zaphod = False + if sys.platform.startswith('linux'): + pyglet_screens = [] + from pyglet.canvas.xlib import NoSuchDisplayException + try: + # test whether it's a Zaphodhead setup + display = pyglet.canvas.Display(x_screen=1) + is_zaphod = True + except NoSuchDisplayException: + pass + + if sys.platform.startswith('linux') and is_zaphod: + screen_count = 0 + # make an assumption that no nested Xinerama-within-Zaphodhead + while True: + try: + display = pyglet.canvas.Display(x_screen=screen_count) + pyglet_screens.append(display.get_default_screen()) + screen_count += 1 + except NoSuchDisplayException: + break + else: + pyglet_screens = pyglet.canvas.get_display().get_screens() display_count = len(pyglet_screens) for i in range(display_count): d = pyglet_screens[i] @@ -689,7 +711,7 @@ def degcoord2pix(self, degx, degy, display_index=None): degy, self._psychopy_monitor)) return degx, degy self._coord2pix = degcoord2pix - except: + except Exception: print2err('Error during _calculateCoordMappingFunctions') printExceptionDetailsToStdErr() diff --git a/psychopy/iohub/errors.py b/psychopy/iohub/errors.py index f5f2a52c..98a2a28e 100644 --- a/psychopy/iohub/errors.py +++ b/psychopy/iohub/errors.py @@ -27,7 +27,7 @@ def print2err(*args): sys.stderr.write("{0}".format(a)) sys.stderr.write("\n") sys.stderr.flush() - except: + except Exception: for a in args: print("{0}".format(a)) print() @@ -46,7 +46,7 @@ def printExceptionDetailsToStdErr(): errStr = "".join(traceback.format_exception( exc_type, exc_value, exc_tb)) print2err(errStr) - except: + except Exception: traceback.print_exc() diff --git a/psychopy/iohub/net.py b/psychopy/iohub/net.py index 44a71199..ef23c4dd 100644 --- a/psychopy/iohub/net.py +++ b/psychopy/iohub/net.py @@ -102,7 +102,7 @@ def receive(self): num_packets = num_packets - 1 result = self.unpack() return result, address - except: + except Exception: pass def close(self): diff --git a/psychopy/liaison.py b/psychopy/liaison.py index f53459d6..d8300887 100644 --- a/psychopy/liaison.py +++ b/psychopy/liaison.py @@ -41,7 +41,7 @@ def default(self, o): # if object has a getJSON method, use it if hasattr(o, "getJSON"): return o.getJSON(asString=False) - except: + except Exception: # if there's an error in the getJSON method, continue so we can try regular encoding pass # if object is an error, transform in standardised form diff --git a/psychopy/localization/__init__.py b/psychopy/localization/__init__.py index 263faa23..ff542c0a 100644 --- a/psychopy/localization/__init__.py +++ b/psychopy/localization/__init__.py @@ -5,18 +5,17 @@ Sets the locale value as a wx languageID (int) and initializes gettext translation _translate(): - from psychopy.app import localization + from psychopy import localization """ # Part of the PsychoPy library # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. # Distributed under the terms of the MIT License. -try: - from ._localization import ( - _translate, setLocaleWX, locname, available) -except ModuleNotFoundError: - # if wx doesn't exist we can't translate but most other parts - # of the _localization lib will not be relevant - def _translate(val): - return val \ No newline at end of file +from .translation import setLocale, getLocale, _translate + +__all__ = [ + "getLocale", + "setLocale", + "_translate" +] \ No newline at end of file diff --git a/psychopy/localization/_localization.py b/psychopy/localization/_localization.py deleted file mode 100644 index a8ce2db3..00000000 --- a/psychopy/localization/_localization.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""Language localization for PsychoPy. - -Sets the locale value as a wx languageID (int) and initializes gettext -translation _translate(): - from psychopy.app import localization -""" - -# Part of the PsychoPy library -# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. -# Distributed under the terms of the MIT License. - -# Author: Jeremy Gray, July 2014 - - -import gettext -import os -import glob -import io -from psychopy import logging, prefs, constants -import wx -import locale as locale_pkg - - -def setLocaleWX(): - """Sets up the locale for the wx application. Only call this after the app - has been created and initialised (it is called by PsychoPyApp.OnInit()) - - :return: wx.Locale object - """ - # set locale for wx app (before splash screen): - encod = locale_pkg.getpreferredencoding(do_setlocale=False) - if locale.IsAvailable(languageID): - wxlocale = wx.Locale(languageID) - else: - wxlocale = wx.Locale(wx.LANGUAGE_DEFAULT) - # Check language layout, and reset to default if RTL - if wxlocale.GetCanonicalName()[:2] in ['ar', 'dv', 'fa', 'ha', 'he', 'ps', 'ur', 'yi']: - wxlocale = wx.Locale(wx.LANGUAGE_DEFAULT) - # wx.Locale on Py2.7/wx3.0 seems to delete the preferred encoding (utf-8) - # Check if that happened and reinstate if needed. - if locale_pkg.getpreferredencoding(do_setlocale=False) == '': - locale_pkg.setlocale(locale_pkg.LC_ALL, - "{}.{}".format(codeFromWxId[languageID], encod)) - return wxlocale - -# Get a dict of locale aliases from wx.Locale() -- same cross-platform -# (Win 7, Mac 10.9) -# this DOESN'T need the app to be instantiated -locale = wx.Locale() -aliases = {u'English (U.S.)': 'en_US'} -# set defaults because locale.GetLanguageInfo(0) can return None on some -# systems: -wxIdFromCode = {'en_US': wx.LANGUAGE_DEFAULT} # int: 0 default, 2-229 -# used in directory names e.g. ja_JP; never JPN ala Windows -codeFromWxId = {wx.LANGUAGE_DEFAULT: 'en_US'} -for i in range(230): - info = locale.GetLanguageInfo(i) - if info: - # mix of forms: ja or ja_JP - aliases[info.Description] = info.CanonicalName - wxIdFromCode[info.CanonicalName] = i - codeFromWxId[i] = info.CanonicalName - -# read all known mappings cross-platform from a file: -# get windows 3-letter code (=val) from canonical form (=key); use only -# for setting locale (non-wx) -winmap = {'en_US': 'ENU'} -# descriptive name, if available; 5-letter code if not -locname = {'en_US': u'English (U.S.)'} -reverseMap = {u'English (U.S.)': 'en_US'} -mappings = os.path.join(os.path.dirname(__file__), 'mappings.txt') - -with io.open(mappings, 'r', encoding='utf-8-sig') as f: - for line in f.readlines(): - try: - # canonical, windows, name-with-spaces - can, win, name = line.strip().split(' ', 2) - except ValueError: - can, win = line.strip().split(' ', 1) - name = can - winmap[can] = win - locname[can] = name - reverseMap[name] = can - -# what are the available translations? available languages on the OS? -expr = os.path.join(os.path.dirname(__file__), '..', 'app', 'locale', '*') -available = sorted(map(os.path.basename, glob.glob(expr))) -sysAvail = [str(l) for l in codeFromWxId.values() # installed language packs - if l and locale.IsAvailable(wxIdFromCode[l])] - - -def getID(lang=None): - """Get wx ID of language to use for translations: - `lang`, pref, or system default. - - `lang` is a 5 char `language_REGION`, eg ja_JP - """ - if lang: - val = lang - else: - try: - val = prefs.app['locale'] - except KeyError: - val = locale.GetLocale() # wx.Locale, no encoding - if not val: - val = codeFromWxId[wx.LANGUAGE_DEFAULT] - try: - # todo: try to set wx.Locale here to language - language = wxIdFromCode[val] - except KeyError: - logging.error('locale %s not known to wx.Locale, using default' % val) - language = wx.LANGUAGE_DEFAULT - - return language, val - -languageID, lang = getID() -# use lang like this: -# import locale -- the non-wx version of locale -# -# if sys.platform.startswith('win'): -# v = winmap[val] -# else: v=val -# locale.setlocale(locale.LC_ALL, (v, 'UTF-8')) - -# ideally rewrite the following using wxlocale only: -path = os.path.join(os.path.dirname(__file__), '..', 'app', - 'locale', lang, 'LC_MESSAGE') + os.sep -mofile = os.path.join(path, 'messages.mo') -try: - logging.debug("Opening message catalog %s for locale %s" % (mofile, lang)) - trans = gettext.GNUTranslations(open(mofile, "rb")) -except IOError: - logging.debug("Locale for '%s' not found. Using default." % lang) - trans = gettext.NullTranslations() - -trans.install() - -# PsychoPy app uses a nonstandard name _translate (instead of _) -# A dependency overwrites _ somewhere, clobbering use of _ as global: -# __builtins__['_translate'] = _ -# del(__builtins__['_']) # idea: force psychopy code to use _translate - -# Feb 2016: require modules to explicitly import _translate from localization: -_translate = _ # noqa: F821 -# Note that _ is created by gettext, in builtins namespace -del(__builtins__['_']) - -# __builtins__['_'] = wx.GetTranslation -# this seems to have no effect, needs more investigation: -# path = os.path.join(os.path.dirname(__file__), '..', 'locale', -# lang, 'LC_MESSAGE') + os.sep -# wxlocale.AddCatalogLookupPathPrefix(path) diff --git a/psychopy/localization/extract.py b/psychopy/localization/extract.py new file mode 100644 index 00000000..b4a174b5 --- /dev/null +++ b/psychopy/localization/extract.py @@ -0,0 +1,64 @@ +from pathlib import Path +import ast +import json +import importlib + + +class TranslationExtractor(ast.NodeVisitor): + """ + Visitor which cans an ast.Tree object for calls to `_translate` + """ + def __init__(self): + # initialise subclass + ast.NodeVisitor.__init__(self) + # create keys array + self.keys = set() + + def visit_Call(self, node): + # skip irrelevant calls + if getattr(node.func, "id", None) != "_translate": + return + # skip calls with no args + if len(node.args) == 0: + return + # skip calls where arg has no hardcoded value + if not hasattr(node.args[0], "value"): + return + # store value in keys + self.keys.add(node.args[0].value) + + +def extract(module="psychopy.experiment", save=True): + keys = set() + # get location of module + folder = Path(importlib.import_module(module).__file__).parent + # iterate through files in module + for file in folder.glob("**/*.py"): + # parse as ast + tree = ast.parse(file.read_text(), filename=file.name) + # look for _translate calls + extractor = TranslationExtractor() + extractor.visit(tree) + # get keys + keys.update(extractor.keys) + + # save new keys if requested + if save: + # get locales folder + folder = Path(__file__).parent / "locales" + # iterate through each JSON file + for file in folder.glob("*.json"): + # load existing + with file.open() as f: + translations = json.load(f) + # add any untranslated keys + translations = dict.fromkeys(keys, "") | translations + # save + with file.open("wt") as f: + json.dump(translations, f, indent=2, ensure_ascii=False) + + return keys + + +if __name__ == "__main__": + extract() \ No newline at end of file diff --git a/psychopy/localization/generateTranslationTemplate.py b/psychopy/localization/generateTranslationTemplate.py deleted file mode 100644 index 2969673b..00000000 --- a/psychopy/localization/generateTranslationTemplate.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Generate template of translation file (.po) from source tree. -# preferences/generateHints.py is automatically invoked to update -# localization of popup hints on the Preference Dialog. -# -# - -import os -import sys -import subprocess -import shutil -import git -import babel.messages.frontend -import polib -import argparse - -from psychopy import __version__ as psychopy_version - -locale_dir = '../app/locale/' -new_pot_filename = 'messages_new.pot' -current_pot_filename = 'messages.pot' -babel_frontend = babel.messages.frontend.CommandLineInterface() - -target_files = [ - 'psychopy/localization/messages.pot', - 'psychopy/preferences/hints.py', - 'psychopy/alerts/alertsCatalogue/alertmsg.py' -] - -poedit_mime_headers = { - "X-Poedit-KeywordsList": "_translate", - "X-Poedit-Basepath": "../../../..", - "X-Poedit-SourceCharset": "UTF-8", - "X-Poedit-SearchPath-0:": ".", - "X-Poedit-SearchPathExcluded-0": "app/localization/utils", - "X-Poedit-SearchPathExcluded-1": "app/Resources" -} - -def generate_new_template(verbose=False): - """ - Generate new POT file using pybabel. - Before running pybabel, generateHints.py and generateAlertmsg.py are called - to update lists of hints and alerts. - - Returns: - None - """ - - # hints.py must be updated to find new hints and alarts - if verbose: - print('Generate hints.py... ', end='') - subprocess.call(['python', 'generateHints.py'], cwd='../preferences') - if verbose: - print('Done.\nGenerate alartmsg.py... ', end='') - subprocess.call(['python', 'generateAlertmsg.py'], cwd='../alerts/alertsCatalogue') - if verbose: - print('Done.') - - # Extracting messages and generating new template file - - if verbose: - print('Generating new template file... ', end='') - argv = ['pybabel', '-q', 'extract', - '--input-dirs=.', - '--project=PsychoPy', - '--version='+psychopy_version, - '--keyword=_translate', - '--width=79', - '--output-file=localization/'+new_pot_filename, - '--ignore-dirs="app/localization/utils app/Resources"'] - - os.chdir('..') # The command must be run in the parent directory. - babel_frontend.run(argv) # Run the command - os.chdir('localization') # Return to the original directory. - if verbose: - print('Done.') - -def find_new_entries(verbose=False): - """ - Count new entries in the new POT file. - - Returns: - int: number of new entries. - int: number of entries in the new POT file. - """ - if verbose: - print('Making a list of message IDs in the new template... ', end='') - - new_pot_msgids = [] - current_pot_msgids = [] - untranslated_new = 0 - - if not os.path.exists(current_pot_filename): - # if current pot file doesn't exist, copy it from new pot file. - if verbose: - print('INFO: create {}... '.format(current_pot_filename), end='') - shutil.copy(new_pot_filename, current_pot_filename) - - # all entries are new. - po_new = polib.pofile(new_pot_filename) - untranslated_new = len(po_new.untranslated_entries()) - - else: - po_new = polib.pofile(new_pot_filename) - for entry in po_new: - if entry.msgid != '': - new_pot_msgids.append(entry.msgid) - - po = polib.pofile(current_pot_filename) - for entry in po: - if entry.msgid != '': - current_pot_msgids.append(entry.msgid) - - for id in new_pot_msgids: - if id not in current_pot_msgids: - untranslated_new += 1 - - if verbose: - print('{} new entries are found. Done.'.format(untranslated_new)) - return untranslated_new, len(po_new.untranslated_entries()) - -def merge_new_entries(verbose=False): - """ - Merge new POT file to PO files. - The 'Project-Id-Version' and 'POT-Creation-Date' in the PO files will be updated. - No other metadata will be changed. - - returns: - None - """ - if verbose: - print('Merging new POT to PO files...') - - pot = polib.pofile(new_pot_filename) # pot: for updating existing PO file - pot_new = polib.pofile(new_pot_filename, wrapwidth=79) # pot_new: for creating new PO file - pot_new.metadata.update(poedit_mime_headers) # update header of new PO file - - for loc in os.listdir(locale_dir): - lc_message_dir = os.path.join(locale_dir, loc,'LC_MESSAGE') - messages_po_path = os.path.join(lc_message_dir, 'messages.po') - if not os.path.exists(lc_message_dir) or not os.path.isdir(lc_message_dir): - print('WARNING: {} is not a valid locale directory.'.format(loc)) - continue - if os.path.exists(os.path.join(locale_dir, loc, 'LC_MESSAGE','messages.po')): - if verbose: - print(' merge new POT to {}...'.format(messages_po_path)) - po = polib.pofile(messages_po_path, wrapwidth=79) - po.merge(pot) #merge - # update Project-Id-Version and POT-Creation-Date - po.metadata['Project-Id-Version'] = pot.metadata['Project-Id-Version'] - po.metadata['POT-Creation-Date'] = pot.metadata['POT-Creation-Date'] - po.save() # overwrite - else: - # creating new PO file: need to modify "Language" metadata - pot_new.metadata['Language'] = loc[:loc.find('_')] - pot_new.save(messages_po_path) - - if verbose: - print('Done.') - -def check_translation_status(verbose=False): - """ - Count translated messages in the PO files. - - returns: - dict: number of translated messages (key: locale code) - """ - status = {} - - if verbose: - print('Checking current PO files...', end='') - for loc in os.listdir(locale_dir): - lc_message_dir = os.path.join(locale_dir, loc,'LC_MESSAGE') - messages_po_path = os.path.join(lc_message_dir, 'messages.po') - if os.path.exists(os.path.join(locale_dir, loc, 'LC_MESSAGE','messages.po')): - po = polib.pofile(messages_po_path) - translated = len(po.translated_entries()) - status[loc] = translated - - if verbose: - print('Done.') - return status - - -parser = argparse.ArgumentParser(description='usage: generateTranslationTemplate.py [-h] [-c]') -parser.add_argument('-c', '--commit', action='store_true', help='Commit messages.pot if updated.', required=False) -parser.add_argument('-v', '--verbose', action='store_true', help='Show detailed processing information.', required=False) - -args = parser.parse_args() - -parent_dir, current_dir = os.path.split(os.getcwd()) -if current_dir != 'localization' or os.path.split(parent_dir)[1] != 'psychopy': - print('Error: this script must be run in psychopy/localization directory.') - sys.exit(-1) - -generate_new_template(verbose=args.verbose) -num_new_entries, num_total_entries = find_new_entries(verbose=args.verbose) - -# if there are new entries, merge POT to existing PO files. -if num_new_entries > 0: - merge_new_entries(verbose=args.verbose) - -# check translation status -translation_status = check_translation_status(verbose=args.verbose) - - -summary_message = '\nNumber of messages in *.py files: {}\n'.format(num_total_entries) -summary_message += 'New message(s): {}\n\n'.format(num_new_entries) -summary_message += 'Untranslated message(s)\n' - -for loc in translation_status.keys(): - n = translation_status[loc] - summary_message += ' {}:{:>8} ({:>5.1f}%)\n'.format(loc, n, 100*n/num_total_entries) - -# output to stdout -print(summary_message) - -# Update current pot file only if new strings were found. - -if num_new_entries > 0: - # replace current pot file with new one. - os.remove(current_pot_filename) - os.rename(new_pot_filename, current_pot_filename) - - # add and commit template file if --commit is given - if args.commit: - if args.verbose: - sys.stdout.write('\nCommit messages.pot...\n') - - repo = git.Repo('../../') - updated = [item.a_path for item in repo.index.diff(None)] - added = False - - # add if messages.pot is untracked or updated - for file_path in target_files: - if file_path in repo.untracked_files or file_path in updated: - if args.verbose: - print(' add {}'.format(file_path)) - repo.index.add(file_path) - added = True - - for loc in os.listdir(locale_dir): - file_path = '/'.join(('psychopy/app/locale', loc,'LC_MESSAGE', 'messages.po')) - if file_path in repo.untracked_files or file_path in updated: - if args.verbose: - print(' add {}'.format(file_path)) - repo.index.add(file_path) - added = True - - if added: - repo.index.commit('ENH: Translation template is updated\n\n{}'.format(summary_message)) - -else: - # keep current pot file and remove new one. - os.remove(new_pot_filename) diff --git a/psychopy/localization/locales/ar-001.json b/psychopy/localization/locales/ar-001.json new file mode 100644 index 00000000..4fff9c79 --- /dev/null +++ b/psychopy/localization/locales/ar-001.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "مرحبا بكم في PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/cs-CZ.json b/psychopy/localization/locales/cs-CZ.json new file mode 100644 index 00000000..d90f035b --- /dev/null +++ b/psychopy/localization/locales/cs-CZ.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Vítejte v PsychoPy" +} \ No newline at end of file diff --git a/psychopy/localization/locales/da-DK.json b/psychopy/localization/locales/da-DK.json new file mode 100644 index 00000000..cdd58db2 --- /dev/null +++ b/psychopy/localization/locales/da-DK.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Velkommen til PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/de-DE.json b/psychopy/localization/locales/de-DE.json new file mode 100644 index 00000000..ab2d120b --- /dev/null +++ b/psychopy/localization/locales/de-DE.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Willkommen auf PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/el-GR.json b/psychopy/localization/locales/el-GR.json new file mode 100644 index 00000000..f1ebd582 --- /dev/null +++ b/psychopy/localization/locales/el-GR.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Καλώς ορίσατε στο PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/en-NZ.json b/psychopy/localization/locales/en-NZ.json new file mode 100644 index 00000000..ea5f4ba4 --- /dev/null +++ b/psychopy/localization/locales/en-NZ.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Welcome to PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/en-US.json b/psychopy/localization/locales/en-US.json new file mode 100644 index 00000000..ea5f4ba4 --- /dev/null +++ b/psychopy/localization/locales/en-US.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Welcome to PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/es-CO.json b/psychopy/localization/locales/es-CO.json new file mode 100644 index 00000000..feddc382 --- /dev/null +++ b/psychopy/localization/locales/es-CO.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "¡Bienvenido a PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/es-ES.json b/psychopy/localization/locales/es-ES.json new file mode 100644 index 00000000..feddc382 --- /dev/null +++ b/psychopy/localization/locales/es-ES.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "¡Bienvenido a PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/es-US.json b/psychopy/localization/locales/es-US.json new file mode 100644 index 00000000..feddc382 --- /dev/null +++ b/psychopy/localization/locales/es-US.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "¡Bienvenido a PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/et-EE.json b/psychopy/localization/locales/et-EE.json new file mode 100644 index 00000000..9804f89e --- /dev/null +++ b/psychopy/localization/locales/et-EE.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Tere tulemast PsychoPy-sse!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/fa-IR.json b/psychopy/localization/locales/fa-IR.json new file mode 100644 index 00000000..16164730 --- /dev/null +++ b/psychopy/localization/locales/fa-IR.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "خوش آمدید به PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/fi-FI.json b/psychopy/localization/locales/fi-FI.json new file mode 100644 index 00000000..286bcfbf --- /dev/null +++ b/psychopy/localization/locales/fi-FI.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Tervetuloa PsychoPy:hen!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/fr-FR.json b/psychopy/localization/locales/fr-FR.json new file mode 100644 index 00000000..f974aca3 --- /dev/null +++ b/psychopy/localization/locales/fr-FR.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Bienvenue à PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/he-IL.json b/psychopy/localization/locales/he-IL.json new file mode 100644 index 00000000..af237a2d --- /dev/null +++ b/psychopy/localization/locales/he-IL.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "ברוכים הבאים ל PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/hi-IN.json b/psychopy/localization/locales/hi-IN.json new file mode 100644 index 00000000..d4fdb30f --- /dev/null +++ b/psychopy/localization/locales/hi-IN.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "PsychoPy आपका स्वागत है!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/hu-HU.json b/psychopy/localization/locales/hu-HU.json new file mode 100644 index 00000000..f7ffb625 --- /dev/null +++ b/psychopy/localization/locales/hu-HU.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Üdvözlünk a PsychoPy-ban!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/it-IT.json b/psychopy/localization/locales/it-IT.json new file mode 100644 index 00000000..7a393466 --- /dev/null +++ b/psychopy/localization/locales/it-IT.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Benvenuti a PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/ja-JP.json b/psychopy/localization/locales/ja-JP.json new file mode 100644 index 00000000..5831bb9e --- /dev/null +++ b/psychopy/localization/locales/ja-JP.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "PsychoPyへようこそ!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/ko-KR.json b/psychopy/localization/locales/ko-KR.json new file mode 100644 index 00000000..ae51f15e --- /dev/null +++ b/psychopy/localization/locales/ko-KR.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "PsychoPy에 오신 것을 환영합니다!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/ms-MY.json b/psychopy/localization/locales/ms-MY.json new file mode 100644 index 00000000..61d33aa6 --- /dev/null +++ b/psychopy/localization/locales/ms-MY.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Selamat datang ke PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/nl-NL.json b/psychopy/localization/locales/nl-NL.json new file mode 100644 index 00000000..ac747137 --- /dev/null +++ b/psychopy/localization/locales/nl-NL.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Welkom bij PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/nn-NO.json b/psychopy/localization/locales/nn-NO.json new file mode 100644 index 00000000..cdd58db2 --- /dev/null +++ b/psychopy/localization/locales/nn-NO.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Velkommen til PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/pl-PL.json b/psychopy/localization/locales/pl-PL.json new file mode 100644 index 00000000..6502367c --- /dev/null +++ b/psychopy/localization/locales/pl-PL.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Witamy w PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/pt-PT.json b/psychopy/localization/locales/pt-PT.json new file mode 100644 index 00000000..feb18c16 --- /dev/null +++ b/psychopy/localization/locales/pt-PT.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Bem-vindo ao PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/ro-RO.json b/psychopy/localization/locales/ro-RO.json new file mode 100644 index 00000000..888aba42 --- /dev/null +++ b/psychopy/localization/locales/ro-RO.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Bine ați venit la PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/ru-RU.json b/psychopy/localization/locales/ru-RU.json new file mode 100644 index 00000000..08b6c398 --- /dev/null +++ b/psychopy/localization/locales/ru-RU.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Добро пожаловать в PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/sv-SE.json b/psychopy/localization/locales/sv-SE.json new file mode 100644 index 00000000..8562ef67 --- /dev/null +++ b/psychopy/localization/locales/sv-SE.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "Välkommen till PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/tr-TR.json b/psychopy/localization/locales/tr-TR.json new file mode 100644 index 00000000..5d19a049 --- /dev/null +++ b/psychopy/localization/locales/tr-TR.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "PsychoPy hoşgeldiniz!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/zh-CN.json b/psychopy/localization/locales/zh-CN.json new file mode 100644 index 00000000..59983178 --- /dev/null +++ b/psychopy/localization/locales/zh-CN.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "欢迎使用 PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/locales/zh-TW.json b/psychopy/localization/locales/zh-TW.json new file mode 100644 index 00000000..59983178 --- /dev/null +++ b/psychopy/localization/locales/zh-TW.json @@ -0,0 +1,3 @@ +{ + "Welcome to PsychoPy!": "欢迎使用 PsychoPy!" +} \ No newline at end of file diff --git a/psychopy/localization/mappings.txt b/psychopy/localization/mappings.txt deleted file mode 100644 index df2c390f..00000000 --- a/psychopy/localization/mappings.txt +++ /dev/null @@ -1,170 +0,0 @@ -af_ZA AFK -am_ET AMH -ar_001 ARX العربية (Standard Arabic) -ar_SA ARA -ar_LB ARB -ar_EG ARE -ar_DZ ARG -ar_BH ARH -ar_IQ ARI -ar_JO ARJ -ar_KW ARK -ar_LY ARL -ar_MA ARM -ar_OM ARO -ar_QA ARQ -ar_SY ARS -ar_TN ART -ar_AE ARU -ar_YE ARY -as_IN ASM -ba_RU BAS -be_BY BEL -bg_BG BGR -bn_BD BNG -bn_IN BNG -bo_CN BOB -br_FR BRE -ca_ES CAT -zh_CN CHS 简体中文 (Chinese, simplified) -zh_TW CHT 繁體中文 (Chinese, traditional) -co_FR COS -cs_CZ CSY čeština (Czech) -cy_GB CYM -da_DK DAN dansk (Danish) -de_AT DEA -de_LI DEC -de_LU DEL -de_CH DES -de_DE DEU Deutsch (German) -el_GR ELL ελληνικά (Greek) -en_AU ENA -en_CB ENB -en_CA ENC -en_SG ENE -en_GB ENG English (U. K.) -en_IE ENI -en_JM ENJ -en_BZ ENL -en_MY ENM -en_IN ENN -en_PH ENP -en_ZA ENS -en_TT ENT -en_US ENU English (U. S.) -en_ZW ENW -en_NZ ENZ English (New Zealand) -es_PA ESA -es_BO ESB -es_CR ESC -es_DO ESD -es_SV ESE -es_EC ESF -es_GT ESG -es_HN ESH -es_NI ESI -es_CL ESL -es_MX ESM -es_ES ESN español, España (Spanish, Spain) -es_CO ESO Español, Colombia (Spanish, Colombia) -es_PE ESR -es_AR ESS -es_US EST Español, USA (Spanish, USA) -es_PR ESU -es_VE ESV -es_UY ESY -es_PY ESZ -et_EE ETI eesti (Estonian) -eu_ES EUQ -fa_IR FAR فارسی (Persian) -fi_FI FIN suomi (Finnish) -fo_FO FOS -fr_FR FRA français (French) -fr_BE FRB -fr_CA FRC -fr_LU FRL -fr_MC FRM -fr_CH FRS -fy_NL FYN -gd_GB GLA -gl_ES GLC -gu_IN GUJ -he_IL HEB עברית (Hebrew) -hi_IN HIN हिन्दी (Hindi) -hr_BA HRB -hr_HR HRV -hu_HU HUN magyar (Hungarian) -hy_AM HYE -ig_NG IBO -ii_CN III -id_ID IND -ga_IE IRE -is_IS ISL -it_IT ITA italiano (Italian) -it_CH ITS -ja_JP JPN 日本語 (Japanese) -kl_GL KAL -ka_GE KAT -kn_IN KDI -km_KH KHM -rw_RW KIN -kk_KZ KKZ -ko_KR KOR 한국어 (Korean) -ky_KG KYR -lo_LA LAO -lb_LU LBX -lt_LT LTH -lv_LV LVI -mr_IN MAR -mk_MK MKI -mt_MT MLT -mn_MN MON -mi_NZ MRI -ms_BN MSB -ms_MY MSL Bahasa melayu (Malay) -ml_IN MYM -ne_NP NEP -nl_BE NLB -nl_NL NLD Nederlands (Dutch) -nn_NO NON Norsk (Norwegian) -nb_NO NOR -ns_ZA NSO -oc_FR OCI -or_IN ORI -pa_IN PAN -ps_AF PAS -pl_PL PLK polski (Polish) -pt_BR PTB -pt_PT PTG português (Portuguese) -rm_CH RMC -ro_RO ROM limba română (Romanian) -ru_RU RUS Русский язык (Russian) -sa_IN SAN -si_LK SIN -sk_SK SKY -sl_SI SLV -se_NO SME -se_SE SMF -se_FI SMG -sq_AL SQI -sv_SE SVE Svenska (Swedish) -sv_FI SVF -sw_KE SWK -ta_IN TAM -te_IN TEL -th_TH THA -tr_TR TRK Türkçe (Turkish) -tn_ZA TSN -tt_RU TTT -tk_TM TUK -ug_CN UIG -uk_UA UKR Українська (Ukrainian) -ur_PK URD -vi_VN VIT -wo_SN WOL -xh_ZA XHO -yo_NG YOR -zh_HK ZHH -zh_SG ZHI -zh_MO ZHM -zu_ZA ZUL diff --git a/psychopy/localization/messages.pot b/psychopy/localization/messages.pot deleted file mode 100644 index cf8087ba..00000000 --- a/psychopy/localization/messages.pot +++ /dev/null @@ -1,9950 +0,0 @@ -# Translations template for PsychoPy. -# Copyright (C) 2025 ORGANIZATION -# This file is distributed under the same license as the PsychoPy project. -# FIRST AUTHOR , 2025. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PsychoPy 2025.2.0\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-09 20:32+0900\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" - -#: liaison.py:29 -msgid "" -"`psychopy.liaison` requires the package `websockets`, this can be installed " -"via command line:\n" -"`pip install websockets`." -msgstr "" - -#: session.py:407 -#, python-brace-format -msgid "" -"Experiment '{}' is located outside of the root folder for this Session. All " -"files from its experiment folder ('{}') will be copied to the root folder " -"and the experiment will run from there." -msgstr "" - -#: session.py:424 -#, python-brace-format -msgid "Experiment '{}' and its experiment folder ('{}') have been copied to {}" -msgstr "" - -#: session.py:465 -#, python-brace-format -msgid "" -"Experiment could not be loaded as name of folder {} is also the name of an " -"installed Python package. Please rename." -msgstr "" - -#: session.py:1032 -#, python-brace-format -msgid "Running experiment via Session: name={key}, expInfo={expInfo}" -msgstr "" - -#: session.py:1076 -#, python-brace-format -msgid "Finished running experiment via Session: name={key}, expInfo={expInfo}" -msgstr "" - -#: session.py:1199 -msgid "Could not pause loop as there is no experiment running." -msgstr "" - -#: session.py:1205 -msgid "Could not pause loop as the current experiment is not in a loop." -msgstr "" - -#: session.py:1223 -msgid "Could not pause experiment as there is none running." -msgstr "" - -#: session.py:1252 -msgid "Could not resume experiment as there is none running or paused." -msgstr "" - -#: session.py:1280 -msgid "Could not stop experiment as there is none running." -msgstr "" - -#: session.py:1546 -msgid "" -"Could not send data to liaison server as none is initialised for this " -"Session." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:12 -#, python-brace-format -msgid "Your stimulus size exceeds the {dimension} dimension of your window." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:16 -#, python-brace-format -msgid "Your stimulus size is smaller than 1 pixel ({dimension} dimension)." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:20 -#, python-brace-format -msgid "Your stimulus position exceeds the {dimension} dimension of your window." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:24 -#, python-brace-format -msgid "" -"Your stimulus {type} time of {time} is less than a screen refresh for a " -"{Hz}Hz monitor." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:28 -#, python-brace-format -msgid "" -"Your stimulus {type} time of {time} seconds cannot be accurately presented " -"for {time} on a {Hz}Hz monitor." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:31 -#, python-brace-format -msgid "" -"Speaker {deviceName} is set to \"Exclusive low latency\" mode. As resampling" -" is enabled, this mode has little benefit over \"Shared low latency\" mode, " -"with some drawbacks." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:35 -#, python-brace-format -msgid "" -"Multiple Components in the same Routine are validated by {validator}, please" -" ensure that the timing of these Components do not overlap." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:39 -#, python-brace-format -msgid "" -"Experiment was built in a future version of PsychoPy ({version}), we " -"recommend either updating PsychoPy or changing the \"Use Version\" setting " -"in Experiment Settings to this version." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:43 -#, python-brace-format -msgid "" -"Experiment was built in a past version of PsychoPy ({version}), saving it in" -" this version may add parameters which cannot be parsed." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:47 -#, python-brace-format -msgid "" -"Your stimulus start {type} exceeds the stop {type}. Consider using a {type} " -"duration." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:51 -#, python-brace-format -msgid "Your stimulus {type} type {frameType} must be expressed as a whole number." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:55 -#, python-brace-format -msgid "" -"Component {component} has stop time set as a duration, but doesn't have a " -"start time" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:59 -#, python-brace-format -msgid "" -"Microphone component `{name}` given blank stop time, using max duration " -"allowed by buffer size ({stopVal}s)." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:62 -#, python-brace-format -msgid "Static Component `{name}` given infinite stop time" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:66 -#, python-brace-format -msgid "" -"Python Syntax Error in '{codeTab}' tab. See '{code}' on line number " -"{lineNumber} of the '{codeTab}' tab." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:70 -#, python-brace-format -msgid "" -"JavaScript Syntax Error in '{codeTab}' tab. See '{lineNumber}' in the " -"'{codeTab}' tab." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:74 -#, python-brace-format -msgid "" -"The component {name} is currently disabled and will not be written to your " -"experiment script." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:77 -msgid "Cannot calculate parameter." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:81 -#, python-brace-format -msgid "" -"Builder cannot interpret value \"{param.val}\" of {param.label} for " -"{component.type} component \"{component.params[name].val}\" as a dollar sign" -" has been used incorrectly." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:85 -#, python-brace-format -msgid "Font `{param.val}` not found locally, will check Google Fonts on next run." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:89 -#, python-brace-format -msgid "" -"Font `{font} {style}` not available in weight `{weight}`, component `{name}`" -" will default to Open Sans Regular." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:93 -#, python-brace-format -msgid "Recording device '{device}' not found, using default device instead." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:97 -#, python-brace-format -msgid "" -"The component or routine '{comp}' is only implemented online, so will do " -"nothing when running locally." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:101 -#, python-brace-format -msgid "" -"The component or routine '{comp}' is only implemented locally, so will do " -"nothing when running online." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:105 -#, python-brace-format -msgid "" -"Editable textbox component {textbox} and keyboard component {keyboard} in " -"the same routine may compete for keypresses" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:108 -msgid "" -"Experiment includes components or routines which use eyetracking, but no eye" -" tracker is configured." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:112 -#, python-brace-format -msgid "" -"A {eyetracker} eye tracker has been configured, but no calibration routine " -"is present." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:115 -#, python-brace-format -msgid "" -"As {brand} eyetrackers do not support animations in their calibration " -"routine, animation values have not been used in your calibration routine." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:118 -#, python-brace-format -msgid "Eyetrackers by {brand} do not support manual pacing" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:122 -msgid "" -"Window mode is set to be windowed, but eyetracking requires the window to be" -" full screen." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:126 -msgid "" -"A monitor config is required for accurate eyetracking measurements, but none" -" was found." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:130 -msgid "" -"Eye tracker experiments should use 'ioHub' as the Input -> Keyboard Backend " -"setting" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:134 -#, python-brace-format -msgid "Audio transcription service \"{transcriber}\" is not supported online." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:138 -#, python-brace-format -msgid "Audio transcription service \"{transcriber}\" is not supported offline." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:142 -#, python-brace-format -msgid "" -"Chosen transcriber '{engine}' requires an API key, please supply one in " -"Preferences." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:146 -#, python-brace-format -msgid "" -"Column name '{param}' in conditions file already exists as a variable in " -"this experiment ({category})." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:149 -#, python-brace-format -msgid "Column name '{param}' is likely to cause name clashes. {msg}." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:153 -#, python-brace-format -msgid "" -"Could not find any config for device {deviceName}, please setup this device " -"up in the Device Manager dialog (from Builder).\"" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:157 -#, python-brace-format -msgid "Device parameter of microphone component \"{name}\" will not be used online." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:161 -#, python-brace-format -msgid "" -"The file you are attempting to run does not seem to exist, the full path " -"supplied to Runner was {path}" -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:165 -#, python-brace-format -msgid "" -"Component {name} comes from the plugin {plugin}, which is either not " -"installed or not activated." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:169 -#, python-brace-format -msgid "" -"Color space attribute `.{colorSpaceAttrib}` is no longer in use, as colors " -"are no longer tied to one space." -msgstr "" - -#: alerts/alertsCatalogue/alertmsg.py:173 -#, python-brace-format -msgid "" -"RGB attribute `.{rgbAttrib}` is no longer in use, as non-RGB colors now " -"handle their own conversion." -msgstr "" - -#: app/_psychopyApp.py:96 app/builder/builder.py:388 app/coder/coder.py:1569 -#: app/runner/runner.py:231 -msgid "&View" -msgstr "" - -#: app/_psychopyApp.py:97 -msgid "&Open Builder view\t" -msgstr "" - -#: app/_psychopyApp.py:101 -msgid "Open a new Builder view" -msgstr "" - -#: app/_psychopyApp.py:104 -msgid "&Open Coder view\t" -msgstr "" - -#: app/_psychopyApp.py:108 -msgid "Open a new Coder view" -msgstr "" - -#: app/_psychopyApp.py:111 app/builder/builder.py:358 app/coder/coder.py:335 -#: app/coder/coder.py:1442 app/pavlovia_ui/_base.py:40 app/runner/runner.py:173 -#, python-format -msgid "&Quit\t%s" -msgstr "" - -#: app/_psychopyApp.py:115 app/builder/builder.py:359 app/coder/coder.py:1443 -#: app/pavlovia_ui/_base.py:41 -msgid "Terminate the program" -msgstr "" - -#: app/_psychopyApp.py:439 -#, python-brace-format -msgid "Copyright (C) {year} OpenScienceTools.org" -msgstr "" - -#: app/_psychopyApp.py:482 -msgid "Loading app fonts..." -msgstr "" - -#: app/_psychopyApp.py:535 -msgid "Loading plugins..." -msgstr "" - -#: app/_psychopyApp.py:541 -msgid "Creating frames..." -msgstr "" - -#: app/_psychopyApp.py:564 -msgid "Loading requested files..." -msgstr "" - -#: app/_psychopyApp.py:586 -#, python-brace-format -msgid "Failed to open {}, file does not exist." -msgstr "" - -#: app/_psychopyApp.py:610 -#, python-brace-format -msgid "Failed to open file {}, reason: {}" -msgstr "" - -#: app/_psychopyApp.py:630 -msgid "Compatibility information" -msgstr "" - -#: app/_psychopyApp.py:646 -msgid "tips.txt" -msgstr "" - -#: app/_psychopyApp.py:752 -msgid "Select .psydat file(s) to extract" -msgstr "" - -#: app/_psychopyApp.py:1102 -msgid "" -"For stimulus generation and experimental control in Python.\n" -"PsychoPy depends on your feedback. If something doesn't work\n" -"then let us know at psychopy-users@googlegroups.com" -msgstr "" - -#: app/dialogs.py:34 gui/qtgui.py:754 -msgid "Warning" -msgstr "" - -#: app/dialogs.py:35 -msgid "Info" -msgstr "" - -#: app/dialogs.py:36 -msgid "Query" -msgstr "" - -#: app/errorDlg.py:27 -msgid "PsychoPy3 Error" -msgstr "" - -#: app/errorDlg.py:34 -msgid "" -"PsychoPy encountered an unhandled internal error! Please send the report " -"under \"Details\" to the developers with a description of what you were " -"doing with the software when the error occurred." -msgstr "" - -#: app/errorDlg.py:56 -msgid "&OK" -msgstr "" - -#: app/errorDlg.py:59 -msgid "E&xit PsychoPy" -msgstr "" - -#: app/errorDlg.py:66 -msgid "&Details" -msgstr "" - -#: app/errorDlg.py:78 -msgid "&Copy" -msgstr "" - -#: app/errorDlg.py:82 -msgid "&Save" -msgstr "" - -#: app/errorDlg.py:125 -msgid "" -"Are you sure you want to exit PsychoPy? Unsaved work may be lost (but we'll " -"try to save opened files)." -msgstr "" - -#: app/errorDlg.py:127 -msgid "Exit PsychoPy?" -msgstr "" - -#: app/errorDlg.py:163 -msgid "Save error traceback" -msgstr "" - -#: app/errorDlg.py:180 -#, python-format -msgid "Cannot save to file '%s'." -msgstr "" - -#: app/errorDlg.py:181 -msgid "File save error" -msgstr "" - -#: app/errorDlg.py:212 -msgid "Connection Error" -msgstr "" - -#: app/errorDlg.py:213 -msgid "" -"Could not connect to Pavlovia server. \n" -"\n" -"Please check that you are connected to the internet. If you are connected, " -"then the Pavlovia servers may be down. You can check their status here: \n" -"\n" -"https://pavlovia.org/status" -msgstr "" - -#: app/localizedStrings.py:14 -msgid "Basic" -msgstr "" - -#: app/localizedStrings.py:15 -msgid "Color" -msgstr "" - -#: app/localizedStrings.py:16 -msgid "Layout" -msgstr "" - -#: app/localizedStrings.py:17 -msgid "Data" -msgstr "" - -#: app/localizedStrings.py:18 experiment/components/settings/__init__.py:302 -#: monitors/MonitorCenter.py:1104 -msgid "Screen" -msgstr "" - -#: app/localizedStrings.py:19 -msgid "Input" -msgstr "" - -#: app/localizedStrings.py:20 -msgid "Dots" -msgstr "" - -#: app/localizedStrings.py:21 -msgid "Grating" -msgstr "" - -#: app/localizedStrings.py:22 -msgid "Advanced" -msgstr "" - -#: app/localizedStrings.py:23 -msgid "Favorites" -msgstr "" - -#: app/localizedStrings.py:24 -msgid "Stimuli" -msgstr "" - -#: app/localizedStrings.py:25 -msgid "Responses" -msgstr "" - -#: app/localizedStrings.py:26 -msgid "I/O" -msgstr "" - -#: app/localizedStrings.py:27 app/localizedStrings.py:208 -msgid "Custom" -msgstr "" - -#: app/localizedStrings.py:28 -msgid "Validation" -msgstr "" - -#: app/localizedStrings.py:29 -msgid "Carrier" -msgstr "" - -#: app/localizedStrings.py:30 -msgid "Envelope" -msgstr "" - -#: app/localizedStrings.py:31 -msgid "Appearance" -msgstr "" - -#: app/builder/builder.py:4524 app/coder/coder.py:2941 app/localizedStrings.py:32 -#: app/pavlovia_ui/project.py:395 app/runner/runner.py:1181 app/utils.py:501 -#: monitors/MonitorCenter.py:259 -msgid "Save" -msgstr "" - -#: app/localizedStrings.py:33 -msgid "Online" -msgstr "" - -#: app/localizedStrings.py:34 -msgid "Testing" -msgstr "" - -#: app/localizedStrings.py:35 -msgid "Audio" -msgstr "" - -#: app/localizedStrings.py:36 -msgid "Format" -msgstr "" - -#: app/localizedStrings.py:37 -msgid "Formatting" -msgstr "" - -#: app/localizedStrings.py:38 -msgid "Eyetracking" -msgstr "" - -#: app/localizedStrings.py:39 -msgid "Target" -msgstr "" - -#: app/localizedStrings.py:40 -msgid "Animation" -msgstr "" - -#: app/localizedStrings.py:41 -msgid "Transcription" -msgstr "" - -#: app/localizedStrings.py:42 -msgid "Timing" -msgstr "" - -#: app/localizedStrings.py:43 -msgid "Playback" -msgstr "" - -#: app/localizedStrings.py:44 -msgid "Window" -msgstr "" - -#: app/localizedStrings.py:50 -msgid "linear" -msgstr "" - -#: app/localizedStrings.py:51 -msgid "nearest" -msgstr "" - -#: app/localizedStrings.py:53 -msgid "named" -msgstr "" - -#: app/localizedStrings.py:55 -msgid "last key" -msgstr "" - -#: app/localizedStrings.py:56 -msgid "first key" -msgstr "" - -#: app/localizedStrings.py:57 -msgid "all keys" -msgstr "" - -#: app/localizedStrings.py:58 -msgid "nothing" -msgstr "" - -#: app/localizedStrings.py:59 -msgid "last button" -msgstr "" - -#: app/localizedStrings.py:60 -msgid "first button" -msgstr "" - -#: app/localizedStrings.py:61 -msgid "all buttons" -msgstr "" - -#: app/localizedStrings.py:62 -msgid "final" -msgstr "" - -#: app/localizedStrings.py:63 -msgid "on click" -msgstr "" - -#: app/localizedStrings.py:64 -msgid "every frame" -msgstr "" - -#: app/localizedStrings.py:65 -msgid "never" -msgstr "" - -#: app/localizedStrings.py:66 -msgid "from exp settings" -msgstr "" - -#: app/localizedStrings.py:67 -msgid "from preferences" -msgstr "" - -#: app/localizedStrings.py:68 -msgid "circle" -msgstr "" - -#: app/localizedStrings.py:69 -msgid "square" -msgstr "" - -#: app/localizedStrings.py:71 -msgid "direction" -msgstr "" - -#: app/localizedStrings.py:72 -msgid "position" -msgstr "" - -#: app/localizedStrings.py:73 -msgid "walk" -msgstr "" - -#: app/localizedStrings.py:74 -msgid "same" -msgstr "" - -#: app/localizedStrings.py:75 -msgid "different" -msgstr "" - -#: app/builder/builder.py:4564 app/coder/coder.py:2981 app/localizedStrings.py:76 -#: app/runner/runner.py:1196 -msgid "Experiment" -msgstr "" - -#: app/localizedStrings.py:77 -msgid "repeat" -msgstr "" - -#: app/localizedStrings.py:78 -msgid "none" -msgstr "" - -#: app/localizedStrings.py:80 -msgid "time (s)" -msgstr "" - -#: app/localizedStrings.py:81 -msgid "frame N" -msgstr "" - -#: app/localizedStrings.py:82 -msgid "condition" -msgstr "" - -#: app/localizedStrings.py:83 -msgid "duration (s)" -msgstr "" - -#: app/localizedStrings.py:84 -msgid "duration (frames)" -msgstr "" - -#: app/localizedStrings.py:90 -msgid "cover" -msgstr "" - -#: app/localizedStrings.py:91 -msgid "contain" -msgstr "" - -#: app/localizedStrings.py:92 -msgid "fill" -msgstr "" - -#: app/localizedStrings.py:93 -msgid "scale-down" -msgstr "" - -#: app/localizedStrings.py:95 -msgid "center" -msgstr "" - -#: app/localizedStrings.py:96 -msgid "top-center" -msgstr "" - -#: app/localizedStrings.py:97 -msgid "bottom-center" -msgstr "" - -#: app/localizedStrings.py:98 -msgid "center-left" -msgstr "" - -#: app/localizedStrings.py:99 -msgid "center-right" -msgstr "" - -#: app/localizedStrings.py:100 -msgid "top-left" -msgstr "" - -#: app/localizedStrings.py:101 -msgid "top-right" -msgstr "" - -#: app/localizedStrings.py:102 -msgid "bottom-left" -msgstr "" - -#: app/localizedStrings.py:103 -msgid "bottom-right" -msgstr "" - -#: app/builder/dialogs/__init__.py:145 app/localizedStrings.py:108 -msgid "constant" -msgstr "" - -#: app/builder/dialogs/__init__.py:146 app/localizedStrings.py:109 -msgid "set every repeat" -msgstr "" - -#: app/builder/dialogs/__init__.py:147 app/localizedStrings.py:110 -msgid "set every frame" -msgstr "" - -#: app/localizedStrings.py:112 -msgid "add" -msgstr "" - -#: app/localizedStrings.py:113 -msgid "average" -msgstr "" - -#: app/localizedStrings.py:114 -msgid "avg" -msgstr "" - -#: app/localizedStrings.py:115 -msgid "average (no FBO)" -msgstr "" - -#: app/localizedStrings.py:116 -msgid "use prefs" -msgstr "" - -#: app/localizedStrings.py:117 -msgid "on Sync" -msgstr "" - -#: app/localizedStrings.py:118 -msgid "on Save" -msgstr "" - -#: app/localizedStrings.py:119 -msgid "manually" -msgstr "" - -#: app/localizedStrings.py:121 -msgid "auto" -msgstr "" - -#: app/localizedStrings.py:122 -msgid "comma" -msgstr "" - -#: app/localizedStrings.py:123 -msgid "semicolon" -msgstr "" - -#: app/localizedStrings.py:124 -msgid "tab" -msgstr "" - -#: app/localizedStrings.py:126 -msgid "debug" -msgstr "" - -#: app/localizedStrings.py:127 -msgid "info" -msgstr "" - -#: app/localizedStrings.py:128 -msgid "exp" -msgstr "" - -#: app/localizedStrings.py:129 -msgid "data" -msgstr "" - -#: app/localizedStrings.py:130 -msgid "warning" -msgstr "" - -#: app/localizedStrings.py:131 -msgid "error" -msgstr "" - -#: app/localizedStrings.py:133 -msgid "Experiment start" -msgstr "" - -#: app/localizedStrings.py:134 -msgid "Wall clock" -msgstr "" - -#: app/localizedStrings.py:136 experiment/components/settings/__init__.py:239 -msgid "Field" -msgstr "" - -#: app/localizedStrings.py:137 experiment/components/camera/__init__.py:113 -#: experiment/components/settings/__init__.py:239 experiment/devices.py:33 -msgid "Default" -msgstr "" - -#: app/localizedStrings.py:139 -msgid "press" -msgstr "" - -#: app/localizedStrings.py:140 -msgid "release" -msgstr "" - -#: app/localizedStrings.py:142 -msgid "any click" -msgstr "" - -#: app/localizedStrings.py:143 -msgid "valid click" -msgstr "" - -#: app/localizedStrings.py:144 -msgid "on valid click" -msgstr "" - -#: app/localizedStrings.py:145 -msgid "correct click" -msgstr "" - -#: app/localizedStrings.py:146 -msgid "mouse onset" -msgstr "" - -#: app/localizedStrings.py:147 -msgid "Routine" -msgstr "" - -#: app/localizedStrings.py:149 -msgid "joystick onset" -msgstr "" - -#: app/localizedStrings.py:151 -msgid "every click" -msgstr "" - -#: app/localizedStrings.py:152 -msgid "first click" -msgstr "" - -#: app/localizedStrings.py:153 -msgid "last click" -msgstr "" - -#: app/localizedStrings.py:154 -msgid "button onset" -msgstr "" - -#: app/localizedStrings.py:156 -msgid "Line" -msgstr "" - -#: app/localizedStrings.py:157 -msgid "Triangle" -msgstr "" - -#: app/localizedStrings.py:158 -msgid "Rectangle" -msgstr "" - -#: app/localizedStrings.py:159 -msgid "Circle" -msgstr "" - -#: app/localizedStrings.py:160 -msgid "Cross" -msgstr "" - -#: app/localizedStrings.py:161 app/pavlovia_ui/project.py:194 -msgid "Star" -msgstr "" - -#: app/localizedStrings.py:162 -msgid "Arrow" -msgstr "" - -#: app/localizedStrings.py:163 -msgid "Regular polygon..." -msgstr "" - -#: app/localizedStrings.py:164 -msgid "Custom polygon..." -msgstr "" - -#: app/localizedStrings.py:166 -msgid "rows" -msgstr "" - -#: app/localizedStrings.py:167 -msgid "columns" -msgstr "" - -#: app/localizedStrings.py:168 -msgid "custom..." -msgstr "" - -#: app/localizedStrings.py:170 -msgid "first" -msgstr "" - -#: app/localizedStrings.py:171 -msgid "last" -msgstr "" - -#: app/localizedStrings.py:172 -msgid "all" -msgstr "" - -#: app/localizedStrings.py:176 -msgid "one of your Components, Routines, or condition parameters" -msgstr "" - -#: app/localizedStrings.py:178 -msgid " Avoid `this`, `these`, `continue`, `Clock`, or `component` in name" -msgstr "" - -#: app/localizedStrings.py:179 -msgid "Builder variable" -msgstr "" - -#: app/localizedStrings.py:180 -msgid "Psychopy module" -msgstr "" - -#: app/localizedStrings.py:181 -msgid "numpy function" -msgstr "" - -#: app/localizedStrings.py:182 -msgid "python keyword" -msgstr "" - -#: app/localizedStrings.py:184 -msgid "look at" -msgstr "" - -#: app/localizedStrings.py:185 -msgid "look away" -msgstr "" - -#: app/localizedStrings.py:186 -msgid "every look" -msgstr "" - -#: app/localizedStrings.py:187 -msgid "first look" -msgstr "" - -#: app/localizedStrings.py:188 -msgid "last look" -msgstr "" - -#: app/localizedStrings.py:189 -msgid "roi onset" -msgstr "" - -#: app/localizedStrings.py:191 -msgid "Start and Stop" -msgstr "" - -#: app/localizedStrings.py:192 -msgid "Start Only" -msgstr "" - -#: app/localizedStrings.py:193 -msgid "Stop Only" -msgstr "" - -#: app/localizedStrings.py:194 -msgid "None" -msgstr "" - -#: app/localizedStrings.py:196 -msgid "Start and Check" -msgstr "" - -#: app/localizedStrings.py:198 -msgid "Check Only" -msgstr "" - -#: app/localizedStrings.py:200 -msgid "Mouse" -msgstr "" - -#: app/localizedStrings.py:201 -msgid "Drag" -msgstr "" - -#: app/localizedStrings.py:202 -msgid "Keyboard (Arrow Keys)" -msgstr "" - -#: app/localizedStrings.py:203 -msgid "Keyboard (WASD)" -msgstr "" - -#: app/localizedStrings.py:204 -msgid "Keyboard (Custom keys)" -msgstr "" - -#: app/localizedStrings.py:205 -msgid "Mouse Wheel" -msgstr "" - -#: app/localizedStrings.py:206 -msgid "Mouse Wheel (Inverted)" -msgstr "" - -#: app/localizedStrings.py:207 -msgid "Keyboard (+-)" -msgstr "" - -#: app/localizedStrings.py:210 -msgid "visible" -msgstr "" - -#: app/localizedStrings.py:211 -msgid "scroll" -msgstr "" - -#: app/localizedStrings.py:212 -msgid "hidden" -msgstr "" - -#: app/localizedStrings.py:217 app/preferencesDlg.py:336 -msgid "General" -msgstr "" - -#: app/localizedStrings.py:218 app/preferencesDlg.py:341 -msgid "Application" -msgstr "" - -#: app/localizedStrings.py:219 app/preferencesDlg.py:347 -msgid "Pilot mode" -msgstr "" - -#: app/localizedStrings.py:220 app/preferencesDlg.py:353 -msgid "Key Bindings" -msgstr "" - -#: app/localizedStrings.py:221 app/preferencesDlg.py:359 -msgid "Hardware" -msgstr "" - -#: app/localizedStrings.py:222 app/preferencesDlg.py:365 -msgid "Connections" -msgstr "" - -#: app/localizedStrings.py:224 -msgid "general" -msgstr "" - -#: app/localizedStrings.py:225 -msgid "app" -msgstr "" - -#: app/localizedStrings.py:229 -msgid "piloting" -msgstr "" - -#: app/localizedStrings.py:230 -msgid "keyBindings" -msgstr "" - -#: app/localizedStrings.py:231 app/runner/runner.py:408 -msgid "hardware" -msgstr "" - -#: app/localizedStrings.py:232 -msgid "connections" -msgstr "" - -#: app/localizedStrings.py:234 -msgid "window type" -msgstr "" - -#: app/localizedStrings.py:235 -msgid "units" -msgstr "" - -#: app/localizedStrings.py:236 -msgid "fullscr" -msgstr "" - -#: app/localizedStrings.py:237 -msgid "allowGUI" -msgstr "" - -#: app/localizedStrings.py:238 -msgid "paths" -msgstr "" - -#: app/localizedStrings.py:239 -msgid "flac" -msgstr "" - -#: app/localizedStrings.py:240 -msgid "shutdownKey" -msgstr "" - -#: app/localizedStrings.py:241 -msgid "shutdownKeyModifiers" -msgstr "" - -#: app/localizedStrings.py:242 -msgid "gammaErrorPolicy" -msgstr "" - -#: app/localizedStrings.py:243 -msgid "startUpPlugins" -msgstr "" - -#: app/localizedStrings.py:244 -msgid "appKeyGoogleCloud" -msgstr "" - -#: app/localizedStrings.py:247 -msgid "showStartupTips" -msgstr "" - -#: app/localizedStrings.py:248 -msgid "defaultView" -msgstr "" - -#: app/localizedStrings.py:249 -msgid "resetPrefs" -msgstr "" - -#: app/localizedStrings.py:250 -msgid "autoSavePrefs" -msgstr "" - -#: app/localizedStrings.py:251 -msgid "debugMode" -msgstr "" - -#: app/localizedStrings.py:252 -msgid "locale" -msgstr "" - -#: app/localizedStrings.py:253 -msgid "errorDialog" -msgstr "" - -#: app/localizedStrings.py:254 -msgid "theme" -msgstr "" - -#: app/localizedStrings.py:255 -msgid "showSplash" -msgstr "" - -#: app/localizedStrings.py:257 -msgid "reloadPrevExp" -msgstr "" - -#: app/localizedStrings.py:258 -msgid "codeComponentLanguage" -msgstr "" - -#: app/localizedStrings.py:259 -msgid "unclutteredNamespace" -msgstr "" - -#: app/localizedStrings.py:260 -msgid "componentsFolders" -msgstr "" - -#: app/localizedStrings.py:261 -msgid "componentFilter" -msgstr "" - -#: app/localizedStrings.py:262 -msgid "hiddenComponents" -msgstr "" - -#: app/localizedStrings.py:263 -msgid "abbreviateLongCompNames" -msgstr "" - -#: app/localizedStrings.py:264 -msgid "unpackedDemosDir" -msgstr "" - -#: app/localizedStrings.py:265 -msgid "savedDataFolder" -msgstr "" - -#: app/localizedStrings.py:266 -msgid "builderLayout" -msgstr "" - -#: app/localizedStrings.py:267 -msgid "alwaysShowReadme" -msgstr "" - -#: app/localizedStrings.py:268 -msgid "maxFavorites" -msgstr "" - -#: app/localizedStrings.py:269 -msgid "confirmRoutineClose" -msgstr "" - -#: app/localizedStrings.py:271 -msgid "readonly" -msgstr "" - -#: app/localizedStrings.py:272 -msgid "outputFont" -msgstr "" - -#: app/localizedStrings.py:273 -msgid "codeFont" -msgstr "" - -#: app/localizedStrings.py:274 -msgid "outputFontSize" -msgstr "" - -#: app/localizedStrings.py:275 -msgid "codeFontSize" -msgstr "" - -#: app/localizedStrings.py:276 -msgid "lineSpacing" -msgstr "" - -#: app/localizedStrings.py:277 -msgid "edgeGuideColumn" -msgstr "" - -#: app/localizedStrings.py:278 -msgid "showSourceAsst" -msgstr "" - -#: app/localizedStrings.py:279 -msgid "showOutput" -msgstr "" - -#: app/localizedStrings.py:280 -msgid "autocomplete" -msgstr "" - -#: app/localizedStrings.py:281 -msgid "reloadPrevFiles" -msgstr "" - -#: app/localizedStrings.py:282 -msgid "preferredShell" -msgstr "" - -#: app/localizedStrings.py:284 -msgid "forceWindowed" -msgstr "" - -#: app/localizedStrings.py:285 -msgid "forceMouseVisible" -msgstr "" - -#: app/localizedStrings.py:286 -msgid "forcedWindowSize" -msgstr "" - -#: app/localizedStrings.py:287 -msgid "pilotLoggingLevel" -msgstr "" - -#: app/localizedStrings.py:288 -msgid "pilotConsoleLoggingLevel" -msgstr "" - -#: app/localizedStrings.py:289 -msgid "showPilotingIndicator" -msgstr "" - -#: app/localizedStrings.py:290 -msgid "forceNonRush" -msgstr "" - -#: app/localizedStrings.py:291 -msgid "replaceParticipantID" -msgstr "" - -#: app/localizedStrings.py:293 -msgid "open" -msgstr "" - -#: app/localizedStrings.py:294 -msgid "new" -msgstr "" - -#: app/localizedStrings.py:295 -msgid "save" -msgstr "" - -#: app/localizedStrings.py:296 -msgid "saveAs" -msgstr "" - -#: app/localizedStrings.py:297 -msgid "revealFolder" -msgstr "" - -#: app/localizedStrings.py:298 -msgid "print" -msgstr "" - -#: app/localizedStrings.py:299 -msgid "close" -msgstr "" - -#: app/localizedStrings.py:300 -msgid "quit" -msgstr "" - -#: app/localizedStrings.py:301 -msgid "preferences" -msgstr "" - -#: app/localizedStrings.py:302 -msgid "exportHTML" -msgstr "" - -#: app/localizedStrings.py:303 -msgid "cut" -msgstr "" - -#: app/localizedStrings.py:304 -msgid "copy" -msgstr "" - -#: app/builder/builder.py:2041 app/localizedStrings.py:305 -msgid "paste" -msgstr "" - -#: app/localizedStrings.py:306 -msgid "duplicate" -msgstr "" - -#: app/localizedStrings.py:307 -msgid "indent" -msgstr "" - -#: app/localizedStrings.py:308 -msgid "dedent" -msgstr "" - -#: app/localizedStrings.py:309 -msgid "smartIndent" -msgstr "" - -#: app/localizedStrings.py:310 -msgid "find" -msgstr "" - -#: app/localizedStrings.py:311 -msgid "findAgain" -msgstr "" - -#: app/localizedStrings.py:312 -msgid "undo" -msgstr "" - -#: app/localizedStrings.py:313 -msgid "redo" -msgstr "" - -#: app/localizedStrings.py:314 -msgid "comment" -msgstr "" - -#: app/localizedStrings.py:315 -msgid "uncomment" -msgstr "" - -#: app/localizedStrings.py:316 -msgid "toggle comment" -msgstr "" - -#: app/localizedStrings.py:317 -msgid "fold" -msgstr "" - -#: app/localizedStrings.py:318 -msgid "enlargeFont" -msgstr "" - -#: app/localizedStrings.py:319 -msgid "shrinkFont" -msgstr "" - -#: app/localizedStrings.py:320 -msgid "analyseCode" -msgstr "" - -#: app/localizedStrings.py:321 -msgid "compileScript" -msgstr "" - -#: app/localizedStrings.py:322 -msgid "runScript" -msgstr "" - -#: app/localizedStrings.py:323 -msgid "runnerScript" -msgstr "" - -#: app/localizedStrings.py:324 -msgid "stopScript" -msgstr "" - -#: app/localizedStrings.py:325 -msgid "toggleWhitespace" -msgstr "" - -#: app/localizedStrings.py:326 -msgid "toggleEOLs" -msgstr "" - -#: app/localizedStrings.py:327 -msgid "toggleIndentGuides" -msgstr "" - -#: app/localizedStrings.py:328 -msgid "expSettings" -msgstr "" - -#: app/localizedStrings.py:329 -msgid "newRoutine" -msgstr "" - -#: app/localizedStrings.py:330 -msgid "copyRoutine" -msgstr "" - -#: app/localizedStrings.py:331 -msgid "pasteRoutine" -msgstr "" - -#: app/localizedStrings.py:332 -msgid "pasteCompon" -msgstr "" - -#: app/localizedStrings.py:333 -msgid "builderFind" -msgstr "" - -#: app/localizedStrings.py:334 -msgid "toggleOutputPanel" -msgstr "" - -#: app/localizedStrings.py:335 -msgid "renameRoutine" -msgstr "" - -#: app/localizedStrings.py:336 -msgid "cycleWindows" -msgstr "" - -#: app/localizedStrings.py:337 -msgid "largerFlow" -msgstr "" - -#: app/localizedStrings.py:338 -msgid "smallerFlow" -msgstr "" - -#: app/localizedStrings.py:339 -msgid "largerRoutine" -msgstr "" - -#: app/localizedStrings.py:340 -msgid "smallerRoutine" -msgstr "" - -#: app/localizedStrings.py:341 -msgid "toggleReadme" -msgstr "" - -#: app/localizedStrings.py:342 -msgid "pavlovia_logIn" -msgstr "" - -#: app/localizedStrings.py:343 -msgid "OSF_logIn" -msgstr "" - -#: app/localizedStrings.py:344 -msgid "projectsSync" -msgstr "" - -#: app/localizedStrings.py:345 -msgid "projectsFind" -msgstr "" - -#: app/localizedStrings.py:346 -msgid "projectsOpen" -msgstr "" - -#: app/localizedStrings.py:347 -msgid "projectsNew" -msgstr "" - -#: app/localizedStrings.py:349 -msgid "audioWASAPIOnly" -msgstr "" - -#: app/localizedStrings.py:352 -msgid "audioDriver" -msgstr "" - -#: app/localizedStrings.py:353 -msgid "audioDevice" -msgstr "" - -#: app/localizedStrings.py:354 -msgid "parallelPorts" -msgstr "" - -#: app/localizedStrings.py:355 -msgid "qmixConfiguration" -msgstr "" - -#: app/localizedStrings.py:358 -msgid "proxy" -msgstr "" - -#: app/localizedStrings.py:359 -msgid "autoProxy" -msgstr "" - -#: app/localizedStrings.py:360 -msgid "allowUsageStats" -msgstr "" - -#: app/localizedStrings.py:361 -msgid "checkForUpdates" -msgstr "" - -#: app/localizedStrings.py:362 -msgid "timeout" -msgstr "" - -#: app/localizedStrings.py:364 -msgid "Builder, Coder and Runner" -msgstr "" - -#: app/localizedStrings.py:365 -msgid "same as in the file" -msgstr "" - -#: app/localizedStrings.py:366 -msgid "abort" -msgstr "" - -#: app/localizedStrings.py:367 -msgid "warn" -msgstr "" - -#: app/localizedStrings.py:377 -msgid "From theme..." -msgstr "" - -#: app/preferencesDlg.py:24 -msgid "Latency not important" -msgstr "" - -#: app/preferencesDlg.py:25 -msgid "Share low-latency driver" -msgstr "" - -#: app/preferencesDlg.py:26 experiment/components/sound/__init__.py:392 -msgid "Exclusive low-latency" -msgstr "" - -#: app/preferencesDlg.py:27 -msgid "Aggressive low-latency" -msgstr "" - -#: app/preferencesDlg.py:28 -msgid "Latency critical" -msgstr "" - -#: app/preferencesDlg.py:311 -msgid "PsychoPy Preferences" -msgstr "" - -#: app/builder/dialogs/__init__.py:860 app/builder/dialogs/dlgsCode.py:142 -#: app/builder/dialogs/dlgsConditions.py:507 app/preferencesDlg.py:381 -msgid " Help " -msgstr "" - -#: app/preferencesDlg.py:387 -msgid " Apply " -msgstr "" - -#: app/builder/dialogs/__init__.py:867 app/builder/dialogs/dlgsCode.py:145 -#: app/builder/dialogs/dlgsConditions.py:513 app/preferencesDlg.py:388 -#: gui/qtgui.py:161 gui/wxgui.py:70 monitors/MonitorCenter.py:1214 -#: monitors/MonitorCenter.py:1322 -msgid " OK " -msgstr "" - -#: app/builder/dialogs/__init__.py:871 app/builder/dialogs/dlgsCode.py:148 -#: app/builder/dialogs/dlgsConditions.py:520 app/preferencesDlg.py:389 -#: gui/qtgui.py:162 gui/wxgui.py:71 monitors/MonitorCenter.py:1216 -#: monitors/MonitorCenter.py:1325 -msgid " Cancel " -msgstr "" - -#: app/preferencesDlg.py:530 -msgid "system locale" -msgstr "" - -#: app/preferencesDlg.py:682 -#, python-format -msgid "Invalid value in \"%(pref)s\" (\"%(section)s\" Tab)" -msgstr "" - -#: app/builder/builder.py:2896 app/preferencesDlg.py:684 -msgid "Error" -msgstr "" - -#: app/ribbon.py:754 app/ribbon.py:836 -msgid "No user" -msgstr "" - -#: app/ribbon.py:802 -msgid "Edit user..." -msgstr "" - -#: app/ribbon.py:808 -msgid "Switch user" -msgstr "" - -#: app/ribbon.py:816 -msgid "New user..." -msgstr "" - -#: app/ribbon.py:822 -msgid "Log out" -msgstr "" - -#: app/ribbon.py:825 -msgid "Log in" -msgstr "" - -#: app/ribbon.py:893 app/ribbon.py:961 -msgid "No project" -msgstr "" - -#: app/ribbon.py:940 -msgid "New project" -msgstr "" - -#: app/ribbon.py:944 -msgid "Edit project..." -msgstr "" - -#: app/ribbon.py:950 -msgid "Search projects..." -msgstr "" - -#: app/utils.py:300 -#, python-brace-format -msgid "Could not get image from: {}, using blank image instead." -msgstr "" - -#: app/builder/builder.py:1918 app/builder/builder.py:3430 -#: app/builder/builder.py:4539 app/coder/coder.py:2956 app/utils.py:493 -msgid "Edit" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:489 app/utils.py:497 -msgid "Preview" -msgstr "" - -#: app/utils.py:598 -msgid "Save file as..." -msgstr "" - -#: app/utils.py:628 -msgid "View raw code" -msgstr "" - -#: app/utils.py:632 -msgid "View styled HTML" -msgstr "" - -#: app/utils.py:874 -msgid "item" -msgstr "" - -#: app/utils.py:940 -#, python-brace-format -msgid "Add {}..." -msgstr "" - -#: app/utils.py:1226 -msgid "Inavlid image format, could not set image." -msgstr "" - -#: app/utils.py:1244 -msgid "Select image..." -msgstr "" - -#: app/pavlovia_ui/project.py:828 app/utils.py:1350 -msgid "Specify folder..." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:694 app/utils.py:1352 -msgid "Specify file..." -msgstr "" - -#: app/utils.py:1448 app/utils.py:1449 -#, python-format -msgid "&Next window\t%s" -msgstr "" - -#: app/utils.py:1474 -msgid "Show &builder" -msgstr "" - -#: app/builder/builder.py:4693 app/coder/coder.py:3082 app/runner/runner.py:1276 -#: app/utils.py:1474 -msgid "Show Builder" -msgstr "" - -#: app/utils.py:1481 -msgid "Show &coder" -msgstr "" - -#: app/builder/builder.py:4699 app/coder/coder.py:3088 app/runner/runner.py:1282 -#: app/utils.py:1481 -msgid "Show Coder" -msgstr "" - -#: app/utils.py:1488 -msgid "Show &runner" -msgstr "" - -#: app/builder/builder.py:4705 app/coder/coder.py:3094 app/runner/runner.py:1288 -#: app/utils.py:1488 -msgid "Show Runner" -msgstr "" - -#: app/builder/builder.py:288 app/builder/builder.py:3427 app/coder/coder.py:1382 -#: app/pavlovia_ui/_base.py:25 app/runner/runner.py:230 -#: monitors/MonitorCenter.py:227 -msgid "&File" -msgstr "" - -#: app/builder/builder.py:304 app/coder/coder.py:1396 -#, python-format -msgid "&New\t%s" -msgstr "" - -#: app/builder/builder.py:307 app/coder/coder.py:1397 -#, python-format -msgid "&Open...\t%s" -msgstr "" - -#: app/builder/builder.py:310 app/coder/coder.py:1398 -msgid "Open &Recent" -msgstr "" - -#: app/builder/builder.py:313 app/coder/coder.py:1400 -#, python-format -msgid "&Save\t%s" -msgstr "" - -#: app/builder/builder.py:314 app/builder/builder.py:4525 -msgid "Save current experiment file" -msgstr "" - -#: app/builder/builder.py:317 app/coder/coder.py:1404 -#, python-format -msgid "Save &as...\t%s" -msgstr "" - -#: app/builder/builder.py:318 app/builder/builder.py:4531 -msgid "Save current experiment file as..." -msgstr "" - -#: app/builder/builder.py:323 -#, python-format -msgid "Export HTML...\t%s" -msgstr "" - -#: app/builder/builder.py:324 -msgid "Export experiment to html/javascript file" -msgstr "" - -#: app/builder/builder.py:331 -#, python-format -msgid "Reveal in file explorer...\t%s" -msgstr "" - -#: app/builder/builder.py:332 -msgid "Open the folder containing this experiment in your system's file explorer" -msgstr "" - -#: app/builder/builder.py:337 app/coder/coder.py:1408 -#, python-format -msgid "&Close file\t%s" -msgstr "" - -#: app/builder/builder.py:338 -msgid "Close current experiment" -msgstr "" - -#: app/builder/builder.py:348 app/coder/coder.py:1424 -#, python-format -msgid "&Preferences\t%s" -msgstr "" - -#: app/builder/builder.py:351 app/coder/coder.py:1429 -msgid "Reset preferences..." -msgstr "" - -#: app/builder/builder.py:364 app/coder/coder.py:1449 -#: monitors/MonitorCenter.py:235 -msgid "&Edit" -msgstr "" - -#: app/builder/builder.py:367 app/builder/builder.py:1267 app/coder/coder.py:1515 -#, python-format -msgid "Undo\t%s" -msgstr "" - -#: app/builder/builder.py:368 app/builder/builder.py:4544 app/coder/coder.py:1516 -#: app/coder/coder.py:2961 -msgid "Undo last action" -msgstr "" - -#: app/builder/builder.py:372 app/builder/builder.py:1282 app/coder/coder.py:1520 -#, python-format -msgid "Redo\t%s" -msgstr "" - -#: app/builder/builder.py:373 app/builder/builder.py:4550 app/coder/coder.py:1521 -#: app/coder/coder.py:2967 -msgid "Redo last action" -msgstr "" - -#: app/builder/builder.py:376 app/coder/coder.py:1454 -#, python-format -msgid "&Paste\t%s" -msgstr "" - -#: app/builder/builder.py:381 -#, python-format -msgid "&Find in experiment...\t%s" -msgstr "" - -#: app/builder/builder.py:382 app/builder/builder.py:4556 -msgid "Search the whole experiment for a specific term" -msgstr "" - -#: app/builder/builder.py:403 app/builder/builder.py:3436 -#, python-format -msgid "&Toggle readme\t%s" -msgstr "" - -#: app/builder/builder.py:405 app/builder/builder.py:3438 -msgid "Toggle Readme" -msgstr "" - -#: app/builder/builder.py:408 -#, python-format -msgid "&Flow Larger\t%s" -msgstr "" - -#: app/builder/builder.py:410 -msgid "Larger flow items" -msgstr "" - -#: app/builder/builder.py:413 -#, python-format -msgid "&Flow Smaller\t%s" -msgstr "" - -#: app/builder/builder.py:415 -msgid "Smaller flow items" -msgstr "" - -#: app/builder/builder.py:418 -#, python-format -msgid "&Routine Larger\t%s" -msgstr "" - -#: app/builder/builder.py:420 -msgid "Larger routine items" -msgstr "" - -#: app/builder/builder.py:423 -#, python-format -msgid "&Routine Smaller\t%s" -msgstr "" - -#: app/builder/builder.py:425 -msgid "Smaller routine items" -msgstr "" - -#: app/builder/builder.py:434 app/coder/coder.py:1630 app/runner/runner.py:224 -msgid "&Themes" -msgstr "" - -#: app/builder/builder.py:438 app/coder/coder.py:1660 -msgid "&Tools" -msgstr "" - -#: app/builder/builder.py:441 app/coder/coder.py:1662 -msgid "Monitor Center" -msgstr "" - -#: app/builder/builder.py:442 app/coder/coder.py:1663 -msgid "To set information about your monitor" -msgstr "" - -#: app/builder/builder.py:446 -#, python-format -msgid "Compile\t%s" -msgstr "" - -#: app/builder/builder.py:447 -msgid "Compile the exp to a script" -msgstr "" - -#: app/builder/builder.py:450 app/coder/coder.py:1677 -#, python-format -msgid "Run/pilot\t%s" -msgstr "" - -#: app/builder/builder.py:451 app/coder/coder.py:1678 -msgid "Run the current script" -msgstr "" - -#: app/builder/builder.py:454 app/coder/coder.py:1681 -#, python-format -msgid "Send to runner\t%s" -msgstr "" - -#: app/builder/builder.py:455 app/coder/coder.py:1682 -msgid "Send current script to runner" -msgstr "" - -#: app/builder/builder.py:459 app/coder/coder.py:1687 -msgid "PsychoPy updates..." -msgstr "" - -#: app/builder/builder.py:460 app/coder/coder.py:1688 -msgid "Update PsychoPy to the latest, or a specific, version" -msgstr "" - -#: app/builder/builder.py:464 app/coder/coder.py:1691 -msgid "Plugin/packages manager..." -msgstr "" - -#: app/builder/builder.py:465 app/coder/coder.py:1692 -msgid "Manage Python packages and optional plugins for PsychoPy" -msgstr "" - -#: app/builder/builder.py:469 app/coder/coder.py:1695 -msgid "Benchmark wizard" -msgstr "" - -#: app/builder/builder.py:470 app/coder/coder.py:1696 -msgid "Check software & hardware, generate report" -msgstr "" - -#: app/builder/builder.py:476 -msgid "E&xperiment" -msgstr "" - -#: app/builder/builder.py:480 -#, python-format -msgid "Experiment &Settings\t%s" -msgstr "" - -#: app/builder/builder.py:481 app/builder/builder.py:4583 -msgid "Edit experiment settings" -msgstr "" - -#: app/builder/builder.py:486 -#, python-format -msgid "&New Routine\t%s" -msgstr "" - -#: app/builder/builder.py:487 -msgid "Create a new routine (e.g. the trial definition)" -msgstr "" - -#: app/builder/builder.py:491 -#, python-format -msgid "&Copy Routine\t%s" -msgstr "" - -#: app/builder/builder.py:493 -msgid "Copy the current routine so it can be used in another exp" -msgstr "" - -#: app/builder/builder.py:498 -#, python-format -msgid "&Paste Routine\t%s" -msgstr "" - -#: app/builder/builder.py:500 -msgid "Paste the Routine into the current experiment" -msgstr "" - -#: app/builder/builder.py:505 -#, python-format -msgid "&Rename Routine\t%s" -msgstr "" - -#: app/builder/builder.py:507 -msgid "Change the name of this routine" -msgstr "" - -#: app/builder/builder.py:510 -#, python-format -msgid "Paste Component\t%s" -msgstr "" - -#: app/builder/builder.py:513 -msgid "Paste the Component at bottom of the current Routine" -msgstr "" - -#: app/builder/builder.py:520 -msgid "Insert Routine in Flow" -msgstr "" - -#: app/builder/builder.py:522 -msgid "Select one of your routines to be inserted into the experiment flow" -msgstr "" - -#: app/builder/builder.py:526 -msgid "Insert Loop in Flow" -msgstr "" - -#: app/builder/builder.py:527 -msgid "Create a new loop in your flow window" -msgstr "" - -#: app/builder/builder.py:532 -msgid "README..." -msgstr "" - -#: app/builder/builder.py:533 -msgid "Add or edit the text shown when your experiment is opened" -msgstr "" - -#: app/builder/builder.py:544 -msgid "&Unpack Demos..." -msgstr "" - -#: app/builder/builder.py:546 -msgid "Unpack demos to a writable location (so that they can be run)" -msgstr "" - -#: app/builder/builder.py:550 -msgid "Browse on Pavlovia" -msgstr "" - -#: app/builder/builder.py:551 -msgid "Get more demos from the online demos repository on Pavlovia" -msgstr "" - -#: app/builder/builder.py:556 -msgid "Open demos folder" -msgstr "" - -#: app/builder/builder.py:557 -msgid "Open the local folder where demos are stored" -msgstr "" - -#: app/builder/builder.py:563 app/coder/coder.py:1711 app/runner/runner.py:233 -msgid "&Demos" -msgstr "" - -#: app/builder/builder.py:567 app/coder/coder.py:1739 -msgid "&Pavlovia.org" -msgstr "" - -#: app/builder/builder.py:571 app/coder/coder.py:1744 app/runner/runner.py:237 -msgid "&Window" -msgstr "" - -#: app/builder/builder.py:575 app/coder/coder.py:1748 -msgid "&Help" -msgstr "" - -#: app/builder/builder.py:579 app/coder/coder.py:1750 -msgid "&PsychoPy Homepage" -msgstr "" - -#: app/builder/builder.py:580 app/coder/coder.py:1751 -msgid "Go to the PsychoPy homepage" -msgstr "" - -#: app/builder/builder.py:584 -msgid "&PsychoPy Builder Help" -msgstr "" - -#: app/builder/builder.py:586 -msgid "Go to the online documentation for PsychoPy Builder" -msgstr "" - -#: app/builder/builder.py:593 app/coder/coder.py:1766 -msgid "&System Info..." -msgstr "" - -#: app/builder/builder.py:594 app/coder/coder.py:1767 -msgid "Get system information." -msgstr "" - -#: app/builder/builder.py:599 app/coder/coder.py:1772 -msgid "&About..." -msgstr "" - -#: app/builder/builder.py:599 app/coder/coder.py:1773 -msgid "About PsychoPy" -msgstr "" - -#: app/builder/builder.py:602 app/coder/coder.py:1777 -msgid "&News..." -msgstr "" - -#: app/builder/builder.py:603 app/coder/coder.py:1778 -msgid "News" -msgstr "" - -#: app/builder/builder.py:733 app/builder/builder.py:863 -msgid "PsychoPy experiments (*.psyexp)|*.psyexp|Any file (*.*)|*.*" -msgstr "" - -#: app/builder/builder.py:735 app/builder/builder.py:865 -msgid "PsychoPy experiments (*.psyexp)|*.psyexp|Any file (*.*)|*" -msgstr "" - -#: app/builder/builder.py:739 app/builder/builder.py:744 -#: app/builder/dialogs/__init__.py:1589 app/coder/coder.py:2359 -msgid "Open file ..." -msgstr "" - -#: app/builder/builder.py:868 app/coder/coder.py:2501 -msgid "Save file as ..." -msgstr "" - -#: app/builder/builder.py:925 -msgid "Please save experiment before editing the README file" -msgstr "" - -#: app/builder/builder.py:926 -msgid "No readme file" -msgstr "" - -#: app/builder/builder.py:1031 -#, python-format -msgid "Experiment %s has changed. Save before quitting?" -msgstr "" - -#: app/builder/builder.py:1136 app/coder/coder.py:2890 -msgid "Are you sure you want to reset your preferences? This cannot be undone." -msgstr "" - -#: app/builder/builder.py:1141 app/coder/coder.py:2894 -msgid "I'm sure" -msgstr "" - -#: app/builder/builder.py:1142 app/coder/coder.py:2895 -msgid "Wait, go back!" -msgstr "" - -#: app/builder/builder.py:1151 app/coder/coder.py:2904 -msgid "" -"Done! Your preferences have been reset. Changes will be applied when you " -"next open PsychoPy." -msgstr "" - -#: app/builder/builder.py:1271 -#, python-format -msgid "Undo %(action)s\t%(key)s" -msgstr "" - -#: app/builder/builder.py:1286 -#, python-format -msgid "Redo %(action)s\t%(key)s" -msgstr "" - -#: app/builder/builder.py:1299 -msgid "Location to unpack demos" -msgstr "" - -#: app/builder/builder.py:1434 app/builder/builder.py:2639 -#, python-format -msgid "New name for copy of \"%(copied)s\"? [%(default)s]" -msgstr "" - -#: app/builder/builder.py:1438 -msgid "Paste Routine" -msgstr "" - -#: app/builder/builder.py:1514 -msgid "What is the new name for the Routine?" -msgstr "" - -#: app/builder/builder.py:1516 app/coder/fileBrowser.py:97 -msgid "Rename" -msgstr "" - -#: app/builder/builder.py:1589 app/coder/coder.py:2861 -msgid "The package index is currently being updated. Please try again later." -msgstr "" - -#: app/builder/builder.py:1593 app/coder/coder.py:2865 -msgid "Package indexing in progress" -msgstr "" - -#: app/builder/builder.py:1757 app/builder/dialogs/__init__.py:1828 -msgid "What is the name for the new Routine? (e.g. instr, trial, feedback)" -msgstr "" - -#: app/builder/builder.py:1787 -#, python-brace-format -msgid "Do you want to remove routine '{}' from the experiment?" -msgstr "" - -#: app/builder/builder.py:1793 -msgid "Remove routine?" -msgstr "" - -#: app/builder/builder.py:1915 app/coder/codeEditorBase.py:104 -#: app/colorpicker/ui.py:202 -msgid "Copy" -msgstr "" - -#: app/builder/builder.py:1916 -msgid "Paste above" -msgstr "" - -#: app/builder/builder.py:1917 -msgid "Paste below" -msgstr "" - -#: app/builder/builder.py:1919 app/runner/runner.py:1175 -msgid "Remove" -msgstr "" - -#: app/builder/builder.py:1920 -msgid "Move to top" -msgstr "" - -#: app/builder/builder.py:1921 -msgid "Move up" -msgstr "" - -#: app/builder/builder.py:1922 -msgid "Move down" -msgstr "" - -#: app/builder/builder.py:1923 -msgid "Move to bottom" -msgstr "" - -#: app/builder/builder.py:2589 -msgid "Routine settings" -msgstr "" - -#: app/builder/builder.py:2643 -msgid "Paste Component" -msgstr "" - -#: app/builder/builder.py:2758 -msgid "Help" -msgstr "" - -#: app/builder/builder.py:2895 -msgid "Cannot add component, experiment has no routines." -msgstr "" - -#: app/builder/builder.py:2946 -msgid "Remove from favorites" -msgstr "" - -#: app/builder/builder.py:2950 -msgid "Add to favorites" -msgstr "" - -#: app/builder/builder.py:3084 app/pavlovia_ui/project.py:914 -#: app/pavlovia_ui/search.py:412 app/pavlovia_ui/sync.py:97 -msgid "OK" -msgstr "" - -#: app/builder/builder.py:3127 -msgid "Get more..." -msgstr "" - -#: app/builder/builder.py:3128 -msgid "Add new components and features via plugins." -msgstr "" - -#: app/builder/builder.py:3134 -msgid "Filter components by whether they work with PsychoJS, PsychoPy or both." -msgstr "" - -#: app/builder/builder.py:3433 -#, python-format -msgid "&Close readme\t%s" -msgstr "" - -#: app/builder/builder.py:3530 app/builder/builder.py:3653 -msgid "Insert Routine" -msgstr "" - -#: app/builder/builder.py:3537 app/builder/builder.py:3655 -msgid "Insert Loop" -msgstr "" - -#: app/builder/builder.py:3600 -msgid "remove" -msgstr "" - -#: app/builder/builder.py:3601 -msgid "rename" -msgstr "" - -#: app/builder/builder.py:3684 -msgid "Select a Routine to insert (Esc to exit)" -msgstr "" - -#: app/builder/builder.py:3724 -msgid "CANCEL Insert" -msgstr "" - -#: app/builder/builder.py:3726 -msgid "Click where you want to insert the Routine, or CANCEL insert." -msgstr "" - -#: app/builder/builder.py:3757 -msgid "CANCEL insert" -msgstr "" - -#: app/builder/builder.py:3760 -msgid "Click where you want the loop to start/end, or CANCEL insert." -msgstr "" - -#: app/builder/builder.py:3769 -msgid "Click the other end for the loop" -msgstr "" - -#: app/builder/builder.py:4021 -#, python-format -msgid "" -"The \"%s\" Loop is about to be deleted as well (by collapsing). OK to " -"proceed?" -msgstr "" - -#: app/builder/builder.py:4023 -msgid "Impending Loop collapse" -msgstr "" - -#: app/builder/builder.py:4508 app/coder/coder.py:2925 app/runner/runner.py:515 -msgid "File" -msgstr "" - -#: app/builder/builder.py:4512 app/coder/coder.py:2929 -msgid "New" -msgstr "" - -#: app/builder/builder.py:4513 -msgid "Create new experiment file" -msgstr "" - -#: app/builder/builder.py:4518 app/coder/coder.py:2935 app/runner/runner.py:1187 -msgid "Open" -msgstr "" - -#: app/builder/builder.py:4519 -msgid "Open an existing experiment file" -msgstr "" - -#: app/builder/builder.py:4530 app/coder/coder.py:2947 -msgid "Save as..." -msgstr "" - -#: app/builder/builder.py:4543 app/coder/codeEditorBase.py:101 -#: app/coder/coder.py:2960 -msgid "Undo" -msgstr "" - -#: app/builder/builder.py:4549 app/coder/codeEditorBase.py:102 -#: app/coder/coder.py:2966 -msgid "Redo" -msgstr "" - -#: app/builder/builder.py:4555 app/coder/coder.py:2972 -msgid "Find" -msgstr "" - -#: app/builder/builder.py:4568 app/coder/coder.py:3019 -msgid "Monitor center" -msgstr "" - -#: app/builder/builder.py:4570 app/coder/coder.py:3020 -msgid "Monitor settings and calibration" -msgstr "" - -#: app/builder/builder.py:4575 -msgid "Device manager" -msgstr "" - -#: app/builder/builder.py:4577 -msgid "Map devices from this machine to names in your experiment" -msgstr "" - -#: app/builder/builder.py:4582 -msgid "Experiment settings" -msgstr "" - -#: app/builder/builder.py:4589 app/builder/builder.py:4621 app/coder/coder.py:2992 -#: app/coder/coder.py:3025 app/runner/runner.py:1201 app/runner/runner.py:1214 -msgid "Pilot" -msgstr "" - -#: app/builder/builder.py:4589 app/builder/builder.py:4627 app/coder/coder.py:2992 -#: app/coder/coder.py:3031 app/runner/runner.py:1201 app/runner/runner.py:1220 -msgid "Run" -msgstr "" - -#: app/builder/builder.py:4595 app/builder/builder.py:4601 app/coder/coder.py:2997 -#: app/coder/coder.py:3003 -msgid "Runner" -msgstr "" - -#: app/builder/builder.py:4596 app/builder/builder.py:4603 app/coder/coder.py:2998 -#: app/coder/coder.py:3005 -msgid "Send experiment to Runner" -msgstr "" - -#: app/builder/builder.py:4611 app/coder/coder.py:3015 app/runner/runner.py:1210 -msgid "Desktop" -msgstr "" - -#: app/builder/builder.py:4615 -msgid "Write Python" -msgstr "" - -#: app/builder/builder.py:4616 -msgid "Write experiment as a Python script" -msgstr "" - -#: app/builder/builder.py:4622 app/coder/coder.py:3026 app/runner/runner.py:1215 -msgid "Run the current script in Python with piloting features on" -msgstr "" - -#: app/builder/builder.py:4628 app/coder/coder.py:3032 app/runner/runner.py:1221 -msgid "Run the current script in Python" -msgstr "" - -#: app/builder/builder.py:4636 app/coder/coder.py:3043 app/runner/runner.py:1235 -msgid "Browser" -msgstr "" - -#: app/builder/builder.py:4640 -msgid "Write JS" -msgstr "" - -#: app/builder/builder.py:4641 -msgid "Write experiment as a JavaScript (JS) script" -msgstr "" - -#: app/builder/builder.py:4646 app/runner/runner.py:1239 -msgid "Pilot in browser" -msgstr "" - -#: app/builder/builder.py:4648 app/runner/runner.py:1241 -msgid "Pilot experiment locally in your browser" -msgstr "" - -#: app/builder/builder.py:4653 app/runner/runner.py:1246 -msgid "Run on Pavlovia" -msgstr "" - -#: app/builder/builder.py:4654 app/runner/runner.py:1247 -msgid "Run experiment on Pavlovia" -msgstr "" - -#: app/builder/builder.py:4659 app/coder/coder.py:3048 -#: app/pavlovia_ui/project.py:308 -msgid "Sync" -msgstr "" - -#: app/builder/builder.py:4660 app/coder/coder.py:3049 -msgid "Sync project with Pavlovia" -msgstr "" - -#: app/builder/builder.py:4668 app/coder/coder.py:3057 app/runner/runner.py:1093 -#: app/runner/runner.py:1255 -msgid "Pavlovia" -msgstr "" - -#: app/builder/builder.py:4689 app/coder/coder.py:3078 app/runner/runner.py:1272 -msgid "Views" -msgstr "" - -#: app/builder/builder.py:4694 app/coder/coder.py:3083 app/runner/runner.py:1277 -msgid "Switch to Builder view" -msgstr "" - -#: app/builder/builder.py:4700 app/coder/coder.py:3089 app/runner/runner.py:1283 -msgid "Switch to Coder view" -msgstr "" - -#: app/builder/builder.py:4706 app/coder/coder.py:3095 app/runner/runner.py:1289 -msgid "Switch to Runner view" -msgstr "" - -#: app/builder/dialogs/__init__.py:1051 app/builder/validators.py:386 -msgid "Missing name" -msgstr "" - -#: app/builder/validators.py:396 -#, python-brace-format -msgid "That name is in use (by {used}). Try another name." -msgstr "" - -#: app/builder/validators.py:400 -msgid "" -"Name can only contain letters, numbers and underscores (_), no spaces or " -"other symbols" -msgstr "" - -#: app/builder/validators.py:498 -#, python-brace-format -msgid "" -"Font `{val}` not found locally, will attempt to retrieve from Google Fonts " -"when this experiment next runs" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:337 app/builder/validators.py:517 -#, python-brace-format -msgid "Python syntax error in field `{}`: {}" -msgstr "" - -#: app/builder/validators.py:532 -#, python-brace-format -msgid "Looks like your variable '{code}' in '{displayName}' should be set to update." -msgstr "" - -#: app/builder/validators.py:552 -#, python-brace-format -msgid "Python var `{}` in `{}` is same as Name" -msgstr "" - -#: app/builder/validators.py:575 -#, python-brace-format -msgid "Variable name ${newName} is in use (by {used}). Try another name." -msgstr "" - -#: app/builder/dialogs/__init__.py:161 -msgid "set during: " -msgstr "" - -#: app/builder/dialogs/__init__.py:737 app/builder/dialogs/__init__.py:739 -#: app/builder/dialogs/__init__.py:1090 app/builder/dialogs/dlgsCode.py:41 -#: app/builder/dialogs/dlgsCode.py:43 -msgid " Properties" -msgstr "" - -#: app/builder/dialogs/__init__.py:802 -#, python-brace-format -msgid "Requires plugin {}, click here to install." -msgstr "" - -#: app/builder/dialogs/__init__.py:861 app/builder/dialogs/dlgsCode.py:143 -msgid "Go to online help about this component" -msgstr "" - -#: app/builder/dialogs/__init__.py:1058 -#, python-format -msgid "That name is in use (it's a %s). Try another name." -msgstr "" - -#: app/builder/dialogs/__init__.py:1061 app/builder/dialogs/dlgsConditions.py:296 -#: app/builder/dialogs/dlgsConditions.py:582 -msgid "Name must be alphanumeric or _, no spaces" -msgstr "" - -#: app/builder/dialogs/__init__.py:1350 app/builder/dialogs/__init__.py:1540 -msgid "No parameters set" -msgstr "" - -#: app/builder/dialogs/__init__.py:1429 -msgid "No parameters set (select a file above)" -msgstr "" - -#: app/builder/dialogs/__init__.py:1529 -#, python-format -msgid "" -"%(nCondition)i conditions, with %(nParam)i parameters\n" -"%(paramStr)s" -msgstr "" - -#: app/builder/dialogs/__init__.py:1538 -msgid "No parameters set (conditionsFile not found)" -msgstr "" - -#: app/builder/dialogs/__init__.py:1622 -msgid "Conditions file set from variable." -msgstr "" - -#: app/builder/dialogs/__init__.py:1637 -#, python-format -msgid "Could not read conditions from: %s\n" -msgstr "" - -#: app/builder/dialogs/__init__.py:1644 -#, python-format -msgid "" -"Bad name in %s: Parameters (column headers) cannot contain dots or be " -"duplicated." -msgstr "" - -#: app/builder/dialogs/__init__.py:1660 -#, python-brace-format -msgid "Builder variable(s) ({}) in file:{}" -msgstr "" - -#: app/builder/dialogs/__init__.py:1690 -#, python-format -msgid "Duplicate condition names, different conditions file: %s" -msgstr "" - -#: app/builder/dialogs/__init__.py:1785 -msgid "Show screen numbers" -msgstr "" - -#: app/builder/dialogs/__init__.py:1812 -msgid "New Routine" -msgstr "" - -#: app/builder/dialogs/__init__.py:1824 -msgid "New Routine name:" -msgstr "" - -#: app/builder/dialogs/__init__.py:1832 -msgid "Routine Template:" -msgstr "" - -#: app/builder/dialogs/__init__.py:1836 -msgid "Select a template to base your new Routine on" -msgstr "" - -#: app/builder/dialogs/dlgsCode.py:110 app/plugin_manager/plugins.py:1279 -#: app/plugin_manager/plugins.py:1297 -msgid "Disabled" -msgstr "" - -#: app/builder/dialogs/dlgsCode.py:238 -msgid "" -"\n" -"Py to JS auto-translation requires the metapensiero library.\n" -"Available for Python 3.5+.\n" -msgstr "" - -#: app/builder/dialogs/dlgsCode.py:240 -msgid "Warning: requires the metapensiero library" -msgstr "" - -#: app/builder/dialogs/dlgsCode.py:272 -msgid "" -"\n" -"Auto-JS translation will overwrite your existing JavaScript code.\n" -"Press OK to continue, or Cancel.\n" -msgstr "" - -#: app/builder/dialogs/dlgsCode.py:274 -msgid "Warning: Python to JavaScript Translation" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:79 -msgid "New (no file)" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:87 -msgid "Conditions data (no file)" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:160 -msgid "Params:" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:169 -msgid "type:" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:225 -#, python-format -msgid "cond %s:" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:262 -msgid "Should be legal as a variable name (alphanumeric)" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:273 -msgid "extra white-space" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:438 -msgid "PREVIEW" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:475 -msgid "+cond." -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:476 -msgid "Add a condition (row); to delete a condition, delete all of its values." -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:482 -msgid "+param" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:483 -msgid "" -"Add a parameter (column); to delete a param, set its type to None, or delete" -" all of its values." -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:490 -msgid "" -"Show all values as they would appear after saving to a file, without " -"actually saving anything." -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:496 -msgid "Save as" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:508 -msgid "Go to online help" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:515 -msgid "Save and exit" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:522 -msgid "Exit, discard any edits" -msgstr "" - -#: app/builder/dialogs/dlgsConditions.py:595 -msgid "Param name(s) adjusted to be legal. Look ok?" -msgstr "" - -#: app/builder/dialogs/findDlg.py:20 -msgid "Find in experiment..." -msgstr "" - -#: app/builder/dialogs/findDlg.py:46 -msgid "Match case?" -msgstr "" - -#: app/builder/dialogs/findDlg.py:55 -msgid "Match regex?" -msgstr "" - -#: app/builder/dialogs/findDlg.py:91 -msgid "Go" -msgstr "" - -#: app/builder/dialogs/findDlg.py:101 -msgid "Location" -msgstr "" - -#: app/builder/dialogs/findDlg.py:102 -msgid "Parameter" -msgstr "" - -#: app/builder/dialogs/findDlg.py:103 -msgid "Value" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:278 -msgid "" -"This parameter will be treated as code - we have already put in the $, so " -"you don't have to." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:351 -#, python-brace-format -msgid "Setting the variable `{}` will overwrite an existing variable ({})" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:361 -#, python-brace-format -msgid "Looks like your variable '{}' in '{}' should be set to update." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:369 -msgid "Quotation marks (\" or ') need to be escaped (\\\" or \\')" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:442 -#, python-brace-format -msgid "Name is already in use ({})" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:446 -msgid "Name is not valid" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:467 -msgid "" -"This parameter has come from an older version of PsychoPy. In the latest " -"version of PsychoPy, it is not used. Click this button to delete it. " -"WARNING: This may affect how this experiment works in older versions!" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:473 -msgid "DELETED" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:480 -msgid "" -"This parameter will not be deleted until you click Okay. Click this button " -"to revert the deletion and keep the parameter." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:659 -msgid "Browse for a file" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:734 -#, python-brace-format -msgid "Not a valid file path: {}" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:746 -#, python-brace-format -msgid "No file named {}" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:786 -msgid "Open/create in your default table editor" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:818 -#, python-brace-format -msgid "" -"Once you have created and saved your table,please remember to add it to " -"{name}" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:821 -msgid "Reminder" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:861 -msgid "" -"Below are all of the surveys linked to your Pavlovia account - select the " -"one you want and press OK to add its ID." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:870 -msgid "There are no surveys linked to your Pavlovia account." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:881 -msgid "Click here to manage surveys on Pavlovia." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:888 -msgid "Refresh survey list" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:948 -msgid "Find online..." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:955 -msgid "Get survey ID from a list of your surveys on Pavlovia" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1027 -msgid "Specify color ..." -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1063 -#, python-brace-format -msgid "Font {} is not installed, would you like to download it from Google Fonts?" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1075 -#, python-brace-format -msgid "Could not download font {} from Google Fonts, reason: {}" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1084 -msgid "Font download successfully" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1373 app/builder/dialogs/paramCtrls.py:1556 -msgid "Add item" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1461 -msgid "Dictionary keys can't be code" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1628 -#, python-brace-format -msgid "Duplicate dictionary key: {}" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1658 -msgid "Open the Device Manager to setup devices" -msgstr "" - -#: app/builder/dialogs/paramCtrls.py:1687 -#, python-brace-format -msgid "No device named `{}` has been setup in the Device Manager, set one up now?" -msgstr "" - -#: app/coder/codeEditorBase.py:103 -msgid "Cut" -msgstr "" - -#: app/coder/codeEditorBase.py:105 -msgid "Paste" -msgstr "" - -#: app/coder/codeEditorBase.py:106 app/coder/fileBrowser.py:103 -#: monitors/MonitorCenter.py:266 monitors/MonitorCenter.py:287 -msgid "Delete" -msgstr "" - -#: app/coder/codeEditorBase.py:107 -msgid "Select All" -msgstr "" - -#: app/coder/coder.py:289 -msgid "PsychoPy unit testing" -msgstr "" - -#: app/coder/coder.py:317 -msgid "&Tests" -msgstr "" - -#: app/coder/coder.py:320 -#, python-format -msgid "&Run tests\t%s" -msgstr "" - -#: app/coder/coder.py:324 -#, python-format -msgid "&Close tests panel\t%s" -msgstr "" - -#: app/coder/coder.py:328 -#, python-format -msgid "Go to &Coder view\t%s" -msgstr "" - -#: app/coder/coder.py:329 -msgid "Go to the Coder view" -msgstr "" - -#: app/coder/coder.py:336 -msgid "Terminate PsychoPy" -msgstr "" - -#: app/coder/coder.py:339 -msgid "&Preferences" -msgstr "" - -#: app/coder/coder.py:360 -msgid "" -"Select the test(s) to run, from:\n" -"psychopy/tests/test*" -msgstr "" - -#: app/coder/coder.py:367 -msgid "Run tests" -msgstr "" - -#: app/coder/coder.py:369 app/pavlovia_ui/project.py:111 -#: app/pavlovia_ui/project.py:916 app/pavlovia_ui/sync.py:100 -msgid "Cancel" -msgstr "" - -#: app/coder/coder.py:375 -msgid "Coverage Report" -msgstr "" - -#: app/coder/coder.py:376 -msgid "Include coverage report (requires coverage module)" -msgstr "" - -#: app/coder/coder.py:380 -msgid "ALL stdout" -msgstr "" - -#: app/coder/coder.py:382 -msgid "Report all printed output & show any new rms-test images" -msgstr "" - -#: app/coder/coder.py:978 -msgid "Analyzing code" -msgstr "" - -#: app/coder/coder.py:1068 -#, python-format -msgid "Unable to find \"%s\"" -msgstr "" - -#: app/coder/coder.py:1184 app/coder/coder.py:1300 -msgid "Editor" -msgstr "" - -#: app/coder/coder.py:1225 app/coder/coder.py:1299 app/coder/coder.py:1586 -msgid "Source Assistant" -msgstr "" - -#: app/coder/coder.py:1257 -msgid "Shell" -msgstr "" - -#: app/coder/coder.py:1263 app/plugin_manager/dialog.py:48 -msgid "Output" -msgstr "" - -#: app/coder/coder.py:1272 -msgid "Shelf" -msgstr "" - -#: app/coder/coder.py:1285 tools/wizard.py:477 -msgid "Welcome to PsychoPy3!" -msgstr "" - -#: app/coder/coder.py:1401 -msgid "Save current file" -msgstr "" - -#: app/coder/coder.py:1405 -msgid "Save current python file as..." -msgstr "" - -#: app/coder/coder.py:1409 -msgid "Close current file" -msgstr "" - -#: app/coder/coder.py:1411 -msgid "Close all files" -msgstr "" - -#: app/coder/coder.py:1412 -msgid "Close all files in the editor." -msgstr "" - -#: app/coder/coder.py:1421 -#, python-format -msgid "Print\t%s" -msgstr "" - -#: app/coder/coder.py:1436 -msgid "Close PsychoPy Coder" -msgstr "" - -#: app/coder/coder.py:1450 -#, python-format -msgid "Cu&t\t%s" -msgstr "" - -#: app/coder/coder.py:1452 -#, python-format -msgid "&Copy\t%s" -msgstr "" - -#: app/coder/coder.py:1456 -msgid "Duplicate the current line (or current selection)" -msgstr "" - -#: app/coder/coder.py:1458 -#, python-format -msgid "&Duplicate\t%s" -msgstr "" - -#: app/coder/coder.py:1464 -#, python-format -msgid "&Find\t%s" -msgstr "" - -#: app/coder/coder.py:1467 -#, python-format -msgid "Find &Next\t%s" -msgstr "" - -#: app/coder/coder.py:1472 -#, python-format -msgid "Comment\t%s" -msgstr "" - -#: app/coder/coder.py:1473 -msgid "Comment selected lines" -msgstr "" - -#: app/coder/coder.py:1477 -#, python-format -msgid "Uncomment\t%s" -msgstr "" - -#: app/coder/coder.py:1478 -msgid "Un-comment selected lines" -msgstr "" - -#: app/coder/coder.py:1483 -#, python-format -msgid "Toggle comment\t%s" -msgstr "" - -#: app/coder/coder.py:1484 -msgid "Toggle commenting of selected lines" -msgstr "" - -#: app/coder/coder.py:1489 -#, python-format -msgid "Toggle fold\t%s" -msgstr "" - -#: app/coder/coder.py:1490 -msgid "Toggle folding of top level" -msgstr "" - -#: app/coder/coder.py:1496 -#, python-format -msgid "Indent selection\t%s" -msgstr "" - -#: app/coder/coder.py:1497 -msgid "Increase indentation of current line" -msgstr "" - -#: app/coder/coder.py:1501 -#, python-format -msgid "Dedent selection\t%s" -msgstr "" - -#: app/coder/coder.py:1502 -msgid "Decrease indentation of current line" -msgstr "" - -#: app/coder/coder.py:1505 -msgid "Try to indent to the correct position w.r.t. last line" -msgstr "" - -#: app/coder/coder.py:1508 -#, python-format -msgid "SmartIndent\t%s" -msgstr "" - -#: app/coder/coder.py:1527 -#, python-format -msgid "Enlarge font\t%s" -msgstr "" - -#: app/coder/coder.py:1528 -msgid "Increase font size" -msgstr "" - -#: app/coder/coder.py:1532 -#, python-format -msgid "Shrink font\t%s" -msgstr "" - -#: app/coder/coder.py:1533 -msgid "Decrease font size" -msgstr "" - -#: app/coder/coder.py:1537 -msgid "Reset font" -msgstr "" - -#: app/coder/coder.py:1538 -msgid "Return fonts to their original size." -msgstr "" - -#: app/coder/coder.py:1547 app/coder/fileBrowser.py:332 -msgid "Editor file location" -msgstr "" - -#: app/coder/coder.py:1553 -msgid "File browser pane location" -msgstr "" - -#: app/coder/coder.py:1560 app/coder/fileBrowser.py:341 -msgid "Choose directory ..." -msgstr "" - -#: app/coder/coder.py:1564 -msgid "Change working directory to ..." -msgstr "" - -#: app/coder/coder.py:1574 -msgid "Panels" -msgstr "" - -#: app/coder/coder.py:1577 -msgid "Shows the output and shell panes (and starts capturing stdout)" -msgstr "" - -#: app/coder/coder.py:1580 -#, python-format -msgid "&Output/Shell\t%s" -msgstr "" - -#: app/coder/coder.py:1584 -msgid "Hide/show the source assistant pane." -msgstr "" - -#: app/coder/coder.py:1594 -msgid "Shows guides in the editor for your indentation level" -msgstr "" - -#: app/coder/coder.py:1597 -#, python-format -msgid "&Indentation guides\t%s" -msgstr "" - -#: app/coder/coder.py:1603 -msgid "Show whitespace characters in the code" -msgstr "" - -#: app/coder/coder.py:1605 -#, python-format -msgid "&Whitespace\t%s" -msgstr "" - -#: app/coder/coder.py:1611 -msgid "Show End Of Line markers in the code" -msgstr "" - -#: app/coder/coder.py:1614 -#, python-format -msgid "Show &EOLs\t%s" -msgstr "" - -#: app/coder/coder.py:1619 -msgid "Enable/disable line wrapping in editors." -msgstr "" - -#: app/coder/coder.py:1622 -msgid "Line wrapping" -msgstr "" - -#: app/coder/coder.py:1699 -msgid "csv from psydat" -msgstr "" - -#: app/coder/coder.py:1700 -msgid "Create a .csv file from an existing .psydat file" -msgstr "" - -#: app/coder/coder.py:1705 -msgid "Unit &testing...\tCtrl-T" -msgstr "" - -#: app/coder/coder.py:1706 -msgid "Show dialog to run unit tests" -msgstr "" - -#: app/coder/coder.py:1755 -msgid "&PsychoPy Coder Tutorial" -msgstr "" - -#: app/coder/coder.py:1756 -msgid "Go to the online PsychoPy tutorial" -msgstr "" - -#: app/coder/coder.py:1760 -msgid "&PsychoPy API (reference)" -msgstr "" - -#: app/coder/coder.py:1761 -msgid "Go to the online PsychoPy reference manual" -msgstr "" - -#: app/coder/coder.py:2021 -#, python-format -msgid "" -"'%s' was modified outside of PsychoPy:\n" -"\n" -"Reload (without saving)?" -msgstr "" - -#: app/coder/coder.py:2026 -msgid "Reloading file" -msgstr "" - -#: app/coder/coder.py:2116 app/coder/coder.py:2536 -#, python-format -msgid "Save changes to %s before quitting?" -msgstr "" - -#: app/coder/coder.py:2257 -#, python-brace-format -msgid "Failed to open `{}`. Make sure that encoding of the file is utf-8." -msgstr "" - -#: app/coder/coder.py:2365 -msgid "Loading file" -msgstr "" - -#: app/coder/coder.py:2427 -#, python-format -msgid "" -"File appears to have been modified outside of PsychoPy:\n" -" %s\n" -"OK to overwrite?" -msgstr "" - -#: app/coder/coder.py:2436 -#, python-format -msgid "" -"File '%s' lacks write-permission:\n" -"Will try save-as instead." -msgstr "" - -#: app/coder/coder.py:2447 -msgid "Saving file" -msgstr "" - -#: app/coder/coder.py:2490 -msgid "" -"Python script (*.py)|*.py|JavaScript file (*.js)|*.js|Text file " -"(*.txt)|*.txt|Any file (*.*)|*.*" -msgstr "" - -#: app/coder/coder.py:2495 -msgid "" -"Python script (*.py)|*.py|JavaScript file (*.js)|*.js|Text file " -"(*.txt)|*.txt|Any file (*.*)|*" -msgstr "" - -#: app/coder/coder.py:2596 -#, python-format -msgid "Save changes to %s before running?" -msgstr "" - -#: app/coder/coder.py:2930 -msgid "Create new text file" -msgstr "" - -#: app/coder/coder.py:2936 -msgid "Open an existing text file" -msgstr "" - -#: app/coder/coder.py:2942 -msgid "Save current text file" -msgstr "" - -#: app/coder/coder.py:2948 -msgid "Save current text file as..." -msgstr "" - -#: app/coder/coder.py:2973 -msgid "Search the current file for a specific term" -msgstr "" - -#: app/coder/coder.py:2985 -msgid "Color picker" -msgstr "" - -#: app/coder/coder.py:2986 -msgid "Open a tool for choosing colors" -msgstr "" - -#: app/coder/fileBrowser.py:89 -msgid "Folder" -msgstr "" - -#: app/coder/fileBrowser.py:90 -msgid "Create a new folder here." -msgstr "" - -#: app/coder/fileBrowser.py:93 monitors/MonitorCenter.py:253 -msgid "New..." -msgstr "" - -#: app/coder/fileBrowser.py:98 -msgid "Rename the file" -msgstr "" - -#: app/coder/fileBrowser.py:104 -msgid "Delete the file" -msgstr "" - -#: app/coder/fileBrowser.py:197 -msgid "Directory:" -msgstr "" - -#: app/coder/fileBrowser.py:210 -msgid "Browse for a folder to open." -msgstr "" - -#: app/coder/fileBrowser.py:215 -msgid "Navigate to PsychoPy library root." -msgstr "" - -#: app/coder/fileBrowser.py:222 -msgid "Navigate to current open file." -msgstr "" - -#: app/coder/fileBrowser.py:312 -#, python-brace-format -msgid "" -"Cannot change working directory to location of file `{}`. It needs to be " -"saved first." -msgstr "" - -#: app/coder/fileBrowser.py:323 -msgid "Browse ..." -msgstr "" - -#: app/coder/fileBrowser.py:324 -msgid "Browse the file system for a directory to open" -msgstr "" - -#: app/coder/fileBrowser.py:328 -msgid "Current working directory" -msgstr "" - -#: app/coder/fileBrowser.py:329 -msgid "Open the current working directory" -msgstr "" - -#: app/coder/fileBrowser.py:333 -msgid "Open the directory the current editor file is located" -msgstr "" - -#: app/coder/fileBrowser.py:352 -msgid "Enter folder name:" -msgstr "" - -#: app/coder/fileBrowser.py:353 -msgid "New folder" -msgstr "" - -#: app/coder/fileBrowser.py:364 -msgid "Folder name cannot be empty." -msgstr "" - -#: app/coder/fileBrowser.py:376 -#, python-brace-format -msgid "Cannot create folder `{}`, already exists." -msgstr "" - -#: app/coder/fileBrowser.py:389 -#, python-brace-format -msgid "Cannot create folder `{}`, permission denied." -msgstr "" - -#: app/coder/fileBrowser.py:431 -#, python-brace-format -msgid "Rename folder `{}` to:" -msgstr "" - -#: app/coder/fileBrowser.py:432 -msgid "Rename Folder" -msgstr "" - -#: app/coder/fileBrowser.py:442 app/coder/fileBrowser.py:478 -#, python-brace-format -msgid "Cannot rename `{}` to `{}`." -msgstr "" - -#: app/coder/fileBrowser.py:465 -#, python-brace-format -msgid "Rename file `{}` to:" -msgstr "" - -#: app/coder/fileBrowser.py:466 -msgid "Rename file" -msgstr "" - -#: app/coder/fileBrowser.py:503 -#, python-brace-format -msgid "Are you sure you want to PERMANENTLY delete folder `{}`?" -msgstr "" - -#: app/coder/fileBrowser.py:513 -#, python-brace-format -msgid "Cannot delete folder `{}`, directory does not exist." -msgstr "" - -#: app/coder/fileBrowser.py:520 -#, python-brace-format -msgid "Cannot delete folder `{}`, directory is not empty or permission denied." -msgstr "" - -#: app/coder/fileBrowser.py:532 -#, python-brace-format -msgid "Are you sure you want to PERMANENTLY delete file `{}`?" -msgstr "" - -#: app/coder/fileBrowser.py:542 -#, python-brace-format -msgid "Cannot delete folder `{}`, file does not exist." -msgstr "" - -#: app/coder/fileBrowser.py:549 -#, python-brace-format -msgid "Cannot delete file `{}`, permission denied." -msgstr "" - -#: app/coder/fileBrowser.py:570 -#, python-brace-format -msgid "Specified path `{}` is not a directory." -msgstr "" - -#: app/coder/fileBrowser.py:642 -#, python-brace-format -msgid "Cannot access directory `{}`, permission denied." -msgstr "" - -#: app/coder/fileBrowser.py:691 -#, python-brace-format -msgid "Cannot access directory `{}`, not a directory." -msgstr "" - -#: app/coder/repl.py:57 app/coder/repl.py:77 -msgid "Close the current shell." -msgstr "" - -#: app/coder/repl.py:67 -msgid "Close the current shell and start a new one, this will clear any variables." -msgstr "" - -#: app/coder/repl.py:87 app/stdout/stdOutRich.py:278 -msgid "Clear all previous output." -msgstr "" - -#: app/coder/repl.py:181 -msgid "Hit [Return] to start a Python session." -msgstr "" - -#: app/coder/repl.py:193 -msgid "Hit [Return] to start a Python shell." -msgstr "" - -#: app/colorpicker/ui.py:33 -msgid " RGB Channels " -msgstr "" - -#: app/colorpicker/ui.py:84 -msgid "Hex/HTML" -msgstr "" - -#: app/colorpicker/ui.py:92 -msgid "RGB Format" -msgstr "" - -#: app/colorpicker/ui.py:118 -msgid " HSV Channels " -msgstr "" - -#: app/colorpicker/ui.py:192 -msgid "Output Space:" -msgstr "" - -#: app/colorpicker/ui.py:205 -msgid "Insert" -msgstr "" - -#: app/connections/updates.py:93 -msgid "Couldn't connect to psychopy.org to check for updates. \n" -msgstr "" - -#: app/connections/updates.py:95 -msgid "Check internet settings (and proxy setting in PsychoPy Preferences)." -msgstr "" - -#: app/connections/updates.py:99 app/connections/updates.py:148 -#: app/connections/updates.py:167 -msgid "PsychoPy updates" -msgstr "" - -#: app/connections/updates.py:138 -#, python-format -msgid "" -"PsychoPy v%(latest)s is available (you are running %(running)s).\n" -"\n" -msgstr "" - -#: app/connections/updates.py:142 -msgid "This version is too big an update to be handled automatically.\n" -msgstr "" - -#: app/connections/updates.py:144 -msgid "Please fetch the latest version from www.psychopy.org and install manually." -msgstr "" - -#: app/connections/updates.py:149 -msgid "Go to downloads" -msgstr "" - -#: app/connections/updates.py:151 -msgid "Go to changelog" -msgstr "" - -#: app/connections/updates.py:152 -msgid "Later" -msgstr "" - -#: app/connections/updates.py:163 -#, python-format -msgid "You are running the latest version of PsychoPy (%s). " -msgstr "" - -#: app/connections/updates.py:189 -#, python-format -msgid "" -"PsychoPy v%(latest)s is available (you are running %(running)s).\n" -"\n" -"(To disable this check, see Preferences > connections > checkForUpdates)" -msgstr "" - -#: app/connections/updates.py:196 -msgid "" -"This version MAY require you to modify your\n" -"scripts/exps slightly. Read the changelog carefully." -msgstr "" - -#: app/connections/updates.py:202 -msgid "" -"There are no known compatibility\n" -"issues with your current version." -msgstr "" - -#: app/connections/updates.py:206 -msgid "View complete Changelog" -msgstr "" - -#: app/connections/updates.py:210 -msgid "You can update PsychoPy with your package manager" -msgstr "" - -#: app/connections/updates.py:214 -msgid "Should PsychoPy update itself?" -msgstr "" - -#: app/connections/updates.py:228 -msgid "Keep warning me" -msgstr "" - -#: app/connections/updates.py:231 -msgid "Stop warning me" -msgstr "" - -#: app/connections/updates.py:233 -msgid "Yes" -msgstr "" - -#: app/connections/updates.py:236 -msgid "Not now" -msgstr "" - -#: app/connections/updates.py:238 -msgid "Skip this version" -msgstr "" - -#: app/connections/updates.py:275 -msgid "PsychoPy Updates" -msgstr "" - -#: app/connections/updates.py:286 -msgid " Auto-update (will fetch latest version)" -msgstr "" - -#: app/connections/updates.py:295 -msgid " Use zip file below (download a PsychoPy release file ending .zip)" -msgstr "" - -#: app/connections/updates.py:305 app/plugin_manager/packages.py:296 -#: app/plugin_manager/packages.py:466 app/plugin_manager/plugins.py:327 -#: app/plugin_manager/plugins.py:808 -msgid "Install" -msgstr "" - -#: app/connections/updates.py:308 app/runner/runner.py:170 -msgid "Close" -msgstr "" - -#: app/connections/updates.py:335 -#, python-format -msgid "" -"You are running PsychoPy v%s.\n" -" " -msgstr "" - -#: app/connections/updates.py:336 -msgid "" -"PsychoPy could not connect to the \n" -" internet to check for more recent versions.\n" -msgstr "" - -#: app/connections/updates.py:338 -msgid "Check proxy settings in preferences." -msgstr "" - -#: app/connections/updates.py:344 -#, python-format -msgid "" -"You are running PsychoPy (%(running)s), which is ahead of the latest " -"official version (%(latest)s)" -msgstr "" - -#: app/connections/updates.py:349 -#, python-format -msgid "" -"You are running the latest version of PsychoPy (%s)\n" -" " -msgstr "" - -#: app/connections/updates.py:350 -msgid "" -"You can revert to a previous version by selecting a specific .zip source " -"installation file" -msgstr "" - -#: app/connections/updates.py:354 -#, python-format -msgid "" -"PsychoPy v%(latest)s is available\n" -"You are running v%(running)s" -msgstr "" - -#: app/connections/updates.py:359 -msgid "" -"\n" -"You can update to the latest version automatically" -msgstr "" - -#: app/connections/updates.py:361 -msgid "" -"\n" -"You cannot update to the latest version automatically.\n" -"Please fetch the latest Standalone package from www.psychopy.org" -msgstr "" - -#: app/connections/updates.py:413 -#, python-format -msgid "Attempting to fetch PsychoPy %s..." -msgstr "" - -#: app/connections/updates.py:434 -#, python-format -msgid "Fetched %(done)i of %(total)i kb of PsychoPy-%(version)s.zip" -msgstr "" - -#: app/connections/updates.py:439 -#, python-format -msgid "Successfully downloaded PsychoPy-%s.zip" -msgstr "" - -#: app/connections/updates.py:486 -msgid "" -"To upgrade you need to restart the app as admin (Right-click the app and " -"'Run as admin')" -msgstr "" - -#: app/connections/updates.py:490 -msgid "Could not move existing PsychoPy installation (permissions error?)" -msgstr "" - -#: app/connections/updates.py:519 -#, python-format -msgid "" -"Right-click the app and 'Run as admin'):\n" -"%s" -msgstr "" - -#: app/connections/updates.py:521 -#, python-format -msgid "" -"Failed to create directory for new version (permissions error?):\n" -"%s" -msgstr "" - -#: app/connections/updates.py:546 -msgid "" -"Success. \n" -"Changes to PsychoPy will be completed when the application is next run" -msgstr "" - -#: app/connections/updates.py:555 -#, python-format -msgid "Downloading PsychoPy v%s" -msgstr "" - -#: app/connections/updates.py:560 -msgid "" -"Failed to fetch PsychoPy release.\n" -"Check proxy setting in preferences" -msgstr "" - -#: app/deviceManager/addDialog.py:38 -msgid "Device name" -msgstr "" - -#: app/deviceManager/addDialog.py:44 experiment/devices.py:96 -msgid "Device label" -msgstr "" - -#: app/deviceManager/addDialog.py:46 experiment/devices.py:98 -msgid "A name to refer to this device by in Device Manager." -msgstr "" - -#: app/deviceManager/addDialog.py:67 -msgid "Available devices" -msgstr "" - -#: app/deviceManager/addDialog.py:84 -msgid "Scanning..." -msgstr "" - -#: app/pavlovia_ui/_base.py:34 -#, python-format -msgid "&Close View\t%s" -msgstr "" - -#: app/pavlovia_ui/_base.py:35 -msgid "Close current window" -msgstr "" - -#: app/pavlovia_ui/_base.py:194 app/pavlovia_ui/functions.py:138 -msgid "Committing changes" -msgstr "" - -#: app/pavlovia_ui/_base.py:196 -msgid "Summary of changes" -msgstr "" - -#: app/pavlovia_ui/_base.py:198 -msgid "" -"Details of changes\n" -" (optional)" -msgstr "" - -#: app/pavlovia_ui/_base.py:213 -msgid "Title summarizing the changes you're making in these files" -msgstr "" - -#: app/pavlovia_ui/_base.py:216 -msgid "Optional details about the changes you're making in these files" -msgstr "" - -#: app/pavlovia_ui/functions.py:43 -msgid "Choose/create the root location for the synced project" -msgstr "" - -#: app/pavlovia_ui/functions.py:72 -msgid "You are not logged in to Pavlovia. Please log in to continue." -msgstr "" - -#: app/pavlovia_ui/functions.py:74 app/pavlovia_ui/project.py:764 -msgid "Login..." -msgstr "" - -#: app/pavlovia_ui/functions.py:130 -msgid "Changes to commit:\n" -msgstr "" - -#: app/pavlovia_ui/functions.py:136 -#, python-brace-format -msgid "\t{}: {} files\n" -msgstr "" - -#: app/pavlovia_ui/functions.py:160 -msgid "You need to install git to use Pavlovia projects" -msgstr "" - -#: app/pavlovia_ui/menu.py:59 -#, python-brace-format -msgid "Log in to Pavlovia...\t{}" -msgstr "" - -#: app/pavlovia_ui/menu.py:62 -msgid "User" -msgstr "" - -#: app/pavlovia_ui/menu.py:66 -#, python-brace-format -msgid "Search Pavlovia\t{}" -msgstr "" - -#: app/pavlovia_ui/menu.py:72 -#, python-brace-format -msgid "New...\t{}" -msgstr "" - -#: app/pavlovia_ui/menu.py:76 -#, python-brace-format -msgid "Sync\t{}" -msgstr "" - -#: app/pavlovia_ui/menu.py:138 -msgid "You need to log in to create a project" -msgstr "" - -#: app/pavlovia_ui/project.py:66 -msgid "Name:" -msgstr "" - -#: app/pavlovia_ui/project.py:79 -msgid "Group/owner:" -msgstr "" - -#: app/pavlovia_ui/project.py:83 -msgid "Description:" -msgstr "" - -#: app/pavlovia_ui/project.py:87 -msgid "Local folder:" -msgstr "" - -#: app/pavlovia_ui/project.py:90 -msgid "Browse..." -msgstr "" - -#: app/pavlovia_ui/project.py:97 -msgid "Tags (comma separated):" -msgstr "" - -#: app/pavlovia_ui/project.py:101 -msgid "Public:" -msgstr "" - -#: app/pavlovia_ui/project.py:106 -msgid "Create project on Pavlovia" -msgstr "" - -#: app/pavlovia_ui/project.py:108 -msgid "Submit changes to Pavlovia" -msgstr "" - -#: app/pavlovia_ui/project.py:244 -msgid "" -"An image to represent this project, this helps it stand out when browsing on" -" Pavlovia." -msgstr "" - -#: app/pavlovia_ui/project.py:259 -msgid "" -"Title of the project. Unlike the project name, this isn't used as a filename" -" anywhere; so you can add spaces, apostrophes and emojis to your heart's " -"content! 🦕✨" -msgstr "" - -#: app/pavlovia_ui/project.py:273 -msgid "Click to view the project in Pavlovia." -msgstr "" - -#: app/pavlovia_ui/project.py:285 -msgid "" -"'Star' this project to get back to it easily. Projects you've starred will " -"appear first in your searches and projects with more stars in total will " -"appear higher in everyone's searches." -msgstr "" - -#: app/pavlovia_ui/project.py:291 -msgid "Fork" -msgstr "" - -#: app/pavlovia_ui/project.py:296 -msgid "" -"Create a copy of this project on your own Pavlovia account so that you can " -"make changes without affecting the original project." -msgstr "" - -#: app/pavlovia_ui/project.py:300 -msgid "Create" -msgstr "" - -#: app/pavlovia_ui/project.py:305 -msgid "Create a Pavlovia project for the current experiment." -msgstr "" - -#: app/pavlovia_ui/project.py:313 -msgid "" -"Synchronise this project's local files with their online counterparts. This " -"will 'pull' changes from Pavlovia and 'push' changes from your local files." -msgstr "" - -#: app/pavlovia_ui/project.py:317 -msgid "Download" -msgstr "" - -#: app/pavlovia_ui/project.py:322 -msgid "" -"'Clone' this project, creating local copies of all its files and tracking " -"any changes you make so that they can be applied when you next 'sync' the " -"project." -msgstr "" - -#: app/pavlovia_ui/project.py:329 -msgid "Last synced at..." -msgstr "" - -#: app/pavlovia_ui/project.py:343 -msgid "" -"Folder in which local files are stored for this project. Changes to files in" -" this folder will be tracked and applied to the project when you 'sync', so " -"make sure the only files in this folder are relevant!" -msgstr "" - -#: app/pavlovia_ui/project.py:353 -msgid "" -"Description of the project to be shown on Pavlovia. Note: This is different " -"than a README file!" -msgstr "" - -#: app/pavlovia_ui/project.py:360 -msgid "Visibility:" -msgstr "" - -#: app/pavlovia_ui/project.py:366 -msgid "" -"Visibility of the current project; whether its visible only to its creator " -"(Private) or to any user (Public)." -msgstr "" - -#: app/pavlovia_ui/project.py:372 -msgid "Status:" -msgstr "" - -#: app/pavlovia_ui/project.py:378 -msgid "" -"Project status; whether it can be run to collect data (Running), run by its " -"creator without saving data (Piloting) or cannot be run (Inactive)." -msgstr "" - -#: app/pavlovia_ui/project.py:384 app/plugin_manager/plugins.py:841 -msgid "Keywords:" -msgstr "" - -#: app/pavlovia_ui/project.py:386 -msgid "tag" -msgstr "" - -#: app/pavlovia_ui/project.py:391 -msgid "" -"Keywords associated with this project, helping others to find it. For " -"example, if your experiment is useful to psychophysicists, you may want to " -"add the keyword 'psychophysics'." -msgstr "" - -#: app/pavlovia_ui/project.py:473 -#, python-brace-format -msgid "" -"Could not find GitLab project with id {}.\n" -"\n" -"Please check that the project exists on Pavlovia, that you are logged in as " -"the correct user in the PsychoPy app, and that your account has access to " -"the project." -msgstr "" - -#: app/pavlovia_ui/project.py:676 -#, python-brace-format -msgid "Could not find folder {directory}, please select a different local root." -msgstr "" - -#: app/pavlovia_ui/project.py:714 -msgid "Project info has changed, update online before closing?" -msgstr "" - -#: app/pavlovia_ui/project.py:729 -msgid "Project info" -msgstr "" - -#: app/pavlovia_ui/project.py:762 projects/pavlovia.py:902 -msgid "You are not logged in to Pavlovia. Please log in to sync project." -msgstr "" - -#: app/pavlovia_ui/project.py:786 -msgid "This file doesn't belong to any existing project." -msgstr "" - -#: app/pavlovia_ui/project.py:788 -msgid "Create a project" -msgstr "" - -#: app/pavlovia_ui/project.py:821 -msgid "Project root folder is not yet specified, specify project root now?" -msgstr "" - -#: app/pavlovia_ui/project.py:824 -msgid "Project root folder does not exist, change project root now?" -msgstr "" - -#: app/pavlovia_ui/project.py:846 -msgid "" -"\n" -"Sync cancelled by user." -msgstr "" - -#: app/pavlovia_ui/project.py:900 -msgid "points to a remote that doesn't exist (deleted?)." -msgstr "" - -#: app/pavlovia_ui/project.py:901 -msgid "What shall we do?" -msgstr "" - -#: app/pavlovia_ui/project.py:903 -msgid "(Re)create a project" -msgstr "" - -#: app/pavlovia_ui/project.py:904 -msgid "Point to an different location" -msgstr "" - -#: app/pavlovia_ui/project.py:905 -msgid "not yet supported" -msgstr "" - -#: app/pavlovia_ui/project.py:906 -msgid "Forget the local git repository (deletes history keeps files)" -msgstr "" - -#: app/pavlovia_ui/search.py:44 -msgid "Search for projects online" -msgstr "" - -#: app/pavlovia_ui/search.py:129 -msgid "Me" -msgstr "" - -#: app/pavlovia_ui/search.py:139 -msgid "Sort..." -msgstr "" - -#: app/pavlovia_ui/search.py:144 -msgid "Filter..." -msgstr "" - -#: app/pavlovia_ui/search.py:172 -msgid "Author" -msgstr "" - -#: app/pavlovia_ui/search.py:173 experiment/components/_base.py:76 -#: experiment/loops.py:97 experiment/loops.py:484 experiment/loops.py:650 -#: experiment/routines/_base.py:56 -msgid "Name" -msgstr "" - -#: app/pavlovia_ui/sync.py:46 -msgid "New project..." -msgstr "" - -#: app/pavlovia_ui/sync.py:63 -msgid "Project name:" -msgstr "" - -#: app/pavlovia_ui/sync.py:84 -msgid "Project folder:" -msgstr "" - -#: app/pavlovia_ui/user.py:104 -msgid "Switch User" -msgstr "" - -#: app/pavlovia_ui/user.py:109 -msgid "Login" -msgstr "" - -#: app/pavlovia_ui/user.py:114 -msgid "Logout" -msgstr "" - -#: app/plugin_manager/dialog.py:32 -msgid "Plugins & Packages" -msgstr "" - -#: app/plugin_manager/dialog.py:51 -msgid "Plugins" -msgstr "" - -#: app/plugin_manager/dialog.py:54 -msgid "Packages" -msgstr "" - -#: app/plugin_manager/dialog.py:322 -msgid "" -"[Warning] Could not activate plugin. PsychoPy may need to restart for plugin" -" to take effect." -msgstr "" - -#: app/plugin_manager/dialog.py:337 -msgid "" -"The following components/routines should now be visible in the Components " -"panel (a restart may be required in some cases):\n" -msgstr "" - -#: app/plugin_manager/dialog.py:348 -#, python-format -msgid "For more information about the %s plugin, read the documentation at:" -msgstr "" - -#: app/plugin_manager/dialog.py:376 -msgid "" -"There is currently an installation/uninstallation in progress, are you sure " -"you want to close?" -msgstr "" - -#: app/plugin_manager/dialog.py:395 -msgid "Please restart PsychoPy to apply changes." -msgstr "" - -#: app/plugin_manager/packages.py:83 -#, python-brace-format -msgid "" -"Type pip commands below and press Enter to execute them in the installed " -"PsychoPy environment, any returned text will appear below. When installing, " -"remember to add `--user` on the end!\n" -"\n" -"All commands will be automatically prefaced with:\n" -"{}\n" -"(so you don't need to type it yourself)\n" -msgstr "" - -#: app/plugin_manager/packages.py:185 -msgid "Package" -msgstr "" - -#: app/plugin_manager/packages.py:186 -msgid "Installed" -msgstr "" - -#: app/plugin_manager/packages.py:188 app/plugin_manager/packages.py:192 -#: app/plugin_manager/packages.py:348 app/plugin_manager/packages.py:392 -msgid "User Packages" -msgstr "" - -#: app/plugin_manager/packages.py:189 app/plugin_manager/packages.py:193 -#: app/plugin_manager/packages.py:351 app/plugin_manager/packages.py:382 -msgid "System Packages" -msgstr "" - -#: app/plugin_manager/packages.py:190 app/plugin_manager/packages.py:194 -#: app/plugin_manager/packages.py:354 app/plugin_manager/packages.py:398 -#: app/plugin_manager/packages.py:403 -msgid "Available Packages" -msgstr "" - -#: app/plugin_manager/packages.py:207 -msgid "or..." -msgstr "" - -#: app/plugin_manager/packages.py:210 -msgid "Install from file" -msgstr "" - -#: app/plugin_manager/packages.py:212 -msgid "" -"Install a package from a local file, such as a .egg or .whl. You can also " -"point to a pyproject.toml file to add an 'editable install' of an in-" -"development package." -msgstr "" - -#: app/plugin_manager/packages.py:218 -msgid "Open PIP terminal" -msgstr "" - -#: app/plugin_manager/packages.py:219 -msgid "Open PIP terminal to manage packages manually" -msgstr "" - -#: app/plugin_manager/packages.py:289 app/plugin_manager/packages.py:475 -#: app/plugin_manager/plugins.py:823 -msgid "Uninstall" -msgstr "" - -#: app/plugin_manager/packages.py:452 -msgid "by " -msgstr "" - -#: app/plugin_manager/packages.py:462 app/plugin_manager/plugins.py:831 -msgid "Homepage" -msgstr "" - -#: app/plugin_manager/plugins.py:536 -#, python-brace-format -msgid "Not for PsychoPy {}:" -msgstr "" - -#: app/plugin_manager/plugins.py:543 -msgid "" -"Could not retrieve plugins. Try restarting the PsychoPy app and make sure " -"you are connected to the internet." -msgstr "" - -#: app/plugin_manager/plugins.py:551 -msgid "Uninstall all plugins" -msgstr "" - -#: app/plugin_manager/plugins.py:689 -msgid "" -"This will uninstall all plugins an additional packages you have installed, " -"are you sure you want to continue?" -msgstr "" - -#: app/plugin_manager/plugins.py:700 -msgid "" -"All plugins and additional packages have been uninstalled. You will need to " -"restart PsychoPy for this to take effect." -msgstr "" - -#: app/plugin_manager/plugins.py:802 -msgid "Version:" -msgstr "" - -#: app/plugin_manager/plugins.py:816 -msgid "Update" -msgstr "" - -#: app/plugin_manager/plugins.py:846 -msgid "keyword" -msgstr "" - -#: app/plugin_manager/plugins.py:860 -msgid "Select a plugin to view details." -msgstr "" - -#: app/plugin_manager/plugins.py:1070 -#, python-brace-format -msgid "Works with versions {}." -msgstr "" - -#: app/plugin_manager/plugins.py:1116 -msgid "Author's GitHub" -msgstr "" - -#: app/plugin_manager/plugins.py:1180 -msgid "That's us! We make PsychoPy and Pavlovia!" -msgstr "" - -#: app/plugin_manager/plugins.py:1275 app/plugin_manager/plugins.py:1293 -msgid "Enabled" -msgstr "" - -#: app/plugin_manager/utils.py:13 -msgid "PIP error" -msgstr "" - -#: app/plugin_manager/utils.py:41 -msgid "We tried:" -msgstr "" - -#: app/plugin_manager/utils.py:48 -msgid "We got:" -msgstr "" - -#: app/plugin_manager/utils.py:83 -#, python-brace-format -msgid "Package {} could not be uninstalled." -msgstr "" - -#: app/plugin_manager/utils.py:89 -msgid "Package installed" -msgstr "" - -#: app/plugin_manager/utils.py:90 -#, python-brace-format -msgid "Package {} successfully uninstalled!" -msgstr "" - -#: app/plugin_manager/utils.py:111 -msgid "Installation complete. See above for info.\n" -msgstr "" - -#: app/plugin_manager/utils.py:113 -msgid "Installation failed. See above for info.\n" -msgstr "" - -#: app/runner/runner.py:154 -msgid "Add task" -msgstr "" - -#: app/runner/runner.py:155 -msgid "Adding task" -msgstr "" - -#: app/runner/runner.py:157 -msgid "Remove task" -msgstr "" - -#: app/runner/runner.py:160 -msgid "Clear all" -msgstr "" - -#: app/runner/runner.py:161 -msgid "Clearing tasks" -msgstr "" - -#: app/runner/runner.py:164 -msgid "&Save list" -msgstr "" - -#: app/runner/runner.py:165 -msgid "Saving task" -msgstr "" - -#: app/runner/runner.py:167 -msgid "&Open list" -msgstr "" - -#: app/runner/runner.py:168 -msgid "Loading task" -msgstr "" - -#: app/runner/runner.py:171 -msgid "Closing Runner" -msgstr "" - -#: app/runner/runner.py:174 -msgid "Quitting PsychoPy" -msgstr "" - -#: app/runner/runner.py:183 -#, python-format -msgid "&Run/pilot\t%s" -msgstr "" - -#: app/runner/runner.py:184 -msgid "Running experiment" -msgstr "" - -#: app/runner/runner.py:187 -msgid "Run &JS for local debug" -msgstr "" - -#: app/runner/runner.py:188 -msgid "Launching local debug of online study" -msgstr "" - -#: app/runner/runner.py:191 -msgid "Run JS on &Pavlovia" -msgstr "" - -#: app/runner/runner.py:192 -msgid "Launching online study at Pavlovia" -msgstr "" - -#: app/runner/runner.py:198 -msgid "&Builder Demos" -msgstr "" - -#: app/runner/runner.py:199 -msgid "Loading builder demos" -msgstr "" - -#: app/runner/runner.py:202 -msgid "&Coder Demos" -msgstr "" - -#: app/runner/runner.py:203 -msgid "Loading coder demos" -msgstr "" - -#: app/runner/runner.py:232 -msgid "&Run" -msgstr "" - -#: app/runner/runner.py:252 -msgid "Save task list as ..." -msgstr "" - -#: app/runner/runner.py:287 -msgid "Open task list ..." -msgstr "" - -#: app/runner/runner.py:403 -msgid "basic" -msgstr "" - -#: app/runner/runner.py:404 -msgid "input" -msgstr "" - -#: app/runner/runner.py:405 -msgid "stimuli" -msgstr "" - -#: app/runner/runner.py:406 -msgid "exp control" -msgstr "" - -#: app/runner/runner.py:409 -msgid "timing" -msgstr "" - -#: app/runner/runner.py:410 -msgid "misc" -msgstr "" - -#: app/runner/runner.py:516 -msgid "Path" -msgstr "" - -#: app/runner/runner.py:517 experiment/components/settings/__init__.py:184 -msgid "Run mode" -msgstr "" - -#: app/runner/runner.py:1070 -msgid "Alerts" -msgstr "" - -#: app/runner/runner.py:1082 -msgid "Stdout" -msgstr "" - -#: app/runner/runner.py:1165 -msgid "Manage list" -msgstr "" - -#: app/runner/runner.py:1169 -msgid "Add" -msgstr "" - -#: app/runner/runner.py:1170 -msgid "Add experiment to list" -msgstr "" - -#: app/runner/runner.py:1176 -msgid "Remove experiment from list" -msgstr "" - -#: app/runner/runner.py:1182 -msgid "Save task list to a file" -msgstr "" - -#: app/runner/runner.py:1188 -msgid "Load tasks from a file" -msgstr "" - -#: app/runner/runner.py:1226 experiment/components/_base.py:102 -#: experiment/components/panorama/__init__.py:139 -#: experiment/components/serialOut/__init__.py:57 experiment/routines/_base.py:62 -msgid "Stop" -msgstr "" - -#: app/runner/runner.py:1227 -msgid "Stop the current (Python) script" -msgstr "" - -#: app/stdout/stdOutRich.py:153 -msgid "For further info see " -msgstr "" - -#: app/themes/ui.py:47 -msgid "&Open theme folder" -msgstr "" - -#: data/experiment.py:305 -#, python-brace-format -msgid "Cannot add data to row {} as there are only {} entries" -msgstr "" - -#: data/experiment.py:461 -#, python-brace-format -msgid "Experiment '{}' paused." -msgstr "" - -#: data/experiment.py:466 -#, python-brace-format -msgid "" -"Attempted to pause experiment '{}', but it is already paused. Status will " -"remain unchanged." -msgstr "" - -#: data/experiment.py:477 -#, python-brace-format -msgid "Experiment '{}' resumed." -msgstr "" - -#: data/experiment.py:482 -#, python-brace-format -msgid "" -"Attempted to resume experiment '{}', but it is not paused. Status will " -"remain unchanged." -msgstr "" - -#: data/experiment.py:495 -#, python-brace-format -msgid "" -"Attempted to stop experiment '{}', but it is already stopping. Status will " -"remain unchanged." -msgstr "" - -#: data/utils.py:81 -msgid "Variables cannot be missing, None, or ''" -msgstr "" - -#: data/utils.py:87 -msgid "Variables must be string-like" -msgstr "" - -#: data/utils.py:95 -#, python-format -msgid "name %s (type %s) contains non-ASCII characters (e.g. accents)" -msgstr "" - -#: data/utils.py:100 -#, python-format -msgid "name %s (type %s) could not be converted to a string" -msgstr "" - -#: data/utils.py:107 -msgid "Variables cannot begin with numeric character" -msgstr "" - -#: data/utils.py:113 -msgid "Variables cannot contain punctuation or spaces" -msgstr "" - -#: data/utils.py:315 -#, python-brace-format -msgid "" -"Could not load {}. \n" -"Delimiter in heading: {} in {}." -msgstr "" - -#: data/utils.py:335 -#, python-brace-format -msgid "Could not parse file {}." -msgstr "" - -#: data/utils.py:369 -#, python-format -msgid "" -"Conditions file %s: Missing parameter name(s); empty cell(s) in the first " -"row?" -msgstr "" - -#: data/utils.py:389 -#, python-format -msgid "Conditions file not found: %s" -msgstr "" - -#: data/utils.py:440 -msgid "openpyxl or xlrd is required for loading excel files, but neither was found." -msgstr "" - -#: data/utils.py:515 -#, python-format -msgid "Could not open %s as conditions" -msgstr "" - -#: data/utils.py:534 -msgid "Your conditions file should be an xlsx, csv, dlm, tsv or pkl file" -msgstr "" - -#: data/utils.py:547 -msgid "importConditions() was given some `indices` but could not parse them" -msgstr "" - -#: experiment/_experiment.py:691 -msgid "" -"Name of the folder in which to save data and log files (blank defaults to " -"the builder pref)" -msgstr "" - -#: experiment/_experiment.py:755 -msgid "" -"This parameter is not known by this version of PsychoPy. It might be worth " -"upgrading, otherwise press the X button to remove this parameter." -msgstr "" - -#: experiment/_experiment.py:1110 -#, python-format -msgid "" -"Parameters not known to this version of PsychoPy have come from your " -"experiment file: %s. This experiment may not run correctly in the current " -"version." -msgstr "" - -#: experiment/devices.py:53 -msgid "Device" -msgstr "" - -#: experiment/components/camera/__init__.py:133 experiment/devices.py:55 -msgid "The named device from Device Manager to use for this Component." -msgstr "" - -#: experiment/loops.py:98 experiment/loops.py:483 experiment/loops.py:651 -msgid "Name of this loop" -msgstr "" - -#: experiment/loops.py:101 experiment/routines/counterbalance/__init__.py:57 -msgid "Num. repeats" -msgstr "" - -#: experiment/loops.py:102 -msgid "Number of repeats (for each condition)" -msgstr "" - -#: experiment/loops.py:106 experiment/loops.py:111 experiment/loops.py:682 -#: experiment/loops.py:709 experiment/routines/counterbalance/__init__.py:91 -#: experiment/routines/counterbalance/__init__.py:103 -msgid "Conditions" -msgstr "" - -#: experiment/loops.py:107 -msgid "A list of dictionaries describing the parameters in each condition" -msgstr "" - -#: experiment/loops.py:112 -msgid "" -"Name of a file specifying the parameters for each condition (.csv, .xlsx, or" -" .pkl). Browse to select a file. Right-click to preview file contents, or " -"create a new file." -msgstr "" - -#: experiment/loops.py:122 experiment/loops.py:538 experiment/loops.py:676 -msgid "End points" -msgstr "" - -#: experiment/loops.py:123 -msgid "The start and end of the loop (see flow timeline)" -msgstr "" - -#: experiment/loops.py:128 -msgid "Selected rows" -msgstr "" - -#: experiment/loops.py:129 -msgid "" -"Select just a subset of rows from your condition file (the first is 0 not " -"1!). Examples: 0, 0:5, 5:-1" -msgstr "" - -#: experiment/loops.py:137 experiment/loops.py:533 experiment/loops.py:672 -msgid "Loop type" -msgstr "" - -#: experiment/loops.py:138 -msgid "How should the next condition value(s) be chosen?" -msgstr "" - -#: experiment/loops.py:142 -msgid "Random seed" -msgstr "" - -#: experiment/loops.py:143 -msgid "" -"To have a fixed random sequence provide an integer of your choosing here. " -"Leave blank to have a new random sequence on each run of the experiment." -msgstr "" - -#: experiment/loops.py:149 experiment/loops.py:543 experiment/loops.py:718 -msgid "Is trials" -msgstr "" - -#: experiment/loops.py:150 experiment/loops.py:544 experiment/loops.py:719 -msgid "" -"Indicates that this loop generates TRIALS, rather than BLOCKS of trials or " -"stimuli within a trial. It alters how data files are output" -msgstr "" - -#: experiment/loops.py:487 experiment/loops.py:654 -msgid "nReps" -msgstr "" - -#: experiment/loops.py:488 -msgid "(Minimum) number of trials in the staircase" -msgstr "" - -#: experiment/loops.py:491 -msgid "Start value" -msgstr "" - -#: experiment/loops.py:492 -msgid "The initial value of the parameter" -msgstr "" - -#: experiment/loops.py:495 -msgid "Max value" -msgstr "" - -#: experiment/loops.py:496 -msgid "The maximum value the parameter can take" -msgstr "" - -#: experiment/loops.py:499 -msgid "Min value" -msgstr "" - -#: experiment/loops.py:500 -msgid "The minimum value the parameter can take" -msgstr "" - -#: experiment/loops.py:503 -msgid "Step sizes" -msgstr "" - -#: experiment/loops.py:504 -msgid "The size of the jump at each step (can change on each 'reversal')" -msgstr "" - -#: experiment/loops.py:508 -msgid "Step type" -msgstr "" - -#: experiment/loops.py:509 -msgid "" -"The units of the step size (e.g. 'linear' will add/subtract that value each " -"step, whereas 'log' will ad that many log units)" -msgstr "" - -#: experiment/loops.py:514 -msgid "N up" -msgstr "" - -#: experiment/loops.py:515 -msgid "The number of 'incorrect' answers before the value goes up" -msgstr "" - -#: experiment/loops.py:519 -msgid "N down" -msgstr "" - -#: experiment/loops.py:520 -msgid "The number of 'correct' answers before the value goes down" -msgstr "" - -#: experiment/loops.py:524 -msgid "N reversals" -msgstr "" - -#: experiment/loops.py:525 -msgid "Minimum number of times the staircase must change direction before ending" -msgstr "" - -#: experiment/loops.py:534 experiment/loops.py:673 -msgid "How should the next trial value(s) be chosen?" -msgstr "" - -#: experiment/loops.py:539 experiment/loops.py:677 -msgid "Where to loop from and to (see values currently shown in the flow view)" -msgstr "" - -#: experiment/loops.py:655 -msgid "(Minimum) number of trials in *each* staircase" -msgstr "" - -#: experiment/loops.py:659 -msgid "Stair type" -msgstr "" - -#: experiment/loops.py:660 experiment/loops.py:665 -msgid "How to select the next staircase to run" -msgstr "" - -#: experiment/loops.py:664 -msgid "Switch method" -msgstr "" - -#: experiment/loops.py:683 -msgid "A list of dictionaries describing the differences between each staircase" -msgstr "" - -#: experiment/loops.py:710 -msgid "An xlsx or csv file specifying the parameters for each condition" -msgstr "" - -#: experiment/monitor.py:34 -msgid "Position (x, y)" -msgstr "" - -#: experiment/monitor.py:36 -msgid "Position of the patch of pixels to pretend there is a photometer looking at" -msgstr "" - -#: experiment/monitor.py:41 -msgid "Size (w, h)" -msgstr "" - -#: experiment/monitor.py:43 -msgid "Size of the patch of pixels to pretend there is a photometer looking at" -msgstr "" - -#: experiment/components/_base.py:1464 experiment/monitor.py:51 -#: experiment/routines/eyetracker_calibrate/__init__.py:152 -#: experiment/routines/eyetracker_validate/__init__.py:163 -#: experiment/routines/visualValidator/__init__.py:110 -msgid "Spatial units" -msgstr "" - -#: experiment/monitor.py:53 -msgid "Spatial units in which to interpret size and position" -msgstr "" - -#: experiment/components/_base.py:72 -msgid "Name of this Component (alphanumeric or _, no spaces)" -msgstr "" - -#: experiment/components/_base.py:78 -msgid "How do you want to define your start point?" -msgstr "" - -#: experiment/components/_base.py:83 -msgid "Start type" -msgstr "" - -#: experiment/components/_base.py:85 experiment/routines/_base.py:64 -msgid "How do you want to define your end point?" -msgstr "" - -#: experiment/components/_base.py:91 -msgid "Stop type" -msgstr "" - -#: experiment/components/_base.py:95 -msgid "When does the Component start?" -msgstr "" - -#: experiment/components/_base.py:96 -#: experiment/components/serialOut/__init__.py:56 -msgid "Start" -msgstr "" - -#: experiment/components/_base.py:101 -msgid "When does the Component end? (blank is endless)" -msgstr "" - -#: experiment/components/_base.py:104 -msgid "(Optional) expected start (s), purely for representing in the timeline" -msgstr "" - -#: experiment/components/_base.py:109 -msgid "Expected start (s)" -msgstr "" - -#: experiment/components/_base.py:111 -msgid "(Optional) expected duration (s), purely for representing in the timeline" -msgstr "" - -#: experiment/components/_base.py:116 -msgid "Expected duration (s)" -msgstr "" - -#: experiment/components/_base.py:118 -msgid "Store the onset/offset times in the data file (as well as in the log file)." -msgstr "" - -#: experiment/components/_base.py:123 -msgid "Save onset/offset times" -msgstr "" - -#: experiment/components/_base.py:125 -msgid "" -"Synchronize times with screen refresh (good for visual stimuli and responses" -" based on them)" -msgstr "" - -#: experiment/components/_base.py:130 -msgid "Sync timing with screen refresh" -msgstr "" - -#: experiment/components/_base.py:132 -msgid "Disable this Component" -msgstr "" - -#: experiment/components/_base.py:136 -msgid "Disable Component" -msgstr "" - -#: experiment/components/_base.py:1142 -msgid "Do not validate" -msgstr "" - -#: experiment/components/_base.py:1458 -#: experiment/routines/eyetracker_calibrate/__init__.py:151 -#: experiment/routines/eyetracker_validate/__init__.py:162 -msgid "Units of dimensions for this stimulus" -msgstr "" - -#: experiment/components/_base.py:1466 -msgid "Foreground color of this stimulus (e.g. $[1,1,0], red )" -msgstr "" - -#: experiment/components/_base.py:1473 -msgid "Foreground color" -msgstr "" - -#: experiment/components/_base.py:1475 -#: experiment/routines/eyetracker_calibrate/__init__.py:125 -#: experiment/routines/eyetracker_validate/__init__.py:135 -msgid "" -"In what format (color space) have you specified the colors? (rgb, dkl, lms, " -"hsv)" -msgstr "" - -#: experiment/components/_base.py:1482 -#: experiment/components/routineSettings/__init__.py:132 -#: experiment/components/settings/__init__.py:320 -#: experiment/routines/eyetracker_calibrate/__init__.py:126 -#: experiment/routines/eyetracker_validate/__init__.py:136 -msgid "Color space" -msgstr "" - -#: experiment/components/_base.py:1484 -msgid "Fill color of this stimulus (e.g. $[1,1,0], red )" -msgstr "" - -#: experiment/components/_base.py:1490 -msgid "Fill color" -msgstr "" - -#: experiment/components/_base.py:1492 -msgid "Border color of this stimulus (e.g. $[1,1,0], red )" -msgstr "" - -#: experiment/components/_base.py:1498 -#: experiment/components/progress/__init__.py:55 -msgid "Border color" -msgstr "" - -#: experiment/components/_base.py:1500 -msgid "" -"Opacity of the stimulus (1=opaque, 0=fully transparent, 0.5=translucent). " -"Leave blank for each color to have its own opacity (recommended if any color" -" is None)." -msgstr "" - -#: experiment/components/_base.py:1507 -msgid "Opacity" -msgstr "" - -#: experiment/components/_base.py:1509 -msgid "" -"Contrast of the stimulus (1.0=unchanged contrast, 0.5=decrease contrast, " -"0.0=uniform/no contrast, -0.5=slightly inverted, -1.0=totally inverted)" -msgstr "" - -#: experiment/components/_base.py:1517 -msgid "Contrast" -msgstr "" - -#: experiment/components/_base.py:1519 -msgid "Position of this stimulus (e.g. [1,2] )" -msgstr "" - -#: experiment/components/_base.py:1525 -#: experiment/routines/visualValidator/__init__.py:94 -msgid "Position [x,y]" -msgstr "" - -#: experiment/components/_base.py:1527 -msgid "Size of this stimulus (either a single value or x,y pair, e.g. 2.5, [1,2] " -msgstr "" - -#: experiment/components/_base.py:1534 -msgid "Size [w,h]" -msgstr "" - -#: experiment/components/_base.py:1540 -msgid "Orientation of this stimulus (in deg)" -msgstr "" - -#: experiment/components/_base.py:1541 -msgid "Orientation" -msgstr "" - -#: experiment/components/_base.py:1550 experiment/components/sound/__init__.py:133 -msgid "Validate with..." -msgstr "" - -#: experiment/components/_base.py:1552 experiment/components/sound/__init__.py:135 -msgid "" -"Name of validator Component/Routine to use to check the timing of this " -"stimulus." -msgstr "" - -#: experiment/components/aperture/__init__.py:30 -msgid "Aperture: restrict the drawing of stimuli to a given region" -msgstr "" - -#: experiment/components/aperture/__init__.py:53 -msgid "How big is the aperture? (a single number for diameter)" -msgstr "" - -#: experiment/components/aperture/__init__.py:69 -msgid "Which point on the aperture should be anchored to its exact position?" -msgstr "" - -#: experiment/components/aperture/__init__.py:70 -#: experiment/components/button/__init__.py:139 -#: experiment/components/grating/__init__.py:86 -#: experiment/components/image/__init__.py:108 -#: experiment/components/movie/__init__.py:121 -#: experiment/components/polygon/__init__.py:93 -#: experiment/components/progress/__init__.py:94 -#: experiment/components/textbox/__init__.py:157 -msgid "Anchor" -msgstr "" - -#: experiment/components/aperture/__init__.py:73 -msgid "Size" -msgstr "" - -#: experiment/components/aperture/__init__.py:74 -msgid "Where is the aperture centred?" -msgstr "" - -#: experiment/components/brush/__init__.py:20 -msgid "Brush: a drawing tool" -msgstr "" - -#: experiment/components/brush/__init__.py:44 -msgid "Fill color of this brush" -msgstr "" - -#: experiment/components/brush/__init__.py:50 -msgid "Brush color" -msgstr "" - -#: experiment/components/brush/__init__.py:52 -msgid "Width of the brush's line (always in pixels and limited to 10px max width)" -msgstr "" - -#: experiment/components/brush/__init__.py:58 -msgid "Brush size" -msgstr "" - -#: experiment/components/brush/__init__.py:63 -msgid "The line opacity" -msgstr "" - -#: experiment/components/brush/__init__.py:66 -msgid "" -"Should the participant have to press a button to paint (True), or should it " -"be always on (False)?" -msgstr "" - -#: experiment/components/brush/__init__.py:72 -msgid "Press button" -msgstr "" - -#: experiment/components/button/__init__.py:29 -msgid "Button: A clickable textbox" -msgstr "" - -#: experiment/components/button/__init__.py:36 -msgid "Click here" -msgstr "" - -#: experiment/components/button/__init__.py:63 -#: experiment/components/textbox/__init__.py:65 -#: experiment/routines/eyetracker_calibrate/__init__.py:59 -#: experiment/routines/eyetracker_validate/__init__.py:95 -msgid "Text color" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:67 -#: experiment/components/button/__init__.py:68 -#: experiment/components/joyButtons/__init__.py:65 -#: experiment/components/keyboard/__init__.py:85 -#: experiment/components/soundsensor/__init__.py:68 -msgid "Should a response force the end of the Routine (e.g end the trial)?" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:69 -#: experiment/components/button/__init__.py:70 -#: experiment/components/joyButtons/__init__.py:71 -#: experiment/components/keyboard/__init__.py:91 -#: experiment/components/movie/__init__.py:93 -#: experiment/components/slider/__init__.py:145 -#: experiment/components/sound/__init__.py:126 -#: experiment/components/soundsensor/__init__.py:70 -msgid "Force end of Routine" -msgstr "" - -#: experiment/components/button/__init__.py:86 -msgid "" -"Should the callback run once per click (True), or each frame until click is " -"released (False)" -msgstr "" - -#: experiment/components/button/__init__.py:87 -msgid "Run once per click" -msgstr "" - -#: experiment/components/button/__init__.py:92 -msgid "Code to run when button is clicked" -msgstr "" - -#: experiment/components/button/__init__.py:93 -msgid "Callback function" -msgstr "" - -#: experiment/components/button/__init__.py:97 -#: experiment/components/text/__init__.py:53 -#: experiment/components/textbox/__init__.py:70 -msgid "The text to be displayed" -msgstr "" - -#: experiment/components/button/__init__.py:98 -msgid "Button text" -msgstr "" - -#: experiment/components/button/__init__.py:102 -#: experiment/components/form/__init__.py:94 -#: experiment/components/text/__init__.py:59 -#: experiment/components/textbox/__init__.py:90 -msgid "The font name (e.g. Comic Sans)" -msgstr "" - -#: experiment/components/button/__init__.py:103 -#: experiment/components/form/__init__.py:95 -#: experiment/components/slider/__init__.py:175 -#: experiment/components/text/__init__.py:60 -#: experiment/components/textbox/__init__.py:91 -msgid "Font" -msgstr "" - -#: experiment/components/button/__init__.py:107 -#: experiment/components/text/__init__.py:73 -#: experiment/components/textbox/__init__.py:95 -msgid "Specifies the height of the letter (the width is then determined by the font)" -msgstr "" - -#: experiment/components/button/__init__.py:109 -#: experiment/components/slider/__init__.py:182 -#: experiment/components/text/__init__.py:75 -#: experiment/components/textbox/__init__.py:97 -msgid "Letter height" -msgstr "" - -#: experiment/components/button/__init__.py:113 -#: experiment/components/textbox/__init__.py:126 -msgid "Should text be italic?" -msgstr "" - -#: experiment/components/button/__init__.py:114 -#: experiment/components/textbox/__init__.py:127 -msgid "Italic" -msgstr "" - -#: experiment/components/button/__init__.py:118 -#: experiment/components/textbox/__init__.py:131 -msgid "Should text be bold?" -msgstr "" - -#: experiment/components/button/__init__.py:119 -#: experiment/components/textbox/__init__.py:132 -msgid "Bold" -msgstr "" - -#: experiment/components/button/__init__.py:123 -#: experiment/components/textbox/__init__.py:141 -msgid "Defines the space between text and the textbox border" -msgstr "" - -#: experiment/components/button/__init__.py:124 -#: experiment/components/textbox/__init__.py:142 -msgid "Padding" -msgstr "" - -#: experiment/components/button/__init__.py:138 -msgid "Should text anchor to the top, center or bottom of the box?" -msgstr "" - -#: experiment/components/button/__init__.py:143 -#: experiment/components/textbox/__init__.py:191 -msgid "Textbox border width" -msgstr "" - -#: experiment/components/button/__init__.py:144 -#: experiment/components/textbox/__init__.py:192 -msgid "Border width" -msgstr "" - -#: experiment/components/button/__init__.py:149 -msgid "What clicks on this button should be saved to the data output?" -msgstr "" - -#: experiment/components/button/__init__.py:151 -msgid "Record clicks" -msgstr "" - -#: experiment/components/button/__init__.py:158 -#: experiment/components/mouse/__init__.py:68 -msgid "What should the values of mouse.time should be relative to?" -msgstr "" - -#: experiment/components/button/__init__.py:160 -#: experiment/components/joystick/__init__.py:76 -#: experiment/components/mouse/__init__.py:75 -msgid "Time relative to" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:14 -msgid "Button Box: Get input from a button box" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:83 -#: experiment/components/soundsensor/__init__.py:83 -msgid "Press" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:83 -#: experiment/components/soundsensor/__init__.py:83 -msgid "Release" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:85 -msgid "" -"When should the button press be registered? As soon as pressed, or when " -"released?" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:87 -#: experiment/components/soundsensor/__init__.py:87 -msgid "Register button press on..." -msgstr "" - -#: experiment/components/buttonBox/__init__.py:92 -msgid "Last button" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:92 -msgid "First button" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:93 -msgid "All buttons" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:93 -#: experiment/components/soundsensor/__init__.py:93 -msgid "Nothing" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:96 -#: experiment/components/joyButtons/__init__.py:56 -#: experiment/components/keyboard/__init__.py:103 -#: experiment/components/soundsensor/__init__.py:96 -msgid "Choose which (if any) responses to store at the end of a trial" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:98 -#: experiment/components/joyButtons/__init__.py:63 -#: experiment/components/keyboard/__init__.py:110 -#: experiment/components/soundsensor/__init__.py:98 -msgid "Store" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:102 -msgid "" -"A comma-separated list of button indices (should be whole numbers), leave " -"blank to listen for all buttons." -msgstr "" - -#: experiment/components/buttonBox/__init__.py:105 -#: experiment/components/joyButtons/__init__.py:54 -#: experiment/components/joystick/__init__.py:115 -msgid "Allowed buttons" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:110 -#: experiment/components/joyButtons/__init__.py:73 -#: experiment/components/keyboard/__init__.py:112 -#: experiment/components/mouse/__init__.py:108 -#: experiment/components/soundsensor/__init__.py:103 -msgid "Do you want to save the response as correct/incorrect?" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:112 -#: experiment/components/joyButtons/__init__.py:79 -#: experiment/components/keyboard/__init__.py:118 -#: experiment/components/mouse/__init__.py:114 -#: experiment/components/soundsensor/__init__.py:105 -msgid "Store correct" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:125 -msgid "" -"What is the 'correct' key? Might be helpful to add a correctAns column and " -"use $correctAns to compare to the key press. " -msgstr "" - -#: experiment/components/buttonBox/__init__.py:128 -#: experiment/components/joyButtons/__init__.py:98 -#: experiment/components/keyboard/__init__.py:137 -#: experiment/components/mouse/__init__.py:132 -#: experiment/components/soundsensor/__init__.py:121 -msgid "Correct answer" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:133 -#: experiment/components/keyboard/__init__.py:95 -msgid "" -"Do you want to discard all responses occurring before the onset of this " -"Component?" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:135 -#: experiment/components/keyboard/__init__.py:101 -msgid "Discard previous" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:295 -msgid "Buttons" -msgstr "" - -#: experiment/components/buttonBox/__init__.py:297 -msgid "" -"Keys to treat as buttons (in order of what button index you want them to " -"be). Must be the same length as the number of buttons." -msgstr "" - -#: experiment/components/camera/__init__.py:35 -msgid "Webcam: Record video from a webcam." -msgstr "" - -#: experiment/components/camera/__init__.py:131 -msgid "Microphone device" -msgstr "" - -#: experiment/components/camera/__init__.py:138 -msgid "Save webcam output to a file?" -msgstr "" - -#: experiment/components/camera/__init__.py:142 -msgid "Save file?" -msgstr "" - -#: experiment/components/camera/__init__.py:350 -msgid "Resolution (w x h) to record to, leave blank to use device default." -msgstr "" - -#: experiment/components/camera/__init__.py:352 -msgid "Resolution" -msgstr "" - -#: experiment/components/camera/__init__.py:358 -msgid "" -"Frame rate (frames per second) to record at, leave blank to use device " -"default." -msgstr "" - -#: experiment/components/camera/__init__.py:360 -#: experiment/components/settings/__init__.py:356 -msgid "Frame rate" -msgstr "" - -#: experiment/components/code/__init__.py:53 -msgid "Code: insert python commands into an experiment" -msgstr "" - -#: experiment/components/code/__init__.py:77 -msgid "Display Python or JS Code" -msgstr "" - -#: experiment/components/code/__init__.py:82 -msgid "Code type" -msgstr "" - -#: experiment/components/code/__init__.py:84 -msgid "" -"Code to run before the experiment starts (initialization); right-click " -"checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:90 -msgid "Before experiment" -msgstr "" - -#: experiment/components/code/__init__.py:92 -msgid "Code at the start of the experiment ; right-click checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:98 -msgid "Begin experiment" -msgstr "" - -#: experiment/components/code/__init__.py:100 -#: experiment/components/code/__init__.py:151 -msgid "" -"Code to be run at the start of each repeat of the Routine (e.g. each trial);" -" right-click checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:107 -msgid "Begin Routine" -msgstr "" - -#: experiment/components/code/__init__.py:109 -#: experiment/components/code/__init__.py:160 -msgid "" -"Code to be run on every video frame during for the duration of this Routine;" -" right-click checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:116 -msgid "Each frame" -msgstr "" - -#: experiment/components/code/__init__.py:118 -#: experiment/components/code/__init__.py:169 -msgid "" -"Code at the end of this repeat of the Routine (e.g. getting/storing " -"responses); right-click checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:125 -msgid "End Routine" -msgstr "" - -#: experiment/components/code/__init__.py:127 -#: experiment/components/code/__init__.py:178 -msgid "" -"Code at the end of the entire experiment (e.g. saving files, resetting " -"computer); right-click checks syntax" -msgstr "" - -#: experiment/components/code/__init__.py:134 -msgid "End experiment" -msgstr "" - -#: experiment/components/code/__init__.py:136 -msgid "" -"Code before the start of the experiment (initialization); right-click checks" -" syntax" -msgstr "" - -#: experiment/components/code/__init__.py:142 -msgid "Before JS experiment" -msgstr "" - -#: experiment/components/code/__init__.py:143 -msgid "" -"Code at the start of the experiment (initialization); right-click checks " -"syntax" -msgstr "" - -#: experiment/components/code/__init__.py:149 -msgid "Begin JS experiment" -msgstr "" - -#: experiment/components/code/__init__.py:158 -msgid "Begin JS Routine" -msgstr "" - -#: experiment/components/code/__init__.py:167 -msgid "Each JS frame" -msgstr "" - -#: experiment/components/code/__init__.py:176 -msgid "End JS Routine" -msgstr "" - -#: experiment/components/code/__init__.py:185 -msgid "End JS experiment" -msgstr "" - -#: experiment/components/dots/__init__.py:19 -msgid "Dots: Random Dot Kinematogram" -msgstr "" - -#: experiment/components/dots/__init__.py:51 -msgid "" -"Number of dots in the field (for circular fields this will be average number" -" of dots)" -msgstr "" - -#: experiment/components/dots/__init__.py:57 -msgid "Number of dots" -msgstr "" - -#: experiment/components/dots/__init__.py:59 -msgid "Direction of motion for the signal dots (degrees)" -msgstr "" - -#: experiment/components/dots/__init__.py:65 -msgid "Direction" -msgstr "" - -#: experiment/components/dots/__init__.py:67 -msgid "Speed of the dots (displacement per frame in the specified units)" -msgstr "" - -#: experiment/components/dots/__init__.py:74 -msgid "Speed" -msgstr "" - -#: experiment/components/dots/__init__.py:76 -msgid "" -"Coherence of the dots (fraction moving in the signal direction on any one " -"frame)" -msgstr "" - -#: experiment/components/dots/__init__.py:83 -msgid "Coherence" -msgstr "" - -#: experiment/components/dots/__init__.py:85 -msgid "Size of the dots IN PIXELS regardless of the set units" -msgstr "" - -#: experiment/components/dots/__init__.py:92 -msgid "Dot size" -msgstr "" - -#: experiment/components/dots/__init__.py:94 -msgid "" -"Number of frames before each dot is killed and randomly assigned a new " -"position" -msgstr "" - -#: experiment/components/dots/__init__.py:99 -msgid "Dot life-time" -msgstr "" - -#: experiment/components/dots/__init__.py:101 -msgid "" -"On each frame are the signals dots remaining the same or changing? See Scase" -" et al." -msgstr "" - -#: experiment/components/dots/__init__.py:106 -msgid "Signal dots" -msgstr "" - -#: experiment/components/dots/__init__.py:108 -msgid "When should the whole sample of dots be refreshed" -msgstr "" - -#: experiment/components/dots/__init__.py:113 -msgid "Dot refresh rule" -msgstr "" - -#: experiment/components/dots/__init__.py:116 -msgid "What governs the behaviour of the noise dots? See Scase et al." -msgstr "" - -#: experiment/components/dots/__init__.py:122 -msgid "Noise dots" -msgstr "" - -#: experiment/components/dots/__init__.py:128 -msgid "What is the shape of the field?" -msgstr "" - -#: experiment/components/dots/__init__.py:129 -msgid "Field shape" -msgstr "" - -#: experiment/components/dots/__init__.py:131 -msgid "What is the size of the field (in the specified units)?" -msgstr "" - -#: experiment/components/dots/__init__.py:138 -msgid "Field size" -msgstr "" - -#: experiment/components/dots/__init__.py:141 -msgid "Where is the field centred (in the specified units)?" -msgstr "" - -#: experiment/components/dots/__init__.py:147 -msgid "Field position" -msgstr "" - -#: experiment/components/dots/__init__.py:162 -msgid "Which point on the field should be anchored to its exact position?" -msgstr "" - -#: experiment/components/dots/__init__.py:163 -msgid "Field anchor" -msgstr "" - -#: experiment/components/dots/__init__.py:166 -msgid "Dot color" -msgstr "" - -#: experiment/components/dots/__init__.py:167 -msgid "Dot color space" -msgstr "" - -#: experiment/components/eyetracker_record/__init__.py:23 -msgid "Start and / or Stop recording data from the eye tracker" -msgstr "" - -#: experiment/components/eyetracker_record/__init__.py:50 -msgid "Should this Component start and / or stop eye tracker recording?" -msgstr "" - -#: experiment/components/eyetracker_record/__init__.py:51 -msgid "Record actions" -msgstr "" - -#: experiment/components/eyetracker_record/__init__.py:76 -msgid "" -"Should eyetracking stop when the Routine ends? Tick to force stopping after " -"the Routine has finished." -msgstr "" - -#: experiment/components/eyetracker_record/__init__.py:78 -#: experiment/components/movie/__init__.py:106 -#: experiment/components/sound/__init__.py:120 -msgid "Stop with Routine?" -msgstr "" - -#: experiment/components/form/__init__.py:25 -msgid "Form: a Psychopy survey tool" -msgstr "" - -#: experiment/components/form/__init__.py:78 -msgid "The csv filename containing the items for your survey." -msgstr "" - -#: experiment/components/form/__init__.py:79 -msgid "Items" -msgstr "" - -#: experiment/components/form/__init__.py:88 -msgid "The size of the item text for Form" -msgstr "" - -#: experiment/components/form/__init__.py:89 -msgid "Text height" -msgstr "" - -#: experiment/components/form/__init__.py:100 -msgid "Do you want to randomize the order of your questions?" -msgstr "" - -#: experiment/components/form/__init__.py:101 -msgid "Randomize" -msgstr "" - -#: experiment/components/form/__init__.py:106 -msgid "The padding or space between items." -msgstr "" - -#: experiment/components/form/__init__.py:107 -msgid "Item padding" -msgstr "" - -#: experiment/components/form/__init__.py:113 -msgid "Store item data by columns, or rows" -msgstr "" - -#: experiment/components/form/__init__.py:114 -msgid "Data format" -msgstr "" - -#: experiment/components/form/__init__.py:129 -msgid "Styles determine the appearance of the form" -msgstr "" - -#: experiment/components/form/__init__.py:130 -#: experiment/components/slider/__init__.py:189 -msgid "Styles" -msgstr "" - -#: experiment/components/form/__init__.py:141 -msgid "Color of the form's background" -msgstr "" - -#: experiment/components/form/__init__.py:143 -msgid "Color of the outline around the form" -msgstr "" - -#: experiment/components/form/__init__.py:149 -msgid "Base text color for questions" -msgstr "" - -#: experiment/components/form/__init__.py:150 -msgid "Item color" -msgstr "" - -#: experiment/components/form/__init__.py:156 -msgid "" -"Base text color for responses, also sets color of lines in sliders and " -"borders of textboxes" -msgstr "" - -#: experiment/components/form/__init__.py:157 -msgid "Response color" -msgstr "" - -#: experiment/components/form/__init__.py:163 -msgid "Color of markers and the scrollbar" -msgstr "" - -#: experiment/components/form/__init__.py:164 -#: experiment/components/slider/__init__.py:165 -msgid "Marker color" -msgstr "" - -#: experiment/components/grating/__init__.py:19 -msgid "Grating: present cyclic textures, prebuilt or from a file" -msgstr "" - -#: experiment/components/grating/__init__.py:45 -msgid "" -"The (2D) texture of the grating - can be sin, sqr, sinXsin... or a filename " -"(including path)" -msgstr "" - -#: experiment/components/grating/__init__.py:52 -msgid "Texture" -msgstr "" - -#: experiment/components/grating/__init__.py:54 -msgid "" -"An image to define the alpha mask (ie shape)- gauss, circle... or a filename" -" (including path)" -msgstr "" - -#: experiment/components/grating/__init__.py:61 -#: experiment/components/image/__init__.py:61 -msgid "Mask" -msgstr "" - -#: experiment/components/grating/__init__.py:63 -msgid "" -"Spatial frequency of image repeats across the grating in 1 or 2 dimensions, " -"e.g. 4 or [2,3]" -msgstr "" - -#: experiment/components/grating/__init__.py:70 -msgid "Spatial frequency" -msgstr "" - -#: experiment/components/grating/__init__.py:85 -#: experiment/components/image/__init__.py:107 -#: experiment/components/movie/__init__.py:120 -#: experiment/components/polygon/__init__.py:92 -#: experiment/components/progress/__init__.py:93 -#: experiment/components/textbox/__init__.py:156 -msgid "Which point on the stimulus should be anchored to its exact position?" -msgstr "" - -#: experiment/components/grating/__init__.py:90 -#: experiment/components/image/__init__.py:112 -#: experiment/components/polygon/__init__.py:97 -#: experiment/components/text/__init__.py:65 -#: experiment/components/textbox/__init__.py:113 -msgid "Draggable?" -msgstr "" - -#: experiment/components/grating/__init__.py:92 -#: experiment/components/image/__init__.py:114 -#: experiment/components/polygon/__init__.py:99 -#: experiment/components/text/__init__.py:67 -#: experiment/components/textbox/__init__.py:115 -msgid "Should this stimulus be moveble by clicking and dragging?" -msgstr "" - -#: experiment/components/grating/__init__.py:96 -msgid "Spatial positioning of the image on the grating (wraps in range 0-1.0)" -msgstr "" - -#: experiment/components/grating/__init__.py:103 -msgid "Phase (in cycles)" -msgstr "" - -#: experiment/components/grating/__init__.py:106 -msgid "" -"Resolution of the texture for standard ones such as sin, sqr etc. For most " -"cases a value of 256 pixels will suffice" -msgstr "" - -#: experiment/components/grating/__init__.py:113 -#: experiment/components/image/__init__.py:69 -msgid "Texture resolution" -msgstr "" - -#: experiment/components/grating/__init__.py:115 -#: experiment/components/image/__init__.py:72 -#: experiment/components/panorama/__init__.py:74 -#: experiment/components/polygon/__init__.py:128 -msgid "How should the image be interpolated if/when rescaled" -msgstr "" - -#: experiment/components/grating/__init__.py:121 -#: experiment/components/image/__init__.py:77 -#: experiment/components/panorama/__init__.py:80 -#: experiment/components/polygon/__init__.py:133 -msgid "Interpolate" -msgstr "" - -#: experiment/components/grating/__init__.py:123 -msgid "" -"OpenGL Blendmode: avg gives traditional transparency, add is important to " -"combine gratings)]" -msgstr "" - -#: experiment/components/grating/__init__.py:130 -msgid "OpenGL blend mode" -msgstr "" - -#: experiment/components/image/__init__.py:19 -msgid "Image: present images (bmp, jpg, tif...)" -msgstr "" - -#: experiment/components/image/__init__.py:45 -#: experiment/components/panorama/__init__.py:64 -msgid "The image to be displayed - a filename, including path" -msgstr "" - -#: experiment/components/image/__init__.py:51 -#: experiment/components/panorama/__init__.py:71 -msgid "Image" -msgstr "" - -#: experiment/components/image/__init__.py:54 -msgid "" -"An image to define the alpha mask through which the image is seen - gauss, " -"circle, None or a filename (including path)" -msgstr "" - -#: experiment/components/image/__init__.py:63 -msgid "Resolution of the mask if one is used." -msgstr "" - -#: experiment/components/image/__init__.py:80 -msgid "Should the image be flipped vertically (top to bottom)?" -msgstr "" - -#: experiment/components/image/__init__.py:85 -msgid "Flip vertically" -msgstr "" - -#: experiment/components/image/__init__.py:88 -msgid "Should the image be flipped horizontally (left to right)?" -msgstr "" - -#: experiment/components/image/__init__.py:93 -msgid "Flip horizontally" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:20 -msgid "JoyButtons: check and record joystick/gamepad button presses" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:47 -msgid "A comma-separated list of button numbers, such as 0,1,2,3,4" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:91 -#: experiment/components/keyboard/__init__.py:130 -msgid "" -"What is the 'correct' key? Might be helpful to add a correctAns column and " -"use $correctAns to compare to the key press." -msgstr "" - -#: experiment/components/joyButtons/__init__.py:101 -#: experiment/components/keyboard/__init__.py:140 -msgid "" -"A reaction time to a visual stimulus should be based on when the screen " -"flipped" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:107 -msgid "Sync RT with screen" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:110 -#: experiment/components/joystick/__init__.py:99 -msgid "" -"Device number, if you have multiple devices which one do you want (0, 1, " -"2...)" -msgstr "" - -#: experiment/components/joyButtons/__init__.py:116 -#: experiment/components/joystick/__init__.py:106 -msgid "Device number" -msgstr "" - -#: experiment/components/joystick/__init__.py:22 -msgid "Joystick: query joystick position and buttons" -msgstr "" - -#: experiment/components/joystick/__init__.py:47 -msgid "" -"How often should the joystick state (x,y,buttons) be stored? On every video " -"frame, every click or just at the end of the Routine?" -msgstr "" - -#: experiment/components/joystick/__init__.py:54 -msgid "Save joystick state" -msgstr "" - -#: experiment/components/joystick/__init__.py:56 -#: experiment/components/mouse/__init__.py:55 -msgid "Should a button press force the end of the Routine (e.g end the trial)?" -msgstr "" - -#: experiment/components/joystick/__init__.py:67 -#: experiment/components/mouse/__init__.py:66 -msgid "End Routine on press" -msgstr "" - -#: experiment/components/joystick/__init__.py:69 -msgid "What should the values of joystick.time be relative to?" -msgstr "" - -#: experiment/components/joystick/__init__.py:78 -#: experiment/components/mouse/__init__.py:87 -msgid "" -"A comma-separated list of your stimulus names that can be \"clicked\" by the" -" participant. e.g. target, foil" -msgstr "" - -#: experiment/components/joystick/__init__.py:86 -#: experiment/components/mouse/__init__.py:95 -msgid "Clickable stimuli" -msgstr "" - -#: experiment/components/joystick/__init__.py:88 -msgid "" -"The params (e.g. name, text), for which you want to store the current value," -" for the stimulus that was\"clicked\" by the joystick. Make sure that all " -"the clickable objects have all these params." -msgstr "" - -#: experiment/components/joystick/__init__.py:97 -#: experiment/components/mouse/__init__.py:106 -msgid "Store params for clicked" -msgstr "" - -#: experiment/components/joystick/__init__.py:108 -msgid "Buttons to be read (blank for any) numbers separated by commas" -msgstr "" - -#: experiment/components/keyboard/__init__.py:25 -msgid "Keyboard: check and record keypresses" -msgstr "" - -#: experiment/components/keyboard/__init__.py:67 -msgid "When should the keypress be registered? As soon as pressed, or when released?" -msgstr "" - -#: experiment/components/keyboard/__init__.py:73 -msgid "Register keypress on..." -msgstr "" - -#: experiment/components/keyboard/__init__.py:77 -msgid "" -"A comma-separated list of keys (with quotes), such as " -"'q','right','space','left'" -msgstr "" - -#: experiment/components/keyboard/__init__.py:83 -msgid "Allowed keys" -msgstr "" - -#: experiment/components/keyboard/__init__.py:146 -msgid "Sync timing with screen" -msgstr "" - -#: experiment/components/microphone/__init__.py:26 -msgid "" -"Microphone: basic sound capture (fixed onset & duration), okay for spoken " -"words" -msgstr "" - -#: experiment/components/microphone/__init__.py:84 -msgid "The duration of the recording in seconds; blank = 0 sec" -msgstr "" - -#: experiment/components/microphone/__init__.py:89 -msgid "What file type should output audio files be saved as?" -msgstr "" - -#: experiment/components/microphone/__init__.py:94 -msgid "Output file type" -msgstr "" - -#: experiment/components/microphone/__init__.py:101 -msgid "Discard incoming data" -msgstr "" - -#: experiment/components/microphone/__init__.py:102 -msgid "Clear oldest data" -msgstr "" - -#: experiment/components/microphone/__init__.py:103 -msgid "Raise error" -msgstr "" - -#: experiment/components/microphone/__init__.py:105 -msgid "Full buffer policy" -msgstr "" - -#: experiment/components/microphone/__init__.py:107 -msgid "" -"What to do when we reach the max amount of audio data which can be safely " -"stored in memory?" -msgstr "" - -#: experiment/components/microphone/__init__.py:112 -msgid "Tick this to save times when the participant starts and stops speaking" -msgstr "" - -#: experiment/components/microphone/__init__.py:116 -msgid "Speaking start / stop times" -msgstr "" - -#: experiment/components/microphone/__init__.py:120 -msgid "Trim periods of silence from the output file" -msgstr "" - -#: experiment/components/microphone/__init__.py:124 -msgid "Trim silent" -msgstr "" - -#: experiment/components/microphone/__init__.py:136 -msgid "Whether to transcribe the audio recording and store the transcription" -msgstr "" - -#: experiment/components/microphone/__init__.py:137 -msgid "Transcribe audio" -msgstr "" - -#: experiment/components/microphone/__init__.py:164 -msgid "What transcription service to use to transcribe audio?" -msgstr "" - -#: experiment/components/microphone/__init__.py:165 -msgid "Transcription backend" -msgstr "" - -#: experiment/components/microphone/__init__.py:170 -msgid "" -"What language you expect the recording to be spoken in, e.g. en-US for " -"English" -msgstr "" - -#: experiment/components/microphone/__init__.py:171 -msgid "Transcription language" -msgstr "" - -#: experiment/components/microphone/__init__.py:183 -#, python-format -msgid "" -"Set list of words to listen for - if blank will listen for all words in " -"chosen language. \n" -"\n" -"If using the built-in transcriber, you can set a minimum % confidence level " -"using a colon after the word, e.g. 'red:100', 'green:80'. Otherwise, default" -" confidence level is 80%." -msgstr "" - -#: experiment/components/microphone/__init__.py:186 -msgid "Expected words" -msgstr "" - -#: experiment/components/microphone/__init__.py:200 -msgid "" -"Which model of Whisper AI should be used for transcription? Details of each " -"model are available here at github.com/openai/whisper" -msgstr "" - -#: experiment/components/microphone/__init__.py:201 -msgid "Whisper model" -msgstr "" - -#: experiment/components/microphone/__init__.py:224 -msgid "Which device to use for transcription?" -msgstr "" - -#: experiment/components/microphone/__init__.py:225 -msgid "Whisper device" -msgstr "" - -#: experiment/components/microphone/__init__.py:575 -msgid "Exclusive control" -msgstr "" - -#: experiment/components/microphone/__init__.py:577 -msgid "" -"Take exclusive control of the microphone, so other apps can't use it during " -"your experiment." -msgstr "" - -#: experiment/components/mouse/__init__.py:20 -msgid "Mouse: query mouse position and buttons" -msgstr "" - -#: experiment/components/mouse/__init__.py:46 -msgid "" -"How often should the mouse state (x,y,buttons) be stored? On every video " -"frame, every click or just at the end of the Routine?" -msgstr "" - -#: experiment/components/mouse/__init__.py:53 -msgid "Save mouse state" -msgstr "" - -#: experiment/components/mouse/__init__.py:77 -msgid "" -"If the mouse button is already down when we start checking then wait for it " -"to be released before recording as a new click." -msgstr "" - -#: experiment/components/mouse/__init__.py:85 -msgid "New clicks only" -msgstr "" - -#: experiment/components/mouse/__init__.py:97 -msgid "" -"The params (e.g. name, text), for which you want to store the current value," -" for the stimulus that was\"clicked\" by the mouse. Make sure that all the " -"clickable objects have all these params." -msgstr "" - -#: experiment/components/mouse/__init__.py:126 -msgid "" -"What is the 'correct' object? To specify an area, remember that you can " -"create a shape Component with 0 opacity." -msgstr "" - -#: experiment/components/movie/__init__.py:20 -msgid "Movie: play movie files" -msgstr "" - -#: experiment/components/movie/__init__.py:48 -#: experiment/components/sound/__init__.py:75 -msgid "When does the Component end? (blank to use the duration of the media)" -msgstr "" - -#: experiment/components/movie/__init__.py:51 -msgid "A filename for the movie (including path)" -msgstr "" - -#: experiment/components/movie/__init__.py:56 -msgid "Movie file" -msgstr "" - -#: experiment/components/movie/__init__.py:58 -msgid "What underlying lib to use for loading movies" -msgstr "" - -#: experiment/components/movie/__init__.py:63 -msgid "Backend" -msgstr "" - -#: experiment/components/movie/__init__.py:65 -msgid "" -"Prevent the audio stream from being loaded/processed (moviepy and opencv " -"only)" -msgstr "" - -#: experiment/components/movie/__init__.py:70 -msgid "No audio" -msgstr "" - -#: experiment/components/movie/__init__.py:81 -msgid "How loud should audio be played?" -msgstr "" - -#: experiment/components/movie/__init__.py:85 -#: experiment/components/sound/__init__.py:107 -msgid "Volume" -msgstr "" - -#: experiment/components/movie/__init__.py:87 -msgid "Should the end of the movie cause the end of the Routine (e.g. trial)?" -msgstr "" - -#: experiment/components/movie/__init__.py:95 -msgid "Whether the movie should loop back to the beginning on completion." -msgstr "" - -#: experiment/components/movie/__init__.py:100 -msgid "Loop playback" -msgstr "" - -#: experiment/components/movie/__init__.py:104 -#: experiment/components/sound/__init__.py:118 -msgid "" -"Should playback cease when the Routine ends? Untick to continue playing " -"after the Routine has finished." -msgstr "" - -#: experiment/components/panorama/__init__.py:19 -msgid "" -"Panorama: Present a panoramic image (such as from a phone camera in Panorama" -" mode) on screen." -msgstr "" - -#: experiment/components/panorama/__init__.py:85 -msgid "How to control looking around the panorama scene" -msgstr "" - -#: experiment/components/panorama/__init__.py:95 -msgid "Position control" -msgstr "" - -#: experiment/components/panorama/__init__.py:108 -msgid "Horizontal look position, ranging from -1 (fully left) to 1 (fully right)" -msgstr "" - -#: experiment/components/panorama/__init__.py:115 -msgid "Azimuth" -msgstr "" - -#: experiment/components/panorama/__init__.py:128 -msgid "Vertical look position, ranging from -1 (fully down) to 1 (fully up)" -msgstr "" - -#: experiment/components/panorama/__init__.py:135 -msgid "Elevation" -msgstr "" - -#: experiment/components/panorama/__init__.py:138 -msgid "Up" -msgstr "" - -#: experiment/components/panorama/__init__.py:138 -msgid "Left" -msgstr "" - -#: experiment/components/panorama/__init__.py:138 -msgid "Down" -msgstr "" - -#: experiment/components/panorama/__init__.py:139 -msgid "Right" -msgstr "" - -#: experiment/components/panorama/__init__.py:152 -#: experiment/components/panorama/__init__.py:227 -#, python-brace-format -msgid "What key corresponds to the view action '{}'?" -msgstr "" - -#: experiment/components/panorama/__init__.py:170 -msgid "" -"Should movement be smoothed, so the view keeps moving a little after a " -"change?" -msgstr "" - -#: experiment/components/panorama/__init__.py:176 -msgid "Smooth?" -msgstr "" - -#: experiment/components/panorama/__init__.py:188 -msgid "" -"Multiplier to apply to view changes. 1 means that moving the mouse from the " -"center of the screen to the edge or holding down a key for 2s will rotate " -"180°." -msgstr "" - -#: experiment/components/panorama/__init__.py:194 -msgid "Movement sensitivity" -msgstr "" - -#: experiment/components/panorama/__init__.py:200 -msgid "How to control zooming in and out of the panorama scene" -msgstr "" - -#: experiment/components/panorama/__init__.py:210 -msgid "Zoom control" -msgstr "" - -#: experiment/components/panorama/__init__.py:214 -msgid "Zoom in" -msgstr "" - -#: experiment/components/panorama/__init__.py:214 -msgid "Zoom out" -msgstr "" - -#: experiment/components/panorama/__init__.py:245 -msgid "How zoomed in the scene is, with 1 being no adjustment." -msgstr "" - -#: experiment/components/panorama/__init__.py:252 -msgid "Zoom" -msgstr "" - -#: experiment/components/panorama/__init__.py:265 -msgid "" -"Multiplier to apply to zoom changes. 1 means that pressing the zoom in key " -"for 1s or scrolling the mouse wheel 100% zooms in 100%." -msgstr "" - -#: experiment/components/panorama/__init__.py:271 -msgid "Zoom sensitivity" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:19 -msgid "Parallel out: send signals from the parallel port" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:48 -msgid "" -"Parallel port to be used (you can change these options in " -"preferences>general)" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:52 -msgid "Port address" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:63 -msgid "U3 Register to write byte to" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:66 -msgid "U3 register" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:70 -msgid "Data to be sent at 'start'" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:71 -msgid "Start data" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:75 -msgid "Data to be sent at 'end'" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:76 -msgid "Stop data" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:78 -msgid "" -"If the parallel port data relates to visual stimuli then sync its pulse to " -"the screen refresh" -msgstr "" - -#: experiment/components/parallelOut/__init__.py:85 -msgid "Sync to screen" -msgstr "" - -#: experiment/components/polygon/__init__.py:20 -msgid "Polygon: any regular polygon (line, triangle, square...circle)" -msgstr "" - -#: experiment/components/polygon/__init__.py:63 -msgid "How many vertices in your regular polygon?" -msgstr "" - -#: experiment/components/polygon/__init__.py:69 -msgid "Num. vertices" -msgstr "" - -#: experiment/components/polygon/__init__.py:71 -msgid "" -"What are the vertices of your polygon? Should be an nx2 array or a list of " -"[x, y] lists" -msgstr "" - -#: experiment/components/polygon/__init__.py:77 -msgid "Vertices" -msgstr "" - -#: experiment/components/polygon/__init__.py:103 -msgid "" -"What shape is this? With 'regular polygon...' you can set number of vertices" -" and with 'custom polygon...' you can set vertices" -msgstr "" - -#: experiment/components/polygon/__init__.py:113 -msgid "Shape" -msgstr "" - -#: experiment/components/polygon/__init__.py:118 -#: experiment/components/progress/__init__.py:70 -msgid "Width of the shape's line (always in pixels - this does NOT use 'units')" -msgstr "" - -#: experiment/components/polygon/__init__.py:125 -#: experiment/components/progress/__init__.py:77 -msgid "Line width" -msgstr "" - -#: experiment/components/polygon/__init__.py:137 -msgid "" -"Size of this stimulus [w,h]. Note that for a line only the first value is " -"used, for triangle and rect the [w,h] is as expected,\n" -" but for higher-order polygons it represents the [w,h] of the ellipse that " -"the polygon sits on!! " -msgstr "" - -#: experiment/components/progress/__init__.py:16 -msgid "Progress: Present a progress bar, with values ranging from 0 to 1." -msgstr "" - -#: experiment/components/progress/__init__.py:47 -msgid "Bar color" -msgstr "" - -#: experiment/components/progress/__init__.py:49 -msgid "Color of the filled part of the progress bar." -msgstr "" - -#: experiment/components/progress/__init__.py:51 -msgid "Back color" -msgstr "" - -#: experiment/components/progress/__init__.py:53 -msgid "Color of the empty part of the progress bar." -msgstr "" - -#: experiment/components/progress/__init__.py:57 -msgid "Color of the line around the progress bar." -msgstr "" - -#: experiment/components/progress/__init__.py:65 -msgid "Value between 0 (not started) and 1 (complete) to set the progress bar to." -msgstr "" - -#: experiment/components/progress/__init__.py:67 -msgid "Progress" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:14 -msgid "" -"Pre-load some resources into memory so that components using them can start " -"without having to load first" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:41 -msgid "Resources to download/check" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:42 -msgid "Resources" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:46 -msgid "When checking these resources, also check for all currently downloading?" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:47 -msgid "Check all" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:52 -msgid "Should this Component start an / or check resource preloading?" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:53 -msgid "Preload actions" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:56 -msgid "Should we end the Routine when the resource download is complete?" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:61 -msgid "Force end Routine" -msgstr "" - -#: experiment/components/resourceManager/__init__.py:63 -msgid "Check" -msgstr "" - -#: experiment/components/roi/__init__.py:20 -msgid "Region Of Interest: Define a region of interest for use with eyetrackers" -msgstr "" - -#: experiment/components/roi/__init__.py:59 -msgid "Under what condition should this ROI end the Routine?" -msgstr "" - -#: experiment/components/roi/__init__.py:60 -msgid "End Routine on..." -msgstr "" - -#: experiment/components/roi/__init__.py:74 -msgid "Minimum dwell time within roi (look at) or outside roi (look away)." -msgstr "" - -#: experiment/components/roi/__init__.py:75 -msgid "Min. look time" -msgstr "" - -#: experiment/components/roi/__init__.py:80 -msgid "" -"In debug mode, the ROI is drawn in red. Use this to see what area of the " -"screen is in the ROI." -msgstr "" - -#: experiment/components/roi/__init__.py:82 -msgid "Debug mode" -msgstr "" - -#: experiment/components/roi/__init__.py:90 -msgid "What looks on this ROI should be saved to the data output?" -msgstr "" - -#: experiment/components/roi/__init__.py:91 -msgid "Save..." -msgstr "" - -#: experiment/components/roi/__init__.py:98 -msgid "What should the values of roi.time should be relative to?" -msgstr "" - -#: experiment/components/roi/__init__.py:100 -msgid "Time relative to..." -msgstr "" - -#: experiment/components/routineSettings/__init__.py:15 -msgid "Settings for this Routine." -msgstr "" - -#: experiment/components/routineSettings/__init__.py:54 -#: experiment/routines/_base.py:76 -msgid "Disable Routine" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:59 -msgid "When should this Routine end, if not already ended by a Component?" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:63 -#: experiment/components/serialOut/__init__.py:280 -msgid "Timeout" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:65 -msgid "" -"When should this Routine end, if not already ended by a Component? Leave " -"blank for endless." -msgstr "" - -#: experiment/components/routineSettings/__init__.py:78 -msgid "" -"If this Routine ended by hitting its max duration, reset the timer by " -"subtracting the max duration rather than resetting to 0. Only tick this if " -"you're sure you know how long the Routine is going to take, otherwise you'll" -" get incorrect timestamps in the next Routine!" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:80 -msgid "Non-slip timing" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:86 -msgid "" -"Skip this Routine if the value in this contorl evaluates to True. Leave " -"blank to not skip." -msgstr "" - -#: experiment/components/routineSettings/__init__.py:88 -msgid "Skip if..." -msgstr "" - -#: experiment/components/routineSettings/__init__.py:95 -msgid "" -"Some descriptive text to give information about this Routine. This won't " -"affect how it runs, it's purely for your own reference!" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:99 -msgid "Description" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:114 -msgid "Different window settings?" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:116 -msgid "Should the appearance of the window change while this Routine is running?" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:121 -#: experiment/components/settings/__init__.py:314 -msgid "Background color" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:123 -msgid "" -"Color of the screen this Routine (e.g. black, $[1.0,1.0,1.0], $variable. " -"Right-click to bring up a color-picker.)" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:129 -#: experiment/components/settings/__init__.py:317 -msgid "" -"Needed if color is defined numerically (see PsychoPy documentation on color " -"spaces)" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:135 -#: experiment/components/settings/__init__.py:323 -msgid "Image file to use as a background (leave blank for no image)" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:136 -#: experiment/components/settings/__init__.py:324 -msgid "Background image" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:141 -#: experiment/components/settings/__init__.py:329 -msgid "How should the background image scale to fit the window size?" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:142 -#: experiment/components/settings/__init__.py:330 -msgid "Background fit" -msgstr "" - -#: experiment/components/routineSettings/__init__.py:157 -msgid "" -"Save the start and stop times of this Routine (according to the global " -"clock) to the data file." -msgstr "" - -#: experiment/components/serialOut/__init__.py:21 -msgid "Serial out: send signals from a serial port" -msgstr "" - -#: experiment/components/serialOut/__init__.py:56 -msgid "start" -msgstr "" - -#: experiment/components/serialOut/__init__.py:57 -msgid "stop" -msgstr "" - -#: experiment/components/serialOut/__init__.py:64 -msgid "String" -msgstr "" - -#: experiment/components/serialOut/__init__.py:64 -msgid "Numeric (0-255)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:65 -msgid "Binary" -msgstr "" - -#: experiment/components/serialOut/__init__.py:65 -msgid "Character (Byte)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:65 -msgid "Code" -msgstr "" - -#: experiment/components/serialOut/__init__.py:68 -msgid "" -"Type of data to be sent: A number, a binary sequence, a character byte, or " -"custom code ($)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:70 -#, python-brace-format -msgid "{} data type" -msgstr "" - -#: experiment/components/serialOut/__init__.py:75 -#, python-brace-format -msgid "Send a regular string (which will be converted to binary) on {}" -msgstr "" - -#: experiment/components/serialOut/__init__.py:76 -#, python-brace-format -msgid "{} data (string)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:88 -#, python-brace-format -msgid "Send a number between 0-255 on {}" -msgstr "" - -#: experiment/components/serialOut/__init__.py:89 -#, python-brace-format -msgid "{} data (numeric)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:101 -#, python-brace-format -msgid "Send a binary sequence (1s and 0s) on {}" -msgstr "" - -#: experiment/components/serialOut/__init__.py:102 -#, python-brace-format -msgid "{} data (binary)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:114 -#, python-brace-format -msgid "Send a character byte (e.g. \\x73) on {}" -msgstr "" - -#: experiment/components/serialOut/__init__.py:115 -#, python-brace-format -msgid "{} data (char)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:127 -#, python-brace-format -msgid "Send custom code (e.g. from a variable) on {}" -msgstr "" - -#: experiment/components/serialOut/__init__.py:128 -#, python-brace-format -msgid "{} data (code)" -msgstr "" - -#: experiment/components/serialOut/__init__.py:140 -msgid "" -"After sending a signal, should PsychoPy read and record a response from the " -"port?" -msgstr "" - -#: experiment/components/serialOut/__init__.py:141 -msgid "Get response?" -msgstr "" - -#: experiment/components/serialOut/__init__.py:279 -msgid "Time at which to give up listening for a response (leave blank for no limit)" -msgstr "" - -#: experiment/components/settings/__init__.py:80 -msgid "Edit settings for this experiment" -msgstr "" - -#: experiment/components/settings/__init__.py:97 -msgid "Attempting to measure frame rate of screen, please wait..." -msgstr "" - -#: experiment/components/settings/__init__.py:128 -msgid "Thank you for your patience." -msgstr "" - -#: experiment/components/settings/__init__.py:169 -msgid "Name of the entire experiment (taken by default from the filename on save)" -msgstr "" - -#: experiment/components/settings/__init__.py:171 -msgid "Experiment name" -msgstr "" - -#: experiment/components/settings/__init__.py:176 -msgid "" -"Version number of the experiment (a string). Just for your records if it's " -"useful to store" -msgstr "" - -#: experiment/components/settings/__init__.py:178 -msgid "Experiment version" -msgstr "" - -#: experiment/components/settings/__init__.py:183 -msgid "Piloting" -msgstr "" - -#: experiment/components/settings/__init__.py:183 -msgid "Running" -msgstr "" - -#: experiment/components/settings/__init__.py:186 -msgid "" -"In piloting mode, all of the settings from prefs->piloting are applied. This" -" is recommended while the experiment is a work in progress." -msgstr "" - -#: experiment/components/settings/__init__.py:205 -msgid "The version of PsychoPy to use when running the experiment." -msgstr "" - -#: experiment/components/settings/__init__.py:207 -msgid "Use PsychoPy version" -msgstr "" - -#: experiment/components/settings/__init__.py:211 -msgid "Enable the key, to allow subjects to quit / break out of the experiment" -msgstr "" - -#: experiment/components/settings/__init__.py:213 -msgid "Enable escape key" -msgstr "" - -#: experiment/components/settings/__init__.py:218 -msgid "" -"Enable 'rush' mode, which will raise CPU priority while the experiment is " -"running" -msgstr "" - -#: experiment/components/settings/__init__.py:220 -msgid "Enable 'rush' mode" -msgstr "" - -#: experiment/components/settings/__init__.py:225 -msgid "Start the experiment with a dialog to set info (e.g.participant or condition)" -msgstr "" - -#: experiment/components/settings/__init__.py:227 -msgid "Show info dialog" -msgstr "" - -#: experiment/components/settings/__init__.py:241 -msgid "" -"The info to present in a dialog box. Right-click to check syntax and preview" -" the dialog box." -msgstr "" - -#: experiment/components/settings/__init__.py:244 -msgid "Experiment info" -msgstr "" - -#: experiment/components/settings/__init__.py:267 -msgid "Run the experiment full-screen (recommended)" -msgstr "" - -#: experiment/components/settings/__init__.py:268 -msgid "Full-screen window" -msgstr "" - -#: experiment/components/settings/__init__.py:271 -msgid "Size of window (if not fullscreen)" -msgstr "" - -#: experiment/components/settings/__init__.py:272 -msgid "Window size (pixels)" -msgstr "" - -#: experiment/components/settings/__init__.py:283 -msgid "" -"Should the mouse be visible on screen? Only applicable for fullscreen " -"experiments." -msgstr "" - -#: experiment/components/settings/__init__.py:284 -msgid "Show mouse" -msgstr "" - -#: experiment/components/settings/__init__.py:296 -msgid "" -"What Python package should be used behind the scenes for drawing to the " -"window?" -msgstr "" - -#: experiment/components/settings/__init__.py:297 -msgid "Window backend" -msgstr "" - -#: experiment/components/settings/__init__.py:301 -msgid "Which physical screen to run on (1 or 2)" -msgstr "" - -#: experiment/components/settings/__init__.py:305 -msgid "" -"Name of the monitor (from Monitor Center). Right-click to go there, then " -"copy & paste a monitor name here." -msgstr "" - -#: experiment/components/settings/__init__.py:308 -msgid "Monitor" -msgstr "" - -#: experiment/components/settings/__init__.py:311 -msgid "" -"Color of the screen (e.g. black, $[1.0,1.0,1.0], $variable. Right-click to " -"bring up a color-picker.)" -msgstr "" - -#: experiment/components/settings/__init__.py:336 -msgid "Units to use for window/stimulus coordinates (e.g. cm, pix, deg)" -msgstr "" - -#: experiment/components/settings/__init__.py:338 -msgid "Units" -msgstr "" - -#: experiment/components/settings/__init__.py:343 -msgid "" -"Should new stimuli be added or averaged with the stimuli that have been " -"drawn already" -msgstr "" - -#: experiment/components/settings/__init__.py:345 -msgid "Blend mode" -msgstr "" - -#: experiment/components/settings/__init__.py:348 -msgid "Measure frame rate?" -msgstr "" - -#: experiment/components/settings/__init__.py:350 -msgid "" -"Should we measure your frame rate at the start of the experiment? This is " -"highly recommended for precise timing." -msgstr "" - -#: experiment/components/settings/__init__.py:358 -msgid "" -"Frame rate to store instead of measuring at the start of the experiment. " -"Leave blank to store no frame rate, but be wary: This will lead to errors if" -" frame rate isn't supplied by other means." -msgstr "" - -#: experiment/components/settings/__init__.py:372 -msgid "Frame rate message" -msgstr "" - -#: experiment/components/settings/__init__.py:374 -msgid "Message to display while frame rate is measured. Leave blank for no message." -msgstr "" - -#: experiment/components/settings/__init__.py:396 -msgid "Force audio to stereo (2-channel) output" -msgstr "" - -#: experiment/components/settings/__init__.py:397 -msgid "Force stereo" -msgstr "" - -#: experiment/components/settings/__init__.py:401 -msgid "Which Python sound engine do you want to play your sounds?" -msgstr "" - -#: experiment/components/settings/__init__.py:402 -msgid "Audio library" -msgstr "" - -#: experiment/components/settings/__init__.py:422 -msgid "" -"Code to create your custom file name base. Don't give a file extension - " -"this will be added." -msgstr "" - -#: experiment/components/settings/__init__.py:424 -msgid "Data filename" -msgstr "" - -#: experiment/components/settings/__init__.py:428 -msgid "" -"What symbol should the data file use to separate columns? Auto will select a" -" delimiter automatically from the filename." -msgstr "" - -#: experiment/components/settings/__init__.py:429 -msgid "Data file delimiter" -msgstr "" - -#: experiment/components/settings/__init__.py:433 -msgid "Alphabetical" -msgstr "" - -#: experiment/components/settings/__init__.py:433 -#: experiment/components/settings/__init__.py:443 -msgid "Priority" -msgstr "" - -#: experiment/components/settings/__init__.py:433 -msgid "First added" -msgstr "" - -#: experiment/components/settings/__init__.py:435 -msgid "Sort columns by..." -msgstr "" - -#: experiment/components/settings/__init__.py:437 -msgid "" -"How should data file columns be sorted? Alphabetically, by priority, or " -"simply in the order they were added?" -msgstr "" - -#: experiment/components/settings/__init__.py:443 -msgid "Column" -msgstr "" - -#: experiment/components/settings/__init__.py:444 -msgid "Column priority" -msgstr "" - -#: experiment/components/settings/__init__.py:446 -msgid "" -"Assign priority values to certain columns. To use predefined values, you can" -" do $priority.HIGH, $priority.MEDIUM, etc." -msgstr "" - -#: experiment/components/settings/__init__.py:452 -msgid "" -"Save a detailed log (more detailed than the Excel/csv files) of the entire " -"experiment" -msgstr "" - -#: experiment/components/settings/__init__.py:454 -msgid "Save log file" -msgstr "" - -#: experiment/components/settings/__init__.py:457 -#: experiment/components/settings/__init__.py:462 -msgid "" -"Save data from loops in comma-separated-value (.csv) format for maximum " -"portability" -msgstr "" - -#: experiment/components/settings/__init__.py:459 -msgid "Save csv file (trial-by-trial)" -msgstr "" - -#: experiment/components/settings/__init__.py:464 -msgid "Save csv file (summaries)" -msgstr "" - -#: experiment/components/settings/__init__.py:467 -msgid "Save data from loops in Excel (.xlsx) format" -msgstr "" - -#: experiment/components/settings/__init__.py:468 -msgid "Save Excel file" -msgstr "" - -#: experiment/components/settings/__init__.py:471 -msgid "" -"Save data from loops in psydat format. This is useful for Python programmers" -" to generate analysis scripts." -msgstr "" - -#: experiment/components/settings/__init__.py:474 -msgid "Save psydat file" -msgstr "" - -#: experiment/components/settings/__init__.py:477 -msgid "" -"Save data from eyetrackers in hdf5 format. This is useful for viewing and " -"analyzing complex data in structures." -msgstr "" - -#: experiment/components/settings/__init__.py:479 -msgid "Save hdf5 file" -msgstr "" - -#: experiment/components/settings/__init__.py:484 -msgid "" -"How much output do you want in the log files? ('error' is fewest messages, " -"'debug' is most)" -msgstr "" - -#: experiment/components/settings/__init__.py:487 -msgid "File logging level" -msgstr "" - -#: experiment/components/settings/__init__.py:493 -msgid "" -"How much output do you want displayed in the console / app? ('error' is " -"fewest messages, 'debug' is most)" -msgstr "" - -#: experiment/components/settings/__init__.py:496 -msgid "Console / app logging level" -msgstr "" - -#: experiment/components/settings/__init__.py:502 -msgid "Clock format" -msgstr "" - -#: experiment/components/settings/__init__.py:504 -msgid "" -"Format to use for Routine start timestamps; either wall clock time (in ISO " -"8601 format) or seconds since experiment start (as a float)." -msgstr "" - -#: experiment/components/settings/__init__.py:516 -msgid "Place the HTML files will be saved locally " -msgstr "" - -#: experiment/components/settings/__init__.py:517 -msgid "Output path" -msgstr "" - -#: experiment/components/settings/__init__.py:520 -msgid "Any additional resources needed" -msgstr "" - -#: experiment/components/settings/__init__.py:521 -msgid "Additional resources" -msgstr "" - -#: experiment/components/settings/__init__.py:524 -msgid "Message to display to participants upon completing the experiment" -msgstr "" - -#: experiment/components/settings/__init__.py:525 -msgid "End message" -msgstr "" - -#: experiment/components/settings/__init__.py:528 -msgid "" -"Where should participants be redirected after the experiment on completion, " -"e.g.\n" -"https://pavlovia.org/surveys/XXXXXX-XXXX-XXXXXXX?tab=0" -msgstr "" - -#: experiment/components/settings/__init__.py:530 -msgid "Completed URL" -msgstr "" - -#: experiment/components/settings/__init__.py:533 -msgid "" -"Where participants are redirected if they do not complete the task, e.g.\n" -"https://pavlovia.org/surveys/XXXXXX-XXXX-XXXXXXX?tab=0" -msgstr "" - -#: experiment/components/settings/__init__.py:535 -msgid "Incomplete URL" -msgstr "" - -#: experiment/components/settings/__init__.py:539 -msgid "When to export experiment to the HTML folder." -msgstr "" - -#: experiment/components/settings/__init__.py:540 -msgid "Export HTML" -msgstr "" - -#: experiment/components/settings/__init__.py:601 -msgid "" -"What kind of eye tracker should PsychoPy use? Select 'MouseGaze' to use the " -"mouse to simulate eye movement (for debugging without a tracker connected)" -msgstr "" - -#: experiment/components/settings/__init__.py:603 -msgid "Eyetracker device" -msgstr "" - -#: experiment/components/settings/__init__.py:631 -msgid "IP Address of the computer running GazePoint Control." -msgstr "" - -#: experiment/components/settings/__init__.py:632 -msgid "GazePoint IP address" -msgstr "" - -#: experiment/components/settings/__init__.py:637 -msgid "Port of the GazePoint Control server. Usually 4242." -msgstr "" - -#: experiment/components/settings/__init__.py:638 -msgid "GazePoint port" -msgstr "" - -#: experiment/components/settings/__init__.py:645 -#: experiment/components/settings/__init__.py:706 -msgid "Eye tracker model." -msgstr "" - -#: experiment/components/settings/__init__.py:646 -#: experiment/components/settings/__init__.py:707 -msgid "Model name" -msgstr "" - -#: experiment/components/settings/__init__.py:650 -msgid "Set the EyeLink to run in mouse simulation mode." -msgstr "" - -#: experiment/components/settings/__init__.py:651 -msgid "Mouse simulation mode" -msgstr "" - -#: experiment/components/settings/__init__.py:656 -#: experiment/components/settings/__init__.py:721 -msgid "Eye tracker sampling rate." -msgstr "" - -#: experiment/components/settings/__init__.py:657 -#: experiment/components/settings/__init__.py:722 -#: experiment/components/settings/__init__.py:777 -msgid "Sampling rate" -msgstr "" - -#: experiment/components/settings/__init__.py:662 -msgid "Select with eye(s) to track." -msgstr "" - -#: experiment/components/settings/__init__.py:663 -msgid "Track eyes" -msgstr "" - -#: experiment/components/settings/__init__.py:668 -msgid "" -"Filter eye sample data live, as it is streamed to the driving device. This " -"may reduce the sampling speed." -msgstr "" - -#: experiment/components/settings/__init__.py:670 -msgid "Live sample filtering" -msgstr "" - -#: experiment/components/settings/__init__.py:675 -msgid "" -"Filter eye sample data when it is saved to the output file. This will not " -"affect the sampling speed." -msgstr "" - -#: experiment/components/settings/__init__.py:677 -msgid "Saved sample filtering" -msgstr "" - -#: experiment/components/settings/__init__.py:682 -msgid "Track Pupil-CR or Pupil only." -msgstr "" - -#: experiment/components/settings/__init__.py:683 -msgid "Pupil tracking mode" -msgstr "" - -#: experiment/components/settings/__init__.py:688 -msgid "Algorithm used to detect the pupil center." -msgstr "" - -#: experiment/components/settings/__init__.py:689 -msgid "Pupil center algorithm" -msgstr "" - -#: experiment/components/settings/__init__.py:694 -msgid "Type of pupil data to record." -msgstr "" - -#: experiment/components/settings/__init__.py:695 -msgid "Pupil data type" -msgstr "" - -#: experiment/components/settings/__init__.py:699 -msgid "IP Address of the EyeLink *Host* computer." -msgstr "" - -#: experiment/components/settings/__init__.py:700 -msgid "EyeLink IP address" -msgstr "" - -#: experiment/components/settings/__init__.py:711 -msgid "Eye tracker license file (optional)." -msgstr "" - -#: experiment/components/settings/__init__.py:712 -msgid "License file" -msgstr "" - -#: experiment/components/settings/__init__.py:716 -msgid "Eye tracker serial number (optional)." -msgstr "" - -#: experiment/components/settings/__init__.py:717 -msgid "Serial number" -msgstr "" - -#: experiment/components/settings/__init__.py:728 -msgid "Subscribe to pupil data only, does not require calibration or surface setup" -msgstr "" - -#: experiment/components/settings/__init__.py:729 -msgid "Pupillometry only" -msgstr "" - -#: experiment/components/settings/__init__.py:734 -msgid "Name of the Pupil Capture surface" -msgstr "" - -#: experiment/components/settings/__init__.py:735 -msgid "Surface name" -msgstr "" - -#: experiment/components/settings/__init__.py:739 -#: experiment/components/settings/__init__.py:740 -msgid "Gaze confidence threshold" -msgstr "" - -#: experiment/components/settings/__init__.py:744 -#: experiment/components/settings/__init__.py:745 -msgid "Pupil remote address" -msgstr "" - -#: experiment/components/settings/__init__.py:749 -#: experiment/components/settings/__init__.py:750 -msgid "Pupil remote port" -msgstr "" - -#: experiment/components/settings/__init__.py:754 -#: experiment/components/settings/__init__.py:755 -msgid "Pupil remote timeout (ms)" -msgstr "" - -#: experiment/components/settings/__init__.py:759 -#: experiment/components/settings/__init__.py:760 -msgid "Pupil capture recording location" -msgstr "" - -#: experiment/components/settings/__init__.py:764 -#: experiment/components/settings/__init__.py:765 -msgid "Companion address" -msgstr "" - -#: experiment/components/settings/__init__.py:769 -#: experiment/components/settings/__init__.py:770 -msgid "Companion port" -msgstr "" - -#: experiment/components/settings/__init__.py:776 -msgid "" -"Eyetracker sampling rate: 'default' or [Hz]. Defaults to tracking " -"mode '0'." -msgstr "" - -#: experiment/components/settings/__init__.py:784 -msgid "What Python package should PsychoPy use to get keyboard input?" -msgstr "" - -#: experiment/components/settings/__init__.py:785 -msgid "Keyboard backend" -msgstr "" - -#: experiment/components/settings/__init__.py:1313 -#, python-brace-format -msgid "Could not interpret value as dict: {}" -msgstr "" - -#: experiment/components/settings/__init__.py:1881 -msgid "Fullscreen settings ignored as running in pilot mode." -msgstr "" - -#: experiment/components/settings/eyetracking.py:79 -msgid "Mouse button to press for eye movement." -msgstr "" - -#: experiment/components/settings/eyetracking.py:80 -msgid "Move button" -msgstr "" - -#: experiment/components/settings/eyetracking.py:85 -msgid "Mouse button to press for a blink." -msgstr "" - -#: experiment/components/settings/eyetracking.py:86 -msgid "Blink button" -msgstr "" - -#: experiment/components/settings/eyetracking.py:90 -msgid "Visual degree threshold for Saccade event creation." -msgstr "" - -#: experiment/components/settings/eyetracking.py:91 -msgid "Saccade threshold" -msgstr "" - -#: experiment/components/slider/__init__.py:43 -msgid "Slider: A simple, flexible object for getting ratings" -msgstr "" - -#: experiment/components/slider/__init__.py:91 -msgid "Tick positions (numerical) on the scale, separated by commas" -msgstr "" - -#: experiment/components/slider/__init__.py:93 -msgid "Ticks" -msgstr "" - -#: experiment/components/slider/__init__.py:111 -msgid "Labels for the tick marks on the scale, separated by commas" -msgstr "" - -#: experiment/components/slider/__init__.py:113 -msgid "Labels" -msgstr "" - -#: experiment/components/slider/__init__.py:116 -msgid "" -"Value of the slider befre any response, leave blank to hide the marker until" -" clicked on" -msgstr "" - -#: experiment/components/slider/__init__.py:117 -msgid "Starting value" -msgstr "" - -#: experiment/components/slider/__init__.py:122 -msgid "" -"Specifies the minimum step size (0 for a continuous scale, 1 for integer " -"rating scale)" -msgstr "" - -#: experiment/components/slider/__init__.py:125 -msgid "Granularity" -msgstr "" - -#: experiment/components/slider/__init__.py:143 -msgid "" -"Should setting a rating (releasing the mouse) cause the end of the Routine " -"(e.g. trial)?" -msgstr "" - -#: experiment/components/slider/__init__.py:149 -msgid "Should participant be able to change the rating on the Slider?" -msgstr "" - -#: experiment/components/slider/__init__.py:150 -msgid "Read only" -msgstr "" - -#: experiment/components/slider/__init__.py:157 -msgid "" -"By default the labels will be on the bottom or left of the scale, but this " -"can be flipped to the other side." -msgstr "" - -#: experiment/components/slider/__init__.py:160 -msgid "Flip" -msgstr "" - -#: experiment/components/slider/__init__.py:163 -msgid "Label color" -msgstr "" - -#: experiment/components/slider/__init__.py:164 -msgid "Color of all labels on this slider (might be overridden by the style setting)" -msgstr "" - -#: experiment/components/slider/__init__.py:166 -msgid "Color of the marker on this slider (might be overridden by the style setting)" -msgstr "" - -#: experiment/components/slider/__init__.py:167 -msgid "Line color" -msgstr "" - -#: experiment/components/slider/__init__.py:168 -msgid "Color of all lines on this slider (might be overridden by the style setting)" -msgstr "" - -#: experiment/components/slider/__init__.py:174 -msgid "Font for the labels" -msgstr "" - -#: experiment/components/slider/__init__.py:181 -msgid "Letter height for text in labels" -msgstr "" - -#: experiment/components/slider/__init__.py:188 -msgid "Discrete styles to control the overall appearance of the slider." -msgstr "" - -#: experiment/components/slider/__init__.py:195 -msgid "Tweaks to change the appearance of the slider beyond its style." -msgstr "" - -#: experiment/components/slider/__init__.py:196 -msgid "Style tweaks" -msgstr "" - -#: experiment/components/slider/__init__.py:202 -msgid "store the rating" -msgstr "" - -#: experiment/components/slider/__init__.py:203 -msgid "Store rating" -msgstr "" - -#: experiment/components/slider/__init__.py:207 -msgid "Store the time taken to make the choice (in seconds)" -msgstr "" - -#: experiment/components/slider/__init__.py:209 -msgid "Store rating time" -msgstr "" - -#: experiment/components/slider/__init__.py:213 -msgid "store the history of (selection, time)" -msgstr "" - -#: experiment/components/slider/__init__.py:214 -msgid "Store history" -msgstr "" - -#: experiment/components/sound/__init__.py:24 -msgid "Sound: play recorded files or generated sounds" -msgstr "" - -#: experiment/components/sound/__init__.py:79 -msgid "" -"A sound can be a note name (e.g. A or Bf), a number to specify Hz (e.g. 440)" -" or a filename" -msgstr "" - -#: experiment/components/sound/__init__.py:85 -msgid "Sound" -msgstr "" - -#: experiment/components/sound/__init__.py:88 -msgid "" -"A reaction time to a sound stimulus should be based on when the screen " -"flipped" -msgstr "" - -#: experiment/components/sound/__init__.py:94 -msgid "Sync start with screen" -msgstr "" - -#: experiment/components/sound/__init__.py:106 -msgid "The volume (in range 0 to 1)" -msgstr "" - -#: experiment/components/sound/__init__.py:112 -msgid "" -"For tones we can apply a hamming window to prevent 'clicks' that are caused " -"by a sudden onset. This delays onset by roughly 1ms." -msgstr "" - -#: experiment/components/sound/__init__.py:114 -msgid "Hamming window" -msgstr "" - -#: experiment/components/sound/__init__.py:124 -msgid "Should the end of the sound cause the end of the Routine (e.g. trial)?" -msgstr "" - -#: experiment/components/sound/__init__.py:390 -msgid "Shared" -msgstr "" - -#: experiment/components/sound/__init__.py:391 -msgid "Shared low-latency (recommended)" -msgstr "" - -#: experiment/components/sound/__init__.py:393 -msgid "Exclusive aggressive low-latency (with fallback)" -msgstr "" - -#: experiment/components/sound/__init__.py:394 -msgid "Exclusive aggressive low-latency (no fallback)" -msgstr "" - -#: experiment/components/sound/__init__.py:396 -msgid "Latency/exclusivity mode" -msgstr "" - -#: experiment/components/sound/__init__.py:398 -msgid "" -"How should PsychoPy handle latency? Some options will result in other apps " -"being denied access to the speaker while your experiment is running." -msgstr "" - -#: experiment/components/sound/__init__.py:404 -msgid "Resample" -msgstr "" - -#: experiment/components/sound/__init__.py:406 -msgid "" -"If the sample rate of a clip doesn't match the sample rate of the speaker, " -"should we resample it to match?" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:14 -msgid "Voice Key: Get input from a microphone as simple true/false values" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:85 -msgid "" -"When should the response be registered? When the sound starts, or when it " -"stops?" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:92 -msgid "Last response" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:92 -msgid "First response" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:93 -msgid "All responses" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:118 -msgid "" -"What is the 'correct' response (True/False)? Might be helpful to add a " -"correctAns column and use $correctAns to compare to the response. " -msgstr "" - -#: experiment/components/soundsensor/__init__.py:289 -msgid "Threshold (0-1)" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:291 -msgid "" -"Threshold volume (0 for min value in dB range, 1 for max value) above which " -"to register a sound sensor response" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:298 -msgid "Decibel range" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:300 -msgid "" -"What kind of values (dB) would you expect to receive from this device? In " -"other words, how many dB does a threshold of 0 and of 255 correspond to?" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:307 -msgid "Sampling window (s)" -msgstr "" - -#: experiment/components/soundsensor/__init__.py:309 -msgid "" -"How many seconds to average volume readings across? Bigger windows are less " -"precise, but also less subject to random noise." -msgstr "" - -#: experiment/components/static/__init__.py:26 -msgid "Static: Static screen period (e.g. an ISI). Useful for pre-loading stimuli." -msgstr "" - -#: experiment/components/static/__init__.py:57 -msgid "Custom code" -msgstr "" - -#: experiment/components/static/__init__.py:59 -msgid "Custom code to be run during the static period (after updates)" -msgstr "" - -#: experiment/components/static/__init__.py:64 -msgid "Save data during" -msgstr "" - -#: experiment/components/static/__init__.py:66 -msgid "" -"While the frame loop is paused, should we take the opportunity to save data " -"now? This is only relevant locally, online data saving is either periodic or" -" on close." -msgstr "" - -#: experiment/components/text/__init__.py:20 -msgid "Text: present text stimuli" -msgstr "" - -#: experiment/components/text/__init__.py:24 -#: experiment/components/textbox/__init__.py:26 -msgid "" -"Any text\n" -"\n" -"including line breaks" -msgstr "" - -#: experiment/components/text/__init__.py:55 -#: experiment/components/textbox/__init__.py:72 -msgid "Text" -msgstr "" - -#: experiment/components/text/__init__.py:80 -msgid "How wide should the text get when it wraps? (in the specified units)" -msgstr "" - -#: experiment/components/text/__init__.py:82 -msgid "Wrap width" -msgstr "" - -#: experiment/components/text/__init__.py:86 -#: experiment/components/textbox/__init__.py:101 -#: experiment/components/textbox/__init__.py:107 -msgid "horiz = left-right reversed; vert = up-down reversed; $var = variable" -msgstr "" - -#: experiment/components/text/__init__.py:88 -msgid "Flip (mirror)" -msgstr "" - -#: experiment/components/text/__init__.py:92 -#: experiment/components/textbox/__init__.py:121 -msgid "Handle right-to-left (RTL) languages and Arabic reshaping" -msgstr "" - -#: experiment/components/text/__init__.py:93 -#: experiment/components/textbox/__init__.py:122 -msgid "Language style" -msgstr "" - -#: experiment/components/textbox/__init__.py:21 -msgid "Textbox: present text stimuli but cooler" -msgstr "" - -#: experiment/components/textbox/__init__.py:27 -msgid "Type here..." -msgstr "" - -#: experiment/components/textbox/__init__.py:85 -msgid "Placeholder text to show when there is no text contents." -msgstr "" - -#: experiment/components/textbox/__init__.py:86 -msgid "Placeholder text" -msgstr "" - -#: experiment/components/textbox/__init__.py:103 -msgid "Flip horizontal" -msgstr "" - -#: experiment/components/textbox/__init__.py:109 -msgid "Flip vertical" -msgstr "" - -#: experiment/components/textbox/__init__.py:136 -msgid "Defines the space between lines" -msgstr "" - -#: experiment/components/textbox/__init__.py:137 -msgid "Line spacing" -msgstr "" - -#: experiment/components/textbox/__init__.py:171 -msgid "How should text be laid out within the box?" -msgstr "" - -#: experiment/components/textbox/__init__.py:172 -msgid "Alignment" -msgstr "" - -#: experiment/components/textbox/__init__.py:180 -msgid "If the text is bigger than the textbox, how should it behave?" -msgstr "" - -#: experiment/components/textbox/__init__.py:181 -msgid "Overflow" -msgstr "" - -#: experiment/components/textbox/__init__.py:185 -msgid "If specified, adds a speech bubble tail going to that point on screen." -msgstr "" - -#: experiment/components/textbox/__init__.py:186 -msgid "Speech point [x,y]" -msgstr "" - -#: experiment/components/textbox/__init__.py:196 -msgid "Should textbox be editable?" -msgstr "" - -#: experiment/components/textbox/__init__.py:197 -msgid "Editable?" -msgstr "" - -#: experiment/components/textbox/__init__.py:202 -msgid "Automatically record all changes to this in the log file" -msgstr "" - -#: experiment/components/textbox/__init__.py:203 -msgid "Auto log" -msgstr "" - -#: experiment/components/unknown/__init__.py:20 -msgid "" -"Unknown: A component that is not known by the current installed version of " -"PsychoPy\n" -"(most likely from the future)" -msgstr "" - -#: experiment/components/unknownPlugin/__init__.py:20 -msgid "" -"Unknown: A component which comes from a plugin which you do not have " -"installed & activated." -msgstr "" - -#: experiment/components/variable/__init__.py:21 -msgid "Variable: create a new variable" -msgstr "" - -#: experiment/components/variable/__init__.py:38 -msgid "The start value. A variable can be set to any value." -msgstr "" - -#: experiment/components/variable/__init__.py:42 -msgid "Experiment start value" -msgstr "" - -#: experiment/components/variable/__init__.py:43 -msgid "Set the value for the beginning of each Routine." -msgstr "" - -#: experiment/components/variable/__init__.py:47 -msgid "Routine start value" -msgstr "" - -#: experiment/components/variable/__init__.py:48 -msgid "Set the value for the beginning of every screen refresh." -msgstr "" - -#: experiment/components/variable/__init__.py:52 -msgid "Frame start value" -msgstr "" - -#: experiment/components/variable/__init__.py:54 -msgid "Save the experiment start value in data file." -msgstr "" - -#: experiment/components/variable/__init__.py:59 -msgid "Save exp start value" -msgstr "" - -#: experiment/components/variable/__init__.py:60 -msgid "Save the experiment end value in data file." -msgstr "" - -#: experiment/components/variable/__init__.py:65 -msgid "Save exp end value" -msgstr "" - -#: experiment/components/variable/__init__.py:66 -msgid "Save the Routine start value in data file." -msgstr "" - -#: experiment/components/variable/__init__.py:71 -msgid "Save Routine start value" -msgstr "" - -#: experiment/components/variable/__init__.py:72 -msgid "Save the Routine end value in data file." -msgstr "" - -#: experiment/components/variable/__init__.py:77 -msgid "Save Routine end value" -msgstr "" - -#: experiment/components/variable/__init__.py:78 -msgid "Save choice of frame value in data file." -msgstr "" - -#: experiment/components/variable/__init__.py:84 -msgid "Save frame value" -msgstr "" - -#: experiment/routines/_base.py:52 -msgid "Name of this Routine (alphanumeric or _, no spaces)" -msgstr "" - -#: experiment/routines/_base.py:61 -msgid "When does the Routine end? (blank is endless)" -msgstr "" - -#: experiment/routines/_base.py:69 -msgid "Stop type..." -msgstr "" - -#: experiment/routines/_base.py:72 -msgid "Disable this Routine" -msgstr "" - -#: experiment/routines/audioValidator/__init__.py:23 -msgid "" -"Use a sound sensor to confirm that audio stimuli are presented when they " -"should be." -msgstr "" - -#: experiment/routines/audioValidator/__init__.py:60 -#: experiment/routines/visualValidator/__init__.py:71 -msgid "Threshold" -msgstr "" - -#: experiment/routines/audioValidator/__init__.py:62 -msgid "" -"Arbitrary volume threshold at which the sound sensor should register a " -"positive, units go from 0 (least volume) to 1 (most volume)." -msgstr "" - -#: experiment/routines/audioValidator/__init__.py:74 -msgid "Sound sensor channel" -msgstr "" - -#: experiment/routines/audioValidator/__init__.py:76 -msgid "" -"If relevant, a channel number attached to the sound sensor, to distinguish " -"it from other sound sensors on the same port. Leave blank to use the first " -"sound sensor which can detect the speaker." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:11 -msgid "Counter-balance" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:13 -msgid "" -"Counterbalance Routine: use the Shelf to choose a value taking into account " -"previous runs of this experiment." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:47 -#: experiment/routines/counterbalance/__init__.py:111 -msgid "Num. groups" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:47 -msgid "Conditions file (local only)" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:48 -msgid "Groups from..." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:50 -msgid "" -"Specify groups using an Excel file (for fine tuned control), specify as a " -"variable name, or specify a number of groups to create equally likely groups" -" with a uniform cap." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:59 -msgid "How many times to run slots down to depletion?" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:93 -msgid "" -"Name of a file specifying the parameters for each group (.csv, .xlsx, or " -".pkl). Browse to select a file. Right-click to preview file contents, or " -"create a new file." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:105 -msgid "" -"Name of a variable specifying the parameters for each group. Should be a " -"list of dicts, like the output of data.conditionsFromFile" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:113 -msgid "Number of groups to use." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:119 -msgid "Slots per group" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:121 -msgid "Max number of participants in each group for each repeat." -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:127 -msgid "End experiment on depletion" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:129 -msgid "" -"When all slots and repetitions are depleted, should the experiment end or " -"continue with .finished on this Routine as True?" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:141 -msgid "Save data" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:143 -msgid "Save chosen group and associated params this repeat to the data file?" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:149 -msgid "Save remaining cap" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:151 -msgid "Save the remaining cap for the chosen group this repeat to the data file?" -msgstr "" - -#: experiment/routines/counterbalance/__init__.py:209 -#, python-format -msgid "" -"Slots for Counterbalancer %(name)s have been fully depleted, ending " -"experiment." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:13 -msgid "Calibration routine for eyetrackers" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:49 -#: experiment/routines/eyetracker_validate/__init__.py:64 -msgid "" -"How many targets do you want to be presented for calibration? Points will be" -" displayed in a grid." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:50 -#: experiment/routines/eyetracker_validate/__init__.py:65 -msgid "Target layout" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:54 -#: experiment/routines/eyetracker_validate/__init__.py:84 -msgid "Should the order of target positions be randomised?" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:55 -#: experiment/routines/eyetracker_validate/__init__.py:85 -msgid "Randomise target positions" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:58 -msgid "Text foreground color" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:78 -msgid "Use custom?" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:80 -msgid "" -"Check this box to use a custom stimulus as a calibration target, rather than" -" creating one from params." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:88 -msgid "Custom target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:90 -msgid "Give the name of any visual Component to use it as a calibration target." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:103 -#: experiment/routines/eyetracker_validate/__init__.py:113 -msgid "Fill color of the inner part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:104 -#: experiment/routines/eyetracker_validate/__init__.py:114 -msgid "Inner fill color" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:108 -#: experiment/routines/eyetracker_validate/__init__.py:118 -msgid "Border color of the inner part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:109 -#: experiment/routines/eyetracker_validate/__init__.py:119 -msgid "Inner border color" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:113 -#: experiment/routines/eyetracker_validate/__init__.py:123 -msgid "Fill color of the outer part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:114 -#: experiment/routines/eyetracker_validate/__init__.py:124 -msgid "Outer fill color" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:118 -#: experiment/routines/eyetracker_validate/__init__.py:128 -msgid "Border color of the outer part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:119 -#: experiment/routines/eyetracker_validate/__init__.py:129 -msgid "Outer border color" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:130 -#: experiment/routines/eyetracker_validate/__init__.py:140 -msgid "Width of the line around the outer part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:131 -#: experiment/routines/eyetracker_validate/__init__.py:141 -msgid "Outer border width" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:135 -#: experiment/routines/eyetracker_validate/__init__.py:146 -msgid "Width of the line around the inner part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:136 -#: experiment/routines/eyetracker_validate/__init__.py:147 -msgid "Inner border width" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:140 -#: experiment/routines/eyetracker_validate/__init__.py:151 -msgid "Size (radius) of the outer part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:141 -#: experiment/routines/eyetracker_validate/__init__.py:152 -msgid "Outer radius" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:145 -#: experiment/routines/eyetracker_validate/__init__.py:156 -msgid "Size (radius) of the inner part of the target" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:146 -#: experiment/routines/eyetracker_validate/__init__.py:157 -msgid "Inner radius" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:189 -#: experiment/routines/eyetracker_validate/__init__.py:179 -msgid "" -"Should the target move to the next position after a keypress or after an " -"amount of time?" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:191 -#: experiment/routines/eyetracker_validate/__init__.py:181 -msgid "Progress mode" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:205 -#: experiment/routines/eyetracker_validate/__init__.py:195 -msgid "Time limit (s) after which progress to next position" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:206 -#: experiment/routines/eyetracker_validate/__init__.py:196 -msgid "Target duration" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:220 -#: experiment/routines/eyetracker_validate/__init__.py:210 -msgid "Duration of the target expand/contract animation" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:221 -#: experiment/routines/eyetracker_validate/__init__.py:211 -msgid "Expand / contract duration" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:225 -#: experiment/routines/eyetracker_validate/__init__.py:215 -msgid "How many times bigger than its size the target grows" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:226 -#: experiment/routines/eyetracker_validate/__init__.py:216 -msgid "Expand scale" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:231 -#: experiment/routines/eyetracker_validate/__init__.py:220 -msgid "Enable / disable animations as target stim changes position" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:232 -#: experiment/routines/eyetracker_validate/__init__.py:221 -msgid "Animate position changes" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:246 -#: experiment/routines/eyetracker_validate/__init__.py:235 -msgid "Duration of the animation during position changes." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:247 -#: experiment/routines/eyetracker_validate/__init__.py:236 -msgid "Movement duration" -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:261 -#: experiment/routines/eyetracker_validate/__init__.py:250 -msgid "Duration of the delay between positions." -msgstr "" - -#: experiment/routines/eyetracker_calibrate/__init__.py:262 -#: experiment/routines/eyetracker_validate/__init__.py:251 -msgid "Target delay" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:17 -msgid "Validation routine for eyetrackers" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:79 -msgid "List of positions (x, y) at which the target can appear" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:80 -msgid "Target positions" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:89 -msgid "Fill color of the gaze cursor" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:90 -msgid "Gaze cursor color" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:94 -msgid "Color of text used in validation procedure." -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:262 -msgid "Save results as an image" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:263 -msgid "Save as image" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:268 -msgid "Show a screen with results after completion?" -msgstr "" - -#: experiment/routines/eyetracker_validate/__init__.py:269 -msgid "Show results screen" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:13 -msgid "Run a SurveyJS survey in Pavlovia" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:42 -#: experiment/routines/pavlovia_survey/__init__.py:73 -msgid "Survey id" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:44 -msgid "" -"Linking to a survey ID from Pavlovia Surveys means that the content will " -"automatically update if that survey changes (better for dynamic use)" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:46 -msgid "How do I get my survey ID?" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:50 -msgid "Survey Model File" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:52 -msgid "" -"Inserting a JSON file (exported from Pavlovia Surveys) means that the survey" -" is embedded within this project and will not change unless you import it " -"again (better for archiving)" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:54 -msgid "How do I get my survey model file?" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:58 -msgid "Survey type" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:71 -msgid "" -"The ID for your survey on Pavlovia. Tip: Right click to open the survey in " -"your browser!" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:86 -msgid "File path of the JSON file used to construct the survey" -msgstr "" - -#: experiment/routines/pavlovia_survey/__init__.py:88 -msgid "Survey JSON" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:24 -msgid "" -"Use a light sensor to confirm that visual stimuli are presented when they " -"should be." -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:64 -msgid "Find best threshold?" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:66 -msgid "" -"Run a brief Routine to find the best threshold for the light sensor at " -"experiment start?" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:73 -msgid "" -"Light threshold at which the light sensor should register a positive, units " -"go from 0 (least sensitive) to 1 (most sensitive)." -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:86 -msgid "Find sensor?" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:88 -msgid "" -"Run a brief Routine to find the size and position of the light sensor at " -"experiment start?" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:96 -msgid "Position of the light sensor on the window." -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:102 -msgid "Size [x,y]" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:104 -msgid "Size of the area covered by the light sensor on the window." -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:112 -msgid "Spatial units in which the light sensor size and position are specified." -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:146 -msgid "Light sensor channel" -msgstr "" - -#: experiment/routines/visualValidator/__init__.py:148 -msgid "" -"If relevant, a channel number attached to the light sensor, to distinguish " -"it from other light sensors on the same port. Leave blank to use the first " -"light sensor which can detect the Window." -msgstr "" - -#: gui/qtgui.py:159 -msgid "PsychoPy Dialog" -msgstr "" - -#: gui/qtgui.py:219 -msgid "Fields marked with an asterisk (*) are required." -msgstr "" - -#: gui/qtgui.py:390 -msgid "Configuration fields..." -msgstr "" - -#: gui/qtgui.py:653 gui/wxgui.py:331 -msgid "Select file to save" -msgstr "" - -#: gui/qtgui.py:698 -msgid "Select file to open" -msgstr "" - -#: gui/qtgui.py:748 -msgid "Information" -msgstr "" - -#: gui/qtgui.py:750 gui/qtgui.py:756 gui/qtgui.py:762 gui/qtgui.py:768 -msgid "No details provided. ('prompt' value not set)." -msgstr "" - -#: gui/qtgui.py:760 -msgid "Critical" -msgstr "" - -#: gui/qtgui.py:766 -msgid "About Experiment" -msgstr "" - -#: gui/wxgui.py:67 -msgid "PsychoPy dialogue" -msgstr "" - -#: gui/wxgui.py:382 -msgid "Select file(s) to open" -msgstr "" - -#: hardware/button.py:211 -#, python-brace-format -msgid "" -"Could not find device named '{}', make sure it has been set up in " -"DeviceManager." -msgstr "" - -#: hardware/microphone.py:164 -msgid "" -"Could not choose default recording device as no recording devices are " -"connected." -msgstr "" - -#: hardware/microphone.py:392 -#, python-brace-format -msgid "Could not find any audio recording device with index {index}" -msgstr "" - -#: hardware/serialdevice.py:183 -#, python-brace-format -msgid "" -"Failed to connect to device on {port}, this device is likely to have been " -"disconnected, or the port is in use by another application." -msgstr "" - -#: hardware/soundsensor.py:437 -#, python-brace-format -msgid "" -"Could not find device named '{device}', make sure it has been set up in " -"DeviceManager." -msgstr "" - -#: hardware/speaker.py:97 -#, python-brace-format -msgid "" -"No default speaker specified in Preferences / Hardware, using first speaker " -"found: {}" -msgstr "" - -#: hardware/speaker.py:164 -msgid "No audio devices found!" -msgstr "" - -#: hardware/speaker.py:188 -#, python-brace-format -msgid "No speaker device found with {key} '{name}'" -msgstr "" - -#: monitors/MonitorCenter.py:166 monitors/MonitorCenter.py:304 -msgid "Monitor Info" -msgstr "" - -#: monitors/MonitorCenter.py:175 monitors/MonitorCenter.py:370 -msgid "Calibration" -msgstr "" - -#: monitors/MonitorCenter.py:218 -msgid "Save\tCtrl+S" -msgstr "" - -#: monitors/MonitorCenter.py:219 -msgid "Save the current monitor" -msgstr "" - -#: monitors/MonitorCenter.py:222 -msgid "Close Monitor Center (but not other PsychoPy windows)" -msgstr "" - -#: monitors/MonitorCenter.py:224 -msgid "Close Monitor Center\tCtrl+W" -msgstr "" - -#: monitors/MonitorCenter.py:232 -msgid "Copy the current monitor's name to clipboard" -msgstr "" - -#: monitors/MonitorCenter.py:233 -msgid "Copy\tCtrl+C" -msgstr "" - -#: monitors/MonitorCenter.py:241 -msgid "Choose Monitor" -msgstr "" - -#: monitors/MonitorCenter.py:257 -msgid "Create a new monitor" -msgstr "" - -#: monitors/MonitorCenter.py:262 -msgid "Save all calibrations for this monitor" -msgstr "" - -#: monitors/MonitorCenter.py:269 -msgid "Delete this monitor entirely" -msgstr "" - -#: monitors/MonitorCenter.py:280 -msgid "Copy..." -msgstr "" - -#: monitors/MonitorCenter.py:283 -msgid "Creates a new calibration entry for this monitor" -msgstr "" - -#: monitors/MonitorCenter.py:290 -msgid "Remove this calibration entry (finalized when monitor is saved)" -msgstr "" - -#: monitors/MonitorCenter.py:310 -msgid "Screen Distance (cm):" -msgstr "" - -#: monitors/MonitorCenter.py:317 -msgid "Screen Width (cm):" -msgstr "" - -#: monitors/MonitorCenter.py:323 -msgid "Size (pixels; Horiz,Vert):" -msgstr "" - -#: monitors/MonitorCenter.py:335 -msgid "Calibration Date:" -msgstr "" - -#: monitors/MonitorCenter.py:342 -msgid "Notes:" -msgstr "" - -#: monitors/MonitorCenter.py:350 monitors/MonitorCenter.py:1295 -msgid "Use Bits++" -msgstr "" - -#: monitors/MonitorCenter.py:377 -msgid "Gamma Calibration..." -msgstr "" - -#: monitors/MonitorCenter.py:381 -msgid "Gamma Test..." -msgstr "" - -#: monitors/MonitorCenter.py:388 -msgid "Chromatic Calibration..." -msgstr "" - -#: monitors/MonitorCenter.py:393 -msgid "Plot gamma" -msgstr "" - -#: monitors/MonitorCenter.py:397 -msgid "Plot spectra" -msgstr "" - -#: monitors/MonitorCenter.py:408 -msgid "Linearization" -msgstr "" - -#: monitors/MonitorCenter.py:510 -msgid "Save changes to monitor settings before quitting?" -msgstr "" - -#: monitors/MonitorCenter.py:531 -msgid "Save changes to monitor?" -msgstr "" - -#: monitors/MonitorCenter.py:625 -#, python-format -msgid "Name of this calibration (for monitor \"%(name)s\") will be:)" -msgstr "" - -#: monitors/MonitorCenter.py:629 monitors/MonitorCenter.py:644 -msgid "Input text" -msgstr "" - -#: monitors/MonitorCenter.py:643 -msgid "New monitor name:" -msgstr "" - -#: monitors/MonitorCenter.py:658 -#, python-format -msgid "Are you sure you want to delete all details for %s? (cannot be undone)" -msgstr "" - -#: monitors/MonitorCenter.py:682 -msgid "Are you sure you want to delete this calibration? (cannot be undone)" -msgstr "" - -#: monitors/MonitorCenter.py:944 -msgid "Scanning ports..." -msgstr "" - -#: monitors/MonitorCenter.py:953 -#, python-format -msgid "%(photomType)s found on %(photomPort)s" -msgstr "" - -#: monitors/MonitorCenter.py:958 -msgid "No photometers found" -msgstr "" - -#: monitors/MonitorCenter.py:967 monitors/MonitorCenter.py:972 -msgid "Dark calibration of ColorCAL" -msgstr "" - -#: monitors/MonitorCenter.py:968 -msgid "" -"Your ColorCAL needs to be calibrated first. Please block all light from " -"getting into the lens and press OK." -msgstr "" - -#: monitors/MonitorCenter.py:985 -msgid "Try again. Cover the lens fully and press OK" -msgstr "" - -#: monitors/MonitorCenter.py:989 -#, python-format -msgid "%(monName)s %(calibName)s Gamma Functions" -msgstr "" - -#: monitors/MonitorCenter.py:1058 -#, python-format -msgid "%(monName)s %(calibName)s Spectra" -msgstr "" - -#: monitors/MonitorCenter.py:1088 -msgid "Calibrate gamma" -msgstr "" - -#: monitors/MonitorCenter.py:1106 -msgid "Screen to run the calibration on" -msgstr "" - -#: monitors/MonitorCenter.py:1130 -msgid "Photometer" -msgstr "" - -#: monitors/MonitorCenter.py:1132 -msgid "Photometer device, from the device manager, to use for this calibration" -msgstr "" - -#: monitors/MonitorCenter.py:1137 -msgid "Patch size" -msgstr "" - -#: monitors/MonitorCenter.py:1139 -msgid "How much of the screen (0-1) the calibration patch should occupy" -msgstr "" - -#: monitors/MonitorCenter.py:1144 -msgid "Calibration points" -msgstr "" - -#: monitors/MonitorCenter.py:1146 -msgid "How many calibration points to use" -msgstr "" - -#: monitors/MonitorCenter.py:1205 -msgid "Recorded luminance values" -msgstr "" - -#: monitors/MonitorCenter.py:1232 -msgid "Luminance Values" -msgstr "" - -#: monitors/MonitorCenter.py:1285 -msgid "Gamma Calibration" -msgstr "" - -#: monitors/MonitorCenter.py:1298 -msgid "Number of calibration points:" -msgstr "" - -#: monitors/MonitorCenter.py:1302 -msgid "Screen number (primary is 1)" -msgstr "" - -#: monitors/MonitorCenter.py:1306 -msgid "Patch size (fraction of screen):" -msgstr "" - -#: monitors/MonitorCenter.py:1340 -msgid "PsychoPy Monitor Center" -msgstr "" - -#: preferences/hints.py:12 -msgid "the default units for windows and visual stimuli" -msgstr "" - -#: preferences/hints.py:15 -msgid "full screen is best for accurate timing" -msgstr "" - -#: preferences/hints.py:18 -msgid "enable subjects to use the mouse and GUIs during experiments" -msgstr "" - -#: preferences/hints.py:21 -msgid "'version' is for internal usage, not for the user" -msgstr "" - -#: preferences/hints.py:24 -msgid "Add paths here to your custom Python modules" -msgstr "" - -#: preferences/hints.py:27 -msgid "path to flac (lossless audio compression) on this operating system" -msgstr "" - -#: preferences/hints.py:30 -msgid "Shutdown keys, following the pyglet naming scheme." -msgstr "" - -#: preferences/hints.py:33 -msgid "Modifier keys for shutdown keys" -msgstr "" - -#: preferences/hints.py:36 -msgid "What to do if gamma-correction not possible" -msgstr "" - -#: preferences/hints.py:39 -msgid "Add plugin names here to load when a PsychoPy session starts." -msgstr "" - -#: preferences/hints.py:42 -msgid "" -"Google Cloud Platform key, required for the audio transcription using Google" -" Speech Recognition. Specified as a path to a JSON file containing the key " -"data." -msgstr "" - -#: preferences/hints.py:45 -msgid "LEGACY: which system to use as a backend for drawing" -msgstr "" - -#: preferences/hints.py:48 -msgid "display tips when starting PsychoPy" -msgstr "" - -#: preferences/hints.py:51 -msgid "what windows to display when PsychoPy starts" -msgstr "" - -#: preferences/hints.py:54 -msgid "reset preferences to defaults on next restart of PsychoPy" -msgstr "" - -#: preferences/hints.py:57 -msgid "save any unsaved preferences before closing the window" -msgstr "" - -#: preferences/hints.py:60 -msgid "enable features for debugging PsychoPy itself, including unit-tests" -msgstr "" - -#: preferences/hints.py:63 -msgid "" -"language to use in menus etc; not all translations are available. Select a " -"value, then restart the app." -msgstr "" - -#: preferences/hints.py:67 -msgid "Show an error dialog when PsychoPy encounters an unhandled internal error." -msgstr "" - -#: preferences/hints.py:70 -msgid "Theme" -msgstr "" - -#: preferences/hints.py:73 -msgid "Show / hide splash screen" -msgstr "" - -#: preferences/hints.py:77 -msgid "open Coder files as read-only (allows running without accidental changes)" -msgstr "" - -#: preferences/hints.py:80 -msgid "a list of font names; the first one found on the system will be used" -msgstr "" - -#: preferences/hints.py:83 -msgid "Font size (in pts) takes an integer between 6 and 24" -msgstr "" - -#: preferences/hints.py:86 -msgid "Spacing between lines" -msgstr "" - -#: preferences/hints.py:89 -msgid "Long line edge guide, specify zero to disable" -msgstr "" - -#: preferences/hints.py:92 -msgid "Set the source assistant panel to be visible by default" -msgstr "" - -#: preferences/hints.py:95 -msgid "Set the output/shell to be visible by default" -msgstr "" - -#: preferences/hints.py:99 -msgid "Show code completion suggestion and calltips automatically when typing." -msgstr "" - -#: preferences/hints.py:102 -msgid "reload previously opened files after start" -msgstr "" - -#: preferences/hints.py:105 -msgid "for coder shell window, which shell to use" -msgstr "" - -#: preferences/hints.py:108 -msgid "whether to automatically reload a previously open experiment" -msgstr "" - -#: preferences/hints.py:111 -msgid "Default to when writing code components" -msgstr "" - -#: preferences/hints.py:115 -msgid "if False will create scripts with an 'easier' but more cluttered namespace" -msgstr "" - -#: preferences/hints.py:118 -msgid "folder names for custom components; expects a comma-separated list" -msgstr "" - -#: preferences/hints.py:121 -msgid "Only show components which work in..." -msgstr "" - -#: preferences/hints.py:124 -msgid "a list of components to hide (eg, because you never use them)" -msgstr "" - -#: preferences/hints.py:127 -msgid "Abbreviate long component names to maximise timeline space?" -msgstr "" - -#: preferences/hints.py:130 -msgid "where the Builder demos are located on this computer (after unpacking)" -msgstr "" - -#: preferences/hints.py:134 -msgid "" -"name of the folder where subject data should be saved (relative to the " -"script)" -msgstr "" - -#: preferences/hints.py:137 -msgid "" -"Panels arrangement: Should Flow be on the top or bottom, and should " -"Components be on the left or right?" -msgstr "" - -#: preferences/hints.py:140 -msgid "Display text in a floating window that describes the experiment" -msgstr "" - -#: preferences/hints.py:143 -msgid "Upper limit on how many components can be in favorites" -msgstr "" - -#: preferences/hints.py:146 -msgid "Ask for confirmation when closing a routine tab." -msgstr "" - -#: preferences/hints.py:149 -msgid "LEGACY: choice of audio library" -msgstr "" - -#: preferences/hints.py:152 -msgid "exclude non-WASAPI audio devices" -msgstr "" - -#: preferences/hints.py:155 -msgid "audio driver to use" -msgstr "" - -#: preferences/hints.py:158 -msgid "audio device to use (if audioLib allows control)" -msgstr "" - -#: preferences/hints.py:161 -msgid "a list of parallel ports" -msgstr "" - -#: preferences/hints.py:164 -msgid "The name of the Qmix pump configuration to use" -msgstr "" - -#: preferences/hints.py:167 -msgid "Prevent the experiment from being fullscreen when piloting" -msgstr "" - -#: preferences/hints.py:170 -msgid "Always show the mouse when piloting" -msgstr "" - -#: preferences/hints.py:173 -msgid "What window size to use when forced to windowed mode" -msgstr "" - -#: preferences/hints.py:176 -msgid "" -"How much output to include in the log file when piloting ('error' is fewest " -"messages, 'debug' is most)" -msgstr "" - -#: preferences/hints.py:179 -msgid "" -"How much output to display in the console / app when piloting ('error' is " -"fewest messages, 'debug' is most)." -msgstr "" - -#: preferences/hints.py:182 -msgid "Show an orange border around the window when in piloting mode" -msgstr "" - -#: preferences/hints.py:185 -msgid "Prevent experiment from enabling rush mode when piloting" -msgstr "" - -#: preferences/hints.py:188 -msgid "Replace default participant ID with \"pilot\" when piloting" -msgstr "" - -#: preferences/hints.py:191 -msgid "the http proxy for usage stats and auto-updating; format is host: port" -msgstr "" - -#: preferences/hints.py:195 -msgid "" -"override the above proxy settings with values found in the environment (if " -"possible)" -msgstr "" - -#: preferences/hints.py:198 -msgid "" -"allow PsychoPy to send anonymous usage stats; please allow if possible, it " -"helps PsychoPy's development" -msgstr "" - -#: preferences/hints.py:201 -msgid "allow PsychoPy to check for new features and bug fixes" -msgstr "" - -#: preferences/hints.py:204 -msgid "max time to wait for a connection response" -msgstr "" - -#: preferences/hints.py:207 -msgid "open an existing file" -msgstr "" - -#: preferences/hints.py:210 -msgid "start a new experiment or script" -msgstr "" - -#: preferences/hints.py:213 -msgid "save a Builder or Coder file" -msgstr "" - -#: preferences/hints.py:216 -msgid "save a Builder or Coder file under a new name" -msgstr "" - -#: preferences/hints.py:219 -msgid "reveal the folder containing the current Builder file" -msgstr "" - -#: preferences/hints.py:222 -msgid "Coder: print the file" -msgstr "" - -#: preferences/hints.py:225 -msgid "close the Builder or Coder window" -msgstr "" - -#: preferences/hints.py:228 -msgid "end the application (PsychoPy)" -msgstr "" - -#: preferences/hints.py:231 -msgid "open the preferences dialog" -msgstr "" - -#: preferences/hints.py:234 -msgid "export Builder experiment to HTML" -msgstr "" - -#: preferences/hints.py:237 -msgid "Coder: cut" -msgstr "" - -#: preferences/hints.py:240 -msgid "Coder: copy" -msgstr "" - -#: preferences/hints.py:243 -msgid "Coder: paste" -msgstr "" - -#: preferences/hints.py:246 -msgid "Coder: duplicate" -msgstr "" - -#: preferences/hints.py:249 -msgid "Coder: indent code by one level (4 spaces)" -msgstr "" - -#: preferences/hints.py:252 -msgid "Coder: reduce indentation by one level (4 spaces)" -msgstr "" - -#: preferences/hints.py:255 -msgid "Coder: indent to fit python syntax" -msgstr "" - -#: preferences/hints.py:258 -msgid "Coder: find" -msgstr "" - -#: preferences/hints.py:261 -msgid "Coder: find again" -msgstr "" - -#: preferences/hints.py:264 -msgid "Coder: undo" -msgstr "" - -#: preferences/hints.py:267 -msgid "Coder: redo" -msgstr "" - -#: preferences/hints.py:270 -msgid "Coder: add a # to the start of the line(s)" -msgstr "" - -#: preferences/hints.py:273 -msgid "Coder: remove # from start of line(s)" -msgstr "" - -#: preferences/hints.py:276 -msgid "Coder: add or remove # from start of line(s)" -msgstr "" - -#: preferences/hints.py:279 -msgid "Coder: fold this block of code" -msgstr "" - -#: preferences/hints.py:282 -msgid "Coder: increase font size this block of code" -msgstr "" - -#: preferences/hints.py:285 -msgid "Coder: decrease font size this block of code" -msgstr "" - -#: preferences/hints.py:288 -msgid "Coder: check for basic syntax errors" -msgstr "" - -#: preferences/hints.py:292 -msgid "" -"convert a Builder .psyexp script into a python script and open it in the " -"Coder" -msgstr "" - -#: preferences/hints.py:295 -msgid "launch a script, Builder or Coder, or run unit-tests" -msgstr "" - -#: preferences/hints.py:298 -msgid "attempt to interrupt and halt a running script" -msgstr "" - -#: preferences/hints.py:301 -msgid "Coder: show / hide white-space dots" -msgstr "" - -#: preferences/hints.py:304 -msgid "Coder: show / hide end of line characters" -msgstr "" - -#: preferences/hints.py:307 -msgid "Coder: show / hide indentation level lines" -msgstr "" - -#: preferences/hints.py:310 -msgid "Builder: edit experiment settings" -msgstr "" - -#: preferences/hints.py:313 -msgid "Builder: create a new routine" -msgstr "" - -#: preferences/hints.py:316 -msgid "Builder: copy an existing routine" -msgstr "" - -#: preferences/hints.py:319 -msgid "Builder: paste the copied routine" -msgstr "" - -#: preferences/hints.py:322 -msgid "Builder: paste the copied component" -msgstr "" - -#: preferences/hints.py:325 -msgid "Builder: find" -msgstr "" - -#: preferences/hints.py:328 -msgid "Coder: show / hide the output panel" -msgstr "" - -#: preferences/hints.py:331 -msgid "Builder: rename an existing routine" -msgstr "" - -#: preferences/hints.py:334 -msgid "switch between windows" -msgstr "" - -#: preferences/hints.py:337 -msgid "increase display size in Flow" -msgstr "" - -#: preferences/hints.py:340 -msgid "decrease display size in Flow" -msgstr "" - -#: preferences/hints.py:343 -msgid "increase display size of Routines" -msgstr "" - -#: preferences/hints.py:346 -msgid "decrease display size of Routines" -msgstr "" - -#: preferences/hints.py:349 -msgid "show or hide the readme (info) for this experiment if possible" -msgstr "" - -#: preferences/hints.py:352 -msgid "Projects: Log in to pavlovia" -msgstr "" - -#: preferences/hints.py:355 -msgid "Projects: Log in to OSF" -msgstr "" - -#: preferences/hints.py:358 -msgid "Projects: Sync project" -msgstr "" - -#: preferences/hints.py:361 -msgid "Projects: Find projects" -msgstr "" - -#: preferences/hints.py:364 -msgid "Projects: Open project" -msgstr "" - -#: preferences/hints.py:367 -msgid "Projects: Create new project" -msgstr "" - -#: projects/pavlovia.py:38 -#, python-brace-format -msgid "" -"Failed to {} as Pavlovia works via git, which is not installed on this " -"machine. You can install git from here: https://git-scm.com/downloads" -msgstr "" - -#: projects/pavlovia.py:202 -#, python-brace-format -msgid "" -"Could not retrieve user info for user {}, server returned:\n" -"{}" -msgstr "" - -#: projects/pavlovia.py:336 -#, python-brace-format -msgid "" -"PavloviaSession.createProject was given a namespace ({namespace}) that " -"couldn't be found on gitlab." -msgstr "" - -#: projects/pavlovia.py:361 -#, python-brace-format -msgid "Project `{namespace}/{name}` already exists, please choose another name." -msgstr "" - -#: projects/pavlovia.py:524 -msgid "Most stars" -msgstr "" - -#: projects/pavlovia.py:524 -msgid "Least stars" -msgstr "" - -#: projects/pavlovia.py:525 -msgid "Most forks" -msgstr "" - -#: projects/pavlovia.py:525 -msgid "Least forks" -msgstr "" - -#: projects/pavlovia.py:526 -msgid "Last edited" -msgstr "" - -#: projects/pavlovia.py:526 -msgid "Longest since edited" -msgstr "" - -#: projects/pavlovia.py:527 -msgid "Last created" -msgstr "" - -#: projects/pavlovia.py:527 -msgid "First created" -msgstr "" - -#: projects/pavlovia.py:528 -msgid "Name (Z-A)" -msgstr "" - -#: projects/pavlovia.py:528 -msgid "Name (A-Z)" -msgstr "" - -#: projects/pavlovia.py:529 -msgid "Author (Z-A)" -msgstr "" - -#: projects/pavlovia.py:529 -msgid "Author (A-Z)" -msgstr "" - -#: projects/pavlovia.py:895 -msgid "" -"Can't sync project without a local root. Please specify a local root then " -"try again." -msgstr "" - -#: projects/pavlovia.py:939 -#, python-brace-format -msgid "" -"Sync failed - could not find project with id {}\n" -"\n" -msgstr "" - -#: projects/pavlovia.py:1123 -#, python-brace-format -msgid "Folder '{localRoot}' is not empty, use '{localRoot}/{projectName}' instead?" -msgstr "" - -#: projects/pavlovia.py:1156 -msgid "Push initial project files" -msgstr "" - -#: projects/pavlovia.py:1337 -msgid "Avatar is too big, should be at most 200 KB." -msgstr "" - -#: projects/pavlovia.py:1411 -msgid "get git root" -msgstr "" - -#: projects/pavlovia.py:1444 -msgid "get project name" -msgstr "" - -#: projects/pavlovia.py:1478 -msgid "get Pavlovia project" -msgstr "" - -#: projects/pavlovia.py:1574 -#, python-brace-format -msgid "" -"We found a repository pointing to {} but no user is logged in for us to " -"check it" -msgstr "" - -#: tools/pkgtools.py:278 -#, python-brace-format -msgid "" -"Could not install package {} asynchronously as psychopy.app.jobs is not " -"found. Defaulting to synchronous install." -msgstr "" - -#: tools/pkgtools.py:432 tools/pkgtools.py:444 -#, python-brace-format -msgid "Could not remove {absPath}, reason: {err}" -msgstr "" - -#: tools/pkgtools.py:622 -#, python-brace-format -msgid "" -"Could not get info for package {}. Reason:\n" -"\n" -"{}" -msgstr "" - -#: tools/versionchooser.py:172 -#, python-brace-format -msgid "{} to {}" -msgstr "" - -#: tools/versionchooser.py:248 -#, python-brace-format -msgid "Please request a version before importing any PsychoPy modules. (Found: {})" -msgstr "" - -#: tools/versionchooser.py:260 -#, python-brace-format -msgid "Unknown version `{}`" -msgstr "" - -#: tools/versionchooser.py:269 -msgid "Please install git; needed by useVersion()" -msgstr "" - -#: tools/versionchooser.py:310 -#, python-brace-format -msgid "" -"Requested PsychoPy version {requested} does not support installed Python " -"version {py}. The {mode} version of PsychoPy to support {py} was version " -"{key}.\n" -"\n" -"Try either choosing a different version of PsychoPy or installing a " -"different version of Python - some standalone PsychoPy releases include " -"installers for multiple versions." -msgstr "" - -#: tools/versionchooser.py:331 -#, python-brace-format -msgid "Required minimal version `{}` not met ({})." -msgstr "" - -#: tools/versionchooser.py:367 -#, python-brace-format -msgid "'{}' is not a valid PsychoPy version." -msgstr "" - -#: tools/versionchooser.py:526 -#, python-brace-format -msgid "Couldn't find version {} locally. Trying github..." -msgstr "" - -#: tools/versionchooser.py:540 -#, python-brace-format -msgid "{} is not currently available." -msgstr "" - -#: tools/versionchooser.py:564 -msgid "Downloading the PsychoPy Library from Github (may take a while)" -msgstr "" - -#: tools/wizard.py:63 -#, python-format -msgid "could not assess available physical RAM; total %s" -msgstr "" - -#: tools/wizard.py:68 -#, python-format -msgid "physical RAM available for configuration test (of %.1fG total)" -msgstr "" - -#: tools/wizard.py:73 -#, python-format -msgid "Warning: low available physical RAM for configuration test (of %.1fG total)" -msgstr "" - -#: tools/wizard.py:84 -msgid "avoid upgrading during an experiment" -msgstr "" - -#: tools/wizard.py:87 -msgid "" -"can be set in Preferences -> App" -msgstr "" - -#: tools/wizard.py:95 -msgid "" -"Warning: python 2.7 or 3.6 are recommended; 2.6 and 3.5 might work. Others " -"probably won't." -msgstr "" - -#: tools/wizard.py:113 -msgid "Warning: wx 2.8.10 or higher required" -msgstr "" - -#: tools/wizard.py:119 -msgid "for high-priority threads" -msgstr "" - -#: tools/wizard.py:128 -msgid "" -"Warning: OpenGL" -" 2.0 or higher is ideal." -msgstr "" - -#: tools/wizard.py:143 -msgid "" -"Warning: Rendering" -" of complex stimuli will be slow." -msgstr "" - -#: tools/wizard.py:152 -msgid "" -"during the drifting GratingStim" -msgstr "" - -#: tools/wizard.py:156 -msgid "Warning: too fast? visual sync'ing with the monitor seems unlikely at 300+ Hz" -msgstr "" - -#: tools/wizard.py:161 -msgid "SD < 0.5 ms is ideal (want low variability)" -msgstr "" - -#: tools/wizard.py:165 -msgid "" -"Warning: the refresh rate has high frame-to-frame variability (SD > 0.5 " -"ms)" -msgstr "" - -#: tools/wizard.py:184 -msgid "" -"during DotStim with " -"100 random dots" -msgstr "" - -#: tools/wizard.py:192 -msgid "" -"Warning: could not keep up during DotStim with " -"100 random dots." -msgstr "" - -#: tools/wizard.py:220 -msgid "Warning: pyo is needed for sound and microphone." -msgstr "" - -#: tools/wizard.py:222 -msgid "(missing)" -msgstr "" - -#: tools/wizard.py:232 -msgid "vector-based (fast) calculations" -msgstr "" - -#: tools/wizard.py:234 -msgid "scientific / numerical" -msgstr "" - -#: tools/wizard.py:236 -msgid "plotting; fast contains(), overlaps()" -msgstr "" - -#: tools/wizard.py:242 -msgid "for online help, usage statistics, software updates, and google-speech" -msgstr "" - -#: tools/wizard.py:247 -msgid "Warning: could not connect (no proxy attempted)" -msgstr "" - -#: tools/wizard.py:255 -msgid "" -"try to auto-detect a proxy if needed; see Preferences -> Connections" -msgstr "" - -#: tools/wizard.py:265 -msgid "" -"current manual proxy setting from Preferences -> Connections" -msgstr "" - -#: tools/wizard.py:272 -msgid "numpy.std() of 1,000,000 data points" -msgstr "" - -#: tools/wizard.py:280 -msgid "Python packages" -msgstr "" - -#: tools/wizard.py:311 -#, python-format -msgid "could not import package %s" -msgstr "" - -#: tools/wizard.py:329 -msgid "video card drivers" -msgstr "" - -#: tools/wizard.py:360 -#, python-format -msgid "This page was auto-generated by the PsychoPy configuration wizard on %s" -msgstr "" - -#: tools/wizard.py:370 -msgid "Configuration problem" -msgstr "" - -#: tools/wizard.py:373 -msgid "Critical issue" -msgstr "" - -#: tools/wizard.py:378 -msgid "Configuration report" -msgstr "" - -#: tools/wizard.py:381 -msgid "" -"

All values seem reasonable (no warnings, but there might still be room " -"for improvement).

\n" -msgstr "" - -#: tools/wizard.py:385 -#, python-format -msgid "1 suboptimal value was detected, see details below (%s).

\n" -msgstr "" - -#: tools/wizard.py:390 -#, python-format -msgid "" -"%(num)i suboptimal values were detected, see details below " -"(%(warn)s).

\n" -msgstr "" - -#: tools/wizard.py:412 -msgid "Only show suboptimal values" -msgstr "" - -#: tools/wizard.py:415 -msgid "Show all information" -msgstr "" - -#: tools/wizard.py:416 -msgid "" -"

Resources:\n" -" | On-line documentation\n" -" | Download PDF manual\n" -" | Search the " -"user-group archives\n" -"

" -msgstr "" - -#: tools/wizard.py:423 -msgid "Configuration test or setting" -msgstr "" - -#: tools/wizard.py:424 -msgid "Version or value" -msgstr "" - -#: tools/wizard.py:426 -msgid "Notes" -msgstr "" - -#: tools/wizard.py:466 -msgid " Configuration Wizard" -msgstr "" - -#: tools/wizard.py:479 -msgid "It looks like you are running PsychoPy for the first time." -msgstr "" - -#: tools/wizard.py:481 -msgid "This wizard will help you get started quickly and smoothly." -msgstr "" - -#: tools/wizard.py:484 -msgid "Welcome to the configuration wizard." -msgstr "" - -#: tools/wizard.py:491 -msgid "The first configuration check is your video card's drivers. The current" -msgstr "" - -#: tools/wizard.py:494 -msgid "drivers cannot support PsychoPy, so you'll need to update the drivers." -msgstr "" - -#: tools/wizard.py:497 -#, python-format -msgid "" -"

Critical issue:\n" -"

Your video card (%(card)s) has drivers\n" -" that cannot support the high-performance features that " -"PsychoPy depends on.\n" -" Fortunately, it's typically free and straightforward to get " -"new drivers\n" -" directly from the manufacturer.

\n" -"

To update the drivers:\n" -"

  • You'll need administrator privileges.\n" -"
  • On Windows, don't use the windows option to check for " -"updates\n" -" - it can report that there are no updates available.\n" -"
  • If your card is made by NVIDIA, go to\n" -" the" -" NVIDIA website\n" -" and use the 'auto detect' option. Try here for\n" -" ATI / Radeon " -"drivers. Or try\n" -" \n" -" this google search [google.com].\n" -"
  • Download and install the driver.\n" -"
  • Reboot the computer.\n" -"
  • Restart PsychoPy.

    \n" -"

    If you updated the drivers and still get this message, " -"you'll\n" -" need a different video card to use PsychoPy. Click\n" -" here\n" -" for more information [psychopy.org].

    \n" -" " -msgstr "" - -#: tools/wizard.py:522 -msgid "" -"

    Critical issue:\n" -"

    " -msgstr "" - -#: tools/wizard.py:527 -msgid "We'll go through a series of configuration checks in about 10 seconds. " -msgstr "" - -#: tools/wizard.py:531 -msgid "Note: The display will switch to full-screen mode and will " -msgstr "" - -#: tools/wizard.py:533 -msgid "then switch back. You don't need to do anything." -msgstr "" - -#: tools/wizard.py:535 -msgid "Optional: For best results, please quit all email programs, web-browsers, " -msgstr "" - -#: tools/wizard.py:538 -msgid "Dropbox, backup or sync services, and others." -msgstr "" - -#: tools/wizard.py:540 -msgid "Click OK to start, or Cancel to skip." -msgstr "" - -#: tools/wizard.py:542 -msgid "Full details" -msgstr "" - -#: tools/wizard.py:547 -msgid "Click OK for more information, or Cancel to skip." -msgstr "" - -#: tools/wizard.py:576 -msgid "Configuration testing complete!" -msgstr "" - -#: tools/wizard.py:580 -msgid "All values seem reasonable (no warnings)." -msgstr "" - -#: tools/wizard.py:582 -#, python-format -msgid "1 suboptimal value was detected (%s)" -msgstr "" - -#: tools/wizard.py:586 -#, python-format -msgid "%(num)i suboptimal values were detected (%(warn)s, ...)" -msgstr "" - -#: tools/wizard.py:594 -msgid "Click OK for full details (will open in a web-browser)," -msgstr "" - -#: tools/wizard.py:595 -msgid "or Cancel to stay in PsychoPy." -msgstr "" - -#: tools/wizard.py:614 -msgid " Benchmark Wizard" -msgstr "" - -#: tools/wizard.py:618 -msgid "Benchmarking takes ~20-30 seconds to gather" -msgstr "" - -#: tools/wizard.py:619 -msgid "configuration and performance data. Begin?" -msgstr "" - -#: tools/wizard.py:641 -msgid "dots & configuration" -msgstr "" - -#: tools/wizard.py:643 -msgid "visual window for drawing" -msgstr "" - -#: tools/wizard.py:670 -msgid "Benchmark complete! (See the Coder output window.)" -msgstr "" - -#: tools/wizard.py:679 -msgid "Click OK to view full configuration and benchmark data." -msgstr "" - -#: tools/wizard.py:680 -msgid "Click Cancel to stay in PsychoPy." -msgstr "" - -#: visual/form.py:266 -#, python-brace-format -msgid "Incorrect item type '{}' in Form '{}', allowed types are: {}" -msgstr "" - -#: visual/rift.py:323 -msgid "Cannot find any connected HMD, check connections and try again." -msgstr "" - -#: visual/window.py:3565 -msgid "PILOTING: Switch to run mode before testing." -msgstr "" - diff --git a/psychopy/localization/readme.txt b/psychopy/localization/readme.txt deleted file mode 100644 index 21c8766a..00000000 --- a/psychopy/localization/readme.txt +++ /dev/null @@ -1,68 +0,0 @@ -""" -Localizing text strings in PsychoPy - -Notes by Jeremy R. Gray - -Sources: - - https://www.supernifty.org/blog/2011/09/16/python-localization-made-easy/ - - https://bip.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/gettext/ - - https://webtranslateit.com/en/docs/file_formats/gettext_po/ - - windows mappings: https://msdn.microsoft.com/en-us/goglobal/bb896001.aspx - - python future: https://hg.python.org/cpython/file/ed62c4c70c4d/Lib/locale.py - - -Intended usage: - - early in loading the app, e.g., in _psychopyApp.PsychoPyApp.OnInit(), do: - from psychopy.app.localization import _translate - This should be done after importing wx - - this will: 1) detect the system default or preferred (pref) locale; - 2) initialize the locale setting globally; and 3) make _translate available - in the module. (Feb 2016: move away from using __builtins__._translate) - - currently both the standard gettext and wxPython version are used - -Known limitations (July 2014): - - only strings are localized, not number format (separator , or .), currency, etc - - PsychoPy uses the nonstandard name, _translate(), to avoid a name conflict with - a dummy variable _, which is sometimes used as a placeholder when unpacking - tuples or lists. PsychoPy depends on several packages, and some of them use - _ as a dummy variable, which is quite widespread as a practice, unfortunately. - - not sure how right-to-left languages work - - use for localizing the app (PsychoPy), not for localizing user scripts. - -Files: - - psychopy/app/locale/LANG/LC_MESSAGES/ holds the text files and translations, - where LANG is a 5 letter code like en_UK or ja_JP. poedit will re-make *.mo - next to *.po. - Such directories will be auto-detected by PsychoPy in users prefs -> app -> locale - -Process: -Do once: -- edit the .py files to add _translate() around text strings to be localized - e.g.: replace 'Welcome to PsychoPy3!' with _translate('Welcome to PsychoPy3!') - This process is mostly complete, but might be needed for new code. -- use poedit to open a specific message catalog (*.po file). - In poedit "properties", add _translate as one of the "Sources keywords" - To refresh the list of strings to be translated, in poedit click "Catalog menu > Update from sources" - - poedit will do the following automatically, and is much easier than doing by hand: - To discover all instances of _translate() and dump to a file messages.pot (name customizable) - $ pybabel extract --no-default-keywords -k _translate --no-wrap --project=PsychoPy --sort-by-file -o messages.pot .. -- edit messages.pot manually if needed, fill in various fields for the app. -- messages.pot is now a template, copy to each destination LANG directory: - $ cp messages.pot ../app/locale/LANG/LC_MESSAGES/messages.po - -human translation: -- doing a translation well requires a strong understanding of PsychoPy itself, especially - to know what are technical terms (like Routine) and so should not be translated, and to - know the context of messages and hints, which can be snippets -- edit psychopy/app/locale/LANG/LC_MESSAGES/messages.po to have the desired translations. - Use poEdit from https://poedit.net/ or (debian-based) "sudo apt-get install poedit" - -generate .mo (binary) from .po (text): -- use poedit (easiest): update catalog -- by hand (not recommended): use utils/msgfmt or utils/pomo.py (watch for _translate vs _) - -Notes: -- *.po files and utils are not needed by end users -- could distribute translations separately from PsychoPy itself -""" diff --git a/psychopy/localization/translation.py b/psychopy/localization/translation.py new file mode 100644 index 00000000..e0156095 --- /dev/null +++ b/psychopy/localization/translation.py @@ -0,0 +1,55 @@ +import logging +from i18next import config, trans +from pathlib import Path +import locale + + +__all__ = [ + "getLocale", + "setLocale", + "_translate" +] + +# setup i18next config +config.fallback_lang = "en-US" +config.locale_path = Path(__file__).parent / "locales" +# global for settable locale +currentLocale = None + + +def getLocale(): + """ + Get the current locale + """ + return currentLocale + + +def setLocale(value): + """ + Set the current locale + """ + global currentLocale + # if requested system, get system locale + if value in (None, "system locale", "system"): + value = locale.getdefaultlocale()[0] + # use English as a fallback if locale is undetectable + if value is None: + logging.warning( + "Could not detect system locale, using en-US" + ) + value = "en-US" + # sanitize + value = value.replace("_", "-") + # set + currentLocale = value + + +def _translate(value): + """ + Wrapper around i18next.trans which translates to the current locale + """ + return trans(value, lang=currentLocale) + + +# default to system locale +setLocale(None) diff --git a/psychopy/monitors/MonitorCenter.py b/psychopy/monitors/MonitorCenter.py index a1847660..aa217abe 100644 --- a/psychopy/monitors/MonitorCenter.py +++ b/psychopy/monitors/MonitorCenter.py @@ -15,7 +15,7 @@ from psychopy.localization import _translate from psychopy import monitors, hardware, logging -from psychopy.app import dialogs +from psychopy_app import dialogs DEBUG = False NOTEBOOKSTYLE = False @@ -1086,9 +1086,9 @@ class CalibrationSetupDlg(wx.Dialog): Dialog getting params for a gamma calibration, which also runs said calibration """ def __init__(self, parent): - from psychopy.app.builder.validators import WarningManager + from psychopy_app.builder.validators import WarningManager from psychopy.experiment.params import Param - from psychopy.app.builder.dialogs.paramCtrls import ParamCtrl, EVT_PARAM_CHANGED + from psychopy_app.builder.dialogs.paramCtrls import ParamCtrl, EVT_PARAM_CHANGED wx.Dialog.__init__( self, diff --git a/psychopy/plugins/__init__.py b/psychopy/plugins/__init__.py index 5d1d2b12..5e52ac89 100644 --- a/psychopy/plugins/__init__.py +++ b/psychopy/plugins/__init__.py @@ -83,17 +83,20 @@ def getEntryPointGroup(group, subgroups=False): """ # start off with no entry points or sections entryPoints = [] - + # handle difference between importlib.metadata 5.0 and previous versions + all = importlib.metadata.entry_points() + if isinstance(all, dict): + groups = list(all) + else: + groups = all.groups + # filter groups if subgroups: - # if searching subgroups, iterate through entry point groups - for thisGroup, eps in importlib.metadata.entry_points().items(): - # get entry points within matching group - if thisGroup.startswith(group): - # add to list of all entry points - entryPoints += eps + groups = [g for g in groups if g.startswith(group)] else: - # otherwise, just get the requested group - entryPoints += importlib.metadata.entry_points().get(group, []) + groups = [g for g in groups if g == group] + # append entry points + for g in groups: + entryPoints += importlib.metadata.entry_points(group=g) return entryPoints @@ -752,7 +755,7 @@ def loadPlugin(plugin): logging.error( "Plugin `{}` entry point requires module `{}`, but it " "cannot be imported.".format(plugin, module_name)) - except: + except Exception: importSuccess = False logging.error( "Plugin `{}` entry point requires module `{}`, but an " @@ -844,7 +847,7 @@ def loadPlugin(plugin): _registerBuilderStandaloneRoutine(ep) elif fqn == 'psychopy.hardware.photometer': # photometer _registerPhotometer(ep) - elif fqn == "psychopy.app.themes.icons": + elif fqn == "psychopy_app.themes.icons": # get module folder folder = Path(ep.__file__).parent # add all matching .png files from that folder diff --git a/psychopy/plugins/util.py b/psychopy/plugins/util.py index fda0adf7..6f6d71a5 100644 --- a/psychopy/plugins/util.py +++ b/psychopy/plugins/util.py @@ -19,24 +19,31 @@ def getEntryPoints(module, submodules=True, flatten=True): default True. """ # start off with a blank list/dict - entryPointsList = [] - entryPointsDict = {} - # iterate through groups - for group, points in importlib.metadata.entry_points().items(): - # does this group correspond to the requested module? - if submodules: - targeted = group.startswith(module) - else: - targeted = group == module - # if group is targeted, add entry points - if targeted: - entryPointsList += points - entryPointsDict[group] = points - # return list or dict according to flatten arg if flatten: - return entryPointsList + output = [] + else: + output = {} + # handle difference between importlib.metadata 5.0 and previous versions + all = importlib.metadata.entry_points() + if isinstance(all, dict): + groups = list(all) + else: + groups = all.groups + # filter groups + if submodules: + groups = [group for group in groups if group.startswith(module)] else: - return entryPointsDict + groups = [group for group in groups if group == module] + # get points for each group + for group in groups: + points = importlib.metadata.entry_points(group=group) + # append to output + if flatten: + output += points + else: + output[group] = points + + return output class PluginRequiredError(Exception): diff --git a/psychopy/preferences/preferences.py b/psychopy/preferences/preferences.py index bc4d7679..6e974f8f 100644 --- a/psychopy/preferences/preferences.py +++ b/psychopy/preferences/preferences.py @@ -14,6 +14,11 @@ from packaging.version import Version import shutil +try: + import psychopy_app +except: + psychopy_app = None + try: import configobj if (sys.version_info.minor >= 7 and @@ -119,7 +124,10 @@ def getPaths(self, userDir=None): exePath = sys.executable # path to Resources (icons etc) - dirApp = join(dirPsychoPy, 'app') + if psychopy_app: + dirApp = Path(psychopy_app.__file__).parent + else: + dirApp = join(dirPsychoPy, 'app') if os.path.isdir(join(dirApp, 'Resources')): dirResources = join(dirApp, 'Resources') else: @@ -368,12 +376,20 @@ def fromJSON(self, file): for key in section: # if given in the JSON, set value if key in params: + # sanitize data + val = params[key]['val'] + if val in ['True', 'true', 'TRUE', True]: + val = True + if val in ['False', 'false', 'FALSE', False]: + val = False + if val in ['None', 'none', None, ""]: + val = None try: # attempt to un-stringify - section[key] = json.loads(params[key]['val']) - except: + section[key] = json.loads(val) + except (ValueError, TypeError): # use as-is if this fails - section[key] = params[key]['val'] + section[key] = val @property def devices(self): @@ -444,7 +460,7 @@ def loadAppData(self): preserve_errors=True) self.restoreBadPrefs(cfg, resultOfValidate) # force favComponent level values to be integers - if 'favComponents' in cfg['builder']: + if 'builder' in cfg and 'favComponents' in cfg['builder']: for key in cfg['builder']['favComponents']: _compKey = cfg['builder']['favComponents'][key] cfg['builder']['favComponents'][key] = int(_compKey) diff --git a/psychopy/projects/pavlovia.py b/psychopy/projects/pavlovia.py index e54ab51e..3103c47d 100644 --- a/psychopy/projects/pavlovia.py +++ b/psychopy/projects/pavlovia.py @@ -15,17 +15,18 @@ import time import subprocess import traceback +import threading import pandas from packaging.version import Version from psychopy import logging, prefs, exceptions from psychopy.tools.filetools import DictStorage, KnownProjects -from psychopy import app +import psychopy_app as app from psychopy.localization import _translate import wx -from ..app.errorDlg import exceptionCallback +# from ..app.errorDlg import exceptionCallback from ..tools.apptools import SortTerm try: @@ -43,7 +44,6 @@ import gitlab.v4.objects # for authentication -from . import sshkeys from uuid import uuid4 from .gitignore import gitIgnoreText @@ -137,7 +137,7 @@ def login(tokenOrUsername, refreshToken=None, rememberMe=True): """ currentSession = getCurrentSession() if not currentSession: - exceptionCallback(exc_type=requests.exceptions.ConnectionError) + # exceptionCallback(exc_type=requests.exceptions.ConnectionError) return # would be nice here to test whether this is a token or username logging.debug('pavloviaTokensCurrently: {}'.format(knownUsers)) @@ -261,11 +261,15 @@ def __eq__(self, other): @property def session(self): - # Cache session if not cached - if not hasattr(self, "_session"): - self._session = getCurrentSession() - # Return cached session - return self._session + # get session + if hasattr(self, "_session"): + session = self._session + else: + session = self._session = getCurrentSession() + # make sure token is in date + session.doRefreshToken() + + return session def saveLocal(self): """Saves the data on the current user in the pavlovia/users json file""" @@ -297,6 +301,7 @@ def __init__(self, token=None, remember_me=True): self.userFullName = None self.remember_me = remember_me self.authenticated = False + self.expired = None self.setToken(token) logging.debug("PavloviaLoggedIn") @@ -326,6 +331,9 @@ def createProject(self, name, description="", tags=(), visibility='private', a PavloviaProject object """ + # make sure token is in date + self.doRefreshToken() + if not self.user: raise exceptions.NoUserError("Tried to create project with no user logged in") # NB gitlab also supports "internal" (public to registered users) @@ -415,6 +423,9 @@ def findProjects(self, search_str='', tags="psychopy"): A list of OSFProject objects """ + # make sure token is in date + self.doRefreshToken() + rawProjs = self.gitlab.projects.list( search=search_str, as_list=False) # iterator not list for auto-pagination @@ -431,6 +442,9 @@ def findUserProjects(self, searchStr=''): """Finds all readable projects of a given user_id (None for current user) """ + # make sure token is in date + self.doRefreshToken() + try: own = self.gitlab.projects.list(owned=True, search=searchStr) except Exception as e: @@ -472,11 +486,62 @@ def getNamespace(self, namespace): """Returns a namespace object for the given name if an exact match is found """ + # make sure token is in date + self.doRefreshToken() + spaces = self.gitlab.namespaces.list(search=namespace) # might be more than one, with for thisSpace in spaces: if thisSpace.path == namespace: return thisSpace + + def doRefreshToken(self, refreshToken=None): + """ + Refresh the current authentication token + + Parameters + ---------- + refreshToken : str, optional + Refresh token to use, if None (default) then will use the stored refresh token + """ + # if token isn't expired, do nothing + if self.expired is False: + return + # if not logged in yet, do nothing + if refreshToken is None and self.__dict__['refreshToken'] is None: + return + # refresh auth token + resp = requests.post( + "https://gitlab.pavlovia.org/oauth/token", + params={ + 'client_id': client_id, + 'refresh_token': refreshToken or self.__dict__['refreshToken'], + 'grant_type': "refresh_token", + 'redirect_uri': redirect_url, + 'code_verifier': code_verifier + } + ).json() + # surface error to user if request was rejects + if 'access_token' not in resp: + raise gitlab.GitlabAuthenticationError( + "{error}: {error_description}".format(**resp) + ) + # start again with new token + self.setToken( + resp['access_token'], + refreshToken=resp['refresh_token'] + ) + # mark as not expired + self.expired = False + # start countdown to token expiry + def expire(): + # wait until token expires + time.sleep( + resp['expires_in'] + ) + # mark expired + self.expired = True + threading.Thread(target=expire, daemon=True).start() def startSession(self, token, refreshToken=None): """Start a gitlab session as best we can @@ -503,25 +568,11 @@ def startSession(self, token, refreshToken=None): except gitlab.exceptions.GitlabAuthenticationError as err: if refreshToken is None: # if there isn't a refresh token, log back in from scratch to get one - from psychopy.app.pavlovia_ui.functions import logInPavlovia + from psychopy_app.pavlovia_ui.functions import logInPavlovia logInPavlovia(None) return # refresh auth token - resp = requests.post( - "https://gitlab.pavlovia.org/oauth/token", - params={ - 'client_id': client_id, - 'refresh_token': refreshToken, - 'grant_type': "refresh_token", - 'redirect_uri': redirect_url, - 'code_verifier': code_verifier - } - ).json() - # start again with new token - self.setToken( - resp['access_token'], - refreshToken=resp['refresh_token'] - ) + self.doRefreshToken(refreshToken) return except gitlab.exceptions.GitlabParsingError as err: raise ConnectionError( @@ -616,8 +667,11 @@ def __init__(self, term, sortBy=None, filterBy=None, mine=False): filterBy = {} # Ensure filter is a FilterTerm filterBy = self.FilterTerm(filterBy) - # Do search + # get session session = getCurrentSession() + # make sure token is in date + session.doRefreshToken() + # do search if mine: # Display experiments by current user data = session.session.get( @@ -698,6 +752,9 @@ def __init__(self, id, localRoot=None): # Set local root if localRoot is not None: self.localRoot = localRoot + # set preferred merge strategy + if self.repo and not self.repo.config_reader().has_option("pull", "rebase"): + self.repo.config_writer().set_value("pull", "rebase", False).release() def __getitem__(self, key): # Get either from self or project.attributes @@ -780,12 +837,15 @@ def refresh(self): @property def session(self): - # If previous value is cached, return it + # get session if hasattr(self, "_session"): - return self._session - # Get and cache current session - self._session = getCurrentSession() - return self._session + session = self._session + else: + session = self._session = getCurrentSession() + # make sure token is in date + session.doRefreshToken() + + return session @property def project(self): @@ -1064,7 +1124,7 @@ def repo(self): Will try to clone if local is empty and remote is not""" # If there's no local root, we can't find the repo if not self.localRoot: - raise gitlab.GitlabGetError("Cannot fetch a PavloviaProject until we have chosen a local folder.") + return None # If repo is cached, return it if hasattr(self, "_repo") and self._repo: return self._repo @@ -1192,13 +1252,14 @@ def firstPush(self, infoStream): infoStream = getInfoStream() if infoStream: infoStream.write("Pushing to Pavlovia for the first time...\n") - # construct initial commit - self.stageFiles(infoStream=infoStream) - info = self.commit( - _translate("Push initial project files") - ) - if infoStream and len(info): - infoStream.write("{}\n".format(info)) + # construct initial commit (if not already committed) + diffs = self.stageFiles(infoStream=infoStream) + if diffs: + info = self.commit( + _translate("Push initial project files") + ) + if infoStream and len(info): + infoStream.write("{}\n".format(info)) # push info = self.repo.git.push('-u', self.remoteWithToken, 'master') self.project.attributes['default_branch'] = 'master' @@ -1339,6 +1400,8 @@ def stageFiles(self, files=None, infoStream=None): except git.exc.GitCommandError: if infoStream: infoStream.SetValue(traceback.format_exc()) + + return len(files) else: diffsDict, diffsList = self.getChanges() if diffsDict['untracked']: @@ -1348,6 +1411,8 @@ def stageFiles(self, files=None, infoStream=None): if diffsDict['changed']: self.repo.git.add(diffsDict['changed']) + return len(diffsList) + def getStagedFiles(self): """Retrieves the files that are already staged ready for commit""" return self.repo.index.diff("HEAD") @@ -1535,7 +1600,7 @@ def getProject(filename): # remove extra slashes from project name projectName = projectName.replace("/", "") # Try to log in if not logged in - if not session.user: + if projectName in knownProjects and not session.user: if nameSpace in knownUsers: # Log in if user is known login(nameSpace, rememberMe=True) @@ -1639,10 +1704,11 @@ def getCurrentSession(): """ global _existingSession if _existingSession: + _existingSession.doRefreshToken() return _existingSession else: _existingSession = PavloviaSession() - return _existingSession + return _existingSession def refreshSession(): @@ -1654,6 +1720,7 @@ def refreshSession(): ) else: _existingSession = PavloviaSession() + return _existingSession diff --git a/psychopy/psychojs.zip b/psychopy/psychojs.zip new file mode 100644 index 00000000..a27428a8 Binary files /dev/null and b/psychopy/psychojs.zip differ diff --git a/psychopy/scripts/psyexpCompile.py b/psychopy/scripts/psyexpCompile.py index cd056625..a2ca7c90 100644 --- a/psychopy/scripts/psyexpCompile.py +++ b/psychopy/scripts/psyexpCompile.py @@ -54,7 +54,7 @@ def generateScript(exp, outfile, target="PsychoPy"): # if version is not specified then don't touch useVersion at all version = exp.settings.params['Use version'].val # if useVersion is different to installed version... - if version not in [None, 'None', '', __version__]: + if version not in [None, 'None', '', __version__, "latest"]: # make sure we have a legacy save file if not Path(exp.legacyFilename).is_file(): exp.saveToXML(filename=exp.filename) @@ -112,7 +112,7 @@ def _setVersion(version): """ # Set version - if version: + if version not in (None, "", "latest"): from psychopy import useVersion useVersion(version) diff --git a/psychopy/sound/_base.py b/psychopy/sound/_base.py index efa72ad5..3daa0f91 100644 --- a/psychopy/sound/_base.py +++ b/psychopy/sound/_base.py @@ -5,6 +5,14 @@ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd. # Distributed under the terms of the MIT License. +"""Base classes and functions for playing sounds. + +This module contains the base class for sound objects, which is subclassed by +the specific sound backends (e.g., SoundPygame, SoundPyo, SoundSoundDevice). It +also contains helper functions and classes for processing sound data. + +""" + from pathlib import Path import numpy import copy @@ -26,6 +34,7 @@ except Exception: raise DependencyError("soundfile not working") +# determine media location for default sounds based on platform if platform == 'win32': mediaLocation = "C:\\Windows\\Media" elif platform == 'darwin': @@ -34,26 +43,50 @@ mediaLocation = "/usr/share/sounds" +def apodize(soundArray, sampleRate): + """Apply a Hanning window (5ms) to reduce a sound's 'click' onset / offset. + Parameters + ---------- + soundArray : numpy.ndarray + The array of sound data to be apodized. Should be 1D with shape + (nSamples,). + sampleRate : int + Sample rate of the sound in Hz. + + Returns + ------- + numpy.ndarray + The apodized sound array, with the same shape as the input array. -def apodize(soundArray, sampleRate): - """Apply a Hanning window (5ms) to reduce a sound's 'click' onset / offset """ hwSize = int(min(sampleRate // 200, len(soundArray) // 15)) hanningWindow = numpy.hanning(2 * hwSize + 1) soundArray = copy.copy(soundArray) soundArray[:hwSize] *= hanningWindow[:hwSize] soundArray[-hwSize:] *= hanningWindow[hwSize + 1:] + return soundArray -class HammingWindow(): +class HammingWindow: + """Class to apply a Hanning window to the start and end of a sound, to reduce + 'click' onset and offset. + + """ def __init__(self, winSecs, soundSecs, sampleRate): - """ + """Initialize the HammingWindow. + + Parameters + ---------- + winSecs : float + Window size in seconds. This is the duration of the Hanning window to + apply to the start and end of the sound. + soundSecs : float + Duration of the sound in seconds. + sampleRate : int + Sample rate of the sound. - :param winSecs: - :param soundSecs: - :param sampleRate: """ self.sampleRate = sampleRate self.winSecs = winSecs @@ -67,9 +100,19 @@ def __init__(self, winSecs, soundSecs, sampleRate): def nextBlock(self, t, blockSize): """Returns a block to be multiplied with the current sound block or 1.0 - :param t: current position in time (secs) - :param blockSize: block size for the sound needing the hanning window - :return: numpy array of length blockSize + Parameters + ---------- + t : float + Current position in time (secs). + blockSize : int + Block size for the sound needing the hanning window. + + Returns + ------- + numpy.ndarray + A numpy array of length blockSize to be multiplied with the current + sound block, or 1.0 if no windowing is needed. + """ startSample = int(t*self.sampleRate) if startSample < self.winSamples: @@ -122,7 +165,10 @@ class _SoundBase(AttributeGetSetMixin): # def _setSndFromFile(self, fileName): # def _setSndFromArray(self, thisArray): + preBuffer = -1 autoLog = True + startTime = 0 + stopTime = 0 def setSound(self, value, secs=0.5, octave=4, hamming=True, log=True): """Set the sound to be played. @@ -253,39 +299,114 @@ def isStereo(self, stereo): self.stereo = stereo def _setSndFromNote(self, thisNote, secs, octave, hamming=True): + """Set sound from a note name (e.g., 'A', 'Csh', etc.). + + Note that the octave is needed to determine the frequency of the note, + so it must be specified if using a note name. + + Parameters + ---------- + thisNote : str + The note name, e.g., 'A', 'Csh', etc. + secs : float + Duration of the tone to be generated. + octave : int + The octave of the note, where middle octave of a piano is 4. Most + computers won't output sounds in the bottom octave (1) and the top + octave (8) is generally painful. + hamming : bool + Whether to apply a Hanning window to the sound to reduce 'click' onset + and offset. Not applied to sounds from files. + + """ # note name -> freq -> sound freqA = 440.0 thisOctave = octave - 4 - mult = 2.0**(stepsFromA[thisNote] / 12.) + mult = 2.0 ** (stepsFromA[thisNote] / 12.) thisFreq = freqA * mult * 2.0 ** thisOctave self._setSndFromFreq(thisFreq, secs, hamming=hamming) def _setSndFromFreq(self, thisFreq, secs, hamming=True): + """Set sound from a frequency in Hz. + + Parameters + ---------- + thisFreq : float + Frequency in Hz. + secs : float + Duration of the sound in seconds. If negative, the sound will loop + indefinitely (until stopped). + hamming : bool + Whether to apply a Hanning window to the sound to reduce 'click' onset + and offset. Not applied to sounds from files. + + """ # note freq -> array -> sound if secs < 0: # want infinite duration - create 1 sec sound and loop it secs = 10.0 self.loops = -1 + if not self.sampleRate: self.sampleRate = self._getDefaultSampleRate() + nSamples = int(secs * self.sampleRate) outArr = numpy.arange(0.0, 1.0, 1.0 / nSamples) outArr *= 2 * numpy.pi * thisFreq * secs outArr = numpy.sin(outArr) + if hamming and nSamples > 30: outArr = apodize(outArr, self.sampleRate) + self._setSndFromArray(outArr) + def _channelCheck(self, sndArr): + """Checks whether stream has fewer channels than data. If so, raises + an error with instructions to user. + + Parameters + ---------- + sndArr : numpy.ndarray + The array of sound data to be played. Should be 2D with shape + (nSamples, nChannels). + + Raises + ------ + ValueError + If the sound stream is set up with fewer channels than in the data + array. + + """ + if self.channels < sndArr.shape[1]: + msg = ("The sound stream is set up incorrectly. You have fewer channels in the buffer " + "than in data file ({} vs {}).\n**Ensure you have selected 'Force stereo' in " + "experiment settings**".format(self.channels, sndArr.shape[1])) + logging.error(msg) + raise ValueError(msg) + def _setSndFromFile(self, filename): + """Set sound from a file. + + Parameters + ---------- + filename : str + Path to the sound file. Can be a relative path (relative to current + directory or media directory) or an absolute path. + + """ # alias default names (so it always points to default.png) if filename in defaultStim: filename = Path(prefs.paths['assets']) / defaultStim[filename] + self.sndFile = f = sf.SoundFile(filename) self.sourceType = 'file' self.sampleRate = f.samplerate + if self.channels == -1: # if channels was auto then set to file val self.channels = f.channels + fileDuration = float(len(f)) / f.samplerate # needed for duration? + # process start time if self.startTime and self.startTime > 0: startFrame = self.startTime * self.sampleRate @@ -293,28 +414,40 @@ def _setSndFromFile(self, filename): self.t = self.startTime else: self.t = 0 + # process stop time if self.stopTime and self.stopTime > 0: requestedDur = self.stopTime - self.t self.duration = min(requestedDur, fileDuration) else: self.duration = fileDuration - self.t + # can now calculate duration in frames self.durationFrames = int(round(self.duration * self.sampleRate)) + # are we preloading or streaming? if self.preBuffer == 0: # no buffer - stream from disk on each call to nextBlock - pass + return elif self.preBuffer == -1: # full pre-buffer. Load requested duration to memory sndArr = self.sndFile.read( frames=int(self.sampleRate * self.duration)) self.sndFile.close() self._setSndFromArray(sndArr) - self._channelCheck( - self.sndArr) # Check for fewer channels in stream vs data array - + + self._channelCheck(self.sndArr) + def _setSndFromArray(self, thisArray): + """Set sound from a numpy array. + + Parameters + ---------- + thisArray : numpy.ndarray + A 1D or 2D array of sound data, where rows are samples and columns + are channels. Values should be floats in the range -1.0 to 1.0. + + """ self.sndArr = numpy.asarray(thisArray).astype('float32') if thisArray.ndim == 1: self.sndArr.shape = [len(thisArray), 1] # make 2D for broadcasting @@ -337,7 +470,8 @@ def _setSndFromArray(self, thisArray): logging.warning( "Received a blank array for sound, playing nothing instead." ) - self.sndArr = numpy.zeros(shape=(self.blockSize, self.channels)) + self.sndArr = numpy.zeros( + shape=(self.blockSize, self.channels)) # create audio clip clip = AudioClip( @@ -348,27 +482,42 @@ def _setSndFromArray(self, thisArray): self._setSndFromClip(clip) def _setSndFromClip(self, clip: AudioClip): - """ - Set current sound from an AudioClip object. All other setSound methods eventually lead to - this - they just transform the given sound (be it an array, file, note, etc.) to an - AudioClip first. + """Set current sound from an AudioClip object. + + All other setSound methods eventually lead to this - they just transform + the given sound (be it an array, file, note, etc.) to an AudioClip first. - Each subclass of _SoundBase (so each sound backend; ptb, pygame, etc.) will implement this - method in their own way. + Each subclass of _SoundBase (so each sound backend; ptb, pygame, etc.) + will implement this method in their own way. Parameters ---------- clip : AudioClip AudioClip object to set. + """ raise NotImplementedError() def _getDefaultSampleRate(self): - """For backends this might depend on what streams are open""" + """Default sample rate in Hz to use for sounds. + + Returns + ------- + int + Default sample rate in Hz to use for sounds. + + """ return 44100 def getDuration(self): - """Return the duration of the sound""" + """Return the duration of the sound. + + Returns + ------- + float + Duration of the sound in seconds. + + """ return self.duration def getVolume(self): @@ -383,6 +532,16 @@ def getLoops(self): def setVolume(self, newVol, log=True): """Sets the current volume of the sound (0.0 to 1.0, inclusive) + + Parameters + ---------- + newVol : float + The new volume to set, where 0.0 is silent and 1.0 + is full volume. Values outside this range will be clipped to 0.0 or + 1.0. + log : bool + Whether to log this change. Default is True. + """ self.volume = min(1.0, max(0.0, newVol)) self.needsUpdate = True @@ -391,9 +550,22 @@ def setVolume(self, newVol, log=True): (self.name, self.volume), obj=self) def setLoops(self, newLoops, log=True): - """Sets the current requested extra loops (int)""" + """Sets the current requested extra loops, + + Parameters + ---------- + newLoops : int + The new loops value to set, where -1 means to loop indefinitely and + 0 means to play once (no looping). Values greater than 0 indicate the + number of extra times to play the sound after the first time, so 1 means + to play twice, 2 means to play three times, etc. + log : bool + Whether to log this change. Default is True. + + """ self.loops = int(newLoops) self.needsUpdate = True if log and self.autoLog: logging.exp("Sound %s set loops %s" % (self.name, self.loops), obj=self) + diff --git a/psychopy/sound/backend_ptb.py b/psychopy/sound/backend_ptb.py index 4ac90df5..6357baf6 100644 --- a/psychopy/sound/backend_ptb.py +++ b/psychopy/sound/backend_ptb.py @@ -129,7 +129,7 @@ def __init__(self, value="C", secs=0.5, octave=4, stereo=-1, if isinstance(speaker, str) and DeviceManager.getDevice(speaker): speaker = DeviceManager.getDevice(speaker) # make sure speaker is a SpeakerDevice - if not isinstance(speaker, SpeakerDevice): + if not isinstance(speaker, SpeakerDevice.resolveBackend()): speaker = SpeakerDevice(speaker) self.speaker = speaker @@ -270,7 +270,8 @@ def _setSndFromClip(self, clip: AudioClip): self.track = audio.Slave( self.stream.handle, data=clip.samples, - volume=self.volume + volume=self.volume, + mode=1 ) # seek to start self.seek(0) diff --git a/psychopy/sound/backend_sounddevice.py b/psychopy/sound/backend_sounddevice.py index 9b9a9e85..835e5c4b 100644 --- a/psychopy/sound/backend_sounddevice.py +++ b/psychopy/sound/backend_sounddevice.py @@ -8,37 +8,882 @@ """ +__all__ = [ + 'init', + 'getDevices', + 'getStreamLabel', + 'SoundDeviceSound' +] -from psychopy.plugins import PluginStub +import sys +import os +import time +import re +import atexit +try: + import readline # Work around GH-2230 +except ImportError: + pass # all that will happen is the stderr/stdout might get redirected -class SoundDeviceSound( - PluginStub, - plugin="psychopy-sounddevice", - docsHome="https://github.com/psychopy/psychopy-sounddevice", -): - pass +from psychopy import logging +from psychopy.constants import (PLAYING, PAUSED, FINISHED, STOPPED, + NOT_STARTED) +from psychopy.sound.exceptions import SoundFormatError, DependencyError +from psychopy.sound._base import _SoundBase, HammingWindow +from ..hardware import DeviceManager +from psychopy.hardware.speaker import SpeakerDevice +try: + import sounddevice as sd +except (ImportError, OSError): + raise DependencyError("sounddevice not working") +try: + import soundfile as sf +except (ImportError, OSError): + raise DependencyError("soundfile not working") -class init( - PluginStub, - plugin="psychopy-sounddevice", - docsHome="https://github.com/psychopy/psychopy-sounddevice", -): - pass +import numpy as np +_piTimes2 = 2 * np.pi # computed a lot so store it here +travisCI = bool(str(os.environ.get('TRAVIS')).lower() == 'true') -class getDevices( - PluginStub, - plugin="psychopy-sounddevice", - docsHome="https://github.com/psychopy/psychopy-sounddevice", -): - pass +logging.info("Loaded SoundDevice with {}".format(sd.get_portaudio_version()[1])) + + +def init(rate=44100, stereo=True, buffer=128): + """Initialise the sound system with the specified settings. + + Parameters + ---------- + rate : int + Sample rate for audio playback (e.g., 44100). + stereo : bool + Whether to use stereo (2 channels) or mono (1 channel) audio. + buffer : int + The size of the buffer on the sound card (small for low latency, large + for stability). + + """ + pass # for compatibility with other backends + + +def getDevices(kind=None): + """Returns a dict of dict of audio devices of specified `kind` + + The dict keys are names and items are dicts of properties + """ + devs = {} + if travisCI: # travis-CI testing does not have a sound device + return devs + else: + allDevs = sd.query_devices(kind=kind) + + # annoyingly query_devices is a DeviceList or a dict depending on number + if type(allDevs) == dict: + allDevs = [allDevs] + + for ii, dev in enumerate(allDevs): + # newline characters must be removed + devName = dev['name'].replace('\r\n','') + devs[devName] = dev + dev['id'] = ii + + return devs + + +# these will be controlled by sound.__init__.py +defaultInput = None +defaultOutput = None + + +def getStreamLabel(sampleRate, channels, blockSize): + """Returns the string repr of the stream label + """ + return "{}_{}_{}".format(sampleRate, channels, blockSize) + + +class _StreamsDict(dict): + """Keeps track of what streams have been created. On macOS we can have + multiple streams under portaudio but under windows we can only have one. + + use the instance `streams` rather than creating a new instance of this + """ + + def getStream(self, sampleRate, channels, blockSize): + """Gets a stream of exact match or returns a new one + (if possible for the current operating system) + """ + # if the query looks flexible then try getSimilar + if channels == -1 or blockSize == -1: + return self._getSimilar(sampleRate, + channels=channels, + blockSize=blockSize) + else: + return self._getStream(sampleRate, + channels=channels, + blockSize=blockSize) + + def _getSimilar(self, sampleRate, channels=-1, blockSize=-1): + """Do we already have a compatible stream? + + Many sounds can allow channels and blocksize to change but samplerate + is generally fixed. Any values set to -1 above will be flexible. Any + values set to an alternative number will be fixed + + usage: + + label, stream = streams._getSimilar(sampleRate=44100, # must match + channels=-1, # any + blockSize=-1) # wildcard + """ + label = getStreamLabel(sampleRate, channels, blockSize) + # replace -1 with any regex integer + simil = re.compile(label.replace("-1", r"[-+]?(\d+)")) # I hate REGEX! + for thisFormat in self: + if simil.match(thisFormat): # we found a close-enough match + return thisFormat, self[thisFormat] + # no compatible stream found, create new stream replacing flexible values with defaults + if channels in [None, -1]: + channels = 2 + if sampleRate in [None, -1, 0]: + sampleRate = 44100 + if blockSize in [None, -1]: + blockSize = 128 + return self._getStream(sampleRate, channels, blockSize) + + def _getStream(self, sampleRate, channels, blockSize): + """Strict check for this format or create new + """ + label = getStreamLabel(sampleRate, channels, blockSize) + # try to retrieve existing stream of that name + if label in self: + pass + # on some systems more than one stream isn't supported so check + elif sys.platform == 'win32' and len(self): + raise SoundFormatError( + "Tried to create audio stream {} but {} already exists " + "and {} doesn't support multiple portaudio streams" + .format(label, list(self.keys())[0], sys.platform) + ) + else: + # create new stream + self[label] = _SoundStream(sampleRate, channels, blockSize, + device=defaultOutput) + return label, self[label] + + +streams = _StreamsDict() + + +class _SoundStream: + """A SoundStream is a single stream of audio data to the sound card. It can + be shared by multiple Sound objects, but only one stream of a given format + (sample rate, channels, block size) can exist at once. + + """ + def __init__(self, sampleRate, channels, blockSize, + device=None, duplex=False): + """ + Parameters + ---------- + sampleRate : int + Sample rate of the stream (e.g., 44100). + channels : int + Number of audio channels (e.g., 1 for mono, 2 for stereo). + blockSize : int + The size of the buffer on the sound card (small for low latency, + large for stability). + device : int or str or None + The audio device to use for the stream. Can be specified by name + or index, or `None` to use the default device. + duplex : bool + Whether the stream should be duplex (i.e., support both input and + output). If `False`, the stream will be output-only. + """ + # initialise thread + self.streams = [] + self.list = [] + # sound stream info + self.sampleRate = sampleRate + self.channels = channels + self.duplex = duplex + self.blockSize = blockSize + self.label = getStreamLabel(sampleRate, channels, blockSize) + if device == 'default': + device = None + self.sounds = [] # list of dicts for sounds currently playing + self.takeTimeStamp = False + self.frameN = 1 + # self.frameTimes = range(5) # DEBUGGING: store the last 5 callbacks + if not travisCI: # travis-CI testing does not have a sound device + self._sdStream = sd.OutputStream(samplerate=self.sampleRate, + blocksize=self.blockSize, + latency='low', + device=device, + channels=self.channels, + callback=self._callback) + self._sdStream.start() + self.device = self._sdStream.device + self.latency = self._sdStream.latency + self.cpu_load = self._sdStream.cpu_load + atexit.register(self.__del__) + + # self._tSoundRequestPlay = -1 # time the sound was requested to play + self._isPlaying = False + + @property + def isPlaying(self): + """`True` if the audio playback is ongoing.""" + return self._isPlaying + + def _callback(self, toSpk, blockSize, timepoint, status): + """Callback function for the sound stream. + + This is called internally by the `sounddevice` library to fetch the next + block of audio data to be played when the input output buffer is starved. + It iterates through all currently playing sounds, fetches the next block + of audio data for each sound, applies the volume, and adds it to the + output buffer. If a sound has finished playing (i.e., the fetched block is + shorter than the buffer size), it is removed from the list of currently + playing sounds. + + Parameters + ---------- + toSpk : np.ndarray + A numpy array to be populated with the audio data to be played. + blockSize : int + The number of frames to be included in each block of audio data. + timepoint : object + An object containing timing information for the callback, with + attributes `currentTime`, `inputBufferAdcTime`, and + `outputBufferDacTime`. + status : int + Status flags for the callback (e.g., indicating underflow or + overflow). + + """ + if self.takeTimeStamp and hasattr(self, 'lastFrameTime'): + logging.info("Entered callback: {} ms after last frame end" + .format((time.monotonic() - self.lastFrameTime) * 1000)) + # logging.info("Entered callback: {} ms after sound start" + # .format( + # (time.monotonic() - self._tSoundRequestPlay) * 1000)) + + toSpk.fill(0.0) # fill buffer with silence to start with + + # check if we have reached the requested play time + outputBufferDacTime = timepoint.outputBufferDacTime + + self.frameN += 1 + for thisSound in self.sounds.copy(): + if thisSound._tSoundRequestPlay > outputBufferDacTime: + continue # not time to play this sound yet + + dat = thisSound._nextBlock(blockSize) + if dat is None: # no data for some reason (e.g., sound finished) + continue + + if thisSound.volume != 1.0: + dat = dat.copy() # avoid modifying original data if we need to adjust volume + dat *= thisSound.volume # Set the volume block by block + + datSize = len(dat) + datDims = len(dat.shape) + + # old method + if self.channels == 2 and datDims == 2: + toSpk[:datSize, :] += dat # add to out stream + elif self.channels == 2 and datDims == 1: + toSpk[:datSize, 0] += dat + toSpk[:datSize, 1] += dat + elif self.channels == 1 and datDims == 2: + toSpk[:datSize, :] += dat + else: + toSpk[:datSize, 0:self.channels] += dat + + # check if that was a short block (sound is finished) + if datSize < len(toSpk[:, :]): + self.remove(thisSound) + thisSound._EOS() + # check if that took a long time + # t1 = time.time() + # if (t1-t0) > 0.001: + # logging.debug("buffer_callback took {:.3f}ms that frame" + # .format((t1-t0)*1000)) + # self.frameTimes.pop(0) + # if hasattr(self, 'lastFrameTime'): + # self.frameTimes.append(time.time()-self.lastFrameTime) + # self.lastFrameTime = time.time() + # if self.takeTimeStamp: + # logging.debug("Callback durations: {}".format(self.frameTimes)) + # self.takeTimeStamp = False + + def add(self, sound): + # t0 = time.time() + self.sounds.append(sound) + # logging.debug("took {} ms to add".format((time.time()-t0)*1000)) + + def remove(self, sound): + if sound in self.sounds: + self.sounds.remove(sound) + + def __del__(self): + if hasattr(self, '_sdStream'): + if not travisCI: + self._sdStream.stop() + del self._sdStream + if hasattr(sys, 'stdout'): + sys.stdout.flush() + + +class SoundDeviceSound(_SoundBase): + """Play a variety of sounds using the SoundDevice library. + """ + def __init__(self, value="C", secs=0.5, octave=4, stereo=-1, + speaker=None, + volume=1.0, loops=0, + sampleRate=None, blockSize=128, + preBuffer=-1, + hamming=True, + startTime=0, stopTime=-1, + name='', + autoLog=True): + """ + Parameters + ---------- + value : str or number or array + The sound to be played. Can be a note name (e.g., "C", "Bfl"), a + filename, a frequency in Hz, or an Nx2 numpy array of floats in the + range -1:1 representing the sound waveform. + secs : float + Duration of the sound (for synthesised tones, ignored for sound files). + octave : int + Which octave to use for note names (4 is middle), ignored for sound + files. + stereo : bool or int + -1 (auto), True or False to force sounds to stereo or mono. Ignored + for sound files. + speaker : str or None + The speaker to use for playback. Can be a name or None to use the + default speaker. + volume : float + Volume of the sound, between 0 and 1. + loops : int + Number of loops to play (-1=forever, 0=single repeat). + sampleRate : int or None + Sample rate for synthesised tones (ignored for sound files). If None, + uses the sample rate of the current stream or a default of 44100 Hz. + blockSize : int + The size of the buffer on the sound card (small for low latency, + large for stability). + preBuffer : int + Integer to control streaming/buffering: + - -1 means store all + - 0 (no buffer) means stream from disk + - potentially we could buffer a few secs(!?) + hamming : bool + Whether the sound should be apodized (i.e., the onset and offset + smoothly ramped up from down to zero). The function apodize uses a + Hanning window, but arguments named 'hamming' are preserved so that + existing code is not broken by the change from Hamming to Hanning + internally. Not applied to sounds from files. + startTime : float + For sound files, this controls the start of the snippet to be played. + stopTime : float + For sound files, this controls the end of the snippet to be played. + name : str + String for logging purposes. + autoLog : bool + Whether to automatically log every change. + + """ + if isinstance(speaker, str) and DeviceManager.getDevice(speaker): + speaker = DeviceManager.getDevice(speaker) + # make sure speaker is a SpeakerDevice + if not isinstance(speaker, SpeakerDevice): + speaker = SpeakerDevice(speaker) + self.speaker = speaker + + self.preBuffer = preBuffer + self.volume = volume + self.sound = value + self.name = name + self.secs = secs # for any synthesised sounds (notesand freqs) + self.octave = octave # for note name sounds + self.loops = loops + self._loopsFinished = 0 + self.startTime = startTime # for files + self.stopTime = stopTime # for files specify thesection to be played + self.blockSize = blockSize # can be per-sound unlike other backends + self.frameN = 0 + self.win = None # for timing play with window flips + self._tSoundRequestPlay = -1 + # offset within the block which the sound started at, for accurate + # timing of play requests + self._blockOffset = -1 # sub-block offest + + if sampleRate: #a rate was requested so use it + self.sampleRate = sampleRate + else: # no requested rate so use current stream or a default of 44100 + rate = 44100 # start with a default + for streamLabel in streams: # then look to see if we have an open stream and use that + rate = streams[streamLabel].sampleRate + self.sampleRate = rate + + self.stereo = stereo + + self.channels = 2 # default to stereo but will be updated by setSound + if isinstance(value, np.ndarray): + self.channels = value.shape[1] # let this be set by stereo + + self.multichannel = False + self.duplex = None + self.autoLog = autoLog + self.streamLabel = "" + self.sourceType = 'unknown' # set to be file, array or freq + self.sndFile = None + self.sndArr = None + self.hamming = hamming + self._hammingWindow = None # will be created during setSound + + # setSound (determines sound type) + self.setSound(value, secs=self.secs, octave=self.octave, + hamming=self.hamming) + self.status = NOT_STARTED + + self._isStarted = False + self._isPlaying = False + self._isFinished = False + + @property + def isPlaying(self): + """`True` if the audio playback is ongoing. + """ + return self._isPlaying + + @property + def stereo(self): + """Whether the sound is stereo (2 channels) or mono (1 channel). + + Setting this will update the `channels` property accordingly, but if + `stereo` is set to -1 (auto), then the number of channels will be + determined automatically based on the sound data. + + """ + return self.__dict__['stereo'] + + @stereo.setter + def stereo(self, val): + self.__dict__['stereo'] = val + if val is True: + self.__dict__['channels'] = 2 + elif val is False: + self.__dict__['channels'] = 1 + elif val == -1: + self.__dict__['channels'] = -1 + + @property + def sampleRateHz(self): + """Get the sample rate of the sound stream, in Hz. + + This is an alias of the `sampleRate` property, provided for compatibility + with other backends. + + Returns + ------- + float or None + Sample rate of the sound stream, in Hz. Returns `None` if the sample + rate is not known (e.g., if the stream has not been created yet). + + """ + return self.sampleRate + + def setSound(self, value, secs=0.5, octave=4, hamming=None, log=True): + """Set the sound to be played. + + Often this is not needed by the user - it is called implicitly during + initialisation. + + Parameters + ---------- + value : int, str, np.ndarray or AudioClip + The sound to be played. Can be a note name (e.g., "C", "Bfl"), a filename, + a frequency in Hz, or an Nx2 numpy array of floats in the range -1:1 + representing the sound waveform. + secs : float + Duration of the sound (for synthesised tones, ignored for sound files). + octave : int + Which octave to use for note names (4 is middle), ignored for sound files. + Middle octave of a piano is 4. Most computers won't output sounds in the + bottom octave (1) and the top octave (8) is generally painful. + hamming : bool or None + Whether the sound should be apodized (i.e., the onset and offset smoothly + ramped up from down to zero). The function apodize uses a Hanning window, + but arguments named 'hamming' are preserved so that existing code is not + broken by the change from Hamming to Hanning internally. Not applied to + sounds from files. + log : bool + Whether to log this change. + + """ + # start with the base class method + _SoundBase.setSound(self, value, secs, octave, hamming, log) + + try: + label, s = streams.getStream( + sampleRate=self.sampleRate, + channels=self.channels, + blockSize=self.blockSize) + except SoundFormatError as err: + # try to use something similar (e.g. mono->stereo) + # then check we have an appropriate stream open + altern = streams._getSimilar( + sampleRate=self.sampleRate, + channels=-1, + blockSize=-1) + + if altern is None: + raise err + else: # safe to extract data + label, s = altern + + # update self in case it changed to fit the stream + self.sampleRate = s.sampleRate + self.channels = s.channels + self.blockSize = s.blockSize + + self.streamLabel = label + + if hamming is None: + hamming = self.hamming + else: + self.hamming = hamming + + if not hamming: + return + + # 5ms or 15th of stimulus (for short sounds) + hammDur = min(0.005, # 5ms + self.secs / 15.0) # 15th of stim + self._hammingWindow = HammingWindow( + winSecs=hammDur, + soundSecs=self.secs, + sampleRate=self.sampleRate) + + def _setSndFromClip(self, clip): + """Set the sound from an AudioClip object. + + Parameters + ---------- + clip : AudioClip + The AudioClip object containing the sound data to be set. + + """ + if self.channels == -1: + if self.stereo == 0: + self.channels = 1 + elif self.stereo == 1: + self.channels = 2 + + thisArray = clip.samples + + self.sndArr = np.asarray(thisArray) + if thisArray.ndim == 1: + self.sndArr.shape = [len(thisArray), 1] # make 2D for broadcasting + if self.channels == 2 and self.sndArr.shape[1] == 1: # mono -> stereo + self.sndArr = self.sndArr.repeat(2, axis=1) + elif self.sndArr.shape[1] == 1: # if channels in [-1,1] then pass + pass + else: + try: + self.sndArr.shape = [len(thisArray), self.channels] + except ValueError: + raise ValueError( + "Failed to format sound with shape {} into sound " + "with channels={}".format( + self.sndArr.shape, self.channels)) + + # is this stereo? + if self.stereo == -1: # auto stereo. Try to detect + if self.sndArr.shape[1] == 1: + self.stereo = 0 + elif self.sndArr.shape[1] == 2: + self.stereo = 1 + elif self.sndArr.shape[1] >= 2: + self.multichannel = True + # raise IOError("Couldn't determine whether array is " + # "stereo. Shape={}".format(self.sndArr.shape)) + + self._nSamples = thisArray.shape[0] + if self.stopTime == -1: + self.duration = self._nSamples / float(self.sampleRate) + else: + self.duration = self.secs + # set to run from the start: + self.seek(0) + self.sourceType = "array" + + @property + def isPlaying(self): + """`True` if the audio playback is ongoing.""" + # This will update _isPlaying if sound has stopped by _EOS() + return self._isPlaying + + @property + def isFinished(self): + """`True` if the audio playback has completed.""" + return self._isFinished + + def _channelCheck(self, array): + """Checks whether stream has fewer channels than data. If so, raises an error + with instructions to user. + + """ + if self.channels < array.shape[1]: + msg = ("The sound stream is set up incorrectly. You have fewer channels in the buffer " + "than in data file ({} vs {}).\n**Ensure you have selected 'Force stereo' in " + "experiment settings**".format(self.channels, array.shape[1])) + logging.error(msg) + raise ValueError(msg) + + def start(self): + """Start the audio stream. + + This starts the audio stream and prepares it for playback. Calling this + sometime before `play` can help to reduce latency when `play` is called, + as the stream will already be active and ready to receive audio data. + However, if `play` is called without first calling `start`, the stream will + be started automatically. + + """ + print("Starting stream {}...".format(self.streamLabel)) + streams[self.streamLabel].takeTimeStamp = True + streams[self.streamLabel].add(self) + self._isStarted = True + + def play(self, loops=None, when=None, log=None): + """Start playing the sound. + + Parameters + -------------- + loops : int or None + Number of loops to play (-1=forever, 0=single repeat). If `None`, uses the + value set during initialisation. + when: float, `psychopy.visual.Window` or None + Time to begin playback, in seconds relative to the global clock. If a + `psychopy.visual.Window` is passed, the audio will be played at the + next window flip. If 0.0 or `None`, playback will start immediately. + + """ + if self.isPlaying: + return + + if not self._isStarted: + self.start() + + if loops is not None and self.loops != loops: + # TODO - loop logic doesn't work with generated sounds + self.setLoops(loops) + + self._isPlaying = True + self._tSoundRequestPlay = time.monotonic() + + # handle scheduling of play time + logTime = None + if when is not None: + if isinstance(when, (int, float)): + self._tSoundRequestPlay += when + elif hasattr(when, 'getFutureFlipTime'): + logTime = when.getFutureFlipTime(clock=None) + when = when.getFutureFlipTime(clock='now') + self._tSoundRequestPlay += when + else: + if hasattr(self.win, 'getFutureFlipTime'): + logTime = self.win.getFutureFlipTime(clock=None) + when = self.win.getFutureFlipTime(clock='now') + self._tSoundRequestPlay += when + + if log and self.autoLog: + logging.exp(u"Playing sound %s on speaker %s" % ( + self.name, self.speaker.name), obj=self, t=logTime) + + def pause(self): + """Stop the sound but play will continue from here if needed. + """ + streams[self.streamLabel].remove(self) + # eventually we will keep the stream 'hot' and `stop` will actually + # stop the stream and reset to the beginning + self._isPlaying = False + + def stop(self, reset=True): + """Stop the sound and return to beginning. + + Parameters + ---------- + reset : bool + If `True`, the sound will be reset to the beginning (i.e., `t=0`) when + stopped. If `False`, the sound will not be reset, so that if `play` + is called again, the sound will resume from the current position rather + than the beginning. + + """ + if not self.isPlaying: + return + + streams[self.streamLabel].remove(self) + if reset: + self.seek(0) + + self._isPlaying = self._isStarted = False + + def _nextBlock(self, blockSize=None): + """Get the next block of sound data to be played. + + This is called internally by the sound stream during playback. It retrieves + the next block of sound data based on the current time and the sound's properties, + applies any necessary processing (e.g., Hamming window), and returns the block of + data to be played. + + Parameters + ---------- + blockSize : int or None + The size of the block of audio data to be returned. If `None`, uses the + block size configured for the stream. + + Returns + ------- + block : np.ndarray + The next block of sound data to be played that should be passed to the + stream buffer. The shape is determined by the audio stream's channel + configuration (e.g., mono or stereo) and chunk size. + + """ + if not self.isPlaying: + return + + samplesLeft = int((self.duration - self.t) * self.sampleRate) + blockSize = blockSize or self.blockSize + nSamples = min(blockSize, samplesLeft) + + if self.sourceType == 'file' and self.preBuffer == 0: + # streaming sound block-by-block direct from file + block = self.sndFile.read(nSamples) + # TODO: check if we already finished using sndFile? + elif (self.sourceType == 'file' and self.preBuffer == -1) \ + or self.sourceType == 'array': + # An array, or a file entirely loaded into an array + ii = int(round(self.t * self.sampleRate)) + if self.stereo == 1 or self.multichannel: # don't treat as boolean. Might be -1 + block = self.sndArr[ii:ii + nSamples, :] + elif self.stereo == 0: + block = self.sndArr[ii:ii + nSamples] + else: + raise IOError("Unknown stereo type {!r}".format(self.stereo)) + if ii + nSamples > len(self.sndArr): + self._EOS() + elif self.sourceType == 'freq': + startT = self.t + stopT = self.t + blockSize / float(self.sampleRate) + uu = self.freq * _piTimes2 + xx = np.linspace( + start=startT * uu, + stop=stopT * uu, + num=blockSize, endpoint=False + ) + xx.shape = [blockSize, 1] + block = np.sin(xx) + # if run beyond our desired t then set to zeros + if stopT > (self.secs): + tRange = np.linspace( + startT, stopT, + num=blockSize, + endpoint=False) + block[tRange > self.secs] = 0 + # and inform our EOS function that we finished + self._EOS(reset=False) # don't set t=0 + + else: + raise IOError("SoundDeviceSound._nextBlock doesn't correctly handle" + "{!r} sounds yet".format(self.sourceType)) + + if self._hammingWindow: + thisWin = self._hammingWindow.nextBlock(self.t, self.blockSize) + if thisWin is not None: + if len(block) == len(thisWin): + block *= thisWin + elif block.shape[0] == 0: + pass + else: + block *= thisWin[0:len(block)] + + self.t += self.blockSize / float(self.sampleRate) + + return block + + def seek(self, t): + """Seek to a specific time in the sound. + + Parameters + ---------- + t : float + The time (in seconds) to seek to. + + """ + self.t = t + self.frameN = int(round(t * self.sampleRate)) + if self.sndFile and not self.sndFile.closed: + self.sndFile.seek(self.frameN) + + def _EOS(self, reset=True): + """End-of-stream (EOS) callback for when a sound finishes playing. + + This is called internally by the sound stream when a sound has finished + playing. It checks whether the number of loops has been completed and if so, + stops the sound and removes it from the stream. + + Parameters + ---------- + reset : bool + If `True`, the sound will be reset to the beginning (i.e., `t=0`) when + stopped. If `False`, the sound will not be reset, so that if `play` + is called again, the sound will resume from the current position rather + than the beginning. + + """ + self._loopsFinished += 1 + if self.loops == 0: + self.stop(reset=reset) + self._isFinished = True + elif self.loops > 0 and self._loopsFinished >= self.loops: + self.stop(reset=reset) + self._isFinished = True + + @property + def stream(self): + """Read-only property returns the the stream on which the sound + will be played. + """ + return streams[self.streamLabel] + + + def _setSndFromArrayLegacy(self, thisArray): + """ + Prior to 2025.1.0, _SoundBase didn't have a `_setSndFromArray` method to + inherit. This legacy method can be substituted in if the version of + PsychoPy installed is too old. + """ + from psychopy.sound.audioclip import AudioClip + clip = AudioClip(thisArray, sampleRateHz=self.sampleRate) + self._setSndFromClip(clip) + + +if not hasattr(SoundDeviceSound, "_setSndFromArray"): + SoundDeviceSound._setSndFromArray = SoundDeviceSound._setSndFromArrayLegacy + +# entry point for sound module to import the correct Sound class +Sound = SoundDeviceSound -class getStreamLabel( - PluginStub, - plugin="psychopy-sounddevice", - docsHome="https://github.com/psychopy/psychopy-sounddevice", -): +if __name__ == "__main__": pass diff --git a/psychopy/sound/microphone.py b/psychopy/sound/microphone.py index 1088c569..831d5eb1 100644 --- a/psychopy/sound/microphone.py +++ b/psychopy/sound/microphone.py @@ -15,9 +15,17 @@ from psychopy.constants import NOT_STARTED from psychopy.hardware import DeviceManager from psychopy.tools.attributetools import logAttrib +import numpy as np class Microphone: + """Class for managing audio capture devices. + + This class provides a high-level interface for recording audio from a + microphone, storing clips, and saving them to files. The actual audio + capture is handled by a backend-specific device class. + + """ def __init__( self, device=None, @@ -36,21 +44,27 @@ def __init__( ): # store name self.name = name + # store folder self.recordingFolder = Path(recordingFolder) + # store ext (without dot) while recordingExt.startswith("."): recordingExt = recordingExt[1:] self.recordingExt = recordingExt + # look for device if initialised self.device = DeviceManager.getDevice(device) + # if no matching name, try matching index if self.device is None: self.device = DeviceManager.getDeviceBy("index", device) + # if still no match, make a new device if self.device is None: self.device = DeviceManager.addDevice( - deviceClass="psychopy.hardware.microphone.MicrophoneDevice", deviceName=device, + deviceClass="psychopy.hardware.microphone.MicrophoneDevice", + deviceName=device, index=device, sampleRateHz=sampleRateHz, channels=channels, @@ -60,19 +74,46 @@ def __init__( exclusive=exclusive, audioRunMode=audioRunMode ) + # set policy when full (in case device already existed) - self.device.policyWhenFull = policyWhenFull + self.policyWhenFull = policyWhenFull + + # internal variables for managing recording state + self._tRecordingStartRequested = None + self._tRecordingStopRequested = None + self._isPaused = False # if recordig has been paused + + # stream object writes samples to this buffer + self._recordingBuffer = [] + self._nRecordedFrames = 0 + self._active = False # whether the microphone is currently active (i.e. recording or paused) + self._startRecOffset = 0 + self._endRecOffset = 0 + # setup clips and transcripts dicts self.clips = {} self.lastClip = None self.scripts = {} self.lastScript = None + # set initial status self.status = NOT_STARTED def __del__(self): self.saveClips() + @staticmethod + def getAvailableDevices(): + """Get a list of available microphone devices. + + Returns + ------- + list of dict + + """ + from psychopy.hardware.microphone import MicrophoneDevice + return MicrophoneDevice.getAvailableDevices() + @property def maxRecordingSize(self): """ @@ -123,7 +164,7 @@ def policyWhenFull(self): @policyWhenFull.setter def policyWhenFull(self, value): - return self.device.policyWhenFull + self.device.policyWhenFull = value def setPolicyWhenFull(self, value): self.policyWhenFull = value @@ -133,6 +174,10 @@ def setPolicyWhenFull(self, value): ) setPolicyWhenFull.__doc__ = policyWhenFull.__doc__ + @property + def sampleRateHz(self): + return self.device.sampleRateHz + @property def recording(self): return self.device.recording @@ -182,33 +227,104 @@ def isRecording(self): return self.device.isRecording def start(self, when=None, waitForStart=0, stopTime=None): - return self.device.start( - when=when, waitForStart=waitForStart, stopTime=stopTime - ) + """Start recording audio from the microphone. The recording will continue + until stop() is called, or until the optional stopTime is reached. + + Alias of the `record()` method. + + """ + return self.record(when=when, waitForStart=waitForStart, stopTime=stopTime) def record(self, when=None, waitForStart=0, stopTime=None): - return self.start( - when=when, waitForStart=waitForStart, stopTime=stopTime - ) + """Start recording audio from the microphone. The recording will continue + until stop() is called, or until the optional stopTime is reached. + + Parameters + ---------- + when : float or None + Time at which to start recording, in the timebase used by the microphone + device. If None (the default), recording will start immediately. + waitForStart : float + If > 0, record() will block until the recording has actually started, and + will return the time at which recording started. + stopTime : float or None + Time at which to stop recording from the start of the recording in seconds. + If None (the default), recording will continue until stop() is called. + + Returns + ------- + float + The time at which recording started, in the timebase used by the + microphone device. + + """ + now = self.getTime() + self._tRecordingStartRequested = now if when is None else now + when + if stopTime is not None: + self._tRecordingStopRequested = self._tRecordingStartRequested + stopTime + + self.device.bind(self) # register with device to receive audio data + + return self._tRecordingStartRequested def stop(self, blockUntilStopped=True, stopTime=None): - return self.device.stop( - blockUntilStopped=blockUntilStopped, stopTime=stopTime - ) + """Stop recording audio from the microphone. + """ + # result = self.device.stop( + # blockUntilStopped=blockUntilStopped, stopTime=stopTime + # ) + + if stopTime is not None: + self._tRecordingStopRequested = self.getTime() + stopTime + + self.device.unbind(self) # unregister from device to stop receiving audio data + self._tRecordingStartRequested = -1.0 # reset + self._tRecordingStopRequested = None + + return 0.0 def pause(self, blockUntilStopped=True, stopTime=None): return self.stop( blockUntilStopped=blockUntilStopped, stopTime=stopTime ) + def open(self): + """Open the microphone device for recording. Must be called before + recording can begin. + """ + # unregister from device + # self.device.bind(self) + return self.device.open() + def close(self): + """Close the microphone device and release any resources. Should be + called when finished with the device. + """ + # unregister from device + # self.device.unbind(self) + return self.device.close() def reopen(self): return self.device.reopen() def poll(self): + """Poll the microphone device for new audio data. This method can be + called periodically while recording to check for new audio data. + """ return self.device.poll() + + def getTime(self): + """Current time in the timebase used by the microphone device. + This is used for timestamping recordings and clips. + + Returns + ------- + float + Current time in seconds. + + """ + return self.device._getTime() def saveClips(self, clear=True): """ @@ -322,7 +438,7 @@ def bank(self, tag=None, transcribe=False, **kwargs): self.scripts[tag].append(self.lastScript) # clear recording buffer - self.device._recording.clear() + self._recordingBuffer.clear() # return banked items if transcribe: @@ -336,10 +452,17 @@ def clear(self): # clear clips self.clips = {} # clear recording - self._recording.clear() + self._recordingBuffer.clear() def flush(self): - """Get a copy of all banked clips, then clear the clips from storage.""" + """Get a copy of all banked clips, then clear the clips from storage. + + Returns + ------- + dict + A dictionary containing all banked clips. + + """ # get copy of clips dict clips = self.clips.copy() self.clear() @@ -347,9 +470,51 @@ def flush(self): return clips def getRecording(self): - return self.device.getRecording() + """Get the current recording buffer as an AudioClip object. + + Returns + ------- + AudioClip + The current recording buffer as an AudioClip object. + + """ + if self.device is None: + logging.warning("No microphone device found, cannot get recording.") + return None + + + if not self._recordingBuffer: + logging.warning("No audio data in recording buffer.") + return None + + # trim samples in buffer according to start and end offsets + if self._startRecOffset > 0: + self._recordingBuffer[0] = self._recordingBuffer[0][self._startRecOffset:] + + # collapse recording buffer into a single array + self._recordingBuffer = [ + np.concatenate(self._recordingBuffer, axis=0, dtype=np.float32)] + + # reset offsets + self._startRecOffset = 0 + self._endRecOffset = 0 + + from psychopy.sound.audioclip import AudioClip + + return AudioClip( + samples=self._recordingBuffer[0], + sampleRateHz=self.device.sampleRateHz + ) def getCurrentVolume(self): + """Get the microphone volume. + + Returns + ------- + float + Current microphone volume (0.0 to 1.0). + + """ return self.device.getCurrentVolume() diff --git a/psychopy/sound/sound.py b/psychopy/sound/sound.py index fffae294..053bf5d9 100644 --- a/psychopy/sound/sound.py +++ b/psychopy/sound/sound.py @@ -1,4 +1,5 @@ import importlib.metadata +from psychopy.preferences import prefs class Sound: @@ -7,18 +8,54 @@ class Sound: implementations of Sound. """ - # name of the backend to use for Sound objects - backend = "ptb" + # selected backend + backend = None + # known backends + backends = { + 'ptb': importlib.metadata.EntryPoint( + name="ptb", + value="psychopy.sound.backend_ptb", + group="psychopy.sound.backends" + ), + 'sounddevice': importlib.metadata.EntryPoint( + name="sounddevice", + value="psychopy.sound.backend_sounddevice", + group="psychopy.sound.backends" + ) + } + # alias backend names + backends['psychtoolbox'] = backends['ptb'] + backends['sd'] = backends['sounddevice'] def __new__(cls, *args, **kwargs): - # get backends - backends = cls.getBackends() + backend = cls.resolveBackend() + + return backend.Sound(*args, **kwargs) + + @classmethod + def resolveBackend(cls): + backend = cls.backend + # if backend is None, get from prefs + if backend is None: + backend = prefs.hardware['audioLib'] + # handle list + if isinstance(backend, (list, tuple)): + try: + # try to get the first valid backend + backend = [ + val for val in backend if val in cls.backends + ][0] + except: + # otherwise get the first backend + backend = backend[0] # if not present, error - if cls.backend not in backends: - raise ModuleNotFoundError(f"Invalid value '{cls.backend}' for Sound.backend, known backends are: {list(backends)}") + if backend not in cls.backends: + raise ModuleNotFoundError( + f"Invalid value '{backend}' for {cls.__name__}.backend, known backends are: {list(cls.backends)}" + ) + # import backend - backend = backends[cls.backend].load() - return backend.Sound(*args, **kwargs) + return cls.backends[backend].load() @classmethod def getBackends(cls): @@ -31,28 +68,10 @@ def getBackends(cls): Dict mapping backend names to backend entry points - call `.load` on an entry point to import the relevant module. """ - # start off with builtin backends - backends = { - ep.name: ep for ep in [ - importlib.metadata.EntryPoint( - name="ptb", - value="psychopy.sound.backend_ptb", - group="psychopy.sound.backends" - ), - importlib.metadata.EntryPoint( - name="pygame", - value="psychopy.sound.backend_pygame", - group="psychopy.sound.backends" - ), - importlib.metadata.EntryPoint( - name="pysound", - value="psychopy.sound.backend_pysound", - group="psychopy.sound.backends" - ) - ] - } - # get others from plugins - for ep in importlib.metadata.entry_points(group="psychopy.sound.backends"): - backends[ep.name] = ep - return backends \ No newline at end of file + return cls.backends + + +# get sound backends from plugins +for ep in importlib.metadata.entry_points(group="psychopy.hardware.speaker.backends"): + Sound.backends[ep.name] = ep diff --git a/psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png b/psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png index bea8d47c..53eaa68f 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png and b/psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_0_center.png b/psychopy/tests/data/Test_textbox/test_ori_0_center.png index 26826335..7c0a755e 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_0_center.png and b/psychopy/tests/data/Test_textbox/test_ori_0_center.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_0_top left.png b/psychopy/tests/data/Test_textbox/test_ori_0_top left.png index e9ba29de..e9a96b6d 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_0_top left.png and b/psychopy/tests/data/Test_textbox/test_ori_0_top left.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png b/psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png index 844290c2..a5e3596a 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png and b/psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_120_center.png b/psychopy/tests/data/Test_textbox/test_ori_120_center.png index e2858b98..9592b517 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_120_center.png and b/psychopy/tests/data/Test_textbox/test_ori_120_center.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_120_top left.png b/psychopy/tests/data/Test_textbox/test_ori_120_top left.png index 92f25dcc..fd300790 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_120_top left.png and b/psychopy/tests/data/Test_textbox/test_ori_120_top left.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png b/psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png index d5db862b..4e3a51e9 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png and b/psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_180_center.png b/psychopy/tests/data/Test_textbox/test_ori_180_center.png index 8a88cd3b..f22eba8d 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_180_center.png and b/psychopy/tests/data/Test_textbox/test_ori_180_center.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_180_top left.png b/psychopy/tests/data/Test_textbox/test_ori_180_top left.png index e7409994..a7e48122 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_180_top left.png and b/psychopy/tests/data/Test_textbox/test_ori_180_top left.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png b/psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png index 81c9e0d1..4dc112b6 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png and b/psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_240_center.png b/psychopy/tests/data/Test_textbox/test_ori_240_center.png index 03035b7a..170adf09 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_240_center.png and b/psychopy/tests/data/Test_textbox/test_ori_240_center.png differ diff --git a/psychopy/tests/data/Test_textbox/test_ori_240_top left.png b/psychopy/tests/data/Test_textbox/test_ori_240_top left.png index c73f2638..80697249 100644 Binary files a/psychopy/tests/data/Test_textbox/test_ori_240_top left.png and b/psychopy/tests/data/Test_textbox/test_ori_240_top left.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_LTR.png new file mode 100644 index 00000000..8a512087 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_RTL.png b/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_RTL.png new file mode 100644 index 00000000..682fe217 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_all_html_RTL.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_LTR.png new file mode 100644 index 00000000..da4b2331 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_RTL.png b/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_RTL.png new file mode 100644 index 00000000..18091341 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_all_md_RTL.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_bold_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_bold_md_LTR.png new file mode 100644 index 00000000..9b71f713 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_bold_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_bolditalic_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_bolditalic_md_LTR.png new file mode 100644 index 00000000..353f6f06 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_bolditalic_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_color_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_color_md_LTR.png new file mode 100644 index 00000000..34bf3086 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_color_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_escaped_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_escaped_md_LTR.png new file mode 100644 index 00000000..81a57f28 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_escaped_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_html_raw_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_html_raw_LTR.png new file mode 100644 index 00000000..654202bc Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_html_raw_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_italic_md_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_italic_md_LTR.png new file mode 100644 index 00000000..18696f24 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_italic_md_LTR.png differ diff --git a/psychopy/tests/data/Test_textbox_textbox_formatting_md_raw_LTR.png b/psychopy/tests/data/Test_textbox_textbox_formatting_md_raw_LTR.png new file mode 100644 index 00000000..464e30b0 Binary files /dev/null and b/psychopy/tests/data/Test_textbox_textbox_formatting_md_raw_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_LTR.png new file mode 100644 index 00000000..d731deae Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_RTL.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_RTL.png new file mode 100644 index 00000000..3fbf5fe8 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_html_RTL.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_LTR.png new file mode 100644 index 00000000..fa731eb8 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_RTL.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_RTL.png new file mode 100644 index 00000000..64f24fa1 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_all_md_RTL.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bold_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bold_md_LTR.png new file mode 100644 index 00000000..ead04f7d Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bold_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bolditalic_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bolditalic_md_LTR.png new file mode 100644 index 00000000..eaeac214 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_bolditalic_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_color_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_color_md_LTR.png new file mode 100644 index 00000000..d9e94f32 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_color_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_escaped_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_escaped_md_LTR.png new file mode 100644 index 00000000..c440f038 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_escaped_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_html_raw_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_html_raw_LTR.png new file mode 100644 index 00000000..e156e474 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_html_raw_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_italic_md_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_italic_md_LTR.png new file mode 100644 index 00000000..9abd7654 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_italic_md_LTR.png differ diff --git a/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_md_raw_LTR.png b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_md_raw_LTR.png new file mode 100644 index 00000000..be119375 Binary files /dev/null and b/psychopy/tests/data/Test_uax14_textbox_textbox_formatting_md_raw_LTR.png differ diff --git a/psychopy/tests/data/textbox_rtl.png b/psychopy/tests/data/textbox_rtl.png new file mode 100644 index 00000000..66324f0b Binary files /dev/null and b/psychopy/tests/data/textbox_rtl.png differ diff --git a/psychopy/tests/test_Installation.py b/psychopy/tests/test_Installation.py index 072a3446..182da3e0 100644 --- a/psychopy/tests/test_Installation.py +++ b/psychopy/tests/test_Installation.py @@ -2,7 +2,6 @@ import pytest def test_essential_imports(): - import wx import numpy import scipy import matplotlib diff --git a/psychopy/tests/test_app/__init__.py b/psychopy/tests/test_app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/psychopy/tests/test_app/conftest.py b/psychopy/tests/test_app/conftest.py new file mode 100644 index 00000000..80325d4d --- /dev/null +++ b/psychopy/tests/test_app/conftest.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# emacs: -*- mode: python-mode; py-indent-offset: 4; tab-width: 4; indent-tabs-mode: nil -*- +# ex: set sts=4 ts=4 sw=4 noet: + +""" +py.test fixtures to create an instance of PsychoPyApp for testing +""" + +import pytest +from packaging.version import Version +import psychopy.app as app +from PIL import Image +Image.DEBUG = False + +if Version(pytest.__version__) < Version('5'): + class VersionError(Exception): + pass + raise VersionError("PsychoPy test suite requires pytest>=5.4") + + +# this method seems to work on at least Pytest 5.4+ +@pytest.fixture(scope='session') +def get_app(request): + + # set_up + app.startApp(showSplash=False, testMode=True) + + # yield, to let all tests within the scope run + _app = app.getAppInstance() + yield _app + + # teasr_down: then clear table at the end of the scope + app.quitApp() + + + +if __name__ == '__main__': + pytest.main() diff --git a/psychopy/tests/test_app/test_builder/__init__.py b/psychopy/tests/test_app/test_builder/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/psychopy/tests/test_app/test_builder/test_BuilderFrame.py b/psychopy/tests/test_app/test_builder/test_BuilderFrame.py new file mode 100644 index 00000000..387ff6f9 --- /dev/null +++ b/psychopy/tests/test_app/test_builder/test_BuilderFrame.py @@ -0,0 +1,166 @@ +from os import path +import shutil +import py_compile +from tempfile import mkdtemp +import codecs +import pytest +import locale +import time + +import psychopy.experiment +from psychopy import prefs +from psychopy.app.builder.dialogs import DlgComponentProperties +from psychopy.experiment import Param + +# Jeremy Gray March 2011 + +# caveats when comparing files: +# - dicts have no defined order, can load and save differently: use a +# known-diff file to suppress boring errors. This situation was +# addressed in 7e2c72a for stimOut by sorting the keys +# - namespace.makeValid() can change var names from the orig demos, +# but should not do so from a load-save-load because only the first +# load should change things +from psychopy.experiment.components.unknown import UnknownComponent + +allComponents = psychopy.experiment.getComponents(fetchIcons=False) +import wx + + +class Test_BuilderFrame(): + """This test fetches all standard components and checks that, with default + settings, they can be added to a Routine and result in a script that compiles + """ + + def setup_method(self): + + self.here = path.abspath(path.dirname(__file__)) + self.tmp_dir = mkdtemp(prefix='psychopy-tests-app') + + def teardown_method(self): + shutil.rmtree(self.tmp_dir, ignore_errors=True) + + @pytest.mark.usefixtures("get_app") + def test_BuilderFrame(self, get_app): + """Tests of the Builder frame. We can call dialog boxes using + a timeout (will simulate OK being pressed) + """ + builderView = get_app.newBuilderFrame() # self._app comes from requires_app + + expfile = path.join(prefs.paths['tests'], + 'data', 'test001EntryImporting.psyexp') + builderView.fileOpen(filename=expfile) + builderView.setExperimentSettings(timeout=2000) + builderView.isModified = False + builderView.runFile() + builderView.closeFrame() + + def _getCleanExp(self, app): + """""" + builder = app.newBuilderFrame() + exp = builder.exp + exp.addRoutine('testRoutine') + testRoutine = exp.routines['testRoutine'] + exp.flow.addRoutine(testRoutine, 0) + return exp + + def _checkCompileWith(self, thisComp, app): + """Adds the component to the current Routine and makes sure it still + compiles + """ + filename = thisComp.params['name'].val+'.py' + filepath = path.join(self.tmp_dir, filename) + + exp = self._getCleanExp(app) + testRoutine = exp.routines['testRoutine'] + testRoutine.addComponent(thisComp) + #make sure the mouse code compiles + + # generate a script, similar to 'lastrun.py': + buff = exp.writeScript() # is a StringIO object + script = buff.getvalue() + assert len(script) > 1500 # default empty script is ~2200 chars + + # save the script: + f = codecs.open(filepath, 'w', 'utf-8') + f.write(script) + f.close() + + # compile the temp file to .pyc, catching error msgs (including no file at all): + py_compile.compile(filepath, doraise=True) + return filepath + 'c' + + def test_MessageDialog(self): + """Test the message dialog + """ + from psychopy.app.dialogs import MessageDialog + dlg = MessageDialog(message="Just a test", timeout=500) + ok = dlg.ShowModal() + assert ok == wx.ID_OK + + @pytest.mark.usefixtures("get_app") + def test_ComponentDialogs(self, get_app): + """Test the message dialog + """ + builderView = get_app.newBuilderFrame() # self._app comes from requires_app + componsPanel = builderView.componentButtons + for compBtn in list(componsPanel.compButtons): + # simulate clicking the button for each component + assert compBtn.onClick(timeout=500) + builderView.isModified = False + builderView.closeFrame() + del builderView, componsPanel + + @pytest.mark.usefixtures("get_app") + def test_param_validator(self, get_app): + """Test the code validator for component parameters""" + builderView = get_app.newBuilderFrame() + # Make experiment with a component + exp = self._getCleanExp(get_app) + comp = UnknownComponent(exp, "testRoutine", "testComponent") + exp.routines['testRoutine'].append(comp) + + # Define 'tykes' - combinations of values likely to cause an error if certain features aren't working + tykes = [ + {'fieldName': "brokenCode", 'param': Param(val="for + :", valType="code"), 'msg': "Python syntax error in field `brokenCode`: "}, # Make sure it's picking up clearly broken code + {'fieldName': "variableDef", 'param': Param(val="visual = 1", valType="extendedCode"), 'msg': "Setting the variable `visual` will overwrite an existing variable (Psychopy module)"}, + {'fieldName': "correctAns", 'param': Param(val="'space'", valType="code"), 'msg': ""}, # Single-element lists should not cause warning + ] + for case in tykes: + # Give each param a label + case['param'].label = case['fieldName'] + # Add each param to the component + comp.params[case['fieldName']] = case['param'] + + # Test component dlg + dlg = DlgComponentProperties( + frame=builderView, + element=comp, + experiment=exp, + timeout=500) + # Does the message delivered by the validator match what is expected? + for case in tykes: + # get warning for the relevant ctrl + warning = dlg.paramCtrls[case['fieldName']].valueCtrl.getWarning() + # make sure warning is correct + if case['msg']: + assert case['msg'] in warning.msg, ( + "Param {fieldName} with value `{param}` should raise a warning:\n" + "{msg}\n" + "but instead raised:\n" + "{actual}\n" + ).format( + **case, + actual=warning.msg + ) + else: + assert warning is None, ( + "Param {fieldName} with value `{param}` should not raise a warning, but " + "raised:\n" + "{actual}" + ).format( + **case, + actual=warning.msg + ) + # Cleanup + dlg.Destroy() diff --git a/psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py b/psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py new file mode 100644 index 00000000..af711b73 --- /dev/null +++ b/psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py @@ -0,0 +1,133 @@ +import pytest +import shutil +from tempfile import mkdtemp +import os + + +"""Each test class creates a context subclasses _baseVisualTest to run a series +of tests on a single graphics context (e.g. pyglet with shaders) + +To add a new stimulus test use _base so that it gets tested in all contexts + +""" +import psychopy +from psychopy import experiment +from psychopy.app import getAppInstance +import psychopy.scripts.psyexpCompile as psyexpCompile + +import codecs +from pathlib import Path + +keepFiles = False + +thisDir = Path(__file__).parent +psychoRoot = Path(psychopy.__file__).parent +demosDir = psychoRoot / 'demos' +testsDataDir = psychoRoot/'tests/data' + + + +class Test_PsychoJS_from_Builder(): + """Some tests just for the window - we don't really care about what's drawn inside it + """ + @pytest.mark.usefixtures("get_app") + def setup_class(self): + if keepFiles: + self.temp_dir = Path.home() / "Desktop" / "tmp" + else: + self.temp_dir = Path(mkdtemp(prefix='psychopy-test_psychojs')) + + self.builderView = getAppInstance().newBuilderFrame() # self._app comes from requires_app + + def teardown_class(self): + if not keepFiles: + shutil.rmtree(self.temp_dir) + + def writeScript(self, exp, outFolder): + script = exp.writeScript(expPath=outFolder, target="PsychoJS") + with codecs.open(outFolder/'index.html', 'w', + encoding='utf-8-sig') as f: + f.write(script) + + def compileScript(self, infile=None, version=None, outfile=None): + """ + Compile script used to test whether JS modular files are written + :param infile: psyexp file + :param version: Version to use + :param outfile: For testing JS filename + :return: True + """ + psyexpCompile.compileScript(infile, version, outfile) + return True + + def test_stroop(self): + #load experiment + exp = experiment.Experiment() + exp.loadFromXML(demosDir/'builder'/'Experiments'/'stroop'/'stroop.psyexp') + # try once packaging up the js libs + outFolder = self.temp_dir/'stroopJS_remote/html' + os.makedirs(outFolder) + self.writeScript(exp, outFolder) + + def test_blocked(self): + # load experiment + exp = experiment.Experiment() + exp.loadFromXML(demosDir/'builder'/'Design Templates'/'randomisedBlocks'/'randomisedBlocks.psyexp') + # try once packaging up the js libs + outFolder = self.temp_dir/'blocked_packaged/html' + os.makedirs(outFolder) + self.writeScript(exp, outFolder) + print("files in {}".format(outFolder)) + + def test_JS_script_output(self): + # Load experiment + exp = experiment.Experiment() + exp.loadFromXML(demosDir/'builder'/'Experiments'/'stroop'/'stroop.psyexp') + outFolder = self.temp_dir/'stroopJS_output/html' + outFile = outFolder/'stroop.js' + os.makedirs(outFolder) + # Compile scripts + assert(self.compileScript(infile=exp, version=None, + outfile=str(outFile))) + # Test whether files are written + assert(os.path.isfile(os.path.join(outFolder, 'stroop.js'))) + assert(os.path.isfile(os.path.join(outFolder, 'stroop-legacy-browsers.js'))) + assert(os.path.isfile(os.path.join(outFolder, 'index.html'))) + assert(os.path.isdir(os.path.join(outFolder, 'resources'))) + + def test_getHtmlPath(self): + """Test retrieval of html path""" + self.temp_dir = mkdtemp(prefix='test') + fileName = os.path.join(self.temp_dir, 'testFile.psyexp') + htmlPath = os.path.join(self.temp_dir, self.builderView.exp.htmlFolder) + assert self.builderView._getHtmlPath(fileName) == htmlPath + + def test_getExportPref(self): + """Test default export preferences""" + assert self.builderView._getExportPref('on Sync') + assert not self.builderView._getExportPref('on Save') + assert not self.builderView._getExportPref('manually') + with pytest.raises(ValueError): + self.builderView._getExportPref('DoesNotExist') + + def test_onlineExtraResources(self): + """Open an experiment with resources in the format of 2020.5 + (i.e. broken with \\ and with .. at start)""" + expFile = (testsDataDir / + 'broken2020_2_5_resources/broken_resources.psyexp') + exp = experiment.Experiment() + exp.loadFromXML(expFile) + resList = exp.settings.params['Resources'].val + print(resList) + assert type(resList) == list + assert (not resList[0].startswith('..')) + + +if __name__ == '__main__': + cls = Test_PsychoJS_from_Builder() + cls.setup_class() + cls.test_stroop() + cls.test_blocked() + cls.test_JS_script_output() + cls.test_onlineExtraResources() + cls.teardown_class() diff --git a/psychopy/tests/test_app/test_builder/test_ComponentDialogs.py b/psychopy/tests/test_app/test_builder/test_ComponentDialogs.py new file mode 100644 index 00000000..86b3b685 --- /dev/null +++ b/psychopy/tests/test_app/test_builder/test_ComponentDialogs.py @@ -0,0 +1,98 @@ + +import pytest + +from psychopy import experiment +from psychopy.app.builder.dialogs import DlgCodeComponentProperties +from psychopy.experiment.components.code import CodeComponent + + +class TestComponentDialogs: + + def setup_method(self): + # Create experiment + self.exp = experiment.Experiment() + self.exp.addRoutine( + "testRoutine", + experiment.routines.Routine("testRoutine", self.exp) + ) + + @pytest.mark.usefixtures("get_app") + def test_code_component_changed_marking(self, get_app): + """ + Tests that, when opening a Code component dialog, the correct tabs are marked based on the contents + """ + _nl = "\n" + # Create frame + frame = get_app.newBuilderFrame() + # Define cases by which fields are populated, which tab should be open first and which tabs should be starred + cases = [ + # JS populated then py + {'params': ["Begin JS Routine", "Each Frame"], + 'first': "Begin Routine", + 'starred': ["Begin Routine", "Each Frame"]}, + # JS populated then both then py + {'params': ["Begin JS Routine", "Each Frame", "Each JS Frame", "End Routine"], + 'first': "Begin Routine", + 'starred': ["Begin Routine", "Each Frame", "End Routine"]}, + # Py populated then both then js + {'params': ["Begin Routine", "Each Frame", "Each JS Frame", "End JS Routine"], + 'first': "Begin Routine", + 'starred': ["Begin Routine", "Each Frame", "End Routine"]}, + # Py populated then js + {'params': ["Begin Routine", "Each JS Frame"], + 'first': "Begin Routine", + 'starred': ["Begin Routine", "Each Frame"]}, + # All populated + {'params': ["Before Experiment", "Before JS Experiment", "Begin Experiment", "Begin JS Experiment", + "Begin Routine", "Begin JS Routine", "Each Frame", "Each JS Frame", "End Routine", + "End JS Routine", "End Experiment", "End JS Experiment"], + 'first': "Before Experiment", + 'starred': ["Before Experiment", "Begin Experiment", "Begin Routine", "Each Frame", "End Routine", + "End Experiment"]}, + # None populated + {'params': [], + 'first': "Begin Experiment", + 'starred': []}, + ] + # For each case... + for case in cases: + # Create Code component + comp = CodeComponent( + exp=self.exp, parentName="testRoutine", codeType="Both" + ) + # Assign values from case + for param in case['params']: + comp.params[param].val = "x = 1" # Dummy code just so there's some valid content + # Make dialog + dlg = DlgCodeComponentProperties( + frame=frame, + element=comp, + experiment=self.exp, + timeout=200 + ) + # Check that correct tab is shown first + pg = dlg.codeNotebook.GetCurrentPage() + i = dlg.codeNotebook.FindPage(pg) + tabLabel = dlg.codeNotebook.GetPageText(i) + assert case['first'].lower() in tabLabel.lower(), ( + f"Tab {case['first']} should be opened first when the following fields are populated:\n" + f"{_nl.join(case['params'])}\n" + f"Instead, first tab open was {tabLabel}" + ) + # Check that correct tabs are starred + for i in range(dlg.codeNotebook.GetPageCount()): + tabLabel = dlg.codeNotebook.GetPageText(i) + populated = any(name.lower() in tabLabel.lower() for name in case['starred']) + + if populated: + assert "*" in tabLabel, ( + f"Tab '{tabLabel}' should include a * when the following fields are populated:\n" + f"{_nl.join(case['params'])}" + ) + else: + assert "*" not in tabLabel, ( + f"Tab '{tabLabel}' should not include a * when the following fields are populated:\n" + f"{_nl.join(case['params'])}" + ) + # Close frame + frame.closeFrame() diff --git a/psychopy/tests/test_app/test_command_line.py b/psychopy/tests/test_app/test_command_line.py new file mode 100644 index 00000000..25655ce1 --- /dev/null +++ b/psychopy/tests/test_app/test_command_line.py @@ -0,0 +1,65 @@ +""" +Test that PsychoPy can be initialised from the command line with all API options +""" +import sys +import time +from pathlib import Path +from psychopy import core +from psychopy.tests import utils + + +def test_version_query(): + """ + Check that we can call the PsychoPy app with -v to get the version + """ + from psychopy import __version__ as ppyVersion + cases = [ + "-v", + "--version", + ] + for case in cases: + stderr = core.shellCall( + [sys.executable, "-m", "psychopy.app", case], + stderr=True + ) + assert ppyVersion in "\n".join(stderr) + + +def test_help_query(): + """ + Check that we can call the PsychoPy app with -h to get the help text + """ + cases = [ + "-h", + "--help", + ] + for case in cases: + stderr = core.shellCall( + [sys.executable, "-m", "psychopy.app", case], + stderr=True + ) + assert "PsychoPy" in "\n".join(stderr) + + +def test_direct_run(): + """ + Check that we can directly run files by invoking psychopy.app with -x + """ + cases = [ + {'tag': "-x", 'files': [str(Path(utils.TESTS_DATA_PATH) / "ghost_stroop.psyexp")]}, + {'tag': "-x", 'files': [str(Path(utils.TESTS_DATA_PATH) / "test_basic_run.py")]}, + {'tag': "-x", 'files': [ + str(Path(utils.TESTS_DATA_PATH) / "ghost_stroop.psyexp"), + str(Path(utils.TESTS_DATA_PATH) / "test_basic_run.py") + ]}, + ] + # include --direct too + for case in cases.copy(): + case['tag'] = "--direct" + cases.append(case) + # run all cases + for case in cases: + stderr = core.shellCall( + [sys.executable, "-m", "psychopy.app", case['tag']] + case['files'], + stderr=True + ) \ No newline at end of file diff --git a/psychopy/tests/test_app/test_runner/__init__.py b/psychopy/tests/test_app/test_runner/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/psychopy/tests/test_app/test_runner/test_RunnerFrame.py b/psychopy/tests/test_app/test_runner/test_RunnerFrame.py new file mode 100644 index 00000000..0f59a57b --- /dev/null +++ b/psychopy/tests/test_app/test_runner/test_RunnerFrame.py @@ -0,0 +1,166 @@ +import sys + +import pytest +import os +import time +from psychopy import prefs +import wx +from psychopy.app import psychopyApp + + +class Test_RunnerFrame: + """ + This test opens Runner, and several processes. + """ + def setup_method(self): + self.tempFile = os.path.join( + prefs.paths['tests'], 'data', 'test001EntryImporting.psyexp') + + def _getRunnerView(self, app): + runner = app.newRunnerFrame() + runner.clearTasks() + return runner + + @pytest.mark.usefixtures("get_app") + def test_RunnerFrame(self, get_app): + app = get_app + app.showRunner() + + @pytest.mark.usefixtures("get_app") + def test_addFile(self, get_app): + runner = self._getRunnerView(get_app) + runner.addTask(fileName=self.tempFile) + assert runner.panel.expCtrl.FindItem(-1, self.tempFile) + + @pytest.mark.usefixtures("get_app") + def test_removeTask(self, get_app): + runner = self._getRunnerView(get_app) + runner.removeTask(runner.panel.currentSelection) + assert runner.panel.expCtrl.FindItem(-1, self.tempFile) == -1 + + @pytest.mark.usefixtures("get_app") + def test_clearItems(self, get_app): + runner = self._getRunnerView(get_app) + runner.addTask(fileName=self.tempFile) + runner.clearTasks() + assert runner.panel.expCtrl.FindItem(-1, self.tempFile) == -1 + + @pytest.mark.usefixtures("get_app") + def test_runLocal(self, get_app): + """Run a local experiment file. Tests the `Job` module and expands + coverage. + """ + + if sys.platform == 'linux': # skip on GTK+, manually tested for now + return + + runner = self._getRunnerView(get_app) + runner.Raise() + + # get panel with controls + runnerPanel = runner.panel + + # add task + runner.addTask(fileName=self.tempFile) + runner.panel.expCtrl.Select(0) # select only item + + # --- + # Run a Builder experiment locally without interruption, check if the + # UI is correctly updated. + # --- + + # check button states before running the file + assert runnerPanel.toolbar.buttons['runBtn'].Enabled, ( + "Incorrect button state for `Runner.panel.runBtn` at start of " + "experiment.") + assert not runnerPanel.toolbar.buttons['stopBtn'].Enabled, ( + "Incorrect button state for `Runner.panel.stopBtn` at start of " + "experiment.") + + # issue a button click event to run the file + wx.PostEvent( + runnerPanel.toolbar.buttons['runBtn'].GetEventHandler(), + wx.PyCommandEvent(wx.EVT_BUTTON.typeId, + runnerPanel.toolbar.buttons['runBtn'].GetId()) + ) + + # wait until the subprocess wakes up + timeoutCounter = 0 + while runnerPanel.scriptProcess is None: + # give a minute to start, raise exception otherwise + assert timeoutCounter < 6000, ( + "Timeout starting subprocess. Process took too long to start.") + time.sleep(0.01) + timeoutCounter += 1 + wx.YieldIfNeeded() + + # check button states during experiment + assert not runnerPanel.toolbar.buttons['runBtn'].Enabled, ( + "Incorrect button state for `runnerPanel.toolbar.buttons['runBtn']` " + "during experiment.") + assert runnerPanel.toolbar.buttons['stopBtn'].Enabled, ( + "Incorrect button state for `runnerPanel.toolbar.buttons['stopBtn']` " + "experiment.") + + # wait until the subprocess ends + timeoutCounter = 0 + while runnerPanel.scriptProcess is not None: + # give a minute to stop, raise exception otherwise + assert timeoutCounter < 6000, ( + "Timeout stopping subprocess. Process took too long to end.") + time.sleep(0.01) + timeoutCounter += 1 + wx.YieldIfNeeded() + + # check button states after running the file, make sure they are + # correctly restored + assert not runnerPanel.toolbar.buttons['stopBtn'].Enabled, ( + "Incorrect button state for `runnerPanel.toolbar.buttons['stopBtn']` " + "experiment.") + + # --- + # Run a Builder experiment locally, but interrupt it to see how well + # the UI can handle that. + # --- + + runner.panel.expCtrl.Select(0) + + # again, start the process using the run event + wx.PostEvent( + runnerPanel.toolbar.buttons['runBtn'].GetEventHandler(), + wx.PyCommandEvent(wx.EVT_BUTTON.typeId, + runnerPanel.toolbar.buttons['runBtn'].GetId()) + ) + + # wait until the subprocess wakes up + timeoutCounter = 0 + while runnerPanel.scriptProcess is None: + assert timeoutCounter < 6000, ( + "Timeout starting subprocess. Process took too long to start.") + time.sleep(0.01) + timeoutCounter += 1 + wx.YieldIfNeeded() + + # kill the process a bit through it + wx.PostEvent( + runnerPanel.toolbar.buttons['stopBtn'].GetEventHandler(), + wx.PyCommandEvent(wx.EVT_BUTTON.typeId, + runnerPanel.toolbar.buttons['stopBtn'].GetId()) + ) + + # wait until the subprocess ends + timeoutCounter = 0 + while runnerPanel.scriptProcess is not None: + assert timeoutCounter < 6000, ( + "Timeout stopping subprocess. Process took too long to end.") + time.sleep(0.01) + timeoutCounter += 1 + wx.YieldIfNeeded() + + # check button states after running the file, make sure they are + # correctly restored + assert not runnerPanel.toolbar.buttons['stopBtn'].Enabled, ( + "Incorrect button state for `runnerPanel.toolbar.buttons['stopBtn']` " + "experiment.") + + runner.clearTasks() # clear task list diff --git a/psychopy/tests/test_app/test_speed.py b/psychopy/tests/test_app/test_speed.py new file mode 100644 index 00000000..0b72f271 --- /dev/null +++ b/psychopy/tests/test_app/test_speed.py @@ -0,0 +1,147 @@ +import sys + +import numpy +from pathlib import Path + +from psychopy.tests.utils import TESTS_DATA_PATH, RUNNING_IN_VM + +import shutil +from tempfile import mkdtemp +import pytest +import time + +from ... import logging + + +class TestSpeed: + def setup_method(self): + self.tmp_dir = mkdtemp(prefix='psychopy-tests-app') + # skip speed tests under vm + if RUNNING_IN_VM: + pytest.skip() + + def teardown_method(self): + shutil.rmtree(self.tmp_dir, ignore_errors=True) + + @pytest.mark.usefixtures("get_app") + def test_theme_change(self, get_app): + """ + Tests how fast the app can update its theme + """ + runs = [] + for run in range(3): + # Close any open frames + for frame in get_app._allFrames: + frame().Close() + # Set theme + get_app.theme = "PsychopyLight" + # Open one of each frame + get_app.newBuilderFrame() + get_app.showCoder() + get_app.newRunnerFrame() + # Open some example files + get_app.builder.fileOpen(filename=str( + Path(TESTS_DATA_PATH) / "test_loops" / "testLoopsBlocks.psyexp" + )) + get_app.coder.fileOpen(filename=str( + Path(TESTS_DATA_PATH) / "correctScript" / "python" / "correctKeyboardComponent.py" + )) + get_app.coder.fileOpen(filename=str( + Path(TESTS_DATA_PATH) / "correctScript" / "js" / "correctKeyboardComponent.js" + )) + # Start timer + start = time.time() + # Change theme + get_app.theme = "PsychopyDark" + # Stop timer + finish = time.time() + # Store runtime + runs.append(finish - start) + # Check times + avg = float(numpy.mean(runs)) + # Log result + logging.info(f"Average time to change theme: {avg} ({len(runs)} runs: {runs})") + # <0.5 is the goal + if avg >= 0.5: + logging.warn( + f"App took longer than expected to change theme, but not longer than is acceptable. Expected <0.4s, " + f"got {avg}." + ) + # ...but anything <1 isn't worth failing the tests over + assert avg < 1, ( + f"App took longer than acceptable to change theme. Expected <0.4s, allowed <1s, got {avg}." + ) + + @pytest.mark.usefixtures("get_app") + def test_open_frame(self, get_app): + # Close any open frames + for frame in get_app._allFrames: + frame().Close() + # Set theme + get_app.theme = "PsychopyLight" + # Open one of each frame (to populate icon cache) + get_app.newBuilderFrame() + get_app.showCoder() + get_app.newRunnerFrame() + # Close frames again + for frame in get_app._allFrames: + frame().Close() + # Open Builder frame + start = time.time() + get_app.newBuilderFrame() + finish = time.time() + dur = finish - start + logging.info(f"Time to open builder frame: {dur}") + # Check Builder frame load time + assert dur < 10 + + # Open Coder frame + start = time.time() + get_app.showCoder() + finish = time.time() + dur = finish - start + logging.info(f"Time to open coder frame: {dur}") + # Check Coder frame load time + assert dur < 10 + + # Open Runner frame + start = time.time() + get_app.newRunnerFrame() + finish = time.time() + dur = finish - start + logging.info(f"Time to open runner frame: {dur}") + # Check Runner frame load time + assert dur < 10 + + def test_load_builder(self): + # Load Builder + dur = self._load_app("-b") + logging.info(f"Time to open with -b tag: {dur}") + # Check that it's within acceptable bounds + assert dur < 10 + + def test_load_coder(self): + # Load Coder + dur = self._load_app("-c") + logging.info(f"Time to open with -c tag: {dur}") + # Check that it's within acceptable bounds + assert dur < 10 + + def test_load_runner(self): + # Load Runner + dur = self._load_app("-r") + logging.info(f"Time to with -r tag: {dur}") + # Check that it's within acceptable bounds + assert dur < 10 + + @staticmethod + def _load_app(arg): + # Test builder + start = time.time() + sys.argv.append(arg) + from psychopy.app._psychopyApp import PsychoPyApp + app = PsychoPyApp(0, testMode=True, showSplash=True) + app.quit() + finish = time.time() + dur = finish - start + return dur diff --git a/psychopy/tests/test_app/test_themes/test_icons.py b/psychopy/tests/test_app/test_themes/test_icons.py new file mode 100644 index 00000000..3d4214b4 --- /dev/null +++ b/psychopy/tests/test_app/test_themes/test_icons.py @@ -0,0 +1,79 @@ +import pytest +from pathlib import Path +from psychopy.app.themes import icons +from psychopy.experiment.components.unknown import UnknownComponent + + +class TestIcons: + @pytest.mark.usefixtures("get_app") + def test_button_icons(self, get_app): + exemplars = [ + # File open, 32px + (icons.ButtonIcon("fileopen", size=32), + icons.ButtonIcon("fileopen", size=32)), + # Clear, 16px + (icons.ButtonIcon("clear", size=32), + icons.ButtonIcon("clear", size=32)), + ] + tykes = [ + # File open, no size + (icons.ButtonIcon("fileopen", size=32), + icons.ButtonIcon("fileopen", size=32)), + # File open, wrong size + (icons.ButtonIcon("fileopen", size=48), + icons.ButtonIcon("fileopen", size=48)), + ] + + for case in exemplars + tykes: + # Ensure that the underlying bitmap of each button is the same object + assert case[0].bitmap is case[1].bitmap + + @pytest.mark.usefixtures("get_app") + def test_component_icons(self, get_app): + exemplars = [ + # Unknown component, 48px + (icons.ComponentIcon(UnknownComponent, size=48), + icons.ComponentIcon(UnknownComponent, size=48)), + ] + tykes = [ + # Unknown component, no size + (icons.ComponentIcon(UnknownComponent, size=48), + icons.ComponentIcon(UnknownComponent, size=48)), + # Unknown component, wrong size + (icons.ComponentIcon(UnknownComponent, size=32), + icons.ComponentIcon(UnknownComponent, size=32)), + ] + + for case in exemplars + tykes: + # Ensure that the underlying bitmap of each button is the same object + assert case[0].bitmap is case[1].bitmap + + def testIconParity(self): + """ + Test that the same icons exist for all themes + """ + # Get root icons folder + from psychopy.app.themes.icons import resources as root + # Iterate through all png files in light + for file in (root / "light").glob("**/*.png"): + # Ignore @2x + if file.stem.endswith("@2x"): + file = file.parent / (file.stem[:-3] + ".png") + # Ignore size numbers + while file.stem[-1].isnumeric(): + file = file.parent / (file.stem[:-1] + ".png") + # Get location relative to light folder + file = file.relative_to(root / "light") + # Create versions of file with size suffices + variants = [ + file, + file.parent / (file.stem + "16.png"), + file.parent / (file.stem + "32.png"), + file.parent / (file.stem + "48.png"), + ] + # Check that equivalent file exists in all themes + for theme in ("light", "dark", "classic"): + # Check that file or variant exists + assert any( + (root / theme / v).is_file() for v in variants + ), f"Could not find file '{file}' for theme '{theme}'" diff --git a/psychopy/tests/test_data/test_utils.py b/psychopy/tests/test_data/test_utils.py index 58b04087..41817ec8 100644 --- a/psychopy/tests/test_data/test_utils.py +++ b/psychopy/tests/test_data/test_utils.py @@ -89,6 +89,20 @@ def test_isValidVariableName(self): assert valid == case['valid'] assert msg == case['msg'] + def test_isValidVariableName_str_conversion_failure(self): + # str subclass whose __str__ raises, to exercise the fallback branch + # in isValidVariableName where `str(name)` itself fails (regression + # test for np.unicode_, removed in NumPy 2.0, being referenced there; + # also covers the message formatting, which used to re-trigger the + # same str() failure while building the error message) + class BadStr(str): + def __str__(self): + raise UnicodeEncodeError('ascii', 'x', 0, 1, 'bad char') + + with pytest.raises(exceptions.ConditionsImportError) as errMsg: + utils.isValidVariableName(BadStr('bad_name')) + assert 'could not be converted to a string' in str(errMsg.value) + def test_GetExcelCellName(self): assert utils._getExcelCellName(0,0) == 'A1' assert utils._getExcelCellName(2, 1) == 'C2' diff --git a/psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py b/psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py index bb7158b4..41a8f97a 100644 --- a/psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +++ b/psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py @@ -30,10 +30,6 @@ tmpApp = wx.PySimpleApp() else: tmpApp = wx.App(False) - try: - from psychopy.app import localization - except Exception: - pass # not needed if can't import it allComp = getAllComponents(fetchIcons=False) exp = experiment.Experiment() diff --git a/psychopy/tests/test_experiment/needs_wx/test_components.py b/psychopy/tests/test_experiment/needs_wx/test_components.py index 13b8960a..dee21f97 100644 --- a/psychopy/tests/test_experiment/needs_wx/test_components.py +++ b/psychopy/tests/test_experiment/needs_wx/test_components.py @@ -48,10 +48,6 @@ def setup_class(cls): tmpApp = wx.PySimpleApp() else: tmpApp = wx.App(False) - try: - from psychopy.app import localization - except Exception: - pass # not needed if can't import it cls.allComp = getAllComponents(fetchIcons=False) def setup_method(self): diff --git a/psychopy/tests/test_gui/test_DlgFromDictQt.py b/psychopy/tests/test_gui/test_DlgFromDictQt.py new file mode 100644 index 00000000..987f58ec --- /dev/null +++ b/psychopy/tests/test_gui/test_DlgFromDictQt.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from collections import OrderedDict +from psychopy.gui.qtgui import DlgFromDict +import pytest + + +@pytest.mark.needs_qt +class TestDlgFromDictQt: + def setup_method(self): + self.d = dict( + participant='000', + handedness=['r', 'l'], + exp_type=['foo', 'bar'], + exp_version='2017-01-02') + + self.od = OrderedDict( + [('participant', '000'), + ('handedness', ['r', 'l']), + ('exp_type', ['foo', 'bar']), + ('exp_version', '2017-01-02')]) + + self.title = 'Experiment' + + def test_title(self): + dlg = DlgFromDict(self.d, title=self.title, show=False) + assert dlg.windowTitle() == self.title + + def test_sort_keys_true(self): + dlg = DlgFromDict(self.d, sortKeys=True, show=False) + keys = list(self.d.copy().keys()) + keys.sort() + assert keys == dlg._keys + + def test_sort_keys_false(self): + dlg = DlgFromDict(self.d, sortKeys=False, show=False) + keys = list(self.d.copy().keys()) + assert keys == dlg._keys + + def test_copy_dict_true(self): + dlg = DlgFromDict(self.d, copyDict=True, show=False) + assert self.d is not dlg.dictionary + + def test_copy_dict_false(self): + dlg = DlgFromDict(self.d, copyDict=False, show=False) + assert self.d is dlg.dictionary + + def test_order_list(self): + order = ['exp_type', 'participant', 'handedness', 'exp_version'] + # Be certain we will actually request a different order + # further down. + assert order != list(self.od.keys()) + + dlg = DlgFromDict(self.od, order=order, show=False) + assert dlg.inputFieldNames == order + + def test_order_tuple(self): + order = ('exp_type', 'participant', 'handedness', 'exp_version') + # Be certain we will actually request a different order + # further down. + assert list(order) != list(self.od.keys()) + + dlg = DlgFromDict(self.od, order=order, show=False) + assert dlg.inputFieldNames == list(order) + + def test_fixed(self): + fixed = 'exp_version' + dlg = DlgFromDict(self.d, fixed=fixed, show=False) + field = dlg.inputFields[dlg.inputFieldNames.index(fixed)] + assert field.isEnabled() is False + + def test_tooltips(self): + tip = dict(participant='Tooltip') + dlg = DlgFromDict(self.d, tip=tip, show=False) + field = dlg.inputFields[dlg.inputFieldNames.index('participant')] + assert field.toolTip() == tip['participant'] + +if __name__ == '__main__': + cls = TestDlgFromDictQt() + cls.setup_method() + cls.test_fixed() diff --git a/psychopy/tests/test_gui/test_DlgFromDictWx.py b/psychopy/tests/test_gui/test_DlgFromDictWx.py new file mode 100644 index 00000000..644fe718 --- /dev/null +++ b/psychopy/tests/test_gui/test_DlgFromDictWx.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from collections import OrderedDict +from psychopy.gui.wxgui import DlgFromDict +import pytest + + +@pytest.mark.needs_wx +class TestDlgFromDictWx: + def setup_method(self): + self.d = dict( + participant='000', + handedness=['r', 'l'], + exp_type=['foo', 'bar'], + exp_version='2017-01-02') + + self.od = OrderedDict( + [('participant', '000'), + ('handedness', ['r', 'l']), + ('exp_type', ['foo', 'bar']), + ('exp_version', '2017-01-02')]) + + self.title = 'Experiment' + + def test_title(self): + dlg = DlgFromDict(self.d, title=self.title, show=False) + assert dlg.Title == self.title + + def test_sort_keys_true(self): + dlg = DlgFromDict(self.d, sortKeys=True, show=False) + keys = sorted(self.d) + assert keys == dlg._keys + + def test_sort_keys_false(self): + dlg = DlgFromDict(self.d, sortKeys=False, show=False) + keys = list(self.d) + assert keys == dlg._keys + + def test_copy_dict_true(self): + dlg = DlgFromDict(self.d, copyDict=True, show=False) + assert self.d is not dlg.dictionary + + def test_copy_dict_false(self): + dlg = DlgFromDict(self.d, copyDict=False, show=False) + assert self.d is dlg.dictionary + + def test_order_list(self): + order = ['exp_type', 'participant', 'handedness', 'exp_version'] + # Be certain we will actually request a different order + # further down. + assert order != list(self.od) + + dlg = DlgFromDict(self.od, order=order, show=False) + assert dlg.inputFieldNames == order + + def test_order_tuple(self): + order = ('exp_type', 'participant', 'handedness', 'exp_version') + # Be certain we will actually request a different order + # further down. + assert list(order) != list(self.od) + + dlg = DlgFromDict(self.od, order=order, show=False) + assert dlg.inputFieldNames == list(order) + + def test_fixed(self): + fixed = 'exp_version' + dlg = DlgFromDict(self.d, fixed=fixed, show=False) + field = dlg.inputFields[dlg.inputFieldNames.index(fixed)] + assert field.Enabled is False + + def test_tooltips(self): + tip = dict(participant='Tooltip') + dlg = DlgFromDict(self.d, tip=tip, show=False) + field = dlg.inputFields[dlg.inputFieldNames.index('participant')] + assert field.ToolTip.GetTip() == tip['participant'] + + +if __name__ == '__main__': + cls = TestDlgFromDictWx() + cls.setup_method() + cls.test_fixed() diff --git a/psychopy/tests/test_misc/test_info.py b/psychopy/tests/test_misc/test_info.py index a5819103..be28db2c 100644 --- a/psychopy/tests/test_misc/test_info.py +++ b/psychopy/tests/test_misc/test_info.py @@ -6,6 +6,18 @@ # py.test -k info --cov-report term-missing --cov info.py +def test_all_names_defined(): + """Every name exported in ``info.__all__`` must actually be defined. + + Guards against dangling ``__all__`` entries such as the removed + ``_getSvnVersion``/``_getHgVersion`` helpers, which lingered in + ``__all__`` (and in silently-failing call sites) after their definitions + were deleted. + """ + missing = [name for name in info.__all__ if not hasattr(info, name)] + assert not missing, f"names in __all__ are undefined: {missing}" + + @pytest.mark.info class TestInfo(): @classmethod diff --git a/psychopy/tests/test_preferences/test_prefs.py b/psychopy/tests/test_preferences/test_prefs.py index dd732ea9..68a5a469 100644 --- a/psychopy/tests/test_preferences/test_prefs.py +++ b/psychopy/tests/test_preferences/test_prefs.py @@ -1,7 +1,6 @@ import pytest import re from psychopy import preferences -import psychopy.app as app @pytest.mark.prefs def testGenerateSpec(): @@ -23,6 +22,3 @@ def testGenerateSpec(): prefs.resetPrefs() assert prefs.app['theme'] == "PsychopyDark" # Check that the app still loads - - app.startApp(testMode=True, showSplash=False) - app.quitApp() diff --git a/psychopy/tests/test_sound/test_hamming.py b/psychopy/tests/test_sound/test_hamming.py index 37fee217..b727dd81 100644 --- a/psychopy/tests/test_sound/test_hamming.py +++ b/psychopy/tests/test_sound/test_hamming.py @@ -4,7 +4,7 @@ import numpy as np import pytest -import psychopy.sound.backend_ptb as ptb +import psychopy.sound """ We need to test that the new block-by-block hamming works the same as the @@ -28,7 +28,7 @@ def test_HammingSmallBlock(): blockSize = 64 snd1 = apodize(sndArray, sampleRate) # is 5 ms - sndDev = ptb.SoundPTB(thisFreq, sampleRate=sampleRate, secs=secs, + sndDev = psychopy.sound.Sound(thisFreq, sampleRate=sampleRate, secs=secs, hamming=True, blockSize=blockSize) snd2 = [] while sndDev.status != FINISHED: diff --git a/psychopy/tests/test_validators/test_voicekeyValidator.py b/psychopy/tests/test_validators/test_voicekeyValidator.py index fe8c425a..d1e09ad3 100644 --- a/psychopy/tests/test_validators/test_voicekeyValidator.py +++ b/psychopy/tests/test_validators/test_voicekeyValidator.py @@ -30,7 +30,7 @@ def setup_class(cls): for speaker in foundSpeakers: try: sound.Sound("A", speaker=speaker) - except: + except Exception: continue else: # if successful, we have a matching pair! diff --git a/psychopy/tests/test_visual/test_textbox.py b/psychopy/tests/test_visual/test_textbox.py index eef7dda3..242acaa4 100644 --- a/psychopy/tests/test_visual/test_textbox.py +++ b/psychopy/tests/test_visual/test_textbox.py @@ -41,7 +41,7 @@ def setup_method(self): def teardown_method(self): self.win.close() - + def test_glyph_rendering(self): # Prepare textbox self.textbox.colorSpace = 'rgb' @@ -193,33 +193,134 @@ def test_colors(self): filename = "textbox_{}_{}".format(self.textbox._lineBreaking, case['screenshot']) # self.win.getMovieFrame(buffer='back').save(Path(utils.TESTS_DATA_PATH) / filename) utils.compareScreenshot(Path(utils.TESTS_DATA_PATH) / filename, self.win, crit=20) + + def test_formatting(self): + cases = [ + # bold italic + { + 'text': "This contains ***bold italic*** text", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "bolditalic" + }, + # bold + { + 'text': "This contains **bold** text", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "bold" + }, + # italic + { + 'text': "This contains *italic* text", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "italic" + }, + # escaped + { + 'text': "This contains \*escaped\* text", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "escaped" + }, + # color + { + 'text': "This contains [color=red]colorful[/color] text", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "color" + }, + # one with everything + { + 'text': "This text contains ***bold italic***, **bold**, *italic*, \*escaped\*, and [color=red]colorful[/color] text.", + 'syntax': "md", + 'languageStyle': "LTR", + 'screenshot': "all" + }, + # one with everything (raw md) + { + 'text': "This text contains no formatting, but looks like it contains ***bold italic***, **bold**, *italic*, \*escaped\*, and [color=red]colorful[/color] text.", + 'syntax': "raw", + 'languageStyle': "LTR", + 'screenshot': "md" + }, + # one with everything (md RTL) + { + 'text': "השועל [color=brown]החום[/color] המהיר קופץ **מעל** הכלב ה*עצלן*.", + 'syntax': "md", + 'languageStyle': "RTL", + 'screenshot': "all" + }, + # one with everything (html) + { + 'text': "This text contains bold italic, italic bold, bold, italic,
    div wrapped
    and colorful text.", + 'syntax': "html", + 'languageStyle': "LTR", + 'screenshot': "all" + }, + # one with everything (raw html) + { + 'text': "This text contains no formatting, but looks like it contains bold italic, italic bold, bold, italic,
    div wrapped
    and colorful text.", + 'syntax': "raw", + 'languageStyle': "LTR", + 'screenshot': "html" + }, + # one with everything (html RTL) + { + 'text': "השועל החום המהיר קופץ מעל הכלב העצלן.", + 'syntax': "html", + 'languageStyle': "RTL", + 'screenshot': "all" + }, + ] + # add necessary fonts + self.textbox.fontMGR.addGoogleFont("Noto Sans Hebrew") + self.textbox.fontMGR.addGoogleFont("Noto Sans") + for case in cases: + # set font + if case['languageStyle'] == "RTL": + self.textbox.font = "Noto Sans Hebrew" + else: + self.textbox.font = "Noto Sans" + # set attributes from test cases + self.textbox.languageStyle = case['languageStyle'] + self.textbox.formattingSyntax = case['syntax'] + self.textbox.text = case['text'] + # draw + self.win.flip() + self.textbox.draw() + # compare screenshot + filename = f"{type(self).__name__}_textbox_formatting_%(screenshot)s_%(syntax)s_%(languageStyle)s.png" % case + # self.win.getMovieFrame(buffer='back').save(Path(utils.TESTS_DATA_PATH) / filename) + utils.compareScreenshot(Path(utils.TESTS_DATA_PATH) / filename, self.win, crit=20) def test_char_colors(self): cases = [ # Named color - {'text': "Hello there", + {'text': "[color=white]Hello[/color] there", 'space': "rgb", 'base': "black", 'screenshot': "white_hello_black_there"}, # Hex color - {'text': "Hello there", + {'text': "[color=#ffffff]Hello[/color] there", 'space': "rgb", 'base': "black", 'screenshot': "white_hello_black_there"}, # RGB color - {'text': "Hello there", + {'text': "[color=(1, 1, 1) space=rgb]Hello[/color] there", 'space': "rgb", 'base': "black", 'screenshot': "white_hello_black_there"}, # RGB255 color - {'text': "Hello there", + {'text': "[color=(255, 255, 255) space=rgb255]Hello[/color] there", 'space': "rgb255", 'base': "black", 'screenshot': "white_hello_black_there"}, # Rainbow {'text': ( - "Roy G. " - "Biv is a colorful man and he proudly stands at " + "[color=red]R[/color][color=orange]o[/color][color=yellow]y[/color] [color=green]G.[/color] " + "[color=blue]B[/color][color=indigo]i[/color][color=violet]v[/color] is a colorful man and he proudly stands at " "the rainbow's end" ), 'space': "rgb", diff --git a/psychopy/tools/fontmanager.py b/psychopy/tools/fontmanager.py index 031fd2e3..b3dfdb2c 100644 --- a/psychopy/tools/fontmanager.py +++ b/psychopy/tools/fontmanager.py @@ -35,6 +35,7 @@ "/usr/X11/lib/X11/fonts", # here is the new standard location for fonts "/usr/share/fonts", + "~/.local/share/fonts", # documented as a good place to install new fonts "/usr/local/share/fonts", # common application, not really useful @@ -665,7 +666,7 @@ def findFontFiles(folders=(), recursive=True, currentDir=Path(".")): try: from matplotlib import font_manager searchPaths.append(font_manager.findSystemFonts) - except: + except ImportError: pass elif sys.platform == 'darwin': # on mac matplotlib doesn't include 'ttc' files (which are fine) @@ -1064,6 +1065,11 @@ def getFolderFontFiles(cls, folder, recursive=True): return output # pathify folder thisFolder = Path(folder) + # try expanding ~ (but don't worry if it failed) + try: + thisFolder = thisFolder.expanduser() + except: + pass # try each extension for ext in cls.supportedExtensions: try: diff --git a/psychopy/tools/gltools.py b/psychopy/tools/gltools.py index 36dd85f9..dd07e6ed 100644 --- a/psychopy/tools/gltools.py +++ b/psychopy/tools/gltools.py @@ -110,7 +110,7 @@ 'createCone', 'transformMeshPosOri', 'calculateVertexNormals', - 'mergeVerticies', + 'mergeVertices', 'smoothCreases', 'flipFaces', 'interleaveAttributes', @@ -5191,6 +5191,22 @@ def shininess(self, value): self._shininess = float(value) +def _setDefaultMaterial(face=GL.GL_FRONT_AND_BACK): + """Reset material properties to the OpenGL defaults. + + Parameters + ---------- + face : GLenum + Face to apply the default material properties to. + + """ + GL.glMaterialfv(face, GL.GL_DIFFUSE, (GL.GLfloat * 4)(0.8, 0.8, 0.8, 1.0)) + GL.glMaterialfv(face, GL.GL_SPECULAR, (GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0)) + GL.glMaterialfv(face, GL.GL_AMBIENT, (GL.GLfloat * 4)(0.2, 0.2, 0.2, 1.0)) + GL.glMaterialfv(face, GL.GL_EMISSION, (GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0)) + GL.glMaterialf(face, GL.GL_SHININESS, 0.0) + + def useMaterial(material, useTextures=True): """Use a material for proceeding vertex draws. @@ -5257,19 +5273,17 @@ def useMaterial(material, useTextures=True): GL.glBindTexture(GL.GL_TEXTURE_2D, 0) GL.glDisable(GL.GL_TEXTURE_2D) else: - for mode, param in defaultMaterial.params.items(): - GL.glEnable(GL.GL_COLOR_MATERIAL) - GL.glMaterialfv(GL.GL_FRONT_AND_BACK, mode, param) + GL.glEnable(GL.GL_COLOR_MATERIAL) + _setDefaultMaterial() def clearMaterial(material): """Stop using a material.""" - for mode, param in defaultMaterial.params.items(): - GL.glMaterialfv(GL.GL_FRONT_AND_BACK, mode, param) + _setDefaultMaterial() if material._useTextures: if material.diffuseTexture is not None: - unbindTexture(material.diffuseTexture) + bindTexture(None, 'GL_TEXTURE_2D', 0) GL.glDisable(GL.GL_TEXTURE_2D) diff --git a/psychopy/tools/pkgtools.py b/psychopy/tools/pkgtools.py index 68867dc3..f69e0240 100644 --- a/psychopy/tools/pkgtools.py +++ b/psychopy/tools/pkgtools.py @@ -213,7 +213,7 @@ def installPackage( Returns ------- - tuple or psychopy.app.jobs.Job + tuple or psychopy_app.jobs.Job If `awaited=True`: `True` if the package installed without errors. If `False`, check 'stderr' for more information. The package may still have installed @@ -230,7 +230,7 @@ def installPackage( # handle install from file try: packagePath = Path(package) - except: + except (TypeError, ValueError): pass else: if packagePath.is_file(): @@ -285,10 +285,10 @@ def installPackage( # if unawaited, try to get jobs handler if not awaited: try: - from psychopy.app import jobs + from psychopy_app import jobs except ModuleNotFoundError: logging.warn(_translate( - "Could not install package {} asynchronously as psychopy.app.jobs is not found. " + "Could not install package {} asynchronously as psychopy_app.jobs is not found. " "Defaulting to synchronous install." ).format(package)) awaited = True diff --git a/psychopy/tools/stimulustools.py b/psychopy/tools/stimulustools.py index 8f695045..3c9acf2b 100644 --- a/psychopy/tools/stimulustools.py +++ b/psychopy/tools/stimulustools.py @@ -79,7 +79,7 @@ def serialize(obj, includeClass=True): # convert possible file paths into Path try: pathVal = Path(obj) - except: + except (TypeError, ValueError): pass else: if pathVal.is_file() or pathVal.is_dir(): @@ -97,7 +97,7 @@ def serialize(obj, includeClass=True): json.dumps(obj) except TypeError: pass - except: + except Exception: # if we got something other than a TypeError, substitute None return None else: @@ -129,26 +129,22 @@ def _getAttr(obj, param): # start off with an empty dict arr = {} # get init args - initArgs = inspect.getargspec(obj.__init__) - # if there are variable args, raise an error - if initArgs.varargs: - raise SerializationError("Cannot serialize object with variable args.") - # how many init args are required? - nReq = len(initArgs.args) - len(initArgs.defaults) - # get required params - for param in initArgs.args[:nReq]: + initArgs = inspect.signature(obj.__init__) + # get attributes corresponding to init args + for key, param in initArgs.parameters.items(): # skip self - if param == "self": + if KeyError == "self": continue + # raise error if parameters are variable - these aren't serializable + if param.kind in (inspect._VAR_POSITIONAL, inspect._VAR_KEYWORD): + raise SerializationError("Cannot serialize object with variable args.") # get attribute - arr[param] = _getAttr(obj, param) - # get optional params - for param in initArgs.args[nReq:]: - # get attribute, but don't worry if it fails try: - arr[param] = _getAttr(obj, param) - except SerializationError: - pass + arr[key] = _getAttr(obj, key) + except SerializationError as err: + # if it fails, only error if param was required + if param.default is inspect._empty: + raise err # add class if includeClass: diff --git a/psychopy/tools/systemtools.py b/psychopy/tools/systemtools.py index b143599f..32991946 100644 --- a/psychopy/tools/systemtools.py +++ b/psychopy/tools/systemtools.py @@ -28,7 +28,7 @@ 'getSerialPorts', 'systemProfilerMacOS', 'getInstalledDevices', - 'isPsychopyInFocus' + 'isRegisteredApp' ] # Keep imports to a minimum here! We don't want to import the whole stack to diff --git a/psychopy/visual/backends/pygletbackend.py b/psychopy/visual/backends/pygletbackend.py index c1fcc91d..0e53490d 100644 --- a/psychopy/visual/backends/pygletbackend.py +++ b/psychopy/visual/backends/pygletbackend.py @@ -343,30 +343,36 @@ def __init__(self, win, backendConf=None): temp_origin = cocoapy.NSPoint(thisScreen.x, thisScreen_y) self.winHandle._nswindow.setFrameOrigin_(temp_origin) - # bind the NSWindow pointer to the window handle, we use AppKit here - # because the ctypes bindings in cocoapy are incomplete - winNSObj = AppKit.NSWindow(c_void_p=self.winHandle._nswindow.ptr) - - # create a display link for the window - self.refreshEventHandlerMacOS = RefreshEventHandlerMacOS.alloc().init() - displayLinkObj = winNSObj.displayLinkWithTarget_selector_( - self.refreshEventHandlerMacOS, - "displayRefreshed:") - - # configure the preferred frame rate range hint for the display link - frameRateMax = int(winNSObj.screen().maximumFramesPerSecond()) - frameRateMin = int(frameRateMax / 2) - displayLinkObj.setPreferredFrameRateRange_( - (frameRateMin, - frameRateMax, - frameRateMax)) - - # add the display link to the run loop, only works with - # `NSRunLoopCommonModes` since we don't run a full app loop here - # and will pump our events manually in `swapBuffers()` - displayLinkObj.addToRunLoop_forMode_( - AppKit.NSRunLoop.currentRunLoop(), - AppKit.NSRunLoopCommonModes) + # create a display link + try: + # bind the NSWindow pointer to the window handle, we use AppKit here + # because the ctypes bindings in cocoapy are incomplete + winNSObj = AppKit.NSWindow(c_void_p=self.winHandle._nswindow.ptr) + + # create a display link for the window + self.refreshEventHandlerMacOS = RefreshEventHandlerMacOS.alloc().init() + displayLinkObj = winNSObj.displayLinkWithTarget_selector_( + self.refreshEventHandlerMacOS, + "displayRefreshed:") + + # configure the preferred frame rate range hint for the display link + frameRateMax = int(winNSObj.screen().maximumFramesPerSecond()) + frameRateMin = int(frameRateMax / 2) + displayLinkObj.setPreferredFrameRateRange_( + (frameRateMin, + frameRateMax, + frameRateMax)) + + # add the display link to the run loop, only works with + # `NSRunLoopCommonModes` since we don't run a full app loop here + # and will pump our events manually in `swapBuffers()` + displayLinkObj.addToRunLoop_forMode_( + AppKit.NSRunLoop.currentRunLoop(), + AppKit.NSRunLoopCommonModes) + except Exception: + logging.error( + "Unable to create DisplayLink for screen. This may result in " + "less accurate timing of window flips.") elif sys.platform.startswith('linux'): win._hw_handle = self.winHandle._window @@ -474,7 +480,7 @@ def swapBuffers(self, flipThisFrame=True): for dispatcher in self.win._eventDispatchers: try: dispatcher.dispatch_events() - except: + except AttributeError: dispatcher._dispatch_events() # this might need to be done even more often than once per frame? diff --git a/psychopy/visual/image.py b/psychopy/visual/image.py index dd066b0c..b734cce8 100644 --- a/psychopy/visual/image.py +++ b/psychopy/visual/image.py @@ -135,7 +135,7 @@ def __del__(self): #if hasattr(self, '_listID'): # GL.glDeleteLists(self._listID, 1) self.clearTextures() - except (ImportError, ModuleNotFoundError, TypeError): + except (ImportError, ModuleNotFoundError, TypeError, GL.lib.GLException): pass # has probably been garbage-collected already def _updateListShaders(self): diff --git a/psychopy/visual/movies/__init__.py b/psychopy/visual/movies/__init__.py index 840f3610..298b9a70 100644 --- a/psychopy/visual/movies/__init__.py +++ b/psychopy/visual/movies/__init__.py @@ -26,6 +26,7 @@ from psychopy.constants import ( FINISHED, NOT_STARTED, PAUSED, PLAYING, STOPPED, SEEKING) from psychopy import core +from psychopy.hardware import speaker from .metadata import MovieMetadata, NULL_MOVIE_METADATA from .frame import MovieFrame, NULL_MOVIE_FRAME_INFO @@ -40,7 +41,7 @@ reportNDroppedFrames = 10 # time to wait for the movie decoder to respond -defaultTimeout = 5.0 # seconds +defaultTimeout = 20.0 # seconds # constants for use with ffpyplayer FFPYPLAYER_STATUS_EOF = 'eof' @@ -254,10 +255,19 @@ def __init__(self, # movie information self._metadata = None # metadata object + + # movie attributes + self._frameInterval = -1.0 + self._srcFrameSize = (-1, -1) + self._frameRate = -1.0 + self._duration = -1.0 - # store decoded video segmenets in memory + # store decoded video segments in memory self._frameStore = [] + # maximum number of attempts to get a frame from the decoder before giving up + self._maxGetFrameAttempts = -1 # set later based on the frame interval + # callbacks for video events self._streamEOFCallback = None @@ -487,10 +497,12 @@ def _openFFPyPlayer(self): # keep calling until we get a valid frame size if movieMetadata['src_vid_size'] != (0, 0): break + time.sleep(0.001) else: - raise RuntimeError( - 'FFPyPlayer failed to extract metadata from the movie. Check ' - 'the movie file and decoder options.') + raise RuntimeError(( + 'FFPyPlayer failed to extract metadata from the movie `{}`. ' + 'Check the movie file and decoder options.').format( + self._filename)) # warmup, takes a while before the video starts playing startTime = time.time() @@ -508,12 +520,20 @@ def _openFFPyPlayer(self): self._player.set_mute(False) # unmute the player # seek to the beginning of the movie - self._player.seek(0.0, relative=False) + self._player.seek(0.0, relative=False, accurate=False) + # wait until the player actually seeks to zero + while time.time() - startTime < defaultTimeout: + curPts = self._player.get_pts() + if abs(curPts) < 1e-6: + break + time.sleep(0.001) # wait a bit before checking again + # compute frame rate and interval numer, denom = movieMetadata['frame_rate'] frameRate = numer / denom self._frameInterval = 1.0 / frameRate + self._maxGetFrameAttempts = int(self._frameInterval / 0.001) # populate the metadata object with the movie metadata we got self._metadata = MovieMetadata( @@ -596,6 +616,31 @@ def _convertFrameToRGBFFPyPlayer(self, frame): return rgbImg + def _convertFrameToRGB(self, frame): + """Convert a frame to RGB format. + + This function converts a frame to RGB format. The frame is returned as + a Numpy array. The resulting array will be in the correct format to + upload to OpenGL as a texture. + + Parameters + ---------- + frame : FFPyPlayer frame + The frame to convert. + + Returns + ------- + numpy.ndarray + The converted frame in RGB format. + + """ + # convert the frame to RGB format + if self._decoderLib == 'ffpyplayer': + return self._convertFrameToRGBFFPyPlayer(frame) + else: + raise NotImplementedError( + 'Frame conversion is not implemented for this decoder library.') + def _bufferFramesFFPyPlayer(self, start=0.0, end=None, units='seconds'): """Buffer frames from the movie file using FFPyPlayer. @@ -686,6 +731,7 @@ def _getFrameFFPyPlayer(self, reqPTS=0.0): if frame is not None: return frame + getFrameAttempts = 0 while 1: # keep getting frames until we reach the desired PTS frame, status = self._player.get_frame() @@ -696,9 +742,19 @@ def _getFrameFFPyPlayer(self, reqPTS=0.0): break elif status == 'paused': break - + + # if we get `None` for the frame, it means the player is not ready + # to give us a frame yet, so we wait a bit and try again. If we get + # `None` too many times, we give up and return `None` if frame is None: - break + if getFrameAttempts < self._maxGetFrameAttempts: + time.sleep(0.001) # wait a bit before trying again + getFrameAttempts += 1 + continue # keep retrying + else: + raise RuntimeError( + 'Failed to return a frame after multiple attempts.' + ) img, curPts = frame # extract frame information @@ -787,6 +843,8 @@ def _freePlayer(self): self._player.set_pause(True) # pause the player self._player.close_player() + self._cleanUpAudioTrack() # clean up the audio track + self._player = None def _cleanUpFrameStore(self, keepAfterPTS=None): @@ -826,16 +884,18 @@ def _getFrameFromStore(self, reqPTS): Returns ------- - numpy.ndarray - The converted frame in RGB format. + tuple or None + If a frame is found, return a tuple containing the video data + (`ndarray`), presentation timestamp (PTS), and status. The status + value may be backend specific. If no frame is found, return `None`. """ - if self._frameStore is None: + if self._frameStore is None or not self._frameStore: return None for img, pts, status in self._frameStore: if pts <= reqPTS < pts + self._metadata.frameInterval: - return (img, pts, status) + return (self._convertFrameToRGB(img), pts, status) return None # no frame found @@ -1162,7 +1222,10 @@ def __init__(self, depth=0.0, noAudio=False, interpolate=True, - autoStart=True): + autoStart=True, + audioDevice=None, + audioConfig=None, + **kwargs): # what local vars are defined (these are the init params) for use self._initParams = dir() @@ -1205,12 +1268,17 @@ def __init__(self, self._wasPaused = False # was the movie paused? # audio stuff - if audioLib is None and self._movieLib == 'ffpyplayer': - self._audioLib = 'sdl2' - self._noAudio = False # use SDL2 for audio playback + if audioDevice is not None: + logging.debug( + "Audio device specified for movie playback. Ignoring " \ + "`audioLib` parameter.") + self._audioDevice = speaker.SpeakerDevice(audioDevice) + self._audioLib = None # override else: - self._audioLib = audioLib - self._noAudio = True # no audio if using a different library + if audioLib is None and self._movieLib == 'ffpyplayer': + self._audioLib = 'sdl2' + self._noAudio = False # use SDL2 for audio playback + self._audioDevice = None # warn the user if they are using the SDL2 audio library that precise # A/V sync is not supported @@ -1219,21 +1287,22 @@ def __init__(self, 'Using `sdl2` for audio playback via `ffpyplayer`. This is not ' 'recommended for applications requiring precise audio-visual ' 'synchronization.') - else: - raise MovieAudioError( - "Movie audio playback is only supported with the 'sdl2' library " - "at this time.") + # else: + # raise MovieAudioError( + # "Movie audio playback is only supported with the 'sdl2' library " + # "at this time.") # audio playback configuration - self._audioConfig = {} + self._audioConfig = audioConfig if audioConfig is not None else {} self._audioTempFile = None # audio extracted from the movie self._audioSamples = [] # audio samples from the movie + self._audioTrack = None # audio track information from the movie metadata self._audioReader = None # audio reader object self._audioSampleRate = 44100 # audio sample rate self._audioChannels = 2 # number of audio channels # OpenGL data - self.interpolate = interpolate + self._interpolate = interpolate self._texFilterNeedsUpdate = True self._metadata = NULL_MOVIE_METADATA self._pixbuffId = GL.GLuint(0) @@ -1258,7 +1327,7 @@ def size(self, value): if not self._hasPlayer: return # duplicate if necessary - if isinstance(value, (float, int)): + if isinstance(value, (float, int)) or value is None: value = [value, value] # make sure value is a list so we can assign indices if isinstance(value, tuple): @@ -1286,8 +1355,6 @@ def filename(self, value): self.loadMovie(value) def setMovie(self, value): - if self._isLoaded: - self.unload() self.loadMovie(value) @property @@ -1303,7 +1370,10 @@ def autoStart(self, value): def frameRate(self): """Frame rate of the movie in Hertz (`float`). """ - return self._player.metadata.frameRate + if self._player is None or self._player._metadata is None: + return 0.0 + + return self._player._metadata.frameRate @property def loop(self): @@ -1328,13 +1398,6 @@ def loop(self, value): """ self._loop = bool(value) - @property - def loopCount(self): - """Number of times the movie has looped (`int`). - - """ - return self._player.loopCount if self._hasPlayer else 0 - @property def _hasPlayer(self): """`True` if a media player instance is started. @@ -1342,6 +1405,18 @@ def _hasPlayer(self): # use this property to check if the player instance is started in # methods which require it return hasattr(self, "_player") and self._player is not None + + @property + def interpolate(self): + """Whether to use linear interpolation when scaling the video frame + (`bool`). + """ + return self._interpolate + + @interpolate.setter + def interpolate(self, value): + self._interpolate = bool(value) + self._texFilterNeedsUpdate = True # update the texture filter on the next draw call # -------------------------------------------------------------------------- # Movie file handlers @@ -1386,29 +1461,27 @@ def loadMovie(self, filename): Path to movie file. Must be a format that FFMPEG supports. """ + # if a movie is already loaded, unload it first + if self._isLoaded: + self.unload() + # Set the movie file name, this handles normalizing the path and # checking if the file exists. - self._setFileName(filename) - # Time opening the movie file - t0 = time.time() # time it logging.debug( "Opening movie file: {}".format(self._filename)) - # Extact the audio track so we can read samples from it. This needs to + # Extract the audio track so we can read samples from it. This needs to # be done before the movie is opened by the player to avoid file access # issues. The audio track is extracted to a temporary file which is # deleted when the movie is closed. disableAudio = False if not self._noAudio and self._audioLib not in ('sdl', 'sdl2'): - # if using SDL, playback is handled by the ffpyplayer library so we - # don't need to extract the audio track or setup the audio stream - self._extractAudioTrack() - disableAudio = True - + self._loadAudioTrack() # extract and load the audio track + disableAudio = True # playing through our libs, so disable in ffpyplayer self._decoderOpts['an'] = disableAudio @@ -1456,19 +1529,14 @@ def loadMovie(self, filename): # set the volume to previous self.volume = self._volume - def _setupAudioStream(self): - """Setup the audio stream for the movie. - """ - # todo - handle setting up the audio library stream - if self._noAudio or self._audioLib in ('sdl', 'sdl2'): - return - - def _pushAudioSamples(self): - """Push audio samples to the audio buffer. - """ - # todo - implement this - if self._noAudio or self._audioLib in ('sdl', 'sdl2'): - return + # display first frame of video + frameData = self._player._getFrameFromStore(0.0) + if frameData is not None: + frameImage = frameData[0] + videoBuffer = frameImage.to_memoryview()[0].memview + videoFrameArray = np.frombuffer(videoBuffer, dtype=np.uint8) + self._recentFrame = videoFrameArray # most recent frame + self._pixelTransfer(forceRefresh=True) # copy the first frame to the texture def _extractAudioTrack(self): """Extract the audio track from the movie file. @@ -1495,39 +1563,98 @@ def _extractAudioTrack(self): self._filename) audioTrackData = videoClip.audio + audioConfig = { + 'codec': 'pcm_s16le', + 'fps': 44100, + 'nbytes': 2} + audioConfig.update(self._audioConfig) # update with any user-provided config options + audioTrackData.write_audiofile( self._audioTempFile.name, - codec='pcm_s16le', - fps=44100, - nbytes=2, + codec=audioConfig['codec'], + fps=audioConfig['fps'], + nbytes=audioConfig['nbytes'], logger=None) videoClip.close() self._audioTempFile.close() - logging.warning( + logging.debug( "Audio track written to temporary file: {} ({} bytes)".format( self._audioTempFile.name, os.path.getsize(self._audioTempFile.name))) - logging.warning( + logging.debug( "Audio track extraction completed in {:.2f} seconds".format( time.time() - t0)) # use soundfile to read the audio samples from the temporary file - import soundfile as sf - samples, sr = sf.read( - self._audioTempFile.name, - dtype='float32', - always_2d=True) - self._audioSampleRate = sr - self._audioSamples = samples + # NOTE - Using an actual sound object for audio now + # import soundfile as sf + # samples, sr = sf.read( + # self._audioTempFile.name, + # dtype='float32', + # always_2d=True) + # self._audioSampleRate = sr + # self._audioSamples = samples # compute the size of the audio samples in bytes - audioSize = self._audioSamples.nbytes + # audioSize = self._audioSamples.nbytes + audioSize = os.path.getsize(self._audioTempFile.name) logging.debug( "Audio track size: {} bytes".format(audioSize)) + + def _loadAudioTrack(self): + """Load the extracted audio track into a Sound object for playback. + """ + # check if we have an audio track already loaded + if self._audioTrack is not None: + logging.debug( + "Audio track already loaded, stopping existing track before " \ + "loading new one.") + if not hasattr(self._audioTrack, 'stop'): + logging.error("Audio track does not appear to be valid.") + else: + self._audioTrack.stop() + + self._audioTrack = None + + self._extractAudioTrack() # extract the audio track to a temporary file + + import psychopy.sound as _sound + logging.debug( + "Loading audio track from temporary file: {}".format( + self._audioTempFile.name)) + self._audioTrack = _sound.Sound( + self._audioTempFile.name, + preBuffer=0) # stream audio from disk + self._audioTrack.volume = self._volume # set the volume to the current level + + def _cleanupAudioTrack(self): + """Clean up the audio track. + + This function stops the audio track if it is playing and deletes the + temporary file where the audio track was stored. + + """ + if self._audioTrack is not None: + if hasattr(self._audioTrack, 'stop'): + self._audioTrack.stop() + self._audioTrack = None + + if self._audioTempFile is not None: + tempFilePath = self._audioTempFile.name + try: + os.remove(tempFilePath) + logging.debug( + "Deleted temporary audio file: {}".format( + tempFilePath)) + except Exception as e: + logging.error( + "Error deleting temporary audio file: {}. Error: {}".format( + tempFilePath, e)) + self._audioTempFile = None def load(self, filename): """Load a movie file from disk (alias of `setMovie`). @@ -1550,7 +1677,7 @@ def unload(self, log=True): """ if self._isLoaded: - self._player.close() + self._freePlayer() # free the player if it is already open self._freeTextureBuffers() # free buffer before creating a new one self._isLoaded = False @@ -1719,7 +1846,7 @@ def _setupTextureBuffers(self): None) # setup texture filtering - if self.interpolate: + if self._interpolate: texFilter = GL.GL_LINEAR else: texFilter = GL.GL_NEAREST @@ -1739,13 +1866,25 @@ def _setupTextureBuffers(self): GL.glFlush() # make sure all buffers are ready - def _pixelTransfer(self): + def _pixelTransfer(self, forceRefresh=False): """Copy pixel data from video frame to texture. This is called when a new frame is available. The pixel data is copied from the video frame to the texture store on the GPU. + Parameters + ---------- + forceRefresh : bool + If `True`, the pixel data will be copied to the texture even if the + playback state indicates that the movie is paused or seeking. + """ + if self._recentFrame is None: + return # no frame to copy + + if not forceRefresh and self._playbackStatus != PLAYING: + return # don't update the texture if paused or seeking unless forced + # get the size of the movie frame and compute the buffer size vidWidth, vidHeight = self._player.getMetadata().size @@ -1782,6 +1921,7 @@ def _pixelTransfer(self): GL.glEnable(GL.GL_TEXTURE_2D) GL.glActiveTexture(GL.GL_TEXTURE0) GL.glBindTexture(GL.GL_TEXTURE_2D, self._textureId) + GL.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1) # copy the PBO to the texture GL.glTexSubImage2D( @@ -1793,7 +1933,7 @@ def _pixelTransfer(self): # update texture filtering only if needed if self._texFilterNeedsUpdate: - if self.interpolate: + if self._interpolate: texFilter = GL.GL_LINEAR else: texFilter = GL.GL_NEAREST @@ -1963,9 +2103,13 @@ def play(self, log=True): return # nop if not self._noAudio: - if self._audioLib == 'sdl2': - self._player.mute(False) - self._player.setVolume(self._volume) + if self._audioDevice is None: + if self._audioLib == 'sdl2': + self._player.mute(False) + self._player.setVolume(self._volume) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'play'): + self._audioTrack.play() self._player.pause(False) # start the player self._playbackStatus = PLAYING @@ -1990,6 +2134,9 @@ def pause(self, log=True): if not self._noAudio: if self._audioLib == 'sdl2': self._player.mute(True) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'pause'): + self._audioTrack.pause() self._player.pause() self._wasPaused = True # set the paused flag @@ -2038,6 +2185,7 @@ def stop(self, log=True): logging.debug("Stopping movie: {}".format(self._filename)) self._player.close() # close the player + self._cleanupAudioTrack() # clean up the audio track self.loadMovie(self._filename) # reload the movie @@ -2067,6 +2215,10 @@ def seek(self, timestamp, log=True): # self._player.pause(True) # pause the player self._player.seek(self._movieTime) + # seek the audio track if we have one + if self._audioTrack is not None and hasattr(self._audioTrack, 'seek'): + self._audioTrack.seek(self._movieTime) + # self._pts = self._movieTime # store the current PTS _ = self.updateVideoFrame() @@ -2124,7 +2276,8 @@ def replay(self, log=True): def reset(self): """Reset the movie to its initial state. """ - # self.seek(0.0) # reset movie time to 0 + self._movieTime = 0.0 # reset movie time + self.seek(self._movieTime) self._playbackStatus = NOT_STARTED # reset playback status # -------------------------------------------------------------------------- @@ -2136,13 +2289,20 @@ def muted(self): """`True` if the stream audio is muted (`bool`). """ if self._audioLib == 'sdl2': - return self._player.mute + return self._player.get_mute() else: - return False # for now + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + return self._audioTrack.volume == 0.0 + else: + return False @muted.setter def muted(self, value): - self._player.mute = value + if self._audioLib == 'sdl2': + self._player.set_mute(value) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + self._audioTrack.volume = 0.0 if value else self._volume def volumeUp(self, amount=0.05): """Increase the volume by a fixed amount. @@ -2154,8 +2314,11 @@ def volumeUp(self, amount=0.05): """ if self._audioLib == 'sdl2': - currentVolume = self._player.volume - self._player.setVolume(currentVolume + amount) + currentVolume = self._player.get_volume() + self._player.set_volume(currentVolume + amount) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + self._audioTrack.volume = min(self._audioTrack.volume + amount, 1.0) def volumeDown(self, amount=0.05): """Decrease the volume by a fixed amount. @@ -2167,20 +2330,32 @@ def volumeDown(self, amount=0.05): """ if self._audioLib == 'sdl2': - currentVolume = self._player.volume - self._player.setVolume(currentVolume - amount) + currentVolume = self._player.get_volume() + self._player.set_volume(currentVolume - amount) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + self._audioTrack.volume = max(self._audioTrack.volume - amount, 0.0) @property def volume(self): """Volume for the audio track for this movie (`int` or `float`). """ if self._audioLib == 'sdl2': - return self._player.volume + return self._player.get_volume() + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + return self._audioTrack.volume + else: + return 0.0 @volume.setter def volume(self, value): if self._audioLib == 'sdl2': - self._player.volume = value + self._player.setVolume(value) + else: + if self._audioTrack is not None and hasattr(self._audioTrack, 'volume'): + self._audioTrack.volume = value + self._volume = value # store the volume for later use when loading new movies # -------------------------------------------------------------------------- # Video and playback information diff --git a/psychopy/visual/progress.py b/psychopy/visual/progress.py index 6f823570..271377b4 100644 --- a/psychopy/visual/progress.py +++ b/psychopy/visual/progress.py @@ -10,7 +10,6 @@ "0": "horizontal", "False": "horizontal", 0: "horizontal", - False: "horizontal", # Vertical "vertical": "vertical", "vert": "vertical", @@ -18,7 +17,6 @@ "1": "vertical", "True": "vertical", 1: "vertical", - True: "vertical", } diff --git a/psychopy/visual/textbox2/textbox2.py b/psychopy/visual/textbox2/textbox2.py index b68cffb9..2ba3a52e 100644 --- a/psychopy/visual/textbox2/textbox2.py +++ b/psychopy/visual/textbox2/textbox2.py @@ -73,40 +73,49 @@ class TextBox2(BaseVisualStim, PointerMixin, DraggingMixin, ContainerMixin, ColorMixin): - def __init__(self, win, text, - font="Noto Sans", - pos=(0, 0), - units=None, - letterHeight=None, - ori=0, - size=None, - color=(1.0, 1.0, 1.0), colorSpace='rgb', - fillColor=None, fillColorSpace=None, - borderWidth=2, borderColor=None, borderColorSpace=None, - contrast=1, - opacity=None, - bold=False, - italic=False, - placeholder="Type here...", - lineSpacing=1.0, - letterSpacing=None, - padding=None, # gap between box and text - speechPoint=None, - anchor='center', - alignment='left', - flipHoriz=False, - flipVert=False, - languageStyle="LTR", - editable=False, - overflow="visible", - lineBreaking='default', - draggable=False, - name='', - autoLog=None, - autoDraw=False, - depth=0, - onTextCallback=None, - clickable=True): + def __init__( + self, + win, + text, + font="Noto Sans", + pos=(0, 0), + units=None, + letterHeight=None, + ori=0, + size=None, + color=(1.0, 1.0, 1.0), + colorSpace='rgb', + fillColor=None, + fillColorSpace=None, + borderWidth=2, + borderColor=None, + borderColorSpace=None, + contrast=1, + opacity=None, + bold=False, + italic=False, + placeholder="Type here...", + lineSpacing=1.0, + letterSpacing=None, + padding=None, # gap between box and text + speechPoint=None, + anchor='center', + alignment='left', + flipHoriz=False, + flipVert=False, + formattingSyntax="md", + languageStyle="LTR", + editable=False, + overflow="visible", + lineBreaking='default', + draggable=False, + name='', + autoLog=None, + autoDraw=False, + depth=0, + onTextCallback=None, + clickable=True + ): """ Parameters @@ -237,7 +246,7 @@ def __init__(self, win, text, # used at render time self._lines = None # np.array the line numbers for each char self._colors = None - self._styles = None + self._styles = {} self.flipHoriz = flipHoriz self.flipVert = flipVert # params about positioning (after layout has occurred) @@ -257,6 +266,7 @@ def __init__(self, win, text, "specified.".format(lineBreaking)) self._lineBreaking = lineBreaking # then layout the text (setting text triggers _layout()) + self.formattingSyntax = formattingSyntax self.languageStyle = languageStyle self._text = '' self.text = self.startText = text if text is not None else "" @@ -264,11 +274,6 @@ def __init__(self, win, text, # now that we have text, set orientation self.ori = ori - # Initialise arabic reshaper - arabic_config = {'delete_harakat': False, # if present, retain any diacritics - 'shift_harakat_position': False} # shift by 1 to be compatible with the bidi algorithm - self.arabicReshaper = ArabicReshaper(configuration=arabic_config) - # caret self.editable = editable self.overflow = overflow @@ -669,9 +674,6 @@ def languageStyle(self, value): self._languageStyle = value if hasattr(self, "_placeholder"): self._placeholder.languageStyle = value - # If layout is anything other than LTR, mark that we need to use bidi to lay it out - self._needsBidi = value != "LTR" - self._needsArabic = value.lower() == "arabic" @property def anchor(self): @@ -716,114 +718,71 @@ def alignment(self, alignment): if hasattr(self, "_text"): # If text has been set, layout self._layout() + + @property + def rawText(self): + return self._stylingObj.text + + @rawText.setter + def rawText(self, value): + self.text = value @property def text(self): - return self._styles.formatted_text + return self._text @text.setter def text(self, text): - # Convert to string + # convert to string text = str(text) - original_text = text - # Substitute HTML tags - text = text.replace('', codes['ITAL_START']) - text = text.replace('', codes['ITAL_END']) - text = text.replace('', codes['BOLD_START']) - text = text.replace('', codes['BOLD_END']) - text = text.replace('', codes['COLOR_END']) - - # Handle starting color tag - colorMatches = re.findall(re_color_pattern, text) - # Only execute if color codes are found to save a regex call - if len(colorMatches) > 0: - text = re.sub(re_color_pattern, codes['COLOR_START'], text) - # Interpret colors from tags - color_values = [] - for match in colorMatches: - # Strip C tag - matchKey = match.replace("", "") - # Convert to arrays as needed - try: - matchVal = literal_eval(matchKey) - except (ValueError, SyntaxError): - # If eval fails, use value as is - matchVal = matchKey - # Retrieve/cache color - if matchKey not in _colorCache: - _colorCache[matchKey] = Color(matchVal, self.colorSpace) - if not _colorCache[matchKey].valid: - raise ValueError(f"Could not interpret color value for `{matchKey}` in textbox.") - color_values.append(_colorCache[matchKey].render('rgba1')) - - visible_text = ''.join([c for c in text if c not in codes.values()]) - self._styles = Style(len(visible_text)) - self._styles.formatted_text = original_text - self._text = visible_text - if self._needsArabic and hasattr(self, "arabicReshaper"): - self._text = self.arabicReshaper.reshape(self._text) - if self._needsBidi: - self._text = bidi.get_display(self._text) - - color_iter = 0 # iterator for color_values list - current_color = [()] # keeps track of color style(s) - is_bold = False - is_italic = False - ci = 0 - for c in text: - if c == codes['ITAL_START']: - is_italic = True - elif c == codes['BOLD_START']: - is_bold = True - elif c == codes['COLOR_START']: - current_color.append(color_values[color_iter]) - color_iter += 1 - elif c == codes['ITAL_END']: - is_italic = False - elif c == codes['BOLD_END']: - is_bold = False - elif c == codes['COLOR_END']: - current_color.pop() - else: - self._styles.c[ci] = current_color[-1] - self._styles.i[ci] = is_italic - self._styles.b[ci] = is_bold - ci += 1 + # split into visible text and styling array + self._stylingObj = Styling( + text, + syntax=self.formattingSyntax, + languageStyle=self.languageStyle, + ) + self._text, self._styles = self._stylingObj.getVisibleTextAndStyling() self._layout() def addCharAtCaret(self, char): """Allows a character to be added programmatically at the current caret""" - txt = self._text - txt = txt[:self.caret.index] + char + txt[self.caret.index:] - cstyle = Style(1) - if len(self._styles) and self.caret.index <= len(self._styles): - cstyle = self._styles[self.caret.index-1] - self._styles.insert(self.caret.index, cstyle) + # get raw text + rawText = self.rawText + # get index of caret within raw text + i = self._stylingObj.visible2raw(self.caret.index) + # insert char at caret + rawText = rawText[:i] + char + rawText[i:] + # set text + self.text = rawText + # move caret to end of new char self.caret.index += 1 - self.text = txt - self._layout() def deleteCaretLeft(self): """Deletes 1 character to the left of the caret""" if self.caret.index > 0: - txt = self._text - ci = self.caret.index - txt = txt[:ci-1] + txt[ci:] - self._styles = self._styles[:ci-1]+self._styles[ci:] + # get raw text + rawText = self.rawText + # get index of caret within raw text + i = self._stylingObj.visible2raw(self.caret.index) + # remove char to left of caret + rawText = rawText[:i-1] + rawText[i:] + # set text + self.text = rawText + # move caret back 1 self.caret.index -= 1 - self.text = txt - self._layout() def deleteCaretRight(self): - """Deletes 1 character to the right of the caret""" - ci = self.caret.index - if ci < len(self._text): - txt = self._text - txt = txt[:ci] + txt[ci+1:] - self._styles = self._styles[:ci]+self._styles[ci+1:] - self.text = txt - self._layout() + """Deletes 1 character to the right of the caret""" + if self.caret.index > 0: + # get raw text + rawText = self.rawText + # get index of caret within raw text + i = self._stylingObj.visible2raw(self.caret.index) + # remove char to right of caret + rawText = rawText[:i] + rawText[i+1:] + # set text + self.text = rawText def _layout(self): """Layout the text, calculating the vertex locations @@ -871,9 +830,12 @@ def _layout(self): # handle formatting codes fakeItalic = 0.0 fakeBold = 0.0 - if self._styles.i[i]: + if "italic" in self._styles and self._styles['italic'][i]: + fakeItalic = 0.1 * font.size + if "bold" in self._styles and self._styles['bold'][i]: + fakeBold = 0.3 * font.size + if "bolditalic" in self._styles and self._styles['bolditalic'][i]: fakeItalic = 0.1 * font.size - if self._styles.b[i]: fakeBold = 0.3 * font.size # handle newline @@ -925,9 +887,8 @@ def _layout(self): vertices[i * 4:i * 4 + 4] = theseVertices self._texcoords[i * 4:i * 4 + 4] = texcoords # handle character color - rgb_ = self._styles.c[i] - if len(rgb_) > 0: - self._colors[i*4 : i*4+4, :4] = rgb_ # set custom color + if "color" in self._styles and self._styles['color'][i] is not None: + self._colors[i*4 : i*4+4, :4] = self._styles['color'][i] # set custom color else: self._colors[i*4 : i*4+4, :4] = rgb # set default color self._lineNs[i] = lineN @@ -1001,7 +962,6 @@ def _layout(self): # get a list of line-breakable points according to UAX#14 breakable_points = list(get_breakable_points(self._text)) text_seg = list(break_units(self._text, breakable_points)) - styles_seg = list(break_units(self._styles, breakable_points)) lineN = 0 charwidth_list = [] @@ -1009,20 +969,24 @@ def _layout(self): y_advance_list = [] vertices_list = [] texcoords_list = [] - + # keep track of simple char index + i = 0 # calculate width of each segments for this_seg in range(len(text_seg)): thisSegWidth = 0 # width of this segment - for i, charcode in enumerate(text_seg[this_seg]): + for charcode in text_seg[this_seg]: printable = True # unless we decide otherwise # handle formatting codes fakeItalic = 0.0 fakeBold = 0.0 - if self._styles.i[i]: + if "italic" in self._styles and self._styles['italic'][i]: + fakeItalic = 0.1 * font.size + if "bold" in self._styles and self._styles['bold'][i]: + fakeBold = 0.3 * font.size + if "bolditalic" in self._styles and self._styles['bolditalic'][i]: fakeItalic = 0.1 * font.size - if self._styles.b[i]: fakeBold = 0.3 * font.size # handle newline @@ -1070,6 +1034,7 @@ def _layout(self): [u1, v1], [u1, v0]]) charwidth_list.append(w) y_advance_list.append(glyph.advance[1]) + i += 1 # append width of this segment to the list segwidth_list.append(thisSegWidth) @@ -1112,9 +1077,8 @@ def _layout(self): vertices[i * 4:i * 4 + 4] = theseVertices self._texcoords[i * 4:i * 4 + 4] = texcoords # handle character color - rgb_ = self._styles.c[i] - if len(rgb_) > 0: - self._colors[i*4 : i*4+4, :4] = rgb_ # set custom color + if "color" in self._styles and self._styles['color'][i] is not None: + self._colors[i*4 : i*4+4, :4] = self._styles['color'][i] # set custom color else: self._colors[i*4 : i*4+4, :4] = rgb # set default color self._lineNs[i] = lineN @@ -1188,7 +1152,7 @@ def _layout(self): # convert the vertices to be relative to content box and set vertices = vertices / self.contentBox._size.pix + (-0.5, 0.5) # apply orientation - self.vertices = (vertices * self.size).dot(self._rotationMatrix) / self.size + self.vertices = (vertices * self.contentBox._size.pix).dot(self._rotationMatrix) / self.contentBox._size.pix if len(_lineBottoms): if self.flipVert: @@ -1890,51 +1854,270 @@ def vertices(self): [x, top] ]) -class Style: - # Define a simple Style class for storing information in text(). - # Additional features exist to maintain extant edit/caret syntax - def __init__(self, text_length, i=None, b=None, c=None): - self.len = text_length - self.i = i - self.b = b - self.c = c - if i == None: - self.i = [False]*text_length - if b == None: - self.b = [False]*text_length - if c == None: - self.c = [()]*text_length - self.formatted_text = '' - - def __len__(self): - return self.len - - def __getitem__(self, i): - # Return a new Style object with data from current index - if isinstance(i, int): - s = Style(1, [self.i[i]], [self.b[i]], [self.c[i]]) - else: - s = Style(len(self.i[i]), self.i[i], self.b[i], self.c[i]) - return s - - def __add__(self, c): - s = self.copy() - s.insert(len(s), c) - return s - - def copy(self): - s = Style(self.len, self.i.copy(), self.b.copy(), self.c.copy()) - s.formatted_text = self.formatted_text - return s - - def insert(self, i, style): - # in-place, like list - if not isinstance(style, Style): - raise TypeError('Inserted object must be Style.') - self.i[i:i] = style.i - self.b[i:i] = style.b - self.c[i:i] = style.c - self.len += len(style) + +class Styling: + """ + Handles styling for a block of text. + + Parameters + ---------- + text : str + Raw text from which to generate visible text and styling arrays + syntax : str + Syntax to use for styling, one of... + - "md": Markdown, recommended for local experiments. + - "html": For (limited) compatibility with online experiments. Not recommended for local experiments. + - "raw": No formatting, text is presented as-is. + languageStyle : str + One of... + - "LTR": Text reads left-to-right (e.g. as in English) + - "RTL": Text reads right-to-left (e.g. as in Hebrew) + - "arabic": Text is arabic (same as RTL but with additional transformations specific to arabic) + """ + + def __init__(self, text, syntax="md", languageStyle="LTR"): + self.text = text + # rolling tally of characters substituted when filtering for visible text + self.subadj = 0 + self.adjustments = [] + # maps indices in visible text to styles + self.indices = [] + # initialise arabic reshaper + self.arabicReshaper = ArabicReshaper(configuration={ + 'delete_harakat': False, # if present, retain any diacritics + 'shift_harakat_position': False # shift by 1 to be compatible with the bidi algorithm + }) + # do we need arabic or bidi transformation? + self.needsBidi = languageStyle.lower() in ("rtl", "arabic") + self.needsArabic = languageStyle.lower() == "arabic" + # define regex patterns according to syntax + self.patterns = {} + self.escapes = [] + if syntax == "md": + # regex patterns for formatting markdown-style + if self.needsBidi: + self.patterns = { + 'color': r"\[colou?r\/\](?P.+?)\[colou?r *= *(?P.+?)(?: +space *= *(?P.+?))?\]", + 'bolditalic': r"(?[^\*]+?)\*\*\*(?!\*)", + 'bold': r"(?[^\*]+?)\*\*(?!\*)", + 'italic': r"(?[^\*]+?)\*(?!\*)" + } + else: + self.patterns = { + 'color': r"\[colou?r *= *(?P.+?)(?: +space *= *(?P.+?))?\](?P.+?)\[\/colou?r\]", + 'bolditalic': r"(?[^\*]+?)\*\*\*(?!\*)", + 'bold': r"(?[^\*]+?)\*\*(?!\*)", + 'italic': r"(?[^\*]+?)\*(?!\*)" + } + # escape patterns for formatting-relevant characters + self.escapes = [ + r"\\(?P\*)" + ] + elif syntax == "html": + # regex patterns for formatting html-style + if self.needsBidi: + self.patterns = { + 'color': r"(?P.+?)[^\"';]+?) *;?[\"']>", + 'bolditalic': r"(?:|)(?P.+?)(?:|)", + 'italic': r"(?)(?P.+?)(?!)", + 'bold': r"(?)(?P.+?)(?!)" + } + # hide all other HTML tags + self.escapes = [ + r"<.+?\/>(?P.*?)<(?!(?:\/|b|i|span)).+?>" + ] + else: + self.patterns = { + 'color': r"[^\"';]+?) *;?[\"']>(?P.+?)<\/span>", + 'bolditalic': r"(?:|)(?P.+?)(?:<\/b><\/i>|<\/i><\/b>)", + 'bold': r"(?)(?!)(?P.+?)(?)<\/b>(?!<\/i>)", + 'italic': r"(?)(?!)(?P.+?)(?)<\/i>(?!<\/b>)" + } + # hide all other HTML tags + self.escapes = [ + r"<(?!(?:\/|b|i|span)).+?>(?P.*?)<\/.+?>" + ] + + + def raw2visible(self, index): + """ + Convert an index in the raw text string to the same index in the visible text string + + Parameters + ---------- + index : int + Index to convert + """ + # start off with index as is + target = index + # iterate through points where indices change + for thisAdj in self.adjustments: + if thisAdj[0] <= index: + target -= thisAdj[2] + else: + break + + return target + + def visible2raw(self, index): + """ + Convert an index in the visible text string to the same index in the raw text string + + Parameters + ---------- + index : int + Index to convert + """ + # start off with index as is + target = index + # iterate through points where indices change + for thisAdj in self.adjustments: + if thisAdj[1] < index: + target += thisAdj[2] + else: + break + + return target + + + def getVisibleTextAndStyling(self): + """ + Get the visible text and matching styling arrays for this object's text.. + + Returns + ------- + str + Visible text, with styling tags removed + dict[str:np.ndarray] + Dict of numpy arrays, each with an entry per character in visible text, indicating the + state of that style for that character + """ + # reset indices and adjustment + self.subadj = 0 + self.indices = [] + self.adjustments = [] + # start with raw text + visibleText = transformedText = self.text + # reshape text using bidi + if self.needsArabic and hasattr(self, "arabicReshaper"): + visibleText = transformedText = self.arabicReshaper.reshape(transformedText) + if self.needsBidi: + visibleText = transformedText = bidi.get_display(transformedText) + # get matches for all patterns + matches = [] + for style, pattern in self.patterns.items(): + for match in re.finditer( + pattern=pattern, + string=transformedText + ): + # store their start index, style and the match object + matches.append( + (match.start(), style, match) + ) + # strip syntax + visibleText = re.sub( + pattern=pattern, + repl=r"\g", + string=visibleText + ) + # substitute escaped characters + for escape in self.escapes: + for match in re.finditer( + pattern=escape, + string=transformedText + ): + # store as with patterns, but with style as "escape" + matches.append( + (match.start(), "escape", match) + ) + # do substitution + visibleText = re.sub( + pattern=escape, + repl=r"\g", + string=visibleText + ) + # sort matches chronologically + matches.sort( + key=lambda item: item[0] + ) + # map styles to index in visible text array + for _, style, match in matches: + self._processMatchIndices(style, match) + # create by-character arrays for each style + styling = { + style: [None] * len(visibleText) + for style in self.patterns + } + # apply relevant information to arrays from indices + for item in self.indices: + for i in range(item['start'], item['end']): + if "color" in item: + # create color object + if "space" in item: + col = Color(item['color'], item['space']) + else: + col = Color(item['color'], "named") + # get value in rgb255 + styling[item['style']][i] = col.render('rgba1') + else: + # otherwise apply boolean + styling[item['style']][i] = True + + return visibleText, styling + + def _processMatchIndices(self, style, match): + """ + Mark a region of text as needing a given styling + + Parameters + ---------- + style : string + Styling to apply to range, allowed values are: + - "color": A given color + - "bolditalic": Bold and italic + - "bold": Bold + - "italic": Italic + - "escape": No style, just apply index adjustment (for when an escaped char was subtituted) + match : re.Match + Regex match for the target area, including the syntax identifying it (e.g. + "[color=red]some red text[/color]", not just "some red text") + """ + # store style + item = { + 'style': style + } + # get span of content within matched string + span = match.span("content") + start = match.start() + end = match.end() + # store where the match will be in visible text string + item['start'] = start + self.subadj + item['end'] = item['start'] + span[1] - span[0] + # adjust for characters removed from start + self.adjustments.append( + (span[0], item['start'], span[0] - start) + ) + self.subadj -= span[0] - start + # adjust for characters removed from end + self.adjustments.append( + (end, item['end'], end - span[1]) + ) + self.subadj -= end - span[1] + # if adjusting for an escaped char, we're done now + if style == "escape": + return + # if we have a color, store it + try: + item['color'] = match.group("color") + except IndexError: + pass + # if we have a color space, store it + try: + item['space'] = match.group("space") + except IndexError: + pass + # store + self.indices.append(item) class PlaceholderText(TextBox2): diff --git a/pyproject.toml b/pyproject.toml index dd6fb901..eb100853 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "psychopy" dynamic = ["version"] -requires-python = ">=3.9, <3.12" +requires-python = ">=3.10, <3.13" description = "PsychoPy provides easy, precise, flexible experiments in behavioural sciences" readme ={file = "README.md", content-type = "text/markdown"} authors = [ @@ -25,8 +25,8 @@ classifiers = [ ] dependencies = [ - "numpy", # use numpy<1.24 for psychopy<2023.1 - "scipy < 1.15", # 1.15 fails to import scipy.special + "numpy", + "scipy", # NB scipy 1.16 requires py311; 1.14 requires py310 "matplotlib", "pyglet == 1.4.11; platform_system == \"Windows\"", "pyglet == 1.5.27; platform_system != \"Windows\"", @@ -38,14 +38,15 @@ dependencies = [ "xmlschema", # for core stimuli "soundfile", + "sounddevice", + "psychtoolbox", "imageio", "imageio-ffmpeg", - "psychtoolbox<3.0.20; platform_machine!='arm64'", # for iohub "pywinhook; platform_system == \"Windows\"", - "zope.event==5.0", # py2app+gevent complains about zope.event 5.1 - "zope.interface==7.2", # needed for gevent on macos - "gevent==25.5.1", # macos wheels for >2.5.1 are py3.12 only + "zope.event==5.0", # py2app+gevent complains about zope.event 5.1 + "zope.interface==7.2", # needed for gevent on macos + "gevent==25.5.1", # macos wheels for >2.5.1 are py3.12 only "MeshPy", "psutil", "pyzmq>=22.2.1", @@ -57,11 +58,11 @@ dependencies = [ "freetype-py", "python-bidi", "arabic-reshaper", - "websockets", - "markdown-it-py", + "websockets", # new in 2023.2 for session.py + # for the app "requests", - "future", - "cryptography", # for sshkeys + # for translation + "i18next", # psychoJS conversions "astunparse", "jedi >= 0.16", @@ -70,6 +71,7 @@ dependencies = [ "pyparallel; platform_system != \"Darwin\"", # movie backends "ffpyplayer", + # platform specific "pypiwin32; platform_system == \"Windows\"", "pyobjc-core > 8.0; platform_system == \"Darwin\"", "pyobjc-framework-Quartz > 8.0; platform_system == \"Darwin\"", @@ -78,12 +80,11 @@ dependencies = [ "zeroconf; platform_system == \"Darwin\"", "python-xlib; platform_system == \"Linux\"", "distro; platform_system == \"Linux\"", - 'tables!=3.9.2', # 3.9.2 crashes on Rosetta + "tables", # 3.9.2 crashes on Rosetta "packaging>=24.0", "moviepy", "pyarrow", "beautifulsoup4", - "setuptools>=70.3.0", ] [project.optional-dependencies] # This is optional dependencies @@ -111,12 +112,9 @@ building = [ "polib", ] suggested = [ - "sounddevice", "pylsl>=1.16.1", # lab streaming layer for general connectivity "xlwt", # writing excel files with pandas "h5py", # to read hdf5 files for analysis - "tobii_research", - "badapted>=0.0.3", "egi-pynetstation>=1.0.0", "pyxid2>=1.0.5", "Phidget22", @@ -146,6 +144,9 @@ requires = [ ] build-backend = "pdm.backend" +[tool.uv] +exclude-newer = "7 days" + [tool.pdm.build] includes = [] excludes = ["building/"] diff --git a/setupApp.py b/setupApp.py deleted file mode 100644 index fba4cb7e..00000000 --- a/setupApp.py +++ /dev/null @@ -1,239 +0,0 @@ -#!/usr/bin/env python -################ -# see notes at bottom for requirements - -import os -import sys -from sys import platform -import setuptools # noqa: setuptools complains if it isn't explicitly imported before distutils -from distutils.core import setup -from packaging.version import Version -import bdist_mpkg # noqa: needed to build bdist, even though not explicitly used here -import py2app # noqa: needed to build app bundle, even though not explicitly used here -from ctypes.util import find_library -import importlib -from building import compile_po -from building import semanticVersion -from pathlib import Path - -root = Path(__file__).parent # root of the repo -version = (root / 'psychopy/VERSION').read_text().strip() - -def glob_to_list(path, glob_pattern='*'): - """Convert a glob pattern to a list of files.""" - return [str(p.absolute()) for p in Path(path).glob(glob_pattern)] - -compile_po.compilePoFiles() -semanticVersion.updateVersionFile() -semanticVersion.updateGitShaFile() - -#define the extensions to compile if necess -packageData = [] -requires = [] - -if platform != 'darwin': - raise RuntimeError("setupApp.py is only for building Mac Standalone bundle") - -resources = glob_to_list(root / 'psychopy/app/Resources', '*') -frameworks = [ # these installed using homebrew - find_library("libevent"), - find_library("libmp3lame"), - find_library("libglfw"), - # libffi comes in the system - "/usr/local/opt/libffi/lib/libffi.dylib", - ] -opencvLibs = glob_to_list(Path(sys.exec_prefix, 'lib'), 'libopencv*.2.4.dylib') -frameworks.extend(opencvLibs) - -import macholib -#print("~"*60 + "macholib version: "+macholib.__version__) - -if Version(macholib.__version__) <= Version('1.7'): - print("Applying macholib patch...") - import macholib.dyld - import macholib.MachOGraph - dyld_find_1_7 = macholib.dyld.dyld_find - def dyld_find(name, loader=None, **kwargs): - #print("~"*60 + "calling alternate dyld_find") - if loader is not None: - kwargs['loader_path'] = loader - return dyld_find_1_7(name, **kwargs) - macholib.MachOGraph.dyld_find = dyld_find - -# excludes are often because of codesign difficulties on macos -excludes=['torch', 'mediapipe', - 'bsddb', 'jinja2', 'IPython','ipython_genutils','nbconvert', - 'tkinter', 'Tkinter', 'tcl', - 'libsz.2.dylib', 'pygame', - # 'stringprep', - 'functools32', - 'sympy', - '/usr/lib/libffi.dylib', - 'libwebp.7.dylib', - 'google', - ] -includes = ['_sitebuiltins', # needed for help() - 'imp', 'subprocess', 'shlex', - 'shelve', # for scipy.io - '_elementtree', 'pyexpat', # for openpyxl - 'pyo', 'greenlet', 'zmq', 'tornado', - 'psutil', # for iohub - 'tobii_research', # need tobii_research file and tobiiresearch pkg - 'soundfile', 'sounddevice', 'readline', - 'xlwt', # writes excel files for pandas - 'msgpack_numpy', - 'configparser', - 'ntplib', # for egi-pynetstation - ] -packages = ['pydoc', # needed for help() - 'setuptools', 'wheel', # for plugin installing - 'wx', 'psychopy', - 'PyQt6', - 'pyglet', 'pytz', - 'scipy', 'matplotlib', 'openpyxl', 'pandas', - 'xml', 'xmlschema', - 'ffpyplayer', 'cython', 'AVFoundation', - 'imageio', 'imageio_ffmpeg', - '_sounddevice_data', '_soundfile_data', - 'cffi', 'pycparser', - 'PIL', # 'Image', - 'freetype', - 'objc', 'Quartz', 'AppKit', 'Cocoa', - 'Foundation', 'CoreFoundation', - 'requests', 'certifi', 'cryptography', - 'json_tricks', # allows saving arrays/dates in json - 'git', 'gitlab', - 'msgpack', 'yaml', 'gevent', # for ioHub - 'astunparse', 'esprima', # for translating/adapting py/JS - 'metapensiero.pj', 'dukpy', - 'jedi', 'parso', - 'bidi', 'arabic_reshaper', 'charset_normalizer', # for (natural) language conversions - 'ujson', # faster than built-in json - 'six', # needed by configobj - # hardware - 'serial', - # handy science tools - 'tables', # 'cython', - # these aren't needed, but liked - 'pylsl', - #'smite', # https://github.com/marcus-nystrom/SMITE (not pypi!) - 'cv2', - 'questplus', - 'psychtoolbox', - 'h5py', - 'markdown_it', - 'zeroconf', 'ifaddr', # for pupillabs plugin (fail to build) - 'websocket', # dependency for emotiv that doesn't install nicely from plugins - 'moviepy', # used for a range of of movie-based backends - 'egi_pynetstation', # to be removed in future - ] - -# Add packages that older PsychoPy (<=2023.1.x) shipped, for useVersion() compatibility -# In PsychoPy 2023.2.0 these packages were removed from Standalone Py3.10+ builds -if sys.version_info < (3, 9): - packages.extend( - [ - 'OpenGL', 'glfw', - 'badapted', #'darc_toolbox', # adaptive methods from Ben Vincent - 'pylink', 'tobiiresearch', - 'pyxid2', 'ftd2xx', # ftd2xx is used by cedrus - 'Phidget22', - 'hid', - 'macropy', - ] - ) - packages.append('PyQt5') - packages.remove('PyQt6') # PyQt6 is not compatible with earlier PsychoPy versions - excludes.append('PyQt6') # and explicitly exclude it - -# check the includes and packages are all available -missingPkgs = [] -pipInstallLines = '' -packagePipNames = { # packages that are imported as one thing but installed as another - 'OpenGL': 'pyopengl', - 'opencv': 'opencv-python', - 'googleapiclient': 'google-api-python-client', - 'google': 'google-api-python-client', - 'macropy': 'macropy3', -} - -for pkg in includes+packages: - - try: - importlib.import_module(pkg) - except ModuleNotFoundError: - if pkg in packagePipNames: - missingPkgs.append(packagePipNames[pkg]) - elif pkg == 'pylink': - pipInstallLines += 'pip install --index-url=https://pypi.sr-support.com sr-research-pylink\n' - else: - missingPkgs.append(pkg) - except OSError as err: - if 'libftd2xx.dylib' in str(err): - raise ImportError(f"Missing package: ftd2xx. Please install the FTDI D2XX drivers from " - "https://www.ftdichip.com/Drivers/D2XX.htm") - except ImportError as err: - if 'eyelink' in str(err): - raise ImportError(f"It looks like the Eyelink dev kit is not installed " - "https://www.sr-research.com/support/thread-13.html") - -if missingPkgs or pipInstallLines: - helpStr = f"You're missing some packages to include in standalone. Fix with:\n" - if missingPkgs: - helpStr += f"pip install {' '.join(missingPkgs)}\n" - helpStr += pipInstallLines - raise ImportError(helpStr) -else: - print("All packages appear to be present. Proceeding to build...") - -setup( - app=[str(root / 'psychopy/app/psychopyApp.py')], - options=dict(py2app=dict( - includes=includes, - packages=packages, - excludes=excludes, - resources=resources, - argv_emulation=False, # must be False or app bundle pauses (py2app 0.21 and 0.24 tested) - site_packages=True, - frameworks=frameworks, - iconfile= str(root / 'psychopy/app/Resources/psychopy.icns'), - plist=dict( - CFBundleIconFile='psychopy.icns', - CFBundleName = "PsychoPy", - CFBundleShortVersionString = version, # must be in X.X.X format - CFBundleVersion = version, - CFBundleExecutable = "PsychoPy", - CFBundleIdentifier = "org.opensciencetools.psychopy", - CFBundleLicense = "MIT License", - NSHumanReadableCopyright = "Open Science Tools Limited", - CFBundleDocumentTypes=[dict(CFBundleTypeExtensions=['*'], - CFBundleTypeRole='Editor')], - CFBundleURLTypes=[dict(CFBundleURLName='psychopy', # respond to psychopy:// - CFBundleURLSchemes='psychopy', - CFBundleTypeRole='Editor')], - LSEnvironment=dict(PATH="/usr/local/git/bin:/usr/local/bin:" - "/usr/local:/usr/bin:/usr/sbin"), - NSMicrophoneUsageDescription="This app may require access to the microphone to record audio for experiments.", - NSCameraUsageDescription="This app may require access to the camera to record video for experiments.", - ), - )) # end of the options dict -) - - -# ugly hack for opencv2: -# As of opencv 2.4.5 the cv2.so binary used rpath to a fixed -# location to find libs and even more annoyingly it then appended -# 'lib' to the rpath as well. These were fine for the packaged -# framework python but the libs in an app bundle are different. -# So, create symlinks so they appear in the same place as in framework python -rpath = root / "dist/PsychoPy.app/Contents/Resources/" -for libPath in opencvLibs: - libname = os.path.split(libPath)[-1] - realPath = "../../Frameworks/"+libname # relative path (w.r.t. the fake) - fakePath = os.path.join(rpath, "lib", libname) - os.symlink(realPath, fakePath) -# they even did this for Python lib itself, which is in diff location -realPath = "../Frameworks/Python.framework/Python" # relative to the fake path -fakePath = os.path.join(rpath, "Python") -os.symlink(realPath, fakePath) - diff --git a/uv.lock b/uv.lock index 257a0712..c3c7af57 100644 --- a/uv.lock +++ b/uv.lock @@ -1,50 +1,21 @@ version = 1 -revision = 2 -requires-python = ">=3.9, <3.12" +revision = 3 +requires-python = ">=3.10, <3.13" resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "python_full_version < '3.10' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] -[[package]] -name = "alabaster" -version = "0.7.16" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, -] +[options] +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer-span = "P7D" [[package]] name = "alabaster" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, @@ -52,11 +23,11 @@ wheels = [ [[package]] name = "altgraph" -version = "0.17.4" +version = "0.17.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418, upload-time = "2023-09-25T09:04:52.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428, upload-time = "2025-11-21T20:35:50.583Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212, upload-time = "2023-09-25T09:04:50.691Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228, upload-time = "2025-11-21T20:35:49.444Z" }, ] [[package]] @@ -83,28 +54,20 @@ wheels = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +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/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { 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 = "badapted" -version = "0.0.3" +name = "backports-asyncio-runner" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pandas" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/90/15/79985965f3ce7843615a15b3330bf35a9e76eb6064cd991b037df9807977/badapted-0.0.3.tar.gz", hash = "sha256:33a610cd202a4746a387482be894c0d4860865f79781aed902a6b46b83de81a7", size = 22441, upload-time = "2019-08-30T16:00:20.304Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/61/a23de53fbb0e238f3faeec5311748f52295d0b2e29e49fa34a9bd8b9f194/badapted-0.0.3-py3-none-any.whl", hash = "sha256:4cabe6344fc5d8350418b8bcd8b81bc014b42378c21cc824cb602ceeffaa0b85", size = 22212, upload-time = "2019-08-30T16:00:18.031Z" }, + { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, ] [[package]] @@ -128,184 +91,147 @@ wheels = [ [[package]] name = "blosc2" -version = "2.5.1" +version = "4.1.2" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "msgpack", marker = "python_full_version < '3.10'" }, - { name = "ndindex", marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "py-cpuinfo", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/60/5bc8601f8ffcd5d8787b346898de8a0b454d031c3e158e3bbc312003984e/blosc2-2.5.1.tar.gz", hash = "sha256:47d5df50e7286edf81e629ece35f87f13f55c13c5e8545832188c420c75d1659", size = 4676483, upload-time = "2024-01-25T12:31:31.168Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/75/4511f1f9cea0aad8c5464736720a9de1e762e60e359cde6b7d69186e97b0/blosc2-2.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c861262b7fe317c1614a9b59b6c9edf409532b4a6aaf5b2f4ad0d79c6f800b57", size = 4417584, upload-time = "2024-01-25T12:30:31.487Z" }, - { url = "https://files.pythonhosted.org/packages/c0/8a/c7ce322f90750eb7fdde0948e5c6b9c47ed03e276f2481b701f9d2360d3a/blosc2-2.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f35b5d69a7a41e9d5054297d2540c25f8af5ea3c62e4a80ca7359292d783c04", size = 3471945, upload-time = "2024-01-25T12:30:34.745Z" }, - { url = "https://files.pythonhosted.org/packages/32/72/32bbaf583eea51b27c91ddb145de017d970ec0a835ec70e966925b00c9cf/blosc2-2.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546fa39f397dd54b13d7c42a4f890afaf16c70fe478712070942d464c440ce03", size = 4210024, upload-time = "2024-01-25T12:30:36.556Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8c/d4ab68a40004f93c1fd20dceb1899e54477425542bffa1f5ebab2647956f/blosc2-2.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5455af77e7e94159bb4966cae554f232ca2d52bb80cd3f878ecef39cf569da2a", size = 4374211, upload-time = "2024-01-25T12:30:38.355Z" }, - { url = "https://files.pythonhosted.org/packages/16/7d/c81b1caa0aded9f3e63c4dbab7a334681ded12ad80a18de34e7199939df5/blosc2-2.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4dc4f595bf95c350c50bb77a8749cdd08a5dc2bdf3bdb18983d49a52d60b595", size = 4467025, upload-time = "2024-01-25T12:30:40.682Z" }, - { url = "https://files.pythonhosted.org/packages/9b/cd/56150f9367516f039b62923a5cb243771e2a1f440de0232b195f6e79f1ab/blosc2-2.5.1-cp310-cp310-win32.whl", hash = "sha256:873483bd5c6afb8d139039180ee57b74373232e87b032cb80389fd8bb883ea8e", size = 1948573, upload-time = "2024-01-25T12:30:43.019Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/0cf994e434b5ae860546cfe6941c58bdcdc27ed10009caffac9a29b66651/blosc2-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:d5a7ef00b82fbca069e949335f9c92ce7cbe2039a9fa2e2bd4f5f418043d6262", size = 2343858, upload-time = "2024-01-25T12:30:44.621Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/25a82b7191109beb0fc20c580f35667a2e86087ebac2f6a9e50469f618d7/blosc2-2.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da826d42d616f8a939f27e1501b40e764fded66bc80177eeaefcebdbf3b3afb8", size = 4419509, upload-time = "2024-01-25T12:30:46.347Z" }, - { url = "https://files.pythonhosted.org/packages/03/50/b1d2bad6b9f77c3540b511b5dee77f213c8b179e942bbc34f5c410b92ede/blosc2-2.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae2e0c5dc8561a6b17842ee4320b49621434c20e622c9e9f5c67c9c6eb3b06a3", size = 3472870, upload-time = "2024-01-25T12:30:48.698Z" }, - { url = "https://files.pythonhosted.org/packages/17/26/d34d521fc60b164738d986144642c58675bcdc344cc9fbb8c08e58bb11ab/blosc2-2.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af3cab9c12a4364c643266ee7d9583b526c0f484a291d72ec6efb09ea7ffbbf9", size = 4208463, upload-time = "2024-01-25T12:30:51.019Z" }, - { url = "https://files.pythonhosted.org/packages/2a/00/35169a0765044be69a3bfb73441ff8b9ea05d92d4660be622bbf90c46913/blosc2-2.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f03a723130cf07e4309fe34b1360c868f4376e862f8ff664eb40d019fdd3f6", size = 4371942, upload-time = "2024-01-25T12:30:53.304Z" }, - { url = "https://files.pythonhosted.org/packages/8f/9b/923e29af25f4c34b5b331829a87bc8397b18e8a361551230b70e6b0a785a/blosc2-2.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0fd109eef815ea1e50fde4f676388aa2f3bb5543502d125fb63f16ec7a014464", size = 4468495, upload-time = "2024-01-25T12:30:55.165Z" }, - { url = "https://files.pythonhosted.org/packages/9f/39/21d6d1dc00d765f5c1671f8c0b323096f0dde360e8e1d8005160679b4831/blosc2-2.5.1-cp311-cp311-win32.whl", hash = "sha256:1a3edc3256bad04d3db30c9de7eac3a820f96e741fc754cdabb6a9991e5c37e8", size = 1948151, upload-time = "2024-01-25T12:30:57.515Z" }, - { url = "https://files.pythonhosted.org/packages/d1/48/7d4be4e57342ec60c05d11478257b235cf33dc96c31049fb47e6ae98b652/blosc2-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:e7499e277c13334d54f84e74f429f32341f99f7b978deaf9a7c2e963904cb48c", size = 2344506, upload-time = "2024-01-25T12:30:59.641Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4b/799dcec670a1d511d11a40e919241c26a273cfd2305a4f3fe7444c39758a/blosc2-2.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cb9a6ac1abc466c12bdc90052f17545512de8f854e672a1ea4d2b40292323f5", size = 4417609, upload-time = "2024-01-25T12:31:15.635Z" }, - { url = "https://files.pythonhosted.org/packages/07/cb/e97de5b2c40b6c2106d5b68c1d823707a16386fc08781a6c7c609000866e/blosc2-2.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3def4650faa1db43143d821228ef58797108cc95d6698c4b1581909cc2b149ca", size = 3471971, upload-time = "2024-01-25T12:31:18.231Z" }, - { url = "https://files.pythonhosted.org/packages/65/c4/0c9740c4f5efb7adde87ed8b5af88c171a3ec007df912cc2fbfb2736963d/blosc2-2.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf6efecc1a22da26c73ff5c60d0dc086db1e7edcceb6b360dd193cda893bef28", size = 4209984, upload-time = "2024-01-25T12:31:20.855Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e2/a1367ad174006e5625a1c8ef1b526fc135adc6f546bfc46264ac8e508ebe/blosc2-2.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b473472b977b770aab3bf20d0feeee84ecd5bb8b15a675287e090ce818c1cd40", size = 4374484, upload-time = "2024-01-25T12:31:22.587Z" }, - { url = "https://files.pythonhosted.org/packages/62/88/a185ab2a50b930011396b601ae8e82e83dfa24597e5f1fd91f483f178a94/blosc2-2.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7afe59d35d93bf8da7db8de43f4d8aef277514de43953c1e5e416ca839b9023a", size = 4466917, upload-time = "2024-01-25T12:31:24.387Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7c/6a7d46a6094a100e1bdfba7e1df584971efea00732006fdddcf0320d4846/blosc2-2.5.1-cp39-cp39-win32.whl", hash = "sha256:4315ae8d467fe91efa0dbe22004e967008f5fe021ebb3945518f5213d7c4511f", size = 1948282, upload-time = "2024-01-25T12:31:26.074Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c1/f80115c66a181e2ff18027818d3e1f37a3d5133b350b3e25189e53e28cd8/blosc2-2.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:73eb5e569a91fbe67f7dd78efe6a1ca9a54afff2c847db5dfa675bfd6a424f60", size = 2343778, upload-time = "2024-01-25T12:31:27.669Z" }, +dependencies = [ + { name = "msgpack" }, + { name = "ndindex" }, + { name = "numexpr", marker = "platform_machine != 'wasm32'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "requests" }, ] - -[[package]] -name = "blosc2" -version = "3.3.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "msgpack", marker = "python_full_version >= '3.10'" }, - { name = "ndindex", marker = "python_full_version >= '3.10'" }, - { name = "numexpr", marker = "python_full_version >= '3.10' and platform_machine != 'wasm32'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", marker = "python_full_version >= '3.10'" }, - { name = "py-cpuinfo", marker = "python_full_version >= '3.10' and platform_machine != 'wasm32'" }, - { name = "requests", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/02/8585daf8d86884768ba434e08e18366e1ec0136a35a289789b0cacbf2010/blosc2-3.3.3.tar.gz", hash = "sha256:e406ef8e21a296e0aff83d1569fa81c3cb005d99fcbd6ef4a37b30d7fc8eba5a", size = 3642901, upload-time = "2025-05-14T15:50:48.614Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/e0/60c507ef7d5089d9642356a8a88645ecf1e06052856f32ba6765d332bbed/blosc2-3.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf53da362b7b8fa0ec577d90d4c711726392e75c9e08b6992306a763532d8c2c", size = 3975154, upload-time = "2025-05-14T15:50:18.254Z" }, - { url = "https://files.pythonhosted.org/packages/02/5b/a0bae65e3584e47ccf41bcf6b6cccadae1e5fefcdedf8b195bf3e598435a/blosc2-3.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4edf5cc81c8ef7f003b8e41490d6ef9b23e85cec89b841d06568f3a0948ed2a6", size = 3352761, upload-time = "2025-05-14T15:50:20.197Z" }, - { url = "https://files.pythonhosted.org/packages/0e/82/4883a1f8a1f174621f5ad74a4ee95ba13b7b5a3371d51687101251ee7794/blosc2-3.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92b8f011f67f604b31ffc5f6d8d3a88532321d49e07a91d57ef9997dbc232e7", size = 4259232, upload-time = "2025-05-14T15:50:21.442Z" }, - { url = "https://files.pythonhosted.org/packages/d0/71/728dac9bbc1a30d1f15685238272b73e6a792f3e6efffee75d169588fd58/blosc2-3.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf75ab113abd32b54b15a620c3f4842cc77d72d6d620f59ec5acbcc17e4413f", size = 4401543, upload-time = "2025-05-14T15:50:22.711Z" }, - { url = "https://files.pythonhosted.org/packages/fc/82/b6e082944d0edea5f7ca9ea339a8a184442cebbaa9ce6c069e7bf7e24018/blosc2-3.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:87d2c35249670c34c25520ae4475843638a2206ce2ebd8b39a1644ba9e422c69", size = 2180453, upload-time = "2025-05-14T15:50:23.894Z" }, - { url = "https://files.pythonhosted.org/packages/35/47/a972cb9bda2a010ff4039d29537418da0336b0ff2e6452dab1ebb5df929e/blosc2-3.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5cf0637d653645e344b9909b7448e8a737847db74884bd46b5b8e604441ef65", size = 3978156, upload-time = "2025-05-14T15:50:25.235Z" }, - { url = "https://files.pythonhosted.org/packages/57/a2/efcdfed2993ae7975e02350e3179da9daf80e9a040f4016ffd01793b4566/blosc2-3.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1f0351a5a1e1e3956c37db8bc77f1b274ccb0b1b03c18ca62171ef0b49675a3", size = 3355062, upload-time = "2025-05-14T15:50:26.988Z" }, - { url = "https://files.pythonhosted.org/packages/38/db/203981d0f6991a5ac555bb7ead45ba87a1e461f29753e932c1d1e2329e21/blosc2-3.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38afaf4228802fb0c3d676a6d23d706c0e2f9e2f64b0c95b595e66e741ad572", size = 4263670, upload-time = "2025-05-14T15:50:28.347Z" }, - { url = "https://files.pythonhosted.org/packages/10/2a/bcedd99a3c20391a62ba379a4781fcd892fae8e8811e29470621759285f8/blosc2-3.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24fda61075290d043841730ee27e177dbf62008f0c87f682515f04df3f4152ae", size = 4407895, upload-time = "2025-05-14T15:50:29.697Z" }, - { url = "https://files.pythonhosted.org/packages/7e/55/4a5027118855dbac3ee6d1092c211274e4a9d9d329b4f9a1b9188a3b4eb8/blosc2-3.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:003406698268c291512de28b5caebad653820f661c60b1ec15721e371691616a", size = 2179580, upload-time = "2025-05-14T15:50:30.95Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f8/fa/d72f624903dad1f2e95cb97d4e3777284f7eb398792f0d3380fdd73c1fc4/blosc2-4.1.2.tar.gz", hash = "sha256:c127342d976de44fee242137e83660097e0b072779f4164a34e149ac9f693c8a", size = 4341120, upload-time = "2026-03-03T11:05:14.496Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/ec/dbe9d64258d68b3251c362425347e0477e2ccd769dd14dd17baa6011487b/blosc2-4.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb5f383a1b83a96e4b8ea31b976efdfeb4c7df0016b6ce6c7e735eeac92c3874", size = 4644710, upload-time = "2026-03-03T11:04:28.449Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1d/e162c4dfdc5971ee0159c06b26da3b46b0279e558209e422163fb16fc0e2/blosc2-4.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e69c2f90d5691a439ab6f6f873246ae77b26f5ed46794d5693b5cdba5b60f3e8", size = 4118209, upload-time = "2026-03-03T11:04:30.475Z" }, + { url = "https://files.pythonhosted.org/packages/17/c7/45255f959c81379674b041d85bae1e8edabd80173a1fb1ee3fb1c28b6d5e/blosc2-4.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10612397b4829120ac25cd50c2f923edf9cbb830c2d0e467d272013f06a7ffbc", size = 5094511, upload-time = "2026-03-03T11:04:31.763Z" }, + { url = "https://files.pythonhosted.org/packages/63/83/df6cf0828eb76ef0a12bc4a576f70c3850b45a2ab950445e4cb475ef1cd7/blosc2-4.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb93d560e6a0b7f4642795311659a4ab7b2e12b6c79b2077fe06ec7a99784339", size = 5230560, upload-time = "2026-03-03T11:04:33.291Z" }, + { url = "https://files.pythonhosted.org/packages/c5/07/4afc4612a6e323e5d5394267b9b36c50250d075bf4b3bebfb54f2527e639/blosc2-4.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:4c8740e61f97ce96d7a46569a9b51b9b6fdac7b4792a8a486250a00ef6f7fd8b", size = 3146745, upload-time = "2026-03-03T11:04:34.846Z" }, + { url = "https://files.pythonhosted.org/packages/81/85/1240460e27c82897608df1c3f4b9c9243019a2e2345215d5f04e1a36fb15/blosc2-4.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7f8cd9d95563fbd6a76eed81ba85669d11c53385fb01ee8a91bed3b8070fa661", size = 4641818, upload-time = "2026-03-03T11:04:36.099Z" }, + { url = "https://files.pythonhosted.org/packages/f1/51/a988a96be0cc8a7c187d26579c21770c0f679a1d12b6268629f554640e33/blosc2-4.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0dcddab7db4398c11190f21b48c2fe468d99b4a003bbacb30011c00be11d9c75", size = 4116600, upload-time = "2026-03-03T11:04:37.505Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b6/1c8b6b703d6f000df557ca594451883d18dcbe89b881fe1be75df82d76e7/blosc2-4.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09127cb9d32e2b0d04333ef9e50f7bcf00765f1a20216cede40a04f36d786069", size = 5094195, upload-time = "2026-03-03T11:04:39.035Z" }, + { url = "https://files.pythonhosted.org/packages/2d/2a/d71c52fae9ae60337ad34f872a8537d1329be028b7449951c8f61421298f/blosc2-4.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca2a8cdb85d6c3dc2ed19b550ee57041c9ea9230f9fa9829cfd0fe467fa6ad1d", size = 5229746, upload-time = "2026-03-03T11:04:40.669Z" }, + { url = "https://files.pythonhosted.org/packages/50/3d/e29f14df0053c510ed75a3f8a7a1429b6e5e72f8e3928911d15f6b63fe36/blosc2-4.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:ab8e878763b8f19c284cca8854f312988cb8039181eda508a01a1174f97938c5", size = 3145620, upload-time = "2026-03-03T11:04:42.262Z" }, + { url = "https://files.pythonhosted.org/packages/5a/74/ef2f1cea5239062be872fe7db384fcb5f7532257efcec11c960a15a5134f/blosc2-4.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2f39bc24bfde0ba2938f23b3ecd6a69f7788c9e775c88e0be37a3b4680bc84c8", size = 4686887, upload-time = "2026-03-03T11:04:43.857Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/834a234879ae8bcb61be4bf88855e29f62d06da0b5b45a01f6e7898e9d5f/blosc2-4.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e0bd7e752f636cde649f92acb735d58e23d0813ed9b24fb02f65eaaa7a415cdd", size = 4117160, upload-time = "2026-03-03T11:04:45.11Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d0/84d10472414a605bac9e794e03ff53ce464e22fe83edc365dc88b6833c14/blosc2-4.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ceb440269004619a416813b7c36abef94b028fd702dd8209b5d41311b6ce39c4", size = 5071905, upload-time = "2026-03-03T11:04:47.327Z" }, + { url = "https://files.pythonhosted.org/packages/96/c6/6c98cb75da1ef26cb27fedb3edb4b3cdd1b3aa2f1056bdd9de0823effed9/blosc2-4.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:830addc8d8722348421e5d99d719c53a36ff34a468980a7af05938ddb336cf4f", size = 5208010, upload-time = "2026-03-03T11:04:48.542Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d7/d4988cd88c070b2a24b446bf780fc43a7cb73a4af1e092b11edc832f616c/blosc2-4.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:9abc9432f7aa9335c87eb7b3cec72ac7bf3b764518e775b4f60159617e0817bf", size = 3147758, upload-time = "2026-03-03T11:04:49.789Z" }, ] [[package]] name = "certifi" -version = "2025.4.26" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220, upload-time = "2024-09-04T20:45:01.577Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605, upload-time = "2024-09-04T20:45:03.837Z" }, - { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910, upload-time = "2024-09-04T20:45:05.315Z" }, - { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200, upload-time = "2024-09-04T20:45:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565, upload-time = "2024-09-04T20:45:08.975Z" }, - { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635, upload-time = "2024-09-04T20:45:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218, upload-time = "2024-09-04T20:45:12.366Z" }, - { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486, upload-time = "2024-09-04T20:45:13.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911, upload-time = "2024-09-04T20:45:15.696Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632, upload-time = "2024-09-04T20:45:17.284Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820, upload-time = "2024-09-04T20:45:18.762Z" }, - { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290, upload-time = "2024-09-04T20:45:20.226Z" }, + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, ] [[package]] name = "charset-normalizer" -version = "3.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, - { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, - { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, - { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, - { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload-time = "2025-05-02T08:34:12.696Z" }, - { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload-time = "2025-05-02T08:34:14.665Z" }, - { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload-time = "2025-05-02T08:34:17.134Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload-time = "2025-05-02T08:34:19.081Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload-time = "2025-05-02T08:34:21.073Z" }, - { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload-time = "2025-05-02T08:34:23.193Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload-time = "2025-05-02T08:34:25.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload-time = "2025-05-02T08:34:27.359Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload-time = "2025-05-02T08:34:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload-time = "2025-05-02T08:34:31.858Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload-time = "2025-05-02T08:34:33.88Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload-time = "2025-05-02T08:34:35.907Z" }, - { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload-time = "2025-05-02T08:34:37.935Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/35/02daf95b9cd686320bb622eb148792655c9412dbb9b67abb5694e5910a24/charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644", size = 134804, upload-time = "2026-03-06T06:03:19.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/21/a2b1505639008ba2e6ef03733a81fc6cfd6a07ea6139a2b76421230b8dad/charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765", size = 283319, upload-time = "2026-03-06T06:00:26.433Z" }, + { url = "https://files.pythonhosted.org/packages/70/67/df234c29b68f4e1e095885c9db1cb4b69b8aba49cf94fac041db4aaf1267/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990", size = 189974, upload-time = "2026-03-06T06:00:28.222Z" }, + { url = "https://files.pythonhosted.org/packages/df/7f/fc66af802961c6be42e2c7b69c58f95cbd1f39b0e81b3365d8efe2a02a04/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2", size = 207866, upload-time = "2026-03-06T06:00:29.769Z" }, + { url = "https://files.pythonhosted.org/packages/c9/23/404eb36fac4e95b833c50e305bba9a241086d427bb2167a42eac7c4f7da4/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765", size = 203239, upload-time = "2026-03-06T06:00:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2f/8a1d989bfadd120c90114ab33e0d2a0cbde05278c1fc15e83e62d570f50a/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d", size = 196529, upload-time = "2026-03-06T06:00:32.608Z" }, + { url = "https://files.pythonhosted.org/packages/a5/0c/c75f85ff7ca1f051958bb518cd43922d86f576c03947a050fbedfdfb4f15/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8", size = 184152, upload-time = "2026-03-06T06:00:33.93Z" }, + { url = "https://files.pythonhosted.org/packages/f9/20/4ed37f6199af5dde94d4aeaf577f3813a5ec6635834cda1d957013a09c76/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412", size = 195226, upload-time = "2026-03-06T06:00:35.469Z" }, + { url = "https://files.pythonhosted.org/packages/28/31/7ba1102178cba7c34dcc050f43d427172f389729e356038f0726253dd914/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2", size = 192933, upload-time = "2026-03-06T06:00:36.83Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/f86443ab3921e6a60b33b93f4a1161222231f6c69bc24fb18f3bee7b8518/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1", size = 185647, upload-time = "2026-03-06T06:00:38.367Z" }, + { url = "https://files.pythonhosted.org/packages/82/44/08b8be891760f1f5a6d23ce11d6d50c92981603e6eb740b4f72eea9424e2/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4", size = 209533, upload-time = "2026-03-06T06:00:41.931Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/df114f23406199f8af711ddccfbf409ffbc5b7cdc18fa19644997ff0c9bb/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f", size = 195901, upload-time = "2026-03-06T06:00:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/07/83/71ef34a76fe8aa05ff8f840244bda2d61e043c2ef6f30d200450b9f6a1be/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550", size = 204950, upload-time = "2026-03-06T06:00:45.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/40/0253be623995365137d7dc68e45245036207ab2227251e69a3d93ce43183/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2", size = 198546, upload-time = "2026-03-06T06:00:46.481Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5c/5f3cb5b259a130895ef5ae16b38eaf141430fa3f7af50cd06c5d67e4f7b2/charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475", size = 132516, upload-time = "2026-03-06T06:00:47.924Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c3/84fb174e7770f2df2e1a2115090771bfbc2227fb39a765c6d00568d1aab4/charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05", size = 142906, upload-time = "2026-03-06T06:00:49.389Z" }, + { url = "https://files.pythonhosted.org/packages/d7/b2/6f852f8b969f2cbd0d4092d2e60139ab1af95af9bb651337cae89ec0f684/charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064", size = 133258, upload-time = "2026-03-06T06:00:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9e/bcec3b22c64ecec47d39bf5167c2613efd41898c019dccd4183f6aa5d6a7/charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694", size = 279531, upload-time = "2026-03-06T06:00:52.252Z" }, + { url = "https://files.pythonhosted.org/packages/58/12/81fd25f7e7078ab5d1eedbb0fac44be4904ae3370a3bf4533c8f2d159acd/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5", size = 188006, upload-time = "2026-03-06T06:00:53.8Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6e/f2d30e8c27c1b0736a6520311982cf5286cfc7f6cac77d7bc1325e3a23f2/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281", size = 205085, upload-time = "2026-03-06T06:00:55.311Z" }, + { url = "https://files.pythonhosted.org/packages/d0/90/d12cefcb53b5931e2cf792a33718d7126efb116a320eaa0742c7059a95e4/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923", size = 200545, upload-time = "2026-03-06T06:00:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/03/f4/44d3b830a20e89ff82a3134912d9a1cf6084d64f3b95dcad40f74449a654/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81", size = 193863, upload-time = "2026-03-06T06:00:57.823Z" }, + { url = "https://files.pythonhosted.org/packages/25/4b/f212119c18a6320a9d4a730d1b4057875cdeabf21b3614f76549042ef8a8/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497", size = 181827, upload-time = "2026-03-06T06:00:59.323Z" }, + { url = "https://files.pythonhosted.org/packages/74/00/b26158e48b425a202a92965f8069e8a63d9af1481dfa206825d7f74d2a3c/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c", size = 191085, upload-time = "2026-03-06T06:01:00.546Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1c1737bf6fd40335fe53d28fe49afd99ee4143cc57a845e99635ce0b9b6d/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e", size = 190688, upload-time = "2026-03-06T06:01:02.479Z" }, + { url = "https://files.pythonhosted.org/packages/5a/3d/abb5c22dc2ef493cd56522f811246a63c5427c08f3e3e50ab663de27fcf4/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f", size = 183077, upload-time = "2026-03-06T06:01:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/44/33/5298ad4d419a58e25b3508e87f2758d1442ff00c2471f8e0403dab8edad5/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e", size = 206706, upload-time = "2026-03-06T06:01:05.773Z" }, + { url = "https://files.pythonhosted.org/packages/7b/17/51e7895ac0f87c3b91d276a449ef09f5532a7529818f59646d7a55089432/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af", size = 191665, upload-time = "2026-03-06T06:01:07.473Z" }, + { url = "https://files.pythonhosted.org/packages/90/8f/cce9adf1883e98906dbae380d769b4852bb0fa0004bc7d7a2243418d3ea8/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85", size = 201950, upload-time = "2026-03-06T06:01:08.973Z" }, + { url = "https://files.pythonhosted.org/packages/08/ca/bce99cd5c397a52919e2769d126723f27a4c037130374c051c00470bcd38/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f", size = 195830, upload-time = "2026-03-06T06:01:10.155Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/2e3d023a06911f1281f97b8f036edc9872167036ca6f55cc874a0be6c12c/charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4", size = 132029, upload-time = "2026-03-06T06:01:11.706Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1f/a853b73d386521fd44b7f67ded6b17b7b2367067d9106a5c4b44f9a34274/charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a", size = 142404, upload-time = "2026-03-06T06:01:12.865Z" }, + { url = "https://files.pythonhosted.org/packages/b4/10/dba36f76b71c38e9d391abe0fd8a5b818790e053c431adecfc98c35cd2a9/charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c", size = 132796, upload-time = "2026-03-06T06:01:14.106Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b6/9ee9c1a608916ca5feae81a344dffbaa53b26b90be58cc2159e3332d44ec/charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade", size = 280976, upload-time = "2026-03-06T06:01:15.276Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d8/a54f7c0b96f1df3563e9190f04daf981e365a9b397eedfdfb5dbef7e5c6c/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54", size = 189356, upload-time = "2026-03-06T06:01:16.511Z" }, + { url = "https://files.pythonhosted.org/packages/42/69/2bf7f76ce1446759a5787cb87d38f6a61eb47dbbdf035cfebf6347292a65/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467", size = 206369, upload-time = "2026-03-06T06:01:17.853Z" }, + { url = "https://files.pythonhosted.org/packages/10/9c/949d1a46dab56b959d9a87272482195f1840b515a3380e39986989a893ae/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60", size = 203285, upload-time = "2026-03-06T06:01:19.473Z" }, + { url = "https://files.pythonhosted.org/packages/67/5c/ae30362a88b4da237d71ea214a8c7eb915db3eec941adda511729ac25fa2/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d", size = 196274, upload-time = "2026-03-06T06:01:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/b2/07/c9f2cb0e46cb6d64fdcc4f95953747b843bb2181bda678dc4e699b8f0f9a/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e", size = 184715, upload-time = "2026-03-06T06:01:22.194Z" }, + { url = "https://files.pythonhosted.org/packages/36/64/6b0ca95c44fddf692cd06d642b28f63009d0ce325fad6e9b2b4d0ef86a52/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f", size = 193426, upload-time = "2026-03-06T06:01:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/50/bc/a730690d726403743795ca3f5bb2baf67838c5fea78236098f324b965e40/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc", size = 191780, upload-time = "2026-03-06T06:01:25.053Z" }, + { url = "https://files.pythonhosted.org/packages/97/4f/6c0bc9af68222b22951552d73df4532b5be6447cee32d58e7e8c74ecbb7b/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95", size = 185805, upload-time = "2026-03-06T06:01:26.294Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b9/a523fb9b0ee90814b503452b2600e4cbc118cd68714d57041564886e7325/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a", size = 208342, upload-time = "2026-03-06T06:01:27.55Z" }, + { url = "https://files.pythonhosted.org/packages/4d/61/c59e761dee4464050713e50e27b58266cc8e209e518c0b378c1580c959ba/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac", size = 193661, upload-time = "2026-03-06T06:01:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/1c/43/729fa30aad69783f755c5ad8649da17ee095311ca42024742701e202dc59/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1", size = 204819, upload-time = "2026-03-06T06:01:30.298Z" }, + { url = "https://files.pythonhosted.org/packages/87/33/d9b442ce5a91b96fc0840455a9e49a611bbadae6122778d0a6a79683dd31/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98", size = 198080, upload-time = "2026-03-06T06:01:31.478Z" }, + { url = "https://files.pythonhosted.org/packages/56/5a/b8b5a23134978ee9885cee2d6995f4c27cc41f9baded0a9685eabc5338f0/charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262", size = 132630, upload-time = "2026-03-06T06:01:33.056Z" }, + { url = "https://files.pythonhosted.org/packages/70/53/e44a4c07e8904500aec95865dc3f6464dc3586a039ef0df606eb3ac38e35/charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636", size = 142856, upload-time = "2026-03-06T06:01:34.489Z" }, + { url = "https://files.pythonhosted.org/packages/ea/aa/c5628f7cad591b1cf45790b7a61483c3e36cf41349c98af7813c483fd6e8/charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02", size = 132982, upload-time = "2026-03-06T06:01:35.641Z" }, + { url = "https://files.pythonhosted.org/packages/c5/60/3a621758945513adfd4db86827a5bafcc615f913dbd0b4c2ed64a65731be/charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0", size = 55455, upload-time = "2026-03-06T06:03:17.827Z" }, ] [[package]] @@ -317,75 +243,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "contourpy" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370, upload-time = "2024-08-27T21:00:03.328Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366, upload-time = "2024-08-27T20:50:09.947Z" }, - { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226, upload-time = "2024-08-27T20:50:16.1Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460, upload-time = "2024-08-27T20:50:22.536Z" }, - { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623, upload-time = "2024-08-27T20:50:28.806Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761, upload-time = "2024-08-27T20:50:35.126Z" }, - { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015, upload-time = "2024-08-27T20:50:40.318Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672, upload-time = "2024-08-27T20:50:55.643Z" }, - { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688, upload-time = "2024-08-27T20:51:11.293Z" }, - { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145, upload-time = "2024-08-27T20:51:15.2Z" }, - { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019, upload-time = "2024-08-27T20:51:19.365Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356, upload-time = "2024-08-27T20:51:24.146Z" }, - { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915, upload-time = "2024-08-27T20:51:28.683Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443, upload-time = "2024-08-27T20:51:33.675Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548, upload-time = "2024-08-27T20:51:39.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118, upload-time = "2024-08-27T20:51:44.717Z" }, - { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162, upload-time = "2024-08-27T20:51:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396, upload-time = "2024-08-27T20:52:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297, upload-time = "2024-08-27T20:52:21.843Z" }, - { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808, upload-time = "2024-08-27T20:52:25.163Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181, upload-time = "2024-08-27T20:52:29.13Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518, upload-time = "2024-08-27T20:56:01.333Z" }, - { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350, upload-time = "2024-08-27T20:56:05.432Z" }, - { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167, upload-time = "2024-08-27T20:56:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279, upload-time = "2024-08-27T20:56:15.41Z" }, - { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519, upload-time = "2024-08-27T20:56:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922, upload-time = "2024-08-27T20:56:26.983Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017, upload-time = "2024-08-27T20:56:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773, upload-time = "2024-08-27T20:56:58.58Z" }, - { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353, upload-time = "2024-08-27T20:57:02.718Z" }, - { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817, upload-time = "2024-08-27T20:57:06.328Z" }, - { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886, upload-time = "2024-08-27T20:57:10.863Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008, upload-time = "2024-08-27T20:57:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690, upload-time = "2024-08-27T20:57:19.321Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894, upload-time = "2024-08-27T20:57:23.873Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099, upload-time = "2024-08-27T20:57:28.58Z" }, - { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838, upload-time = "2024-08-27T20:57:32.913Z" }, -] - [[package]] name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ @@ -409,6 +276,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, @@ -417,44 +294,99 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { 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 = "coverage" -version = "7.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/b4/a707d96c2c1ce9402ce1ce7124c53b9e4e1f3e617652a5ed2fbba4c9b4be/coverage-7.8.1.tar.gz", hash = "sha256:d41d4da5f2871b1782c6b74948d2d37aac3a5b39b43a6ba31d736b97a02ae1f1", size = 812193, upload-time = "2025-05-21T12:39:46.1Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/d7/8beb40ec92d6f7bd25ff84dd1a23e46d02ea0c2291cf085c59b6ad351dbc/coverage-7.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7af3990490982fbd2437156c69edbe82b7edf99bc60302cceeeaf79afb886b8", size = 211571, upload-time = "2025-05-21T12:37:43.695Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ec/977d4a7e0c03d43895555bc8b1a9230cb346622e3fd4c5389304cc517355/coverage-7.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5757a7b25fe48040fa120ba6597f5f885b01e323e0d13fe21ff95a70c0f76b7", size = 212002, upload-time = "2025-05-21T12:37:46.592Z" }, - { url = "https://files.pythonhosted.org/packages/31/ac/8c3d0cb74a734e2dfc29ed390691f11fec269a7719425c98b8d255e0558c/coverage-7.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8f105631835fdf191c971c4da93d27e732e028d73ecaa1a88f458d497d026cf", size = 241128, upload-time = "2025-05-21T12:37:48.576Z" }, - { url = "https://files.pythonhosted.org/packages/05/32/12159834aed6a8ed99364db284de79a782aa236a4c8187f28f25579248d4/coverage-7.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21645788c5c2afa3df2d4b607638d86207b84cb495503b71e80e16b4c6b44e80", size = 239026, upload-time = "2025-05-21T12:37:50.461Z" }, - { url = "https://files.pythonhosted.org/packages/04/85/4b384f71c49f5fb8d753eaa128f05ed338d0421663e0545038860839c592/coverage-7.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e93f36a5c9d995f40e9c4cd9bbabd83fd78705792fa250980256c93accd07bb6", size = 240172, upload-time = "2025-05-21T12:37:52.443Z" }, - { url = "https://files.pythonhosted.org/packages/31/dc/4d01e976489971edee5ccd5ae302503909d0e0adffc6ea4fba637a3f4f94/coverage-7.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d591f2ddad432b794f77dc1e94334a80015a3fc7fa07fd6aed8f40362083be5b", size = 240086, upload-time = "2025-05-21T12:37:54.045Z" }, - { url = "https://files.pythonhosted.org/packages/27/74/e1543f1de992f823edf7232c6ce7488aa5807bd24e9ab1ab3c95895f32d3/coverage-7.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:be2b1a455b3ecfee20638289bb091a95216887d44924a41c28a601efac0916e8", size = 238791, upload-time = "2025-05-21T12:37:55.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a7/344dba28ab0815024a0c005e2a6c1546c00e9acdd20a9d23bf1b14f6c16c/coverage-7.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:061a3bf679dc38fe34d3822f10a9977d548de86b440010beb1e3b44ba93d20f7", size = 239096, upload-time = "2025-05-21T12:37:57.559Z" }, - { url = "https://files.pythonhosted.org/packages/09/df/4c69d6fee9a91672bd96c3aa7a8b3daa204d6a754aaa1203d0797417a088/coverage-7.8.1-cp310-cp310-win32.whl", hash = "sha256:12950b6373dc9dfe1ce22a8506ec29c82bfc5b38146ced0a222f38cf5d99a56d", size = 214146, upload-time = "2025-05-21T12:37:59.852Z" }, - { url = "https://files.pythonhosted.org/packages/5e/cc/58712d4627dc36e9028ed3a04b21c7eb421076421daa8114af7a45c4ca6a/coverage-7.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:11e5ea0acd8cc5d23030c34dfb2eb6638ad886328df18cc69f8eefab73d1ece5", size = 215045, upload-time = "2025-05-21T12:38:01.394Z" }, - { url = "https://files.pythonhosted.org/packages/78/7e/224415a4424b610f7f05429b1099daee32eeb98cb39b3b8e8a1981431273/coverage-7.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc6bebc15c3b275174c66cf4e1c949a94c5c2a3edaa2f193a1225548c52c771", size = 211689, upload-time = "2025-05-21T12:38:03.042Z" }, - { url = "https://files.pythonhosted.org/packages/c1/22/87ab73762926a50fb9f2eefe52951ce4f764097480370db86c1e99e075dc/coverage-7.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a6c35afd5b912101fabf42975d92d750cfce33c571508a82ff334a133c40d5", size = 212116, upload-time = "2025-05-21T12:38:04.616Z" }, - { url = "https://files.pythonhosted.org/packages/96/39/cb084825f22d7d9f0064e47bb3af2b9a633172d573a8da72460c96564bd5/coverage-7.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b37729ba34c116a3b2b6fb99df5c37a4ca40e96f430070488fd7a1077ad44907", size = 244739, upload-time = "2025-05-21T12:38:06.758Z" }, - { url = "https://files.pythonhosted.org/packages/2b/5f/fdf000ea0ec1741b4c81367a44eeec036db92ba8e18a0cc5f9e2c840d0a9/coverage-7.8.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6424c716f4c38ff8f62b602e6b94cde478dadda542a1cb3fe2fe2520cc2aae3", size = 242429, upload-time = "2025-05-21T12:38:08.822Z" }, - { url = "https://files.pythonhosted.org/packages/ca/7f/3697436ca527d4cf69e3f251fe24cd2958137442f1fe83b297bb94a7a490/coverage-7.8.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bcfafb2809cd01be8ffe5f962e01b0fbe4cc1d74513434c52ff2dd05b86d492", size = 244218, upload-time = "2025-05-21T12:38:10.434Z" }, - { url = "https://files.pythonhosted.org/packages/71/fa/486c4c0cbed2ab67ff840c90c40184140f54c31d507344451afa26c3bb0e/coverage-7.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3f65da9701648d226b6b24ded3e2528b72075e48d7540968cd857c3bd4c5321", size = 243866, upload-time = "2025-05-21T12:38:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/cb/77/03e336b4c4fa329c9c6ec93ac7f64d2d4984ce8e0a585c195b35e9a3c2a6/coverage-7.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:173e16969f990688aae4b4487717c44330bc57fd8b61a6216ce8eeb827eb5c0d", size = 242038, upload-time = "2025-05-21T12:38:13.724Z" }, - { url = "https://files.pythonhosted.org/packages/d9/fb/2ced07e129e2735b7e4102891f380b05f994e3764abac711c597ea83c60c/coverage-7.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3763b9a4bc128f72da5dcfd7fcc7c7d6644ed28e8f2db473ce1ef0dd37a43fa9", size = 242568, upload-time = "2025-05-21T12:38:15.715Z" }, - { url = "https://files.pythonhosted.org/packages/59/96/47c47ab041f795979f8eed3fb2a93c8eb5dba83a8b78ee5c47535f10f015/coverage-7.8.1-cp311-cp311-win32.whl", hash = "sha256:d074380f587360d2500f3b065232c67ae248aaf739267807adbcd29b88bdf864", size = 214197, upload-time = "2025-05-21T12:38:17.292Z" }, - { url = "https://files.pythonhosted.org/packages/e9/14/7cf088fc11df2e20a531f13e2ce123579e0dcbcb052a76ece6fdb9f2997d/coverage-7.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:cd21de85aa0e247b79c6c41f8b5541b54285550f2da6a9448d82b53234d3611b", size = 215111, upload-time = "2025-05-21T12:38:18.874Z" }, - { url = "https://files.pythonhosted.org/packages/1e/b0/2902f008fceca2aec55dd4c53e815f1e66b7f7bc02819c15d7ec18f0620f/coverage-7.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5102e17b81158de17d4b5bc363fcffd15231a38ef3f50b8e6fa01f0c6911194", size = 211570, upload-time = "2025-05-21T12:39:22.519Z" }, - { url = "https://files.pythonhosted.org/packages/f1/aa/41db6eb71bf09fa9e131c96aa49fd28e14ff4b174e71909210703d8c62fe/coverage-7.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bd8e3753257e95e94f38c058627aba1581d51f674e3badf226283b2bdb8f8ca", size = 211990, upload-time = "2025-05-21T12:39:24.721Z" }, - { url = "https://files.pythonhosted.org/packages/fd/9f/d45f9d27e3c143756433770e022b7e79cce21640afdb6307c1f44f745021/coverage-7.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d616b5a543c7d4deffa25eb8d8ae3d0d95097f08ac8b131600bb7fbf967ea0e2", size = 240741, upload-time = "2025-05-21T12:39:26.447Z" }, - { url = "https://files.pythonhosted.org/packages/e8/91/28b3bbd83787b9929ba3d9764613631c53f94bf2faaa01fc44f34d8f0ca2/coverage-7.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7a95b0dce364535a63fde0ec1b1ca36400037175d3b62ce04d85dbca5e33832", size = 238672, upload-time = "2025-05-21T12:39:28.164Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/e766ea724285d44ddda4b0f0c717360f110e3f9cfbec619c05f6e45f02fa/coverage-7.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f82c1a1c1897d2293cb6c50f20fe8a9ea2add1a228eff479380917a1fe7bbb68", size = 239770, upload-time = "2025-05-21T12:39:30.406Z" }, - { url = "https://files.pythonhosted.org/packages/4c/62/a01c92f057a8d9b622402f5c471c92fa9669ea02a90afe66a1e10d401d09/coverage-7.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:62a13b372b65fa6e11685df9ca924bed23bab1d0f277f9b67be7536f253aaf17", size = 239555, upload-time = "2025-05-21T12:39:32.165Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/447ba399c1d4769e00d6ccc7d044dcaa3c93685f0bcb621c334431afca04/coverage-7.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe4877c24711458f7990392181be30166cc3ae72158036ecb48a73c30c99fb6f", size = 237769, upload-time = "2025-05-21T12:39:33.928Z" }, - { url = "https://files.pythonhosted.org/packages/cf/48/27bfc076aa84447671b29852fa50cd1c65f87c956e3e99ead47057c7068a/coverage-7.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae5e557aa92565d72f6d3196e878e7cbd6a6380e02a15eafe0af781bd767c10d", size = 238757, upload-time = "2025-05-21T12:39:35.664Z" }, - { url = "https://files.pythonhosted.org/packages/f5/71/25f0dc628233375dee92c2b3ae240b575c8fbb0f06275c0c7c432bce5629/coverage-7.8.1-cp39-cp39-win32.whl", hash = "sha256:87284f272746e31919302ab6211b16b41135109822c498f6e7b40a2f828e7836", size = 214166, upload-time = "2025-05-21T12:39:37.455Z" }, - { url = "https://files.pythonhosted.org/packages/18/f3/e22f4e2688b631a0ec8fae6ea0faa30d56b19d02d29c2a206c8ca81a4bcf/coverage-7.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:07fff2f2ce465fae27447432d39ce733476fbf8478de51fb4034c201e0c5da6d", size = 215052, upload-time = "2025-05-21T12:39:39.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/aa/f2063b32526002f639ac0081f177f8f0d3a8389ac08e84a02b8cca22d2c0/coverage-7.8.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:adafe9d71a940927dd3ad8d487f521f11277f133568b7da622666ebd08923191", size = 203637, upload-time = "2025-05-21T12:39:41.321Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a1/4d968d4605f3a87a809f0c8f495eed81656c93cf6c00818334498ad6ad45/coverage-7.8.1-py3-none-any.whl", hash = "sha256:e54b80885b0e61d346accc5709daf8762471a452345521cc9281604a907162c2", size = 203623, upload-time = "2025-05-21T12:39:43.473Z" }, +version = "7.13.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", size = 219152, upload-time = "2026-02-09T12:56:11.974Z" }, + { url = "https://files.pythonhosted.org/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", size = 219667, upload-time = "2026-02-09T12:56:13.33Z" }, + { url = "https://files.pythonhosted.org/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", size = 246425, upload-time = "2026-02-09T12:56:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", size = 248229, upload-time = "2026-02-09T12:56:16.31Z" }, + { url = "https://files.pythonhosted.org/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", size = 250106, upload-time = "2026-02-09T12:56:18.024Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", size = 252021, upload-time = "2026-02-09T12:56:19.272Z" }, + { url = "https://files.pythonhosted.org/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", size = 247114, upload-time = "2026-02-09T12:56:21.051Z" }, + { url = "https://files.pythonhosted.org/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", size = 248143, upload-time = "2026-02-09T12:56:22.585Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", size = 246152, upload-time = "2026-02-09T12:56:23.748Z" }, + { url = "https://files.pythonhosted.org/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", size = 249959, upload-time = "2026-02-09T12:56:25.209Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", size = 246416, upload-time = "2026-02-09T12:56:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", size = 247025, upload-time = "2026-02-09T12:56:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", size = 221758, upload-time = "2026-02-09T12:56:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", size = 222693, upload-time = "2026-02-09T12:56:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" }, + { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" }, + { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" }, + { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" }, + { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" }, + { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" }, + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, ] [package.optional-dependencies] @@ -462,53 +394,6 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] -[[package]] -name = "cryptography" -version = "45.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/47/92a8914716f2405f33f1814b97353e3cfa223cd94a77104075d42de3099e/cryptography-45.0.2.tar.gz", hash = "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", size = 743865, upload-time = "2025-05-18T02:46:34.986Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/2f/46b9e715157643ad16f039ec3c3c47d174da6f825bf5034b1c5f692ab9e2/cryptography-45.0.2-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", size = 7043448, upload-time = "2025-05-18T02:45:12.495Z" }, - { url = "https://files.pythonhosted.org/packages/90/52/49e6c86278e1b5ec226e96b62322538ccc466306517bf9aad8854116a088/cryptography-45.0.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", size = 4201098, upload-time = "2025-05-18T02:45:15.178Z" }, - { url = "https://files.pythonhosted.org/packages/7b/3a/201272539ac5b66b4cb1af89021e423fc0bfacb73498950280c51695fb78/cryptography-45.0.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", size = 4429839, upload-time = "2025-05-18T02:45:17.614Z" }, - { url = "https://files.pythonhosted.org/packages/99/89/fa1a84832b8f8f3917875cb15324bba98def5a70175a889df7d21a45dc75/cryptography-45.0.2-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", size = 4205154, upload-time = "2025-05-18T02:45:19.874Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c5/5225d5230d538ab461725711cf5220560a813d1eb68bafcfb00131b8f631/cryptography-45.0.2-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", size = 3897145, upload-time = "2025-05-18T02:45:22.209Z" }, - { url = "https://files.pythonhosted.org/packages/fe/24/f19aae32526cc55ae17d473bc4588b1234af2979483d99cbfc57e55ffea6/cryptography-45.0.2-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", size = 4462192, upload-time = "2025-05-18T02:45:24.773Z" }, - { url = "https://files.pythonhosted.org/packages/19/18/4a69ac95b0b3f03355970baa6c3f9502bbfc54e7df81fdb179654a00f48e/cryptography-45.0.2-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", size = 4208093, upload-time = "2025-05-18T02:45:27.028Z" }, - { url = "https://files.pythonhosted.org/packages/7c/54/2dea55ccc9558b8fa14f67156250b6ee231e31765601524e4757d0b5db6b/cryptography-45.0.2-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", size = 4461819, upload-time = "2025-05-18T02:45:29.39Z" }, - { url = "https://files.pythonhosted.org/packages/37/f1/1b220fcd5ef4b1f0ff3e59e733b61597505e47f945606cc877adab2c1a17/cryptography-45.0.2-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", size = 4329202, upload-time = "2025-05-18T02:45:31.925Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e0/51d1dc4f96f819a56db70f0b4039b4185055bbb8616135884c3c3acc4c6d/cryptography-45.0.2-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", size = 4570412, upload-time = "2025-05-18T02:45:34.348Z" }, - { url = "https://files.pythonhosted.org/packages/dc/44/88efb40a3600d15277a77cdc69eeeab45a98532078d2a36cffd9325d3b3f/cryptography-45.0.2-cp311-abi3-win32.whl", hash = "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", size = 2933584, upload-time = "2025-05-18T02:45:36.198Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a1/bc9f82ba08760442cc8346d1b4e7b769b86d197193c45b42b3595d231e84/cryptography-45.0.2-cp311-abi3-win_amd64.whl", hash = "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", size = 3408537, upload-time = "2025-05-18T02:45:38.184Z" }, - { url = "https://files.pythonhosted.org/packages/59/bc/1b6acb1dca366f9c0b3880888ecd7fcfb68023930d57df854847c6da1d10/cryptography-45.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", size = 7025581, upload-time = "2025-05-18T02:45:40.632Z" }, - { url = "https://files.pythonhosted.org/packages/31/a3/a3e4a298d3db4a04085728f5ae6c8cda157e49c5bb784886d463b9fbff70/cryptography-45.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", size = 4189148, upload-time = "2025-05-18T02:45:42.538Z" }, - { url = "https://files.pythonhosted.org/packages/53/90/100dfadd4663b389cb56972541ec1103490a19ebad0132af284114ba0868/cryptography-45.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", size = 4424113, upload-time = "2025-05-18T02:45:44.316Z" }, - { url = "https://files.pythonhosted.org/packages/0d/40/e2b9177dbed6f3fcbbf1942e1acea2fd15b17007204b79d675540dd053af/cryptography-45.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d", size = 4189696, upload-time = "2025-05-18T02:45:46.622Z" }, - { url = "https://files.pythonhosted.org/packages/70/ae/ec29c79f481e1767c2ff916424ba36f3cf7774de93bbd60428a3c52d1357/cryptography-45.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", size = 3881498, upload-time = "2025-05-18T02:45:48.884Z" }, - { url = "https://files.pythonhosted.org/packages/5f/4a/72937090e5637a232b2f73801c9361cd08404a2d4e620ca4ec58c7ea4b70/cryptography-45.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", size = 4451678, upload-time = "2025-05-18T02:45:50.706Z" }, - { url = "https://files.pythonhosted.org/packages/d3/fa/1377fced81fd67a4a27514248261bb0d45c3c1e02169411fe231583088c8/cryptography-45.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", size = 4192296, upload-time = "2025-05-18T02:45:52.422Z" }, - { url = "https://files.pythonhosted.org/packages/d1/cf/b6fe837c83a08b9df81e63299d75fc5b3c6d82cf24b3e1e0e331050e9e5c/cryptography-45.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", size = 4451749, upload-time = "2025-05-18T02:45:55.025Z" }, - { url = "https://files.pythonhosted.org/packages/af/d8/5a655675cc635c7190bfc8cffb84bcdc44fc62ce945ad1d844adaa884252/cryptography-45.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", size = 4317601, upload-time = "2025-05-18T02:45:56.911Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d4/75d2375a20d80aa262a8adee77bf56950e9292929e394b9fae2481803f11/cryptography-45.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", size = 4560535, upload-time = "2025-05-18T02:45:59.33Z" }, - { url = "https://files.pythonhosted.org/packages/aa/18/c3a94474987ebcfb88692036b2ec44880d243fefa73794bdcbf748679a6e/cryptography-45.0.2-cp37-abi3-win32.whl", hash = "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", size = 2922045, upload-time = "2025-05-18T02:46:01.012Z" }, - { url = "https://files.pythonhosted.org/packages/63/63/fb28b30c144182fd44ce93d13ab859791adbf923e43bdfb610024bfecda1/cryptography-45.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", size = 3393321, upload-time = "2025-05-18T02:46:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f5/d1d4dead3b269671cda7be6d6b2970b25398e84219681cb397139bdce88b/cryptography-45.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", size = 3578517, upload-time = "2025-05-18T02:46:05.263Z" }, - { url = "https://files.pythonhosted.org/packages/ac/7b/00e18d24f08bc642e4018e0066a6f872d85c744e3265910c3beabb1f4d73/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", size = 4135515, upload-time = "2025-05-18T02:46:07.241Z" }, - { url = "https://files.pythonhosted.org/packages/29/9f/ea7ad5239c33c36f0e2cbdf631a0e3b7633466e87e55923f5b5ea1b0b92d/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", size = 4378133, upload-time = "2025-05-18T02:46:09.035Z" }, - { url = "https://files.pythonhosted.org/packages/47/f8/b4e29d87fbc4d2cf46b36e01fcb98305bf76699f34de6b877cddd8bc3a64/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", size = 4136787, upload-time = "2025-05-18T02:46:10.772Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7c/ac19bbf24d261667a67aac712d8aa3bb740f94bc2391f06ccc90e783f3ff/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", size = 4377741, upload-time = "2025-05-18T02:46:13.215Z" }, - { url = "https://files.pythonhosted.org/packages/e2/69/51f1c3d03ef4e3bcac4d3f00738f6ac0a205199809e2b92368b6f15a9ec4/cryptography-45.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", size = 3326934, upload-time = "2025-05-18T02:46:15.081Z" }, - { url = "https://files.pythonhosted.org/packages/d7/74/2a0fb642c4c34d8c46c12b6eac89b10769b378c7b6a901ff94a8d4ba1b52/cryptography-45.0.2-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", size = 3587805, upload-time = "2025-05-18T02:46:17.531Z" }, - { url = "https://files.pythonhosted.org/packages/8a/18/57bc98fa5d93e74c2c2b16a3c5383f7ec218f957aa44559c0008a46c3629/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", size = 4143347, upload-time = "2025-05-18T02:46:19.934Z" }, - { url = "https://files.pythonhosted.org/packages/84/6f/d015e7e7bd7f3a6c538973005de5a780d93b68138c2d88c804422cf46b1c/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", size = 4387414, upload-time = "2025-05-18T02:46:21.944Z" }, - { url = "https://files.pythonhosted.org/packages/de/9e/fa5ec89cce7e4b86e430438da4d66b79113bdf321d0a00167d34b61daf19/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", size = 4145849, upload-time = "2025-05-18T02:46:24.327Z" }, - { url = "https://files.pythonhosted.org/packages/7c/09/5887d4fcc6f9c6fb19920789d094c4e25c2f604cc1b10b7e69d6f56187fe/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", size = 4387449, upload-time = "2025-05-18T02:46:26.144Z" }, - { url = "https://files.pythonhosted.org/packages/a5/4a/e27ab71dc3e517becc3f2ae358454bb4b78c0cb5af52f8e11b8943525ea6/cryptography-45.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", size = 3335090, upload-time = "2025-05-18T02:46:27.913Z" }, -] - [[package]] name = "cycler" version = "0.12.1" @@ -520,11 +405,11 @@ wheels = [ [[package]] name = "decorator" -version = "5.2.1" +version = "4.4.2" 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" } +sdist = { url = "https://files.pythonhosted.org/packages/da/93/84fa12f2dc341f8cf5f022ee09e109961055749df2d0c75c5f98746cfe6c/decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7", size = 33629, upload-time = "2020-02-29T05:24:43.312Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/72a1821152d07cf1d8b6fce298aeb06a7eb90f4d6d41acec9861e7cc6df0/decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", size = 9239, upload-time = "2020-02-29T05:24:45.993Z" }, ] [[package]] @@ -538,36 +423,53 @@ wheels = [ [[package]] name = "dmgbuild" -version = "1.6.5" +version = "1.6.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ds-store", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "mac-alias", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "ds-store" }, + { name = "mac-alias" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/93/b9702c68d5dedfd6b91c76268a89091ff681b8e3b9a026e7919b6ab730a4/dmgbuild-1.6.5.tar.gz", hash = "sha256:c5cbeec574bad84a324348aa7c36d4aada04568c99fb104dec18d22ba3259f45", size = 36848, upload-time = "2025-03-21T01:04:10.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/f4dbd63c96902de8f2427a82518aaeedac0006587409294e55a14e45f367/dmgbuild-1.6.7.tar.gz", hash = "sha256:676b17acd448899f6d4a83b2184e0657480444ecb6ac9c4922889efad9e5dbfb", size = 36938, upload-time = "2026-01-15T23:13:43.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/4a/b16f1081f69592c6dba92baa4d3ca7a5685091a0f840f4b5e01be41aaf84/dmgbuild-1.6.5-py3-none-any.whl", hash = "sha256:e19ab8c5e8238e6455d9ccb9175817be7fd62b9cdd1eef20f63dd88e0ec469ab", size = 34906, upload-time = "2025-03-21T01:04:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4a/8812638bba991a55a4b670806ab9cf60207077401893bb308eb1b04f288c/dmgbuild-1.6.7-py3-none-any.whl", hash = "sha256:37ee5771c377beb3203d9164aae8046ffed8531c06edf9227f5788b3c599b1bf", size = 34853, upload-time = "2026-01-15T23:13:41.854Z" }, ] [[package]] name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + [[package]] name = "ds-store" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mac-alias", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "mac-alias" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/36/902259bf7ddb142dd91cf7a9794aa15e1a8ab985974f90375e5d3463b441/ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c", size = 27052, upload-time = "2022-11-24T06:13:34.376Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/11/971e423750b219ec3f3a7f27dfb9bd74aef3d3fdfee6cc7df10a0217b5cd/ds_store-1.3.2.tar.gz", hash = "sha256:e4da49df901123481a85b9250945f2aac054a0f0c29352cd2cc858c536cdd364", size = 26574, upload-time = "2025-12-04T00:52:46.178Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/bf/b1c10362a0d670ee8ae086d92c3ab795fca2a927e4ff25e7cd15224d3863/ds_store-1.3.1-py3-none-any.whl", hash = "sha256:fbacbb0bd5193ab3e66e5a47fff63619f15e374ffbec8ae29744251a6c8f05b5", size = 16268, upload-time = "2022-11-24T06:13:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/03/83/7135cae57531edc070c73ea92b9129be0714323f5face6e15f415ca8ef52/ds_store-1.3.2-py3-none-any.whl", hash = "sha256:3b37332d9f8c18ff04c385d2933b66a1d84950071364f94bfc5f5a3ab1fb361e", size = 15928, upload-time = "2025-12-04T00:52:44.528Z" }, ] [[package]] @@ -584,11 +486,11 @@ wheels = [ [[package]] name = "elementpath" -version = "5.0.1" +version = "5.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/3d/0be6a0e373ac54bd53ab6c3b0722de9752dbd62e19d3d4d0f3f70ecbb246/elementpath-5.0.1.tar.gz", hash = "sha256:d3e4807b7e38e190e382eefef93f35ce6f71adf63b33e3f01d0e11f22e5d5cc7", size = 363233, upload-time = "2025-05-11T16:01:20.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/95/eeb61a2a917bf506d1402748e71c62399d8dcdd8cdccd64c81962832c260/elementpath-5.1.1.tar.gz", hash = "sha256:c4d1bd6aed987258354d0ea004d965eb0a6818213326bd4fd9bde5dacdb20277", size = 375378, upload-time = "2026-01-20T21:42:27.175Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/09/fbd26adb51ccd29fa65798fe9bf6e8a73720e37e437ac2cf1d51133bd1f5/elementpath-5.0.1-py3-none-any.whl", hash = "sha256:334f796578d1d273e99838b6a731d265985ea9ab399e22b74ea1c3a3faa73c83", size = 245130, upload-time = "2025-05-11T16:01:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/14/5a/4ddfd9aeecdc75a78b5d85d882abc2b822115caae2c00a4d0eb23cc101fc/elementpath-5.1.1-py3-none-any.whl", hash = "sha256:57637359065e60654422d8474c1749b09bb21348012b7197f868027e3c09c9b9", size = 259962, upload-time = "2026-01-20T21:42:24.127Z" }, ] [[package]] @@ -602,84 +504,87 @@ wheels = [ [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, + { 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 = "ffpyplayer" -version = "4.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/79/9312fdca7165231323a80a817d53ce90c614fe29208fe0f9608d484ac591/ffpyplayer-4.5.2.tar.gz", hash = "sha256:f9affdc12ebba4649f116973b9e4e057d06761bc63758594a91ec85f168752fe", size = 88924, upload-time = "2024-10-16T04:02:27.796Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a9/072852acc54e04f2d815f3a90e2a40d064c1cca0ff769361baf3919809b3/ffpyplayer-4.5.2-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:5d5ccd2bad0884c4e711dfd55f369733f33f8a6fdffda8b48bf02f1212e8cc7a", size = 38371570, upload-time = "2024-10-16T04:20:50.674Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6c/4d3d06ac0f0c748c10dfe96905a669df054e97a9bdd26157606759255f6b/ffpyplayer-4.5.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:6d51ccd761db50a248f2164eb65d352f7ce90ab747e6f1fd06bd3e2cb4702f75", size = 20335530, upload-time = "2024-10-16T04:20:54.864Z" }, - { url = "https://files.pythonhosted.org/packages/e9/31/8e665be12992c93527fad3c7e52ac3b7bbf826117e53e6f56b8b690224e3/ffpyplayer-4.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4aa2dcca53ad445519bda58a7e6b8b808aa5f272eaa92a26f2e4ab152cdf65", size = 18119083, upload-time = "2024-10-16T04:20:57.316Z" }, - { url = "https://files.pythonhosted.org/packages/4c/03/f83daf08f6937e241893a22e27457016aefddd8d1d8685ce98ebc9f0f645/ffpyplayer-4.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ea1b98d4ddffaaa01e519edbf0f67d4759ba100ad09b0f4dce5c21584b493b0", size = 29379984, upload-time = "2024-10-16T04:09:02.998Z" }, - { url = "https://files.pythonhosted.org/packages/23/12/91656070e8c84b5e18088f93e66e22e0acfc2ae000d55cc5378f3780ed89/ffpyplayer-4.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:89224e7d4642ceb18f9f19e3c8e9f9cab1f1849af04f7f7dc553234783e4720c", size = 61014198, upload-time = "2024-10-16T04:01:54.957Z" }, - { url = "https://files.pythonhosted.org/packages/ba/26/04f485c47d71a0f80259bbc5fb29db7cc1869375da4a2a47719ee491915e/ffpyplayer-4.5.2-cp311-cp311-macosx_10_13_universal2.whl", hash = "sha256:8ebb6ba7c5464b5dfb0e335c76845ebee84aabdd4172b7d946868204b35c6f06", size = 38371983, upload-time = "2024-10-16T04:21:11.609Z" }, - { url = "https://files.pythonhosted.org/packages/45/a4/e5d4d2480b12ea409df5990bb656f31a44ca49ab1d6de4e56c6db1a3b181/ffpyplayer-4.5.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:e08736070655f4fdd56a187f8bd41837bdb63d3f12a687979e29ce1b1e436919", size = 20336345, upload-time = "2024-10-16T04:21:15.974Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b4/f79a6a3cd60d22b3d9d3831faf4d45c8c308bc7bb338e16791e6d0efd255/ffpyplayer-4.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98ab4840778739f81fe449945db154e9a0b76d524d918d51b467a4d23b37ed4e", size = 18118911, upload-time = "2024-10-16T04:21:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/e8/9a/2738989628e482609138e404089e3b51cfa2ac26e40dd4fded72efd427da/ffpyplayer-4.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb75d0ad5d6accd302032db22c07639a955dee7d1fb172490b8b2f8c4f4fd685", size = 29648009, upload-time = "2024-10-16T04:09:06.13Z" }, - { url = "https://files.pythonhosted.org/packages/20/6b/7aa8804a30f3c87fdc7d0ec3215fe1628449db6e925af86050be76b2cd14/ffpyplayer-4.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:866affd631ad98e34c3423137fc02b5b00224118318df8c9b2c5462889eee582", size = 61015889, upload-time = "2024-10-16T04:02:32.652Z" }, - { url = "https://files.pythonhosted.org/packages/5c/63/7164da5e01397387f37a926dbce7fe2fb665fd3123d55e4098baa4b9913a/ffpyplayer-4.5.2-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:f0fbbb07f62dd3746cfd99cfcf02391c5dc1b1c78943e52eecea41fa24c86ff8", size = 38383555, upload-time = "2024-10-16T04:22:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c2/14e1d298f72b93819da84d3c18285816cca783748f19002853a5d86fdf9b/ffpyplayer-4.5.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fa74b94a62bf5cbb36e4b58169110fd33c06effc65d3d4556388d6cb6e816ba5", size = 20341378, upload-time = "2024-10-16T04:22:53.306Z" }, - { url = "https://files.pythonhosted.org/packages/55/b1/0c1629a562fae687e61aa0648257b241504b927fc65c3385c805efc5709c/ffpyplayer-4.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dbfbfe02cb65aff35fcce93694904a0cfd7c6841a497aa7f2ba48caa276523a5", size = 18124943, upload-time = "2024-10-16T04:22:56.854Z" }, - { url = "https://files.pythonhosted.org/packages/a4/39/8fdc979c2fd2964dfe0124c8789e40374ccd7472dbb7f305293ee709a464/ffpyplayer-4.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa47757a9f4f8eb934fea49bddd6de50f64d16274fe16188841ee9802bb2d811", size = 29406693, upload-time = "2024-10-16T04:09:22.127Z" }, - { url = "https://files.pythonhosted.org/packages/ba/31/541fb12ae10fc2933c5ec1ab2f545b6b3f25b333215a8d64b7ce81caa7e6/ffpyplayer-4.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:2e4bd6b1fd527c0472a57ace0ec0d76fbc23ca549041ecc19c83f99e75f46b62", size = 61019180, upload-time = "2024-10-16T04:03:38.864Z" }, +version = "4.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/04/bbb7a314c526d1aa055057c243de36ebce8d2828dabe1f2b96a9e3c53157/ffpyplayer-4.5.3.tar.gz", hash = "sha256:8b9623e04997ba7bbf5476313aa8d9eae2665c65f403b5deff4ac51f16155e7e", size = 89089, upload-time = "2025-06-11T02:14:10.525Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/2a/8bbffd8dd39422dd7c20a8d71156a092a0b99b1792a4698e811e7d96585d/ffpyplayer-4.5.3-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:9c8cc4bbbfe5f01ab0568a941927972310b63fad4663f8c08712c25d23b2a8e8", size = 38311544, upload-time = "2025-06-11T03:08:31.925Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ce/9b1e1edfb1ea364df5b98d6b4ea205e703ab4a94b6900b2f8b9a7386d0c2/ffpyplayer-4.5.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:3a5fbae10ce1de3946856dc19937daae3631c076ee98c248d4d889be8ca06320", size = 20323524, upload-time = "2025-06-11T03:08:34.853Z" }, + { url = "https://files.pythonhosted.org/packages/05/9a/a067edbf8414bb7e3b0ef4d4e2c1958184e5386299debfb6570175f27563/ffpyplayer-4.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0db8f81229c5f53e3c4cd60b378b5ecd6a9c40edde12e7f64eab67a52bd49ec3", size = 18071315, upload-time = "2025-06-11T03:08:38.726Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9f/882919be0471af12ae7328e9e7969f678394cee3143faf2fb4416fe58fe6/ffpyplayer-4.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4343948aa3f031e3ba44593587b81f89ce15f8c756cad3d52fc75df1d71b02a0", size = 27810924, upload-time = "2025-06-11T02:46:38.57Z" }, + { url = "https://files.pythonhosted.org/packages/36/dd/98ef3692717d964901280a084b200c472b52d0402a92999b415d61e9adc3/ffpyplayer-4.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa7d590016e95258dcbe82e972a2bea0fea1ec408cbd9f19e710bfcde6b4a397", size = 29680199, upload-time = "2025-06-11T02:48:56.043Z" }, + { url = "https://files.pythonhosted.org/packages/2b/70/4db140644c6f73efe3df1f9787502749065c6982a98c12060a63ac2e0b32/ffpyplayer-4.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:73caa0c12ce57dfa033280e9b4b3dfb7965d15c18f190b56d57b16b4b014c3b9", size = 61015066, upload-time = "2025-06-11T02:13:42.247Z" }, + { url = "https://files.pythonhosted.org/packages/80/54/8a77e5868569915e059adad6f4f80d77532eacf31c0522bebe05552c5a71/ffpyplayer-4.5.3-cp311-cp311-macosx_10_13_universal2.whl", hash = "sha256:7c9799e86a4c197c647e3ece6a8a1d026b2deb21e0a5b5bffbf49eac2a876168", size = 38312017, upload-time = "2025-06-11T03:08:46.534Z" }, + { url = "https://files.pythonhosted.org/packages/df/32/03d63ed11d9d6bec683a85ddf1a8b3b17f25d3a1b71e31d9975ea6af294a/ffpyplayer-4.5.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:a5728d1b3e4a2e449893b766eab4e35fcccb1e6e53a2c3321bf745f1a86c27cf", size = 20324390, upload-time = "2025-06-11T03:08:49.66Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/9d4bdf1516d6593dfd447efced34030e5f5e51770fee1aef3b0d1c969bef/ffpyplayer-4.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b592ee9f6c71ba8d768ebc032ce30e3aaeff3be3c4cba2fcf7fed4a36071f169", size = 18071175, upload-time = "2025-06-11T03:08:52.513Z" }, + { url = "https://files.pythonhosted.org/packages/e8/12/00b1d9c3801dc7ff450f08202b2e9e46fae2f512331c9a5eb67a0598555a/ffpyplayer-4.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2d4f6c779ae5038e321e84e1da7570f9ea9ae3d7993054c60ad1338c2d5da38", size = 28089350, upload-time = "2025-06-11T02:46:41.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9a/4fe815abda74043465575cc52242db4f8a2d88a59123ed04de8f8fb7a6b7/ffpyplayer-4.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29490c57b86c5e48ed0d12c974ca83ee4dd7d2cc360f400115e64e8afb4436ef", size = 29946500, upload-time = "2025-06-11T02:48:59.419Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/a1c88f27fb03a8fa9f36ff9d0a98259028c9e8261a77b6b65d7a1a5bcf0b/ffpyplayer-4.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:3e613fe88c2fd1f3f7c9f84b3e153c90b1222f7e4dbf92a280d449c6217256bf", size = 61016791, upload-time = "2025-06-11T02:14:13.735Z" }, + { url = "https://files.pythonhosted.org/packages/30/c1/d8619d7056b6e1b093727f8549339603acc271a127a7fdd374b649ffcb0e/ffpyplayer-4.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:666bfed646b52014895f30c8d9d10b416a616911ae496a643f9980b45cc24b74", size = 38322177, upload-time = "2025-06-11T03:09:00.639Z" }, + { url = "https://files.pythonhosted.org/packages/8a/19/e080682db8bd706e87bf516dc96452d9af78cc024dfcf52e7f52eea92250/ffpyplayer-4.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb4bd6d9d1ee37cfe8f470aa9b49dc79f1b4761c2c5b44e4784740c8efb8cc22", size = 20330483, upload-time = "2025-06-11T03:09:04.11Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b6/1608abf09e0c0b3c9a68c7a2b64655beb8e4620a084527fa6fa60e61bee2/ffpyplayer-4.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c79aa4c82b414689377b1e0111c61b12c8b2b3b0ed961670ec5f1fbd873b967", size = 18075307, upload-time = "2025-06-11T03:09:06.6Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ac/ef562054a5a5120d8a1cca38f652b55062154bb9c20e57a8e5d9f50b1641/ffpyplayer-4.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2545160450f8dacb1de0f37b2438a61a301610a1f50c1878edf87d19ed9782a1", size = 28108609, upload-time = "2025-06-11T02:46:45.424Z" }, + { url = "https://files.pythonhosted.org/packages/46/6e/af8d576777dae551fbf7061fc300a8bbc462d7c36a7c3e01938cd77f0867/ffpyplayer-4.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b92f2b399b25404b688093b605109ef647a7b4314d6bbb24a81c738646e77b87", size = 29980291, upload-time = "2025-06-11T02:49:02.431Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/73ceb1830f1ba37ab44167214717947db0a2ca1678a1ba31906e3ad7869c/ffpyplayer-4.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:7eefb1060e2df8534eec245e1f7e228b4b53853a0b4f508a124b4b83c6f2c56c", size = 61014946, upload-time = "2025-06-11T02:13:39.577Z" }, ] [[package]] name = "flake8" -version = "7.2.0" +version = "7.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mccabe" }, { name = "pycodestyle" }, { name = "pyflakes" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177, upload-time = "2025-03-29T20:08:39.329Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786, upload-time = "2025-03-29T20:08:37.902Z" }, + { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, ] [[package]] name = "fonttools" -version = "4.58.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/cf/4d037663e2a1fe30fddb655d755d76e18624be44ad467c07412c2319ab97/fonttools-4.58.0.tar.gz", hash = "sha256:27423d0606a2c7b336913254bf0b1193ebd471d5f725d665e875c5e88a011a43", size = 3514522, upload-time = "2025-05-10T17:36:35.886Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/07/06d01b7239d6632a0984ef29ab496928531862b827cd3aa78309b205850d/fonttools-4.58.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0bcaa65cddbc7d32c77bd0af0b41fdd6448bad0e84365ca79cf8923c27b21e46", size = 2731632, upload-time = "2025-05-10T17:34:55.331Z" }, - { url = "https://files.pythonhosted.org/packages/1d/c7/47d26d48d779b1b084ebc0d9ec07035167992578768237ef553a3eecc8db/fonttools-4.58.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25590272f89e94ab5a292d518c549f3a88e6a34fa1193797b7047dfea111b048", size = 2303941, upload-time = "2025-05-10T17:34:58.624Z" }, - { url = "https://files.pythonhosted.org/packages/79/2e/ac80c0fea501f1aa93e2b22d72c97a8c0d14239582b7e8c722185a0540a7/fonttools-4.58.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:614435e9a87abe18bd7bc7ceeb8029e8f181c571317161e89fa3e6e0a4f20f5d", size = 4712776, upload-time = "2025-05-10T17:35:01.124Z" }, - { url = "https://files.pythonhosted.org/packages/f2/5c/b41f9c940dc397ecb41765654efc76e06782bfe0783c3e2affc534be181c/fonttools-4.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0154bd86d9a9e880f6e937e4d99c2139a624428dd9852072e12d7a85c79d611e", size = 4743251, upload-time = "2025-05-10T17:35:03.815Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c4/0d3807d922a788b603a3fff622af53e732464b88baf0049a181a90f9b1c6/fonttools-4.58.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5b3660df0b02c9cebbf7baf66952c2fd055e43e658aceb92cc95ba19e0a5c8b6", size = 4795635, upload-time = "2025-05-10T17:35:06.134Z" }, - { url = "https://files.pythonhosted.org/packages/46/74/627bed8e2c7e641c9c572f09970b0980e5513fd29e57b394d4aee2261e30/fonttools-4.58.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c43b7f1d0b818427bb1cd20903d1168271abdcde10eb6247b1995c4e1ed63907", size = 4904720, upload-time = "2025-05-10T17:35:09.015Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f2/7e5d082a98eb61fc0c3055e8a0e061a1eb9fc2d93f0661854bf6cb63c519/fonttools-4.58.0-cp310-cp310-win32.whl", hash = "sha256:5450f40c385cdfa21133245f57b9cf8ce45018a04630a98de61eed8da14b8325", size = 2188180, upload-time = "2025-05-10T17:35:11.494Z" }, - { url = "https://files.pythonhosted.org/packages/00/33/ffd914e3c3a585003d770457188c8eaf7266b7a1cceb6d234ab543a9f958/fonttools-4.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0553431696eacafee9aefe94dc3c2bf5d658fbdc7fdba5b341c588f935471c6", size = 2233120, upload-time = "2025-05-10T17:35:13.896Z" }, - { url = "https://files.pythonhosted.org/packages/76/2e/9b9bd943872a50cb182382f8f4a99af92d76e800603d5f73e4343fdce61a/fonttools-4.58.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9345b1bb994476d6034996b31891c0c728c1059c05daa59f9ab57d2a4dce0f84", size = 2751920, upload-time = "2025-05-10T17:35:16.487Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8c/e8d6375da893125f610826c2e30e6d2597dfb8dad256f8ff5a54f3089fda/fonttools-4.58.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1d93119ace1e2d39ff1340deb71097932f72b21c054bd3da727a3859825e24e5", size = 2313957, upload-time = "2025-05-10T17:35:18.906Z" }, - { url = "https://files.pythonhosted.org/packages/4f/1b/a29cb00c8c20164b24f88780e298fafd0bbfb25cf8bc7b10c4b69331ad5d/fonttools-4.58.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79c9e4f01bb04f19df272ae35314eb6349fdb2e9497a163cd22a21be999694bd", size = 4913808, upload-time = "2025-05-10T17:35:21.394Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ab/9b9507b65b15190cbfe1ccd3c08067d79268d8312ef20948b16d9f5aa905/fonttools-4.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62ecda1465d38248aaf9bee1c17a21cf0b16aef7d121d7d303dbb320a6fd49c2", size = 4935876, upload-time = "2025-05-10T17:35:23.849Z" }, - { url = "https://files.pythonhosted.org/packages/15/e4/1395853bc775b0ab06a1c61cf261779afda7baff3f65cf1197bbd21aa149/fonttools-4.58.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29d0499bff12a26733c05c1bfd07e68465158201624b2fba4a40b23d96c43f94", size = 4974798, upload-time = "2025-05-10T17:35:26.189Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b9/0358368ef5462f4653a198207b29885bee8d5e23c870f6125450ed88e693/fonttools-4.58.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1871abdb0af582e2d96cc12d88889e3bfa796928f491ec14d34a2e58ca298c7e", size = 5093560, upload-time = "2025-05-10T17:35:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/11/00/f64bc3659980c41eccf2c371e62eb15b40858f02a41a0e9c6258ef094388/fonttools-4.58.0-cp311-cp311-win32.whl", hash = "sha256:e292485d70402093eb94f6ab7669221743838b8bd4c1f45c84ca76b63338e7bf", size = 2186330, upload-time = "2025-05-10T17:35:31.733Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a0/0287be13a1ec7733abf292ffbd76417cea78752d4ce10fecf92d8b1252d6/fonttools-4.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:6df3755fcf9ad70a74ad3134bd5c9738f73c9bb701a304b1c809877b11fe701c", size = 2234687, upload-time = "2025-05-10T17:35:34.015Z" }, - { url = "https://files.pythonhosted.org/packages/33/86/e77cfccfded6e106daedf705eedc6d81a708c9ec59f59208a02a878a11cd/fonttools-4.58.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d3e6f49f24ce313fe674213314a5ff7d2839d7d143d9e2f8a6140bf93de59797", size = 2737552, upload-time = "2025-05-10T17:36:14.867Z" }, - { url = "https://files.pythonhosted.org/packages/cf/ac/020f47dc1498894cd4437f9822c562c2c6b2f41d445cc8c3868ccc5f7b63/fonttools-4.58.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d76bf18647d3aa2a4a539d947a9974e5fb3cd6300ed8d8166b63ab201830d9ed", size = 2306833, upload-time = "2025-05-10T17:36:17.192Z" }, - { url = "https://files.pythonhosted.org/packages/ea/92/58625bb30840fe8c0364f82836216793a8bb4b38ee317ce667e26e2d17fe/fonttools-4.58.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47ed13683b02be5c5db296dc80fd42cc65e1a694c32b2e482714d50c05f8a00", size = 4696309, upload-time = "2025-05-10T17:36:19.6Z" }, - { url = "https://files.pythonhosted.org/packages/aa/de/9d0200eeb5dc186691871e5429ccef5fea52d612ffba96f5f4a1bd400498/fonttools-4.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d63b51485b2da4e74ca5ad8bec084400300a8e7a30799df14d915fd9441e2824", size = 4726096, upload-time = "2025-05-10T17:36:21.74Z" }, - { url = "https://files.pythonhosted.org/packages/af/37/3930476d05b39e26509376878447aace1ca84e68a3bdf0e96943df0cd736/fonttools-4.58.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:187db44b7e1d4e042c23265d7cf7599d280af2e8de091e46e89e7ec4c0729ccf", size = 4778868, upload-time = "2025-05-10T17:36:24.143Z" }, - { url = "https://files.pythonhosted.org/packages/99/5a/eb318d20c77a2ec3fcd52cc54b0fa422bcb00c4d2a08be341bf170c6a367/fonttools-4.58.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fde9b32f5964e2a3a2a58e5269673705eb636f604e3cdde24afb1838bf0a501a", size = 4889938, upload-time = "2025-05-10T17:36:26.232Z" }, - { url = "https://files.pythonhosted.org/packages/8f/83/cff77c089e695372d3c77133eeb523af7ef37c12647a45e52502bc291dc1/fonttools-4.58.0-cp39-cp39-win32.whl", hash = "sha256:ac2037a74b55d6fb2917460d0d6e1d88d35e26a62c70584271d3388f9ea179e1", size = 1466943, upload-time = "2025-05-10T17:36:28.486Z" }, - { url = "https://files.pythonhosted.org/packages/28/73/195b62a675594eb106b096f115e4115503153591deafd49a63bef6254730/fonttools-4.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:72b42acf0e5d3d61423ee22a1483647acdaf18378bb13970bf583142a2f4dcb8", size = 1511848, upload-time = "2025-05-10T17:36:30.518Z" }, - { url = "https://files.pythonhosted.org/packages/9b/1f/4417c26e26a1feab85a27e927f7a73d8aabc84544be8ba108ce4aa90eb1e/fonttools-4.58.0-py3-none-any.whl", hash = "sha256:c96c36880be2268be409df7b08c5b5dacac1827083461a6bc2cb07b8cbcec1d7", size = 1111440, upload-time = "2025-05-10T17:36:33.607Z" }, +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" }, + { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" }, + { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" }, + { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" }, + { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, + { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, + { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, + { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, + { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, + { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { 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]] @@ -745,97 +650,102 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/27/bb38e005106a53787c13ad1f9f73ed990e403e462108acae6320ab11d442/gevent-25.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc7446895fa184890d8ca5ea61e502691114f9db55c9b76adc33f3086c4368", size = 1793549, upload-time = "2025-05-12T11:59:57.854Z" }, { url = "https://files.pythonhosted.org/packages/ee/56/da817bc69e1f0ae8438f12f2cd150656b09a8c3576c6d12f992dc9ca64ef/gevent-25.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5b6106e2414b1797133786258fa1962a5e836480e4d5e861577f9fc63b673a5a", size = 2145899, upload-time = "2025-05-12T11:40:53.275Z" }, { url = "https://files.pythonhosted.org/packages/b8/42/989403abbdbb1346a1507083c02018bee3fedaef3f9648940c767d8c0958/gevent-25.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:bc899212d90f311784c58938a9c09c59802fb6dc287a35fabdc36d180f57f575", size = 1635771, upload-time = "2025-05-12T12:26:47.644Z" }, - { url = "https://files.pythonhosted.org/packages/c7/54/e5908beb092c2745aa8390f15b9559cc3ebd77bf1ba71c81c606f7b1fb92/gevent-25.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e30169ef9cc0a57930bfd8fe14d86bc9d39fb96d278e3891e85cbe7b46058a97", size = 2147450, upload-time = "2025-05-12T11:33:05.883Z" }, - { url = "https://files.pythonhosted.org/packages/ee/39/206c9da2395a7df11c13e2989f7c7c65a7799babdb8b4b055cccae4d5c14/gevent-25.5.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e72ad5f8d9c92df017fb91a1f6a438cfb63b0eff4b40904ff81b40cb8150078c", size = 2210122, upload-time = "2025-05-12T11:40:58.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/18/d10ca3841b686143c1973cac816651a72ff77ad9e79a5300cbbbe310fced/gevent-25.5.1-cp39-cp39-win32.whl", hash = "sha256:e5f358e81e27b1a7f2fb2f5219794e13ab5f59ce05571aa3877cfac63adb97db", size = 1548447, upload-time = "2025-05-12T12:48:21.565Z" }, - { url = "https://files.pythonhosted.org/packages/ac/9d/48c01ff8324ce4bfaba0760c0f1db6f4e2c976838655f6b80333cfd47999/gevent-25.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:b83aff2441c7d4ee93e519989713b7c2607d4510abe990cd1d04f641bc6c03af", size = 1659832, upload-time = "2025-05-12T12:45:00.794Z" }, + { url = "https://files.pythonhosted.org/packages/58/c5/cf71423666a0b83db3d7e3f85788bc47d573fca5fe62b798fe2c4273de7c/gevent-25.5.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d87c0a1bd809d8f70f96b9b229779ec6647339830b8888a192beed33ac8d129f", size = 2909333, upload-time = "2025-05-12T11:11:34.883Z" }, + { url = "https://files.pythonhosted.org/packages/26/7e/d2f174ee8bec6eb85d961ca203bc599d059c857b8412e367b8fa206603a5/gevent-25.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b87a4b66edb3808d4d07bbdb0deed5a710cf3d3c531e082759afd283758bb649", size = 1788420, upload-time = "2025-05-12T11:52:30.306Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f3/3aba8c147b9108e62ba348c726fe38ae69735a233db425565227336e8ce6/gevent-25.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f076779050029a82feb0cb1462021d3404d22f80fa76a181b1a7889cd4d6b519", size = 1868854, upload-time = "2025-05-12T11:54:21.564Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b1/11a5453f8fcebe90a456471fad48bd154c6a62fcb96e3475a5e408d05fc8/gevent-25.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb673eb291c19370f69295f7a881a536451408481e2e3deec3f41dedb7c281ec", size = 1833946, upload-time = "2025-05-12T12:00:05.514Z" }, + { url = "https://files.pythonhosted.org/packages/70/1c/37d4a62303f86e6af67660a8df38c1171b7290df61b358e618c6fea79567/gevent-25.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1325ed44225c8309c0dd188bdbbbee79e1df8c11ceccac226b861c7d52e4837", size = 2070583, upload-time = "2025-05-12T11:33:02.803Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8f/3b14929ff28263aba1d268ea97bcf104be1a86ba6f6bb4633838e7a1905e/gevent-25.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fcd5bcad3102bde686d0adcc341fade6245186050ce14386d547ccab4bd54310", size = 1808341, upload-time = "2025-05-12T11:59:59.154Z" }, + { url = "https://files.pythonhosted.org/packages/2f/fc/674ec819fb8a96e482e4d21f8baa43d34602dba09dfce7bbdc8700899d1b/gevent-25.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a93062609e8fa67ec97cd5fb9206886774b2a09b24887f40148c9c37e6fb71c", size = 2137974, upload-time = "2025-05-12T11:40:54.78Z" }, + { url = "https://files.pythonhosted.org/packages/05/9a/048b7f5e28c54e4595ad4a8ad3c338fa89560e558db2bbe8273f44f030de/gevent-25.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:2534c23dc32bed62b659ed4fd9e198906179e68b26c9276a897e04163bdde806", size = 1638344, upload-time = "2025-05-12T12:08:31.776Z" }, { url = "https://files.pythonhosted.org/packages/11/81/834da3c1ea5e71e4dc1a78a034a15f2813d9760d135464aae5d1f058a8c6/gevent-25.5.1-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:60ad4ca9ca2c4cc8201b607c229cd17af749831e371d006d8a91303bb5568eb1", size = 1291540, upload-time = "2025-05-12T11:11:55.456Z" }, ] -[[package]] -name = "gmsh-interop" -version = "2024.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pytools", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/00/8bfaf010f9d0f1ffe583db6c4a70409edb5d5aaf84af2424649256845bb1/gmsh_interop-2024.1.tar.gz", hash = "sha256:ec9bedf9dfd951032e4806d6f00f6f75c3d513ae655173fb459d6a5bce820ce2", size = 25240, upload-time = "2024-04-26T19:06:40.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/49/03a32591e922281423375a395773935a62fef6cbba68b02e5ddefcbae746/gmsh_interop-2024.1-py2.py3-none-any.whl", hash = "sha256:e1eb66431cff0e27c1e36d46ce270d1af2b500ac101f7b0c953bc54f9477095e", size = 22269, upload-time = "2024-04-26T19:06:38.207Z" }, -] - [[package]] name = "greenlet" -version = "3.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797, upload-time = "2025-05-09T19:47:35.066Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/66/910217271189cc3f32f670040235f4bf026ded8ca07270667d69c06e7324/greenlet-3.2.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6", size = 267395, upload-time = "2025-05-09T14:50:45.357Z" }, - { url = "https://files.pythonhosted.org/packages/a8/36/8d812402ca21017c82880f399309afadb78a0aa300a9b45d741e4df5d954/greenlet-3.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7", size = 625742, upload-time = "2025-05-09T15:23:58.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/77/66d7b59dfb7cc1102b2f880bc61cb165ee8998c9ec13c96606ba37e54c77/greenlet-3.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c", size = 637014, upload-time = "2025-05-09T15:24:47.025Z" }, - { url = "https://files.pythonhosted.org/packages/36/a7/ff0d408f8086a0d9a5aac47fa1b33a040a9fca89bd5a3f7b54d1cd6e2793/greenlet-3.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7409796591d879425997a518138889d8d17e63ada7c99edc0d7a1c22007d4907", size = 632874, upload-time = "2025-05-09T15:29:20.014Z" }, - { url = "https://files.pythonhosted.org/packages/a1/75/1dc2603bf8184da9ebe69200849c53c3c1dca5b3a3d44d9f5ca06a930550/greenlet-3.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f", size = 631652, upload-time = "2025-05-09T14:53:30.961Z" }, - { url = "https://files.pythonhosted.org/packages/7b/74/ddc8c3bd4c2c20548e5bf2b1d2e312a717d44e2eca3eadcfc207b5f5ad80/greenlet-3.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13", size = 580619, upload-time = "2025-05-09T14:53:42.049Z" }, - { url = "https://files.pythonhosted.org/packages/7e/f2/40f26d7b3077b1c7ae7318a4de1f8ffc1d8ccbad8f1d8979bf5080250fd6/greenlet-3.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5", size = 1109809, upload-time = "2025-05-09T15:26:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/c5/21/9329e8c276746b0d2318b696606753f5e7b72d478adcf4ad9a975521ea5f/greenlet-3.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:00cd814b8959b95a546e47e8d589610534cfb71f19802ea8a2ad99d95d702057", size = 1133455, upload-time = "2025-05-09T14:53:55.823Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1e/0dca9619dbd736d6981f12f946a497ec21a0ea27262f563bca5729662d4d/greenlet-3.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:d0cb7d47199001de7658c213419358aa8937df767936506db0db7ce1a71f4a2f", size = 294991, upload-time = "2025-05-09T15:05:56.847Z" }, - { url = "https://files.pythonhosted.org/packages/a3/9f/a47e19261747b562ce88219e5ed8c859d42c6e01e73da6fbfa3f08a7be13/greenlet-3.2.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068", size = 268635, upload-time = "2025-05-09T14:50:39.007Z" }, - { url = "https://files.pythonhosted.org/packages/11/80/a0042b91b66975f82a914d515e81c1944a3023f2ce1ed7a9b22e10b46919/greenlet-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce", size = 628786, upload-time = "2025-05-09T15:24:00.692Z" }, - { url = "https://files.pythonhosted.org/packages/38/a2/8336bf1e691013f72a6ebab55da04db81a11f68e82bb691f434909fa1327/greenlet-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b", size = 640866, upload-time = "2025-05-09T15:24:48.153Z" }, - { url = "https://files.pythonhosted.org/packages/f8/7e/f2a3a13e424670a5d08826dab7468fa5e403e0fbe0b5f951ff1bc4425b45/greenlet-3.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3", size = 636752, upload-time = "2025-05-09T15:29:23.182Z" }, - { url = "https://files.pythonhosted.org/packages/fd/5d/ce4a03a36d956dcc29b761283f084eb4a3863401c7cb505f113f73af8774/greenlet-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74", size = 636028, upload-time = "2025-05-09T14:53:32.854Z" }, - { url = "https://files.pythonhosted.org/packages/4b/29/b130946b57e3ceb039238413790dd3793c5e7b8e14a54968de1fe449a7cf/greenlet-3.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe", size = 583869, upload-time = "2025-05-09T14:53:43.614Z" }, - { url = "https://files.pythonhosted.org/packages/ac/30/9f538dfe7f87b90ecc75e589d20cbd71635531a617a336c386d775725a8b/greenlet-3.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e", size = 1112886, upload-time = "2025-05-09T15:27:01.304Z" }, - { url = "https://files.pythonhosted.org/packages/be/92/4b7deeb1a1e9c32c1b59fdca1cac3175731c23311ddca2ea28a8b6ada91c/greenlet-3.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6", size = 1138355, upload-time = "2025-05-09T14:53:58.011Z" }, - { url = "https://files.pythonhosted.org/packages/c5/eb/7551c751a2ea6498907b2fcbe31d7a54b602ba5e8eb9550a9695ca25d25c/greenlet-3.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b", size = 295437, upload-time = "2025-05-09T15:00:57.733Z" }, - { url = "https://files.pythonhosted.org/packages/37/3a/dbf22e1c7c1affc68ad4bc8f06619945c74a92b112ae6a401bed1f1ed63b/greenlet-3.2.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370", size = 266190, upload-time = "2025-05-09T14:50:53.356Z" }, - { url = "https://files.pythonhosted.org/packages/33/b1/21fabb65b13f504e8428595c54be73b78e7a542a2bd08ed9e1c56c8fcee2/greenlet-3.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59", size = 623904, upload-time = "2025-05-09T15:24:24.588Z" }, - { url = "https://files.pythonhosted.org/packages/ec/9e/3346e463f13b593aafc683df6a85e9495a9b0c16c54c41f7e34353adea40/greenlet-3.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e", size = 635672, upload-time = "2025-05-09T15:24:53.737Z" }, - { url = "https://files.pythonhosted.org/packages/8e/88/6e8459e4789a276d1a18d656fd95334d21fe0609c6d6f446f88dbfd9483d/greenlet-3.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aeca9848d08ce5eb653cf16e15bb25beeab36e53eb71cc32569f5f3afb2a3aa", size = 630975, upload-time = "2025-05-09T15:29:29.393Z" }, - { url = "https://files.pythonhosted.org/packages/ab/80/81ccf96daf166e8334c37663498dad742d61114cdf801f4872a38e8e31d5/greenlet-3.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819", size = 630252, upload-time = "2025-05-09T14:53:42.765Z" }, - { url = "https://files.pythonhosted.org/packages/c1/61/3489e3fd3b7dc81c73368177313231a1a1b30df660a0c117830aa18e0f29/greenlet-3.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc", size = 579122, upload-time = "2025-05-09T14:53:49.702Z" }, - { url = "https://files.pythonhosted.org/packages/be/55/57685fe335e88f8c75d204f9967e46e5fba601f861fb80821e5fb7ab959d/greenlet-3.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457", size = 1108299, upload-time = "2025-05-09T15:27:10.193Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e2/3f27dd194989e8481ccac3b36932836b596d58f908106b8608f98587d9f7/greenlet-3.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659", size = 1132431, upload-time = "2025-05-09T14:54:05.517Z" }, - { url = "https://files.pythonhosted.org/packages/ce/7b/803075f7b1df9165032af07d81d783b04c59e64fb28b09fd7a0e5a249adc/greenlet-3.2.2-cp39-cp39-win32.whl", hash = "sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61", size = 277740, upload-time = "2025-05-09T15:13:47.009Z" }, - { url = "https://files.pythonhosted.org/packages/ff/a3/eb7713abfd0a079d24b775d01c6578afbcc6676d89508ab3cbebd5c836ea/greenlet-3.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834", size = 294863, upload-time = "2025-05-09T15:09:46.366Z" }, +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3f/9859f655d11901e7b2996c6e3d33e0caa9a1d4572c3bc61ed0faa64b2f4c/greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", size = 277747, upload-time = "2026-02-20T20:16:21.325Z" }, + { url = "https://files.pythonhosted.org/packages/fb/07/cb284a8b5c6498dbd7cba35d31380bb123d7dceaa7907f606c8ff5993cbf/greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", size = 579202, upload-time = "2026-02-20T20:47:28.955Z" }, + { url = "https://files.pythonhosted.org/packages/ed/45/67922992b3a152f726163b19f890a85129a992f39607a2a53155de3448b8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", size = 590620, upload-time = "2026-02-20T20:55:55.581Z" }, + { url = "https://files.pythonhosted.org/packages/03/5f/6e2a7d80c353587751ef3d44bb947f0565ec008a2e0927821c007e96d3a7/greenlet-3.3.2-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", size = 602132, upload-time = "2026-02-20T21:02:43.261Z" }, + { url = "https://files.pythonhosted.org/packages/ad/55/9f1ebb5a825215fadcc0f7d5073f6e79e3007e3282b14b22d6aba7ca6cb8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", size = 591729, upload-time = "2026-02-20T20:20:58.395Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/21f5455773d37f94b866eb3cf5caed88d6cea6dd2c6e1f9c34f463cba3ec/greenlet-3.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", size = 1551946, upload-time = "2026-02-20T20:49:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/00/68/91f061a926abead128fe1a87f0b453ccf07368666bd59ffa46016627a930/greenlet-3.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", size = 1618494, upload-time = "2026-02-20T20:21:06.541Z" }, + { url = "https://files.pythonhosted.org/packages/ac/78/f93e840cbaef8becaf6adafbaf1319682a6c2d8c1c20224267a5c6c8c891/greenlet-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", size = 230092, upload-time = "2026-02-20T20:17:09.379Z" }, + { url = "https://files.pythonhosted.org/packages/f3/47/16400cb42d18d7a6bb46f0626852c1718612e35dcb0dffa16bbaffdf5dd2/greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", size = 278890, upload-time = "2026-02-20T20:19:39.263Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/42762b77a5b6aa96cd8c0e80612663d39211e8ae8a6cd47c7f1249a66262/greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", size = 581120, upload-time = "2026-02-20T20:47:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/bf/6f/f3d64f4fa0a9c7b5c5b3c810ff1df614540d5aa7d519261b53fba55d4df9/greenlet-3.3.2-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", size = 594363, upload-time = "2026-02-20T20:55:56.965Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8b/1430a04657735a3f23116c2e0d5eb10220928846e4537a938a41b350bed6/greenlet-3.3.2-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", size = 605046, upload-time = "2026-02-20T21:02:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/72/83/3e06a52aca8128bdd4dcd67e932b809e76a96ab8c232a8b025b2850264c5/greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", size = 594156, upload-time = "2026-02-20T20:20:59.955Z" }, + { url = "https://files.pythonhosted.org/packages/70/79/0de5e62b873e08fe3cef7dbe84e5c4bc0e8ed0c7ff131bccb8405cd107c8/greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", size = 1554649, upload-time = "2026-02-20T20:49:32.293Z" }, + { url = "https://files.pythonhosted.org/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", size = 1619472, upload-time = "2026-02-20T20:21:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3a/efb2cf697fbccdf75b24e2c18025e7dfa54c4f31fab75c51d0fe79942cef/greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", size = 230389, upload-time = "2026-02-20T20:17:18.772Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a1/65bbc059a43a7e2143ec4fc1f9e3f673e04f9c7b371a494a101422ac4fd5/greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", size = 229645, upload-time = "2026-02-20T20:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, ] [[package]] name = "h5py" -version = "3.13.0" +version = "3.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/30/8fa61698b438dd751fa46a359792e801191dadab560d0a5f1c709443ef8e/h5py-3.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67e59f6c2f19a32973a40f43d9a088ae324fe228c8366e25ebc57ceebf093a6b", size = 3414477, upload-time = "2025-10-16T10:33:24.201Z" }, + { url = "https://files.pythonhosted.org/packages/16/16/db2f63302937337c4e9e51d97a5984b769bdb7488e3d37632a6ac297f8ef/h5py-3.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e2f471688402c3404fa4e13466e373e622fd4b74b47b56cfdff7cc688209422", size = 2850298, upload-time = "2025-10-16T10:33:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/fc/2e/f1bb7de9b05112bfd14d5206090f0f92f1e75bbb412fbec5d4653c3d44dd/h5py-3.15.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c45802bcb711e128a6839cb6c01e9ac648dc55df045c9542a675c771f15c8d5", size = 4523605, upload-time = "2025-10-16T10:33:31.168Z" }, + { url = "https://files.pythonhosted.org/packages/05/8a/63f4b08f3628171ce8da1a04681a65ee7ac338fde3cb3e9e3c9f7818e4da/h5py-3.15.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64ce3f6470adb87c06e3a8dd1b90e973699f1759ad79bfa70c230939bff356c9", size = 4735346, upload-time = "2025-10-16T10:33:34.759Z" }, + { url = "https://files.pythonhosted.org/packages/74/48/f16d12d9de22277605bcc11c0dcab5e35f06a54be4798faa2636b5d44b3c/h5py-3.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4411c1867b9899a25e983fff56d820a66f52ac326bbe10c7cdf7d832c9dcd883", size = 4175305, upload-time = "2025-10-16T10:33:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/47cdbff65b2ce53c27458c6df63a232d7bb1644b97df37b2342442342c84/h5py-3.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2cbc4104d3d4aca9d6db8c0c694555e255805bfeacf9eb1349bda871e26cacbe", size = 4653602, upload-time = "2025-10-16T10:33:42.188Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/dc08de359c2f43a67baa529cb70d7f9599848750031975eed92d6ae78e1d/h5py-3.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:01f55111ca516f5568ae7a7fc8247dfce607de331b4467ee8a9a6ed14e5422c7", size = 2873601, upload-time = "2025-10-16T10:33:45.323Z" }, + { url = "https://files.pythonhosted.org/packages/41/fd/8349b48b15b47768042cff06ad6e1c229f0a4bd89225bf6b6894fea27e6d/h5py-3.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aaa330bcbf2830150c50897ea5dcbed30b5b6d56897289846ac5b9e529ec243", size = 3434135, upload-time = "2025-10-16T10:33:47.954Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b0/1c628e26a0b95858f54aba17e1599e7f6cd241727596cc2580b72cb0a9bf/h5py-3.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c970fb80001fffabb0109eaf95116c8e7c0d3ca2de854e0901e8a04c1f098509", size = 2870958, upload-time = "2025-10-16T10:33:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e3/c255cafc9b85e6ea04e2ad1bba1416baa1d7f57fc98a214be1144087690c/h5py-3.15.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80e5bb5b9508d5d9da09f81fd00abbb3f85da8143e56b1585d59bc8ceb1dba8b", size = 4504770, upload-time = "2025-10-16T10:33:54.357Z" }, + { url = "https://files.pythonhosted.org/packages/8b/23/4ab1108e87851ccc69694b03b817d92e142966a6c4abd99e17db77f2c066/h5py-3.15.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b849ba619a066196169763c33f9f0f02e381156d61c03e000bb0100f9950faf", size = 4700329, upload-time = "2025-10-16T10:33:57.616Z" }, + { url = "https://files.pythonhosted.org/packages/a4/e4/932a3a8516e4e475b90969bf250b1924dbe3612a02b897e426613aed68f4/h5py-3.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7f6c841efd4e6e5b7e82222eaf90819927b6d256ab0f3aca29675601f654f3c", size = 4152456, upload-time = "2025-10-16T10:34:00.843Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0a/f74d589883b13737021b2049ac796328f188dbb60c2ed35b101f5b95a3fc/h5py-3.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ca8a3a22458956ee7b40d8e39c9a9dc01f82933e4c030c964f8b875592f4d831", size = 4617295, upload-time = "2025-10-16T10:34:04.154Z" }, + { url = "https://files.pythonhosted.org/packages/23/95/499b4e56452ef8b6c95a271af0dde08dac4ddb70515a75f346d4f400579b/h5py-3.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:550e51131376889656feec4aff2170efc054a7fe79eb1da3bb92e1625d1ac878", size = 2882129, upload-time = "2025-10-16T10:34:06.886Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bb/cfcc70b8a42222ba3ad4478bcef1791181ea908e2adbd7d53c66395edad5/h5py-3.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:b39239947cb36a819147fc19e86b618dcb0953d1cd969f5ed71fc0de60392427", size = 2477121, upload-time = "2025-10-16T10:34:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/62/b8/c0d9aa013ecfa8b7057946c080c0c07f6fa41e231d2e9bd306a2f8110bdc/h5py-3.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:316dd0f119734f324ca7ed10b5627a2de4ea42cc4dfbcedbee026aaa361c238c", size = 3399089, upload-time = "2025-10-16T10:34:12.135Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5e/3c6f6e0430813c7aefe784d00c6711166f46225f5d229546eb53032c3707/h5py-3.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51469890e58e85d5242e43aab29f5e9c7e526b951caab354f3ded4ac88e7b76", size = 2847803, upload-time = "2025-10-16T10:34:14.564Z" }, + { url = "https://files.pythonhosted.org/packages/00/69/ba36273b888a4a48d78f9268d2aee05787e4438557450a8442946ab8f3ec/h5py-3.15.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a33bfd5dfcea037196f7778534b1ff7e36a7f40a89e648c8f2967292eb6898e", size = 4914884, upload-time = "2025-10-16T10:34:18.452Z" }, + { url = "https://files.pythonhosted.org/packages/3a/30/d1c94066343a98bb2cea40120873193a4fed68c4ad7f8935c11caf74c681/h5py-3.15.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25c8843fec43b2cc368aa15afa1cdf83fc5e17b1c4e10cd3771ef6c39b72e5ce", size = 5109965, upload-time = "2025-10-16T10:34:21.853Z" }, + { url = "https://files.pythonhosted.org/packages/81/3d/d28172116eafc3bc9f5991b3cb3fd2c8a95f5984f50880adfdf991de9087/h5py-3.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a308fd8681a864c04423c0324527237a0484e2611e3441f8089fd00ed56a8171", size = 4561870, upload-time = "2025-10-16T10:34:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/a5/83/393a7226024238b0f51965a7156004eaae1fcf84aa4bfecf7e582676271b/h5py-3.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f4a016df3f4a8a14d573b496e4d1964deb380e26031fc85fb40e417e9131888a", size = 5037161, upload-time = "2025-10-16T10:34:30.383Z" }, + { url = "https://files.pythonhosted.org/packages/cf/51/329e7436bf87ca6b0fe06dd0a3795c34bebe4ed8d6c44450a20565d57832/h5py-3.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:59b25cf02411bf12e14f803fef0b80886444c7fe21a5ad17c6a28d3f08098a1e", size = 2874165, upload-time = "2025-10-16T10:34:33.461Z" }, + { url = "https://files.pythonhosted.org/packages/09/a8/2d02b10a66747c54446e932171dd89b8b4126c0111b440e6bc05a7c852ec/h5py-3.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:61d5a58a9851e01ee61c932bbbb1c98fe20aba0a5674776600fb9a361c0aa652", size = 2458214, upload-time = "2025-10-16T10:34:35.733Z" }, +] + +[[package]] +name = "i18next" +version = "0.0.3" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", size = 414876, upload-time = "2025-02-18T16:04:01.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/15/8690e07c48bb44aae8316f19ed988dedb906fc78af80a42c438419b97f4e/i18next-0.0.3.tar.gz", hash = "sha256:69387928e3b0ec0ae655dd2761dd486567876cec5e869d3f38791b89e89f2bd7", size = 12444, upload-time = "2022-07-11T12:51:48.698Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/8a/bc76588ff1a254e939ce48f30655a8f79fac614ca8bd1eda1a79fa276671/h5py-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5540daee2b236d9569c950b417f13fd112d51d78b4c43012de05774908dff3f5", size = 3413286, upload-time = "2025-02-18T16:02:11.355Z" }, - { url = "https://files.pythonhosted.org/packages/19/bd/9f249ecc6c517b2796330b0aab7d2351a108fdbd00d4bb847c0877b5533e/h5py-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10894c55d46df502d82a7a4ed38f9c3fdbcb93efb42e25d275193e093071fade", size = 2915673, upload-time = "2025-02-18T16:02:15.687Z" }, - { url = "https://files.pythonhosted.org/packages/72/71/0dd079208d7d3c3988cebc0776c2de58b4d51d8eeb6eab871330133dfee6/h5py-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb267ce4b83f9c42560e9ff4d30f60f7ae492eacf9c7ede849edf8c1b860e16b", size = 4283822, upload-time = "2025-02-18T16:02:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/d8/fa/0b6a59a1043c53d5d287effa02303bd248905ee82b25143c7caad8b340ad/h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2cf6a231a07c14acd504a945a6e9ec115e0007f675bde5e0de30a4dc8d86a31", size = 4548100, upload-time = "2025-02-18T16:02:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/ad555a7ff7836c943fe97009405566dc77bcd2a17816227c10bd067a3ee1/h5py-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:851ae3a8563d87a5a0dc49c2e2529c75b8842582ccaefbf84297d2cfceeacd61", size = 2950547, upload-time = "2025-02-18T16:02:32.758Z" }, - { url = "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", size = 3422922, upload-time = "2025-02-18T16:02:36.376Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", size = 2921619, upload-time = "2025-02-18T16:02:40.722Z" }, - { url = "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", size = 4259366, upload-time = "2025-02-18T16:02:44.544Z" }, - { url = "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", size = 4509058, upload-time = "2025-02-18T16:02:49.035Z" }, - { url = "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", size = 2966428, upload-time = "2025-02-18T16:02:52.061Z" }, - { url = "https://files.pythonhosted.org/packages/cd/91/3e5b4e4c399bb57141a2451c67808597ab6993f799587566c9f11dbaefe9/h5py-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82690e89c72b85addf4fc4d5058fb1e387b6c14eb063b0b879bf3f42c3b93c35", size = 3424729, upload-time = "2025-02-18T16:03:44.374Z" }, - { url = "https://files.pythonhosted.org/packages/12/82/4e455e12e7ff26533c762eaf324edd6b076f84c3a003a40a1e52d805e0fb/h5py-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d571644958c5e19a61c793d8d23cd02479572da828e333498c9acc463f4a3997", size = 2926632, upload-time = "2025-02-18T16:03:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c9/fb430d3277e81eade92e54e87bd73e9f60c98240a86a5f43e3b85620d7d8/h5py-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560e71220dc92dfa254b10a4dcb12d56b574d2d87e095db20466b32a93fec3f9", size = 4285580, upload-time = "2025-02-18T16:03:51.895Z" }, - { url = "https://files.pythonhosted.org/packages/3f/9b/3e8cded7877ec84b707df82b9c6289cd1d7ad80fef9a10bb1389c5fee8f2/h5py-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10f061764d8dce0a9592ce08bfd5f243a00703325c388f1086037e5d619c5f1", size = 4550898, upload-time = "2025-02-18T16:03:55.832Z" }, - { url = "https://files.pythonhosted.org/packages/cb/47/8353102cff9290861135e13eefff5a916855d2ab23bd052ec7ac144f4c48/h5py-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c82ece71ed1c2b807b6628e3933bc6eae57ea21dac207dca3470e3ceaaf437c", size = 2960208, upload-time = "2025-02-18T16:04:00.029Z" }, + { url = "https://files.pythonhosted.org/packages/02/b7/c82ed3540808ba870c12cb8060f9647e836d72d13dd3074463303ac0e5fc/i18next-0.0.3-py3-none-any.whl", hash = "sha256:d47b3baeda79db92ba68c9da265716d68335e1bcb0442a669be8b8e77f684a66", size = 9288, upload-time = "2022-07-11T12:51:47.175Z" }, ] [[package]] name = "idna" -version = "3.10" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -849,16 +759,16 @@ wheels = [ [[package]] name = "imageio" -version = "2.37.0" +version = "2.37.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pillow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/47/57e897fb7094afb2d26e8b2e4af9a45c7cf1a405acdeeca001fdf2c98501/imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996", size = 389963, upload-time = "2025-01-20T02:42:37.089Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", size = 389600, upload-time = "2025-11-04T14:29:39.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed", size = 315796, upload-time = "2025-01-20T02:42:34.931Z" }, + { url = "https://files.pythonhosted.org/packages/fb/fe/301e0936b79bcab4cacc7548bf2853fc28dced0a578bab1f7ef53c9aa75b/imageio-2.37.2-py3-none-any.whl", hash = "sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b", size = 317646, upload-time = "2025-11-04T14:29:37.948Z" }, ] [[package]] @@ -877,44 +787,20 @@ wheels = [ [[package]] name = "imagesize" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, -] - -[[package]] -name = "importlib-resources" -version = "6.5.2" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp", marker = "python_full_version < '3.10'" }, -] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } 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/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, ] [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, + { 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" }, ] [[package]] @@ -952,157 +838,90 @@ wheels = [ [[package]] name = "kiwisolver" -version = "1.4.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286, upload-time = "2024-09-04T09:39:44.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440, upload-time = "2024-09-04T09:03:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758, upload-time = "2024-09-04T09:03:46.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311, upload-time = "2024-09-04T09:03:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109, upload-time = "2024-09-04T09:03:49.281Z" }, - { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814, upload-time = "2024-09-04T09:03:51.444Z" }, - { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881, upload-time = "2024-09-04T09:03:53.357Z" }, - { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972, upload-time = "2024-09-04T09:03:55.082Z" }, - { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787, upload-time = "2024-09-04T09:03:56.588Z" }, - { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212, upload-time = "2024-09-04T09:03:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399, upload-time = "2024-09-04T09:04:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688, upload-time = "2024-09-04T09:04:02.216Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493, upload-time = "2024-09-04T09:04:04.571Z" }, - { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191, upload-time = "2024-09-04T09:04:05.969Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644, upload-time = "2024-09-04T09:04:07.408Z" }, - { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877, upload-time = "2024-09-04T09:04:08.869Z" }, - { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347, upload-time = "2024-09-04T09:04:10.106Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442, upload-time = "2024-09-04T09:04:11.432Z" }, - { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762, upload-time = "2024-09-04T09:04:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319, upload-time = "2024-09-04T09:04:13.635Z" }, - { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260, upload-time = "2024-09-04T09:04:14.878Z" }, - { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589, upload-time = "2024-09-04T09:04:16.514Z" }, - { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080, upload-time = "2024-09-04T09:04:18.322Z" }, - { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049, upload-time = "2024-09-04T09:04:20.266Z" }, - { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376, upload-time = "2024-09-04T09:04:22.419Z" }, - { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231, upload-time = "2024-09-04T09:04:24.526Z" }, - { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634, upload-time = "2024-09-04T09:04:25.899Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024, upload-time = "2024-09-04T09:04:28.523Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484, upload-time = "2024-09-04T09:04:30.547Z" }, - { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078, upload-time = "2024-09-04T09:04:33.218Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645, upload-time = "2024-09-04T09:04:34.371Z" }, - { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022, upload-time = "2024-09-04T09:04:35.786Z" }, - { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536, upload-time = "2024-09-04T09:04:37.525Z" }, - { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449, upload-time = "2024-09-04T09:05:55.311Z" }, - { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757, upload-time = "2024-09-04T09:05:56.906Z" }, - { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312, upload-time = "2024-09-04T09:05:58.384Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966, upload-time = "2024-09-04T09:05:59.855Z" }, - { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044, upload-time = "2024-09-04T09:06:02.16Z" }, - { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879, upload-time = "2024-09-04T09:06:03.908Z" }, - { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751, upload-time = "2024-09-04T09:06:05.58Z" }, - { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990, upload-time = "2024-09-04T09:06:08.126Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122, upload-time = "2024-09-04T09:06:10.345Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126, upload-time = "2024-09-04T09:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313, upload-time = "2024-09-04T09:06:14.562Z" }, - { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784, upload-time = "2024-09-04T09:06:16.767Z" }, - { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988, upload-time = "2024-09-04T09:06:18.705Z" }, - { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980, upload-time = "2024-09-04T09:06:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847, upload-time = "2024-09-04T09:06:21.407Z" }, - { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494, upload-time = "2024-09-04T09:06:22.648Z" }, - { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491, upload-time = "2024-09-04T09:06:24.188Z" }, - { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648, upload-time = "2024-09-04T09:06:25.559Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257, upload-time = "2024-09-04T09:06:27.038Z" }, - { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906, upload-time = "2024-09-04T09:06:28.48Z" }, - { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951, upload-time = "2024-09-04T09:06:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715, upload-time = "2024-09-04T09:06:31.489Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666, upload-time = "2024-09-04T09:06:43.756Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088, upload-time = "2024-09-04T09:06:45.406Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321, upload-time = "2024-09-04T09:06:47.557Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776, upload-time = "2024-09-04T09:06:49.235Z" }, - { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984, upload-time = "2024-09-04T09:06:51.336Z" }, - { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811, upload-time = "2024-09-04T09:06:53.078Z" }, -] - -[[package]] -name = "kiwisolver" -version = "1.4.8" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload-time = "2024-12-24T18:30:51.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623, upload-time = "2024-12-24T18:28:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720, upload-time = "2024-12-24T18:28:19.158Z" }, - { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413, upload-time = "2024-12-24T18:28:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826, upload-time = "2024-12-24T18:28:21.203Z" }, - { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231, upload-time = "2024-12-24T18:28:23.851Z" }, - { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938, upload-time = "2024-12-24T18:28:26.687Z" }, - { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799, upload-time = "2024-12-24T18:28:30.538Z" }, - { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362, upload-time = "2024-12-24T18:28:32.943Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695, upload-time = "2024-12-24T18:28:35.641Z" }, - { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802, upload-time = "2024-12-24T18:28:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646, upload-time = "2024-12-24T18:28:40.941Z" }, - { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260, upload-time = "2024-12-24T18:28:42.273Z" }, - { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633, upload-time = "2024-12-24T18:28:44.87Z" }, - { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885, upload-time = "2024-12-24T18:28:47.346Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175, upload-time = "2024-12-24T18:28:49.651Z" }, - { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635, upload-time = "2024-12-24T18:28:51.826Z" }, - { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717, upload-time = "2024-12-24T18:28:54.256Z" }, - { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413, upload-time = "2024-12-24T18:28:55.184Z" }, - { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994, upload-time = "2024-12-24T18:28:57.493Z" }, - { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804, upload-time = "2024-12-24T18:29:00.077Z" }, - { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690, upload-time = "2024-12-24T18:29:01.401Z" }, - { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839, upload-time = "2024-12-24T18:29:02.685Z" }, - { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109, upload-time = "2024-12-24T18:29:04.113Z" }, - { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269, upload-time = "2024-12-24T18:29:05.488Z" }, - { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468, upload-time = "2024-12-24T18:29:06.79Z" }, - { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394, upload-time = "2024-12-24T18:29:08.24Z" }, - { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901, upload-time = "2024-12-24T18:29:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306, upload-time = "2024-12-24T18:29:12.644Z" }, - { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966, upload-time = "2024-12-24T18:29:14.089Z" }, - { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311, upload-time = "2024-12-24T18:29:15.892Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403, upload-time = "2024-12-24T18:30:41.372Z" }, - { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657, upload-time = "2024-12-24T18:30:42.392Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948, upload-time = "2024-12-24T18:30:44.703Z" }, - { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186, upload-time = "2024-12-24T18:30:45.654Z" }, - { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279, upload-time = "2024-12-24T18:30:47.951Z" }, - { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762, upload-time = "2024-12-24T18:30:48.903Z" }, +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, ] [[package]] name = "mac-alias" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/a3/83b50f620d318a98363dc7e701fb94856eaaecc472e23a89ac625697b3ea/mac_alias-2.2.2.tar.gz", hash = "sha256:c99c728eb512e955c11f1a6203a0ffa8883b26549e8afe68804031aa5da856b7", size = 34073, upload-time = "2022-12-06T00:37:47.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/c9/2c28b2ea968a6bbc4327c0360b746fda3757cb11cf287d00078cf81a27e2/mac_alias-2.2.3.tar.gz", hash = "sha256:1c7fa367687d66979f2ce4d1a8b2716cf1c9fb811741cab3cf3ca356555c2beb", size = 33860, upload-time = "2025-12-04T00:58:13.679Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/a1/4136777ed6a56df83e7c748ad28892f0672cbbcdc3b3d15a57df6ba72443/mac_alias-2.2.2-py3-none-any.whl", hash = "sha256:504ab8ac546f35bbd75ad014d6ad977c426660aa721f2cd3acf3dc2f664141bd", size = 21220, upload-time = "2022-12-06T00:37:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/13/20/103f4e4a6e8a524ea92eee7d938c6133d0b129aa999a50f8648ad126c728/mac_alias-2.2.3-py3-none-any.whl", hash = "sha256:7362b521d2132ef92f606a37abfed5fcd849ceb2f28b6f9743e014b02af92f0d", size = 21127, upload-time = "2025-12-04T00:58:11.931Z" }, ] [[package]] name = "macholib" -version = "1.16.3" +version = "1.16.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "altgraph", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "altgraph" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30", size = 59309, upload-time = "2023-09-25T09:10:16.155Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427, upload-time = "2025-11-22T08:28:38.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c", size = 38094, upload-time = "2023-09-25T09:10:14.188Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117, upload-time = "2025-11-22T08:28:36.939Z" }, ] [[package]] name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] dependencies = [ { name = "mdurl" }, ] @@ -1112,133 +931,107 @@ wheels = [ ] [[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload-time = "2024-10-18T15:20:51.44Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload-time = "2024-10-18T15:20:52.426Z" }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload-time = "2024-10-18T15:20:53.578Z" }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload-time = "2024-10-18T15:20:55.06Z" }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload-time = "2024-10-18T15:20:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload-time = "2024-10-18T15:20:57.189Z" }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload-time = "2024-10-18T15:20:58.235Z" }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload-time = "2024-10-18T15:20:59.235Z" }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload-time = "2024-10-18T15:21:00.307Z" }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload-time = "2024-10-18T15:21:01.122Z" }, - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, - { url = "https://files.pythonhosted.org/packages/a7/ea/9b1530c3fdeeca613faeb0fb5cbcf2389d816072fab72a71b45749ef6062/MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", size = 14344, upload-time = "2024-10-18T15:21:43.721Z" }, - { url = "https://files.pythonhosted.org/packages/4b/c2/fbdbfe48848e7112ab05e627e718e854d20192b674952d9042ebd8c9e5de/MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", size = 12389, upload-time = "2024-10-18T15:21:44.666Z" }, - { url = "https://files.pythonhosted.org/packages/f0/25/7a7c6e4dbd4f867d95d94ca15449e91e52856f6ed1905d58ef1de5e211d0/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", size = 21607, upload-time = "2024-10-18T15:21:45.452Z" }, - { url = "https://files.pythonhosted.org/packages/53/8f/f339c98a178f3c1e545622206b40986a4c3307fe39f70ccd3d9df9a9e425/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", size = 20728, upload-time = "2024-10-18T15:21:46.295Z" }, - { url = "https://files.pythonhosted.org/packages/1a/03/8496a1a78308456dbd50b23a385c69b41f2e9661c67ea1329849a598a8f9/MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", size = 20826, upload-time = "2024-10-18T15:21:47.134Z" }, - { url = "https://files.pythonhosted.org/packages/e6/cf/0a490a4bd363048c3022f2f475c8c05582179bb179defcee4766fb3dcc18/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", size = 21843, upload-time = "2024-10-18T15:21:48.334Z" }, - { url = "https://files.pythonhosted.org/packages/19/a3/34187a78613920dfd3cdf68ef6ce5e99c4f3417f035694074beb8848cd77/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", size = 21219, upload-time = "2024-10-18T15:21:49.587Z" }, - { url = "https://files.pythonhosted.org/packages/17/d8/5811082f85bb88410ad7e452263af048d685669bbbfb7b595e8689152498/MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", size = 20946, upload-time = "2024-10-18T15:21:50.441Z" }, - { url = "https://files.pythonhosted.org/packages/7c/31/bd635fb5989440d9365c5e3c47556cfea121c7803f5034ac843e8f37c2f2/MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", size = 15063, upload-time = "2024-10-18T15:21:51.385Z" }, - { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506, upload-time = "2024-10-18T15:21:52.974Z" }, +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] -name = "matplotlib" -version = "3.9.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "contourpy", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "cycler", marker = "python_full_version < '3.10'" }, - { name = "fonttools", marker = "python_full_version < '3.10'" }, - { name = "importlib-resources", marker = "python_full_version < '3.10'" }, - { name = "kiwisolver", version = "1.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pillow", marker = "python_full_version < '3.10'" }, - { name = "pyparsing", marker = "python_full_version < '3.10'" }, - { name = "python-dateutil", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529, upload-time = "2024-12-13T05:56:34.184Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089, upload-time = "2024-12-13T05:54:24.224Z" }, - { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600, upload-time = "2024-12-13T05:54:27.214Z" }, - { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138, upload-time = "2024-12-13T05:54:29.497Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711, upload-time = "2024-12-13T05:54:34.396Z" }, - { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622, upload-time = "2024-12-13T05:54:36.808Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211, upload-time = "2024-12-13T05:54:40.596Z" }, - { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430, upload-time = "2024-12-13T05:54:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045, upload-time = "2024-12-13T05:54:46.414Z" }, - { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906, upload-time = "2024-12-13T05:54:49.459Z" }, - { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873, upload-time = "2024-12-13T05:54:53.066Z" }, - { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566, upload-time = "2024-12-13T05:54:55.522Z" }, - { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065, upload-time = "2024-12-13T05:54:58.337Z" }, - { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919, upload-time = "2024-12-13T05:55:59.66Z" }, - { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486, upload-time = "2024-12-13T05:56:04.264Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838, upload-time = "2024-12-13T05:56:06.792Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492, upload-time = "2024-12-13T05:56:09.964Z" }, - { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500, upload-time = "2024-12-13T05:56:13.55Z" }, - { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962, upload-time = "2024-12-13T05:56:16.358Z" }, - { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995, upload-time = "2024-12-13T05:56:18.805Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300, upload-time = "2024-12-13T05:56:21.315Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423, upload-time = "2024-12-13T05:56:26.719Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624, upload-time = "2024-12-13T05:56:29.359Z" }, +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, ] [[package]] name = "matplotlib" -version = "3.10.3" +version = "3.10.8" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "cycler", marker = "python_full_version >= '3.10'" }, - { name = "fonttools", marker = "python_full_version >= '3.10'" }, - { name = "kiwisolver", version = "1.4.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pillow", marker = "python_full_version >= '3.10'" }, - { name = "pyparsing", marker = "python_full_version >= '3.10'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811, upload-time = "2025-05-08T19:10:54.39Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ea/2bba25d289d389c7451f331ecd593944b3705f06ddf593fa7be75037d308/matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", size = 8167862, upload-time = "2025-05-08T19:09:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/41/81/cc70b5138c926604e8c9ed810ed4c79e8116ba72e02230852f5c12c87ba2/matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", size = 8042149, upload-time = "2025-05-08T19:09:42.413Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/0ff45b6bfa42bb16de597e6058edf2361c298ad5ef93b327728145161bbf/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", size = 8453719, upload-time = "2025-05-08T19:09:44.901Z" }, - { url = "https://files.pythonhosted.org/packages/85/c7/1866e972fed6d71ef136efbc980d4d1854ab7ef1ea8152bbd995ca231c81/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", size = 8590801, upload-time = "2025-05-08T19:09:47.404Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b9/748f6626d534ab7e255bdc39dc22634d337cf3ce200f261b5d65742044a1/matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", size = 9402111, upload-time = "2025-05-08T19:09:49.474Z" }, - { url = "https://files.pythonhosted.org/packages/1f/78/8bf07bd8fb67ea5665a6af188e70b57fcb2ab67057daa06b85a08e59160a/matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", size = 8057213, upload-time = "2025-05-08T19:09:51.489Z" }, - { url = "https://files.pythonhosted.org/packages/f5/bd/af9f655456f60fe1d575f54fb14704ee299b16e999704817a7645dfce6b0/matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", size = 8178873, upload-time = "2025-05-08T19:09:53.857Z" }, - { url = "https://files.pythonhosted.org/packages/c2/86/e1c86690610661cd716eda5f9d0b35eaf606ae6c9b6736687cfc8f2d0cd8/matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", size = 8052205, upload-time = "2025-05-08T19:09:55.684Z" }, - { url = "https://files.pythonhosted.org/packages/54/51/a9f8e49af3883dacddb2da1af5fca1f7468677f1188936452dd9aaaeb9ed/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", size = 8465823, upload-time = "2025-05-08T19:09:57.442Z" }, - { url = "https://files.pythonhosted.org/packages/e7/e3/c82963a3b86d6e6d5874cbeaa390166458a7f1961bab9feb14d3d1a10f02/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b", size = 8606464, upload-time = "2025-05-08T19:09:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/0e/34/24da1027e7fcdd9e82da3194c470143c551852757a4b473a09a012f5b945/matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", size = 9413103, upload-time = "2025-05-08T19:10:03.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/da/948a017c3ea13fd4a97afad5fdebe2f5bbc4d28c0654510ce6fd6b06b7bd/matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", size = 8065492, upload-time = "2025-05-08T19:10:05.271Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d1/f54d43e95384b312ffa4a74a4326c722f3b8187aaaa12e9a84cdf3037131/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", size = 8162896, upload-time = "2025-05-08T19:10:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/24/a4/fbfc00c2346177c95b353dcf9b5a004106abe8730a62cb6f27e79df0a698/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", size = 8039702, upload-time = "2025-05-08T19:10:49.634Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298, upload-time = "2025-05-08T19:10:51.738Z" }, +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" }, + { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" }, + { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, + { 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]] @@ -1250,40 +1043,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, ] -[[package]] -name = "mdit-py-plugins" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "markdown-it-py", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload-time = "2024-09-09T20:27:48.397Z" }, -] - [[package]] name = "mdit-py-plugins" version = "0.5.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] dependencies = [ - { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ @@ -1299,63 +1065,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "meshpy" -version = "2022.1.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "gmsh-interop", marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pytools", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/ee/6ec21159624454a2522211c17b72d2211237c74b45c353a6504f801a3d3a/MeshPy-2022.1.3.tar.gz", hash = "sha256:a7158e31ece25fa6c6cebce9fd1e968157d661dc8769fb30ceba69c351478475", size = 474632, upload-time = "2022-11-06T19:54:17.881Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/61/c532e6b2541d4f8679a44bfda2aaf821b88cd4aef8368e3ed0de3d841cb2/MeshPy-2022.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d40478a535cfc27e8e545efa3620f7950b64970f5f0d00102271be6aa449956", size = 532484, upload-time = "2022-11-06T19:53:15.6Z" }, - { url = "https://files.pythonhosted.org/packages/93/cb/54f45882c9b24fd546403a2e23d4bc31b1e11a5fb721ea3814e7be7e7147/MeshPy-2022.1.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46d4d89cc41b7b1f417d51671b1f66a8c852df119c1ead1134f422dc89dd40b9", size = 463078, upload-time = "2022-11-06T19:53:17.219Z" }, - { url = "https://files.pythonhosted.org/packages/70/87/9b8b6eea09dcd890b656d9ad4ed0870a1f71a871af9e1b804cea4fe3978c/MeshPy-2022.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:010c227ec6d3a9c14d8bf7d1f9f2651b317c70beee79c75d7a1d26b3a9e41b1f", size = 458976, upload-time = "2022-11-06T19:53:18.944Z" }, - { url = "https://files.pythonhosted.org/packages/43/9e/905db04b95440f4c7975a8954d6d9dbf13e8b9da8f588c65a8d66959c07d/MeshPy-2022.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:14702088db853d3a72a4ed82654d5ab702a1f7c5561321c2945a8235b7a3b1d6", size = 981142, upload-time = "2022-11-06T19:53:20.753Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8e/ccaab891a02482c0648f5e7174af9444152f8d7a5b7b15a79e6059655ffd/MeshPy-2022.1.3-cp310-cp310-win32.whl", hash = "sha256:dbe033062ed7dfc429ecf06070599054fe93d19c778d2b8159469b1210b36eb2", size = 346736, upload-time = "2022-11-06T19:53:21.839Z" }, - { url = "https://files.pythonhosted.org/packages/90/52/8f938fe5944b99dc7b43eba8cc713b4c5c1957e089e24688b478e3c7abfa/MeshPy-2022.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:2fbade42c1a7b07f9247e8a6ba7060a30dd72bddeeee70e6f6b05b03a88647c7", size = 379773, upload-time = "2022-11-06T19:53:23.235Z" }, - { url = "https://files.pythonhosted.org/packages/13/23/78a31c15e3dfda324f66a4fbd75ffb025415935d4dc05deb2312eec56b81/MeshPy-2022.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db5160faba0362eaeeb5aaee5f7f12f7dc11d659e4ce5fd54e04bd0b46d3993f", size = 532840, upload-time = "2022-11-06T19:53:24.498Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f2/2cbb48a18110800d697651a8fd8da7b017c4c9f7ef32735980cae19b6ad6/MeshPy-2022.1.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14dc6af3f910185711b72c01250755778d995c32309f9ae1a250f3094e7e49e1", size = 463046, upload-time = "2022-11-06T19:53:25.619Z" }, - { url = "https://files.pythonhosted.org/packages/28/d4/fc14e0f32d1b031c6a5a3132798c084634bbd2e45e77c19cbd04aa01d7e2/MeshPy-2022.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6640d5e84bd551eef2c8304b28f9d0cd0c1a2b6f4367571d84174ff16cb0c901", size = 458959, upload-time = "2022-11-06T19:53:26.796Z" }, - { url = "https://files.pythonhosted.org/packages/82/fa/1485aef729b9e6a42f3196ab2ba8049314c6fcb0a6ad3ce68c2e771650d6/MeshPy-2022.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5f48f44eaebf900cfafcb4865cd336df8df6be2bbbd894530fa27f6cbe61cc18", size = 981073, upload-time = "2022-11-06T19:53:29.256Z" }, - { url = "https://files.pythonhosted.org/packages/ec/07/3f710d975d8f5ef7fb91528abe18ac830be3f15717450b2f98ea4ecd2b92/MeshPy-2022.1.3-cp311-cp311-win32.whl", hash = "sha256:3f12b5eeee2907d8ff18e1438076e8e1b3e9c5c23d81578b48b5673d5742343a", size = 346746, upload-time = "2022-11-06T19:53:30.577Z" }, - { url = "https://files.pythonhosted.org/packages/30/d3/15b078f8bafc968008b78baf245cd26ec51102d14ef9e467c79563deac72/MeshPy-2022.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:53e9d7a35bc9c1f0dfa7851270f28a88290e68064da3994275934b4d6ad7626b", size = 379783, upload-time = "2022-11-06T19:53:31.796Z" }, - { url = "https://files.pythonhosted.org/packages/c8/5a/cc3f2904acc739f2e9e6af85c2a48fe184d2482c71980536d501ef67c309/MeshPy-2022.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2d78d1f2a67ed3073bfa63e79638aafaeb2717348e820cbbc7709a7d9be2ad", size = 532634, upload-time = "2022-11-06T19:53:55.781Z" }, - { url = "https://files.pythonhosted.org/packages/fc/71/e68e07e730dd77863d6cc967c97a4165351218a12e2766040590c36ea54e/MeshPy-2022.1.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37e90f154a70fcf2c2ece584f58fb6764d2ee0007d3fddc6cf04b0295de98dab", size = 463407, upload-time = "2022-11-06T19:53:56.95Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c9/7d46ee4d8eb8a49fcd6942d73bf84a8f6a79b03a587bdb301970b9528612/MeshPy-2022.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b876f6f6e8ae865e875b355a1c68ca5672a1a03babdf91a83bcc0f3d92804655", size = 459736, upload-time = "2022-11-06T19:53:58.087Z" }, - { url = "https://files.pythonhosted.org/packages/6d/70/c92e973b3fcce88b35d27e020a076552ee24d340c9f322e936f3892ada22/MeshPy-2022.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d4967ec3166af5147377734c4a4256c8ae3bb94a265d149da6420c728a974b0", size = 981915, upload-time = "2022-11-06T19:53:59.75Z" }, - { url = "https://files.pythonhosted.org/packages/53/0a/91cfaf468d5733b4c97ca7c9d36e52295f162fd5b8482b68889e1d20fd3e/MeshPy-2022.1.3-cp39-cp39-win32.whl", hash = "sha256:b81ace2fff18a63482c4b6be04b27d51c7a715e8d53bf8f270f0414da35685ab", size = 346763, upload-time = "2022-11-06T19:54:00.789Z" }, - { url = "https://files.pythonhosted.org/packages/a9/de/6de00719e60010d985d30e52555d58cff63931e50565773f6bc1a88ab9ec/MeshPy-2022.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:0fd5ffd0c90d9e0b0b1f86b55616c21a8812d1d36d0a4408ed6bd2d640a17bb5", size = 377142, upload-time = "2022-11-06T19:54:01.907Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c0/6fa29792daefde7e28b368d427de6dc3cd43904a6b4afd2c7ca9bbd873ab/MeshPy-2022.1.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d93782f0fd0d961039549e5e5b4a53125f8ea3ec457c4f3b9261acf4a0e94268", size = 464370, upload-time = "2022-11-06T19:54:12.624Z" }, - { url = "https://files.pythonhosted.org/packages/d2/62/74f176825a76dbc7b74833b8439ae49035de3a199816d44631b2a3421e38/MeshPy-2022.1.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebb52237dbd87dc47c9c1c5d9f779bed99a4ce433407e1cb4995f90ca79a636e", size = 512844, upload-time = "2022-11-06T19:54:13.814Z" }, - { url = "https://files.pythonhosted.org/packages/f8/cf/ba443d2bc6e2180177e734913843816d9ae98caad30761fb9d14de4357eb/MeshPy-2022.1.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b7d60d288c3a99fd83ce1d1152cbe2d668c8ba036956fff68a5a4294f7f5850", size = 506314, upload-time = "2022-11-06T19:54:15.008Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/ab4eff1e88dbcbc3b46b26f88d74478bfd3b17f4bfe110ff6e1cfca50e6b/MeshPy-2022.1.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0e107fbf79801721eddee9826a64787d3e3b1f0bfe3d08792bbe05c4d36f12a", size = 378810, upload-time = "2022-11-06T19:54:16.247Z" }, -] - [[package]] name = "meshpy" version = "2025.1.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b0/4a/4b75a61f083302301544c5d9ceb0813e7edac8cc9f4628fe9165e663a11b/meshpy-2025.1.1.tar.gz", hash = "sha256:70fc707fe9ccd9e907b95a9271804b4dd02e77d60644f64a0384cbf9e6d5b86b", size = 485344, upload-time = "2025-03-18T23:06:09.372Z" } wheels = [ @@ -1369,6 +1085,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/c5/adb369dd327417c83ed71d9291ae0edf7c9771434442248c96a3d48cebb4/meshpy-2025.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a633f704a9b8a556c4ac2cc7d65ac152d32a3cfed72da955a7d559d602b12f1", size = 599047, upload-time = "2025-03-18T23:05:38.638Z" }, { url = "https://files.pythonhosted.org/packages/ce/00/14ab974ce6a8e534c44acfcae9604af4e428bb5c7c84ada708cfcb468d65/meshpy-2025.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2b2e4121902a15791814cbd9dc41865a5af40e7943a3d10d80495c42ab032fe8", size = 1622510, upload-time = "2025-03-18T23:05:40.191Z" }, { url = "https://files.pythonhosted.org/packages/0d/46/aa2da0192340178bbd5fe5ab78461a64b6cc218d7f73fc894e9b5f6c3cd2/meshpy-2025.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:d996e1dc8f658cea8bd85e509d69460893e6d68677ddfede08bc49440d8a1dea", size = 603175, upload-time = "2025-03-18T23:05:42.366Z" }, + { url = "https://files.pythonhosted.org/packages/86/0d/887f98f597671ecc0476e188c94f592073fec95ad3d8c76f0728ef38a9db/meshpy-2025.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:547365a8f4df0bb72031f8361071133b28c9214ae5c5fd336fa1b2643aa7cc54", size = 525245, upload-time = "2025-03-18T23:05:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/28b54af580d4f2305d3a78f9a24dc0d985bf4c2f790f77abd51d6399bc3b/meshpy-2025.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af7334576b8336240c1ec12e84c3d6d024fe4233d8af565f95a60a68ffff6fdc", size = 472219, upload-time = "2025-03-18T23:05:45.067Z" }, + { url = "https://files.pythonhosted.org/packages/40/f1/a67d5c40f40a292f11d3ace41af1bc08b5aa84c4fef0e7c76673ace4b48e/meshpy-2025.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a41b4349a87468fa4883f9809e90201e0c9ba6f6d607a6131819ac581e5549", size = 595333, upload-time = "2025-03-18T23:05:46.358Z" }, + { url = "https://files.pythonhosted.org/packages/2d/bf/ea689f6ee156334b6f70e324ce60808b527ce1270e11ecaf807a5c472e76/meshpy-2025.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a64c724d8121d8bdf32d0e4b763bd7a9b7d49d84c1911c4e50fb43a1fa4ee4fc", size = 1627410, upload-time = "2025-03-18T23:05:48.069Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/bf85fe98e4835f4353c6a7b14fb627167ebf596173eab9384be6a0f456f3/meshpy-2025.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:581d6360841b9fb337bd97e9471c721c333ecf85d882d16baa648d3baede5703", size = 603670, upload-time = "2025-03-18T23:05:49.539Z" }, { url = "https://files.pythonhosted.org/packages/77/5b/1e89ded0a14b4610e80d0e982622a940077fda09983688754fb94ddf8e9f/meshpy-2025.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d39aa08aa08f6aba3ed5c2402cbd829dc05b7522ee2410e153c8fc71b7e8ad09", size = 522823, upload-time = "2025-03-18T23:05:58.364Z" }, { url = "https://files.pythonhosted.org/packages/28/8d/6eabff58375737be1e9d877768157c8788226c7b3d61a009dd910fcb8e5a/meshpy-2025.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:52bf29e3cfbb22d0ae3180f6329f5b46121c083a51304b009c62528c9ff4afbf", size = 470375, upload-time = "2025-03-18T23:05:59.603Z" }, { url = "https://files.pythonhosted.org/packages/d5/a1/c0e4c8a81cc55d6e784c78346697f11b198642687d7512c5782e40bb242e/meshpy-2025.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34502491d992f3e0bce44f9bbdc260ad086e64fb8b65e90bb242ed0f7bbe6684", size = 596260, upload-time = "2025-03-18T23:06:00.791Z" }, @@ -1379,75 +1100,65 @@ wheels = [ [[package]] name = "modulegraph" -version = "0.19.6" +version = "0.19.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "altgraph", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "setuptools", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "altgraph" }, + { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/7a/7d1ef5824553c960b441b937dd26a0f99ea04a8c29a5ed099b7c06e9ef61/modulegraph-0.19.6.tar.gz", hash = "sha256:c914c8c95a0e10fe88505d4e9c2284b4e3dbc70943e306cc6567e36cc541bf4b", size = 88145, upload-time = "2023-09-25T08:54:01.591Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/fa/c471f46fa1696309b806d6c663d599525925a5c13cf1371a02587a265109/modulegraph-0.19.7.tar.gz", hash = "sha256:9ad8a81148ba1d90ade66617a153786f7d7cf6a88de83ee28e251183122c2a57", size = 88618, upload-time = "2025-11-22T08:22:43.858Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/e2/f4e1bb5b49ca5521f86309554cebb1ce61290e2d813cd397946b3b354c13/modulegraph-0.19.6-py2.py3-none-any.whl", hash = "sha256:5443e6d93c0b263f4ea309e2ff01312eef7c424dd51981a1e78e960c90e572b8", size = 34898, upload-time = "2023-09-25T08:53:41.154Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c1/3eff0be83439f0408866eaacd4106c9d19b762cba66bcf0d0a523a6f6620/modulegraph-0.19.7-py2.py3-none-any.whl", hash = "sha256:139f89042c9912777ba4bbf1d5496591c6ad780110ea3082c11e8737cf82cacc", size = 35151, upload-time = "2025-11-22T08:22:42.239Z" }, ] [[package]] name = "moviepy" -version = "2.2.0" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "decorator" }, { name = "imageio" }, { name = "imageio-ffmpeg" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pillow" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "proglog" }, - { name = "python-dotenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/38/03c3461dbfbed6a88f0ee1bad99ecbc282ff8320b38b04e2806b8be5dbcd/moviepy-2.2.0.tar.gz", hash = "sha256:895e8f08a338eb1e3a9bcf793b66fff48ab496f28185e7923788d1751a249e7a", size = 58431324, upload-time = "2025-05-21T14:13:54.722Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/0a/bceca4c999fe670fb58ff0e58eb9811e6176d5a62ad5d282e5a581e07ed2/moviepy-2.2.0-py3-none-any.whl", hash = "sha256:5da013da14d918ebe26cf5a113e2d763c2406149b394e1c1b441a4263cf8e322", size = 129831, upload-time = "2025-05-21T14:13:51.869Z" }, + { name = "requests" }, + { name = "tqdm" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/18/54/01a8c4e35c75ca9724d19a7e4de9dc23f0ceb8769102c7de056113af61c3/moviepy-1.0.3.tar.gz", hash = "sha256:2884e35d1788077db3ff89e763c5ba7bfddbd7ae9108c9bc809e7ba58fa433f5", size = 388311, upload-time = "2020-05-07T16:27:46.856Z" } [[package]] name = "msgpack" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260, upload-time = "2024-09-10T04:25:52.197Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/f9/a892a6038c861fa849b11a2bb0502c07bc698ab6ea53359e5771397d883b/msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd", size = 150428, upload-time = "2024-09-10T04:25:43.089Z" }, - { url = "https://files.pythonhosted.org/packages/df/7a/d174cc6a3b6bb85556e6a046d3193294a92f9a8e583cdbd46dc8a1d7e7f4/msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d", size = 84131, upload-time = "2024-09-10T04:25:30.22Z" }, - { url = "https://files.pythonhosted.org/packages/08/52/bf4fbf72f897a23a56b822997a72c16de07d8d56d7bf273242f884055682/msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5", size = 81215, upload-time = "2024-09-10T04:24:54.329Z" }, - { url = "https://files.pythonhosted.org/packages/02/95/dc0044b439b518236aaf012da4677c1b8183ce388411ad1b1e63c32d8979/msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5", size = 371229, upload-time = "2024-09-10T04:25:50.907Z" }, - { url = "https://files.pythonhosted.org/packages/ff/75/09081792db60470bef19d9c2be89f024d366b1e1973c197bb59e6aabc647/msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e", size = 378034, upload-time = "2024-09-10T04:25:22.097Z" }, - { url = "https://files.pythonhosted.org/packages/32/d3/c152e0c55fead87dd948d4b29879b0f14feeeec92ef1fd2ec21b107c3f49/msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b", size = 363070, upload-time = "2024-09-10T04:24:43.957Z" }, - { url = "https://files.pythonhosted.org/packages/d9/2c/82e73506dd55f9e43ac8aa007c9dd088c6f0de2aa19e8f7330e6a65879fc/msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f", size = 359863, upload-time = "2024-09-10T04:24:51.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/a0/3d093b248837094220e1edc9ec4337de3443b1cfeeb6e0896af8ccc4cc7a/msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68", size = 368166, upload-time = "2024-09-10T04:24:19.907Z" }, - { url = "https://files.pythonhosted.org/packages/e4/13/7646f14f06838b406cf5a6ddbb7e8dc78b4996d891ab3b93c33d1ccc8678/msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b", size = 370105, upload-time = "2024-09-10T04:25:35.141Z" }, - { url = "https://files.pythonhosted.org/packages/67/fa/dbbd2443e4578e165192dabbc6a22c0812cda2649261b1264ff515f19f15/msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044", size = 68513, upload-time = "2024-09-10T04:24:36.099Z" }, - { url = "https://files.pythonhosted.org/packages/24/ce/c2c8fbf0ded750cb63cbcbb61bc1f2dfd69e16dca30a8af8ba80ec182dcd/msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f", size = 74687, upload-time = "2024-09-10T04:24:23.394Z" }, - { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803, upload-time = "2024-09-10T04:24:40.911Z" }, - { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343, upload-time = "2024-09-10T04:24:50.283Z" }, - { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408, upload-time = "2024-09-10T04:25:12.774Z" }, - { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096, upload-time = "2024-09-10T04:24:37.245Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671, upload-time = "2024-09-10T04:25:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414, upload-time = "2024-09-10T04:25:27.552Z" }, - { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759, upload-time = "2024-09-10T04:25:03.366Z" }, - { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405, upload-time = "2024-09-10T04:25:07.348Z" }, - { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041, upload-time = "2024-09-10T04:25:48.311Z" }, - { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538, upload-time = "2024-09-10T04:24:29.953Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871, upload-time = "2024-09-10T04:25:44.823Z" }, - { url = "https://files.pythonhosted.org/packages/f7/3b/544a5c5886042b80e1f4847a4757af3430f60d106d8d43bb7be72c9e9650/msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1", size = 150713, upload-time = "2024-09-10T04:25:23.397Z" }, - { url = "https://files.pythonhosted.org/packages/93/af/d63f25bcccd3d6f06fd518ba4a321f34a4370c67b579ca5c70b4a37721b4/msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48", size = 84277, upload-time = "2024-09-10T04:24:34.656Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/5c0dfb0009b9f96328664fecb9f8e4e9c8a1ae919e6d53986c1b813cb493/msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c", size = 81357, upload-time = "2024-09-10T04:24:56.603Z" }, - { url = "https://files.pythonhosted.org/packages/d1/7c/3a9ee6ec9fc3e47681ad39b4d344ee04ff20a776b594fba92d88d8b68356/msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468", size = 371256, upload-time = "2024-09-10T04:25:11.473Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0a/8a213cecea7b731c540f25212ba5f9a818f358237ac51a44d448bd753690/msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74", size = 377868, upload-time = "2024-09-10T04:25:24.535Z" }, - { url = "https://files.pythonhosted.org/packages/1b/94/a82b0db0981e9586ed5af77d6cfb343da05d7437dceaae3b35d346498110/msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846", size = 363370, upload-time = "2024-09-10T04:24:21.812Z" }, - { url = "https://files.pythonhosted.org/packages/93/fc/6c7f0dcc1c913e14861e16eaf494c07fc1dde454ec726ff8cebcf348ae53/msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346", size = 358970, upload-time = "2024-09-10T04:24:24.741Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c6/e4a04c0089deace870dabcdef5c9f12798f958e2e81d5012501edaff342f/msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b", size = 366358, upload-time = "2024-09-10T04:25:45.955Z" }, - { url = "https://files.pythonhosted.org/packages/b6/54/7d8317dac590cf16b3e08e3fb74d2081e5af44eb396f0effa13f17777f30/msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8", size = 370336, upload-time = "2024-09-10T04:24:26.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/a5a1f43b6566831e9630e5bc5d86034a8884386297302be128402555dde1/msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd", size = 68683, upload-time = "2024-09-10T04:24:32.984Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e8/2162621e18dbc36e2bc8492fd0e97b3975f5d89fe0472ae6d5f7fbdd8cf7/msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325", size = 74787, upload-time = "2024-09-10T04:25:14.524Z" }, +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, ] [[package]] @@ -1456,8 +1167,8 @@ version = "0.4.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "msgpack" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/08/94/61e8aee142733ebfdc400a05bdac6e1763c4514bba3b42743d223f388450/msgpack-numpy-0.4.8.tar.gz", hash = "sha256:c667d3180513422f9c7545be5eec5d296dcbb357e06f72ed39cc683797556e69", size = 10923, upload-time = "2022-06-09T03:43:08.739Z" } wheels = [ @@ -1466,95 +1177,76 @@ wheels = [ [[package]] name = "myst-parser" -version = "3.0.1" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "docutils", marker = "python_full_version < '3.10'" }, - { name = "jinja2", marker = "python_full_version < '3.10'" }, - { name = "markdown-it-py", marker = "python_full_version < '3.10'" }, - { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pyyaml", marker = "python_full_version < '3.10'" }, - { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/64/e2f13dac02f599980798c01156393b781aec983b52a6e4057ee58f07c43a/myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87", size = 92392, upload-time = "2024-04-28T20:22:42.116Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/de/21aa8394f16add8f7427f0a1326ccd2b3a2a8a3245c9252bc5ac034c6155/myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1", size = 83163, upload-time = "2024-04-28T20:22:39.985Z" }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] [[package]] name = "myst-parser" -version = "4.0.1" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "docutils", marker = "python_full_version >= '3.10'" }, - { name = "jinja2", marker = "python_full_version >= '3.10'" }, - { name = "markdown-it-py", marker = "python_full_version >= '3.10'" }, - { name = "mdit-py-plugins", version = "0.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.10'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + "python_full_version >= '3.11' and sys_platform != 'win32'", ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } +dependencies = [ + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, ] [[package]] name = "ndindex" -version = "1.9.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/f9/f8d491c18f16ffcb1a8abf78345e54879fd1fe6b61dcc8a9b471285cd27e/ndindex-1.9.2.tar.gz", hash = "sha256:b8658a06e52d6c47445c2ec11d292e1d52c3af259214c8b52e3a1aab733daa72", size = 243001, upload-time = "2024-09-25T22:39:49.97Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/63/ecada5bf66ba8a7382866be58323a6ecb7ad85ddea6fc9fa93d29d9ba472/ndindex-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6c0bd9fb02b5ac6e3e8b70404930e1f6824ad565363bf8f0e817d6f6a3a47593", size = 163400, upload-time = "2024-09-25T22:38:44.409Z" }, - { url = "https://files.pythonhosted.org/packages/61/25/8a6d5905e36e03c1f84d0cdf4a269ad4e80f84105f4607574e44cd2d9195/ndindex-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3502df515c225e653b55fc08e714d4ae56306ad46454759d90156530cb4e2f40", size = 162245, upload-time = "2024-09-25T22:38:45.853Z" }, - { url = "https://files.pythonhosted.org/packages/b6/62/b9eec0bb5f653b48cbf6777ab30c6fd5928a6a3892b445c7cb935979fc35/ndindex-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a36a48abc26dbf405aaa121ee3b4245390801a07856192f4f6c79d4db403520", size = 475505, upload-time = "2024-09-25T22:38:47.178Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ea/2f425a58568e2a359a7ea7f1882591a611c36bb08cc329fd279a33fc8198/ndindex-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0adcfa8f213493399458184175e411ce8040790f5de00d5cbca6ec6a778bfa71", size = 455841, upload-time = "2024-09-25T22:38:48.66Z" }, - { url = "https://files.pythonhosted.org/packages/df/be/4a1cab33eb8ec3838e312318b21a7044d3fb2546e1e809d0ae245e028250/ndindex-1.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5f53810a8eb73ad7054c1d628365a86c3f550a14e59ed7d9904ee7de21a3a432", size = 462059, upload-time = "2024-09-25T22:38:50.194Z" }, - { url = "https://files.pythonhosted.org/packages/b4/5e/6a25117f74c410bf09bf7cac9db8f84b256870378230e4e6ebdaa2e23e1c/ndindex-1.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d227c1c8e3c83ded04499b9a43c58862aebc948f2fe61d4c8622f711a56032b6", size = 477098, upload-time = "2024-09-25T22:38:51.418Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e1/02f4fc78960a6a14ca1f5012cbdfdfaacd4380ab67f2d88ed3fd4c1ce120/ndindex-1.9.2-cp310-cp310-win32.whl", hash = "sha256:2707453757dabd7efa6c8f2d8acda4cdc8e39108528479a8c8fcc9126a693024", size = 151769, upload-time = "2024-09-25T22:38:52.692Z" }, - { url = "https://files.pythonhosted.org/packages/21/fc/088633718e73413e909c1cef18f5ff1bc2ab333fec5e15f3b9b429d09d45/ndindex-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:42614f829e614808987dd68377cacda32634c2d8399b239a7a43f78bd8e3bdda", size = 159535, upload-time = "2024-09-25T22:38:53.698Z" }, - { url = "https://files.pythonhosted.org/packages/90/6d/f272dbbe0a23575e57773272f02a237b51f4e4f33317bf28b2b8be47ac3d/ndindex-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1fa2e521a872870d55fa6fa85399f16c1c20bbe4e3e315bbfc80e3ea92561334", size = 163453, upload-time = "2024-09-25T22:38:55.045Z" }, - { url = "https://files.pythonhosted.org/packages/77/f6/8ff749841f6f8f4096184e8e158e48d572358d4ad0ba1055728e4f7e0f44/ndindex-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b0ef52d15fa8755d00a6868c799ff4227f1f453901a6f4de395586f9a435b7a", size = 161947, upload-time = "2024-09-25T22:38:56.393Z" }, - { url = "https://files.pythonhosted.org/packages/51/2d/bfc284ecc9b24acb916f5d04a69357ae56e0b6073286eaa71cf54bf0b136/ndindex-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f647eda61cae68a260017118ad8daac4d580ad221ff922bbaa1526e30e350feb", size = 506119, upload-time = "2024-09-25T22:38:57.633Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6b/83e328c3dc41ff244d7e79cd24ac62fff96405a3ea948810b2fa883c14f5/ndindex-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:384520b4d9f52cb2fd1d324e6f278ec422b2cc2885e95a00587394bf6f56a798", size = 485492, upload-time = "2024-09-25T22:38:59.111Z" }, - { url = "https://files.pythonhosted.org/packages/87/f4/8a3a3c0d541d96a6cd39026a1211647d0fcbf047f8bac4332e4b95f54e8b/ndindex-1.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e2dd75a6e25269b66607f1722acd72e8f086837b2c58275d31b3bdfdf8a095bf", size = 489557, upload-time = "2024-09-25T22:39:00.497Z" }, - { url = "https://files.pythonhosted.org/packages/0f/5c/5e96422400fad72762e85e3cc3a4bd52b11476b990c4e7df25836e8e9c0c/ndindex-1.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8634be005b18034846163067bce78a0209fab65e4bc77e0bc333aa160ef12b7a", size = 506268, upload-time = "2024-09-25T22:39:02.002Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8b/5948067de44c5484aa8a4db640b8b5dc5cc9b394e9f547a23fd694edf399/ndindex-1.9.2-cp311-cp311-win32.whl", hash = "sha256:89172e90e56a409197cbbe12a49aa16c83879274ca4f61fd8a03b30c6c90e3ca", size = 151566, upload-time = "2024-09-25T22:39:03.552Z" }, - { url = "https://files.pythonhosted.org/packages/b0/f6/b2fde7ec7880d51f7280bb5e974e400bb716e3054048c409ba35ba509823/ndindex-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:d23f07831d28bb3c04c234936b6038078cd7c0c4966d2e2e37738edad6435f9f", size = 159516, upload-time = "2024-09-25T22:39:04.672Z" }, - { url = "https://files.pythonhosted.org/packages/f7/cf/7cfa18540a3d00d5dae797ceaf8ec9758cd01449c843c7e19571dc65b388/ndindex-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35543c2638beeb1119c0842f3cdc394b9a242d312f7a5ec9d967486d66c3094f", size = 164537, upload-time = "2024-09-25T22:39:28.346Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9f/e2584f621e223f75bce3143dbfbe5f3bf9294362f51c7c08e78bd1e915a6/ndindex-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2d9c237269fffdc02b810127d3cacaf82ac7cbee24ac9743e80859e789448b8", size = 163328, upload-time = "2024-09-25T22:39:29.328Z" }, - { url = "https://files.pythonhosted.org/packages/a2/06/3f95030c6a3ece0271e369b34ea2a9be8879c0197a78ee7d84273861342d/ndindex-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d64688b27f89d529dfabeae5f1216e0673652b21143e802cf427ded8a4954ecd", size = 478286, upload-time = "2024-09-25T22:39:30.532Z" }, - { url = "https://files.pythonhosted.org/packages/0e/6b/c8ca550014dcb374d5134dce100e0a139dcb9a5e5f10b8cede1069316e97/ndindex-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d3e507c079dfe12cf8144de0cfd9e670d0c234a3200d578556965723f0387fb", size = 458578, upload-time = "2024-09-25T22:39:31.596Z" }, - { url = "https://files.pythonhosted.org/packages/92/4c/64610ced3a603ded96ed8be9c3572e5e4cf395417626dc2ddd74da8346ea/ndindex-1.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7daafad7af277e92d155178f625a3c951ed2dfb34878f1b7e6e952246eca0314", size = 466979, upload-time = "2024-09-25T22:39:32.686Z" }, - { url = "https://files.pythonhosted.org/packages/fb/4e/e8c5cf31e0289af579b44b0aa4f7f6198ecf7b0cfb9b2ad80c0f5660aaed/ndindex-1.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4110c98e77cd529ec1ea8065bf6ce96a5c613ac47ad17e6f97943a80409de721", size = 483261, upload-time = "2024-09-25T22:39:33.795Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f6/91cc1b2e5dfd9e018a448b2c3bdac1b67329851b56a5018e6dae9d7d4995/ndindex-1.9.2-cp39-cp39-win32.whl", hash = "sha256:9c92921b1453b050b7531f55c568e64d93d6943e16bd9249a896258a6d4489bb", size = 152487, upload-time = "2024-09-25T22:39:34.93Z" }, - { url = "https://files.pythonhosted.org/packages/ae/a2/ab7527ec8d96d9fdb686c83bc111e8cf1f53ba177b08b256d0178c320c3e/ndindex-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:cd1b3d39cb0d3ef6606d7450b79729e1934bf88fd1a20e123d164bae8e74d01b", size = 160126, upload-time = "2024-09-25T22:39:36.205Z" }, - { url = "https://files.pythonhosted.org/packages/d7/61/9e7a4f9fd6504b8e34c20fe8df01ce78ea54b3c7124e4085ba93ede0cba9/ndindex-1.9.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f32019691f52314d6b7ae0168f6c148f94fecda92cd84cc0fd94331982a55f37", size = 147207, upload-time = "2024-09-25T22:39:37.23Z" }, - { url = "https://files.pythonhosted.org/packages/0d/46/ad616f44c759e6026dcfed5ebc990a2303ba478ecf3edb5216088233d5b6/ndindex-1.9.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c6aa27f552a810e60e207fca372db94147811ca9228a728d3529a908197d35ce", size = 147005, upload-time = "2024-09-25T22:39:38.179Z" }, - { url = "https://files.pythonhosted.org/packages/3b/a7/2f2f38620d84c68e40a91521beb5b695ec4c8ad99795d2a89021fdced592/ndindex-1.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67e02762cd342d0e722f47a26ba546d5709e4b17205bda504228ed455f31b690", size = 163542, upload-time = "2024-09-25T22:39:39.781Z" }, - { url = "https://files.pythonhosted.org/packages/92/29/048cfd992465e0b66ffd9443eeaf5a9fd596f2ba5c8d470b8445f8c959e9/ndindex-1.9.2-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4750ded2e1d2941cda4604aade162452ed5eccffd6737e072359a5a633acd5eb", size = 160084, upload-time = "2024-09-25T22:39:41.026Z" }, - { url = "https://files.pythonhosted.org/packages/dc/41/7f993f571958d9352d92a4136e8f191713372491c20096a65ac9ab64499b/ndindex-1.9.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e8c33c2feedefde0789505ffb4b1324c6cb1adf553923f6bff7084910d37740b", size = 150322, upload-time = "2024-09-25T22:39:42.659Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5e/6a685909a5a77279a155a307ed13da76d95ad764b131c252cf1df9f2c56d/ndindex-1.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd82f7b46f0df51631273f72e1c5c8a03c30ce0e0c6da6f8b0ce70235cda31bb", size = 147011, upload-time = "2024-09-25T22:39:44.034Z" }, - { url = "https://files.pythonhosted.org/packages/22/ba/e90af369b1ce098f26885a4f25308599692df9764ebbf3601b2362b68617/ndindex-1.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9dff41fcb353fdb7589f6c7c69fd34748254cddd9c35824d3c81447de8906f5d", size = 146853, upload-time = "2024-09-25T22:39:45.131Z" }, - { url = "https://files.pythonhosted.org/packages/a8/41/4ee2e5878f1aa057409c553cb7128b92374d38787084f85e4e3cfb0e2b85/ndindex-1.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cabded9f47e988b9564df7f37662a53dae5ac8e3419e784c3db07dc230d0480", size = 163130, upload-time = "2024-09-25T22:39:46.505Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a0/b300377cb18f9599e4759710e1569a3f873d9dea7e6c9c84c9702d0ea351/ndindex-1.9.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04ce2e8712a4908641a1e23bba692fc88ba147e5926b6346dd526605de7a7980", size = 159786, upload-time = "2024-09-25T22:39:47.497Z" }, - { url = "https://files.pythonhosted.org/packages/30/81/5631aca8b0a4b99805313f3f162d50ea73601af6c209a4ff298bcaf16e3c/ndindex-1.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7ca14a442375f911dd930b7a246b24d6dfc64543ca202d20d65e5b1b96e9dbbf", size = 150190, upload-time = "2024-09-25T22:39:48.95Z" }, +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/92/4b9d2f4e0f3eabcfc7b02b48261f6e5ad36a3e2c1bbdcc4e3b7b6c768fa6/ndindex-1.10.1.tar.gz", hash = "sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11", size = 271395, upload-time = "2025-11-19T20:40:08.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/71/aff23bd84111d038efdcdaea4d218b463a0b2129ff49f30613cbc6f535ff/ndindex-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f", size = 172022, upload-time = "2025-11-19T20:38:12.429Z" }, + { url = "https://files.pythonhosted.org/packages/99/a6/adcc17b685b24362983b00f965ee5c8607f74e7c68049a20facbd7ceb0b6/ndindex-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b", size = 171057, upload-time = "2025-11-19T20:38:13.846Z" }, + { url = "https://files.pythonhosted.org/packages/ee/28/b0b1bde7818d2ccd5c288802c1f24b69705e03f3975bc948c005eccab25a/ndindex-1.10.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9", size = 498925, upload-time = "2025-11-19T20:38:17.214Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/55c3800048ef5310de542f188e1aad00e0b1d37713230c0eae980e88c895/ndindex-1.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb", size = 495662, upload-time = "2025-11-19T20:38:20.026Z" }, + { url = "https://files.pythonhosted.org/packages/48/a4/0103c3ee3778d7079c3ff7dd879c79362afe3a7e9d3b8dcdaa25b49ca413/ndindex-1.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06", size = 1471263, upload-time = "2025-11-19T20:38:21.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/5a/eaa38b18757c3d8e7b2438faa5001a02f193b51a68a5558d6066f3c407e6/ndindex-1.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777", size = 1522878, upload-time = "2025-11-19T20:38:23.064Z" }, + { url = "https://files.pythonhosted.org/packages/a3/93/a40920c849fa128c9439bc3eb0add814696216dde235497eaa415f14d5e7/ndindex-1.10.1-cp310-cp310-win32.whl", hash = "sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22", size = 149268, upload-time = "2025-11-19T20:38:25.12Z" }, + { url = "https://files.pythonhosted.org/packages/85/d9/baf1655d0b2d36eb46134fddf7dd0ef0093203c9c91d17f8ce01b9060366/ndindex-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7", size = 157151, upload-time = "2025-11-19T20:38:27.229Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d9/c94ab6151c9fdd199c2b560f23e3759a9fb86a7a1275855e0b97291bf05a/ndindex-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac", size = 172128, upload-time = "2025-11-19T20:38:28.977Z" }, + { url = "https://files.pythonhosted.org/packages/3a/34/880c4073750766e44492d51280d025f28e36475394ca3d741b0a4adad4b0/ndindex-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb", size = 171423, upload-time = "2025-11-19T20:38:30.357Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1e/0342da55dabe4075efc2b2ab91a6a22ed3047c5bd511ef771a7a3f822c90/ndindex-1.10.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c", size = 519590, upload-time = "2025-11-19T20:38:32.464Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cb/7a02b6f29b15a16cd0002f4591d14493eff8e9236f7ca4c02ee4d4bcefbd/ndindex-1.10.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9", size = 516676, upload-time = "2025-11-19T20:38:34.276Z" }, + { url = "https://files.pythonhosted.org/packages/67/d5/38da808f968a54b0fead2d7e15ca011d3df93c96a07f4914e8ef3974506e/ndindex-1.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a", size = 1491141, upload-time = "2025-11-19T20:38:35.785Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/8c66ef982a01ae4cbdabba679a2bc711f262cedf23bfb9682293146f8a98/ndindex-1.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c", size = 1543876, upload-time = "2025-11-19T20:38:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/7c7e3a3c6e81b4284fd0d53cbaec51d9e5b90df26dd78e9bde06cb307217/ndindex-1.10.1-cp311-cp311-win32.whl", hash = "sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa", size = 149149, upload-time = "2025-11-19T20:38:38.911Z" }, + { url = "https://files.pythonhosted.org/packages/3b/38/99e1fb0effdef74b883be615ea0053ebcea28a53fd8b896263f4e99b0113/ndindex-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81", size = 157246, upload-time = "2025-11-19T20:38:40.197Z" }, + { url = "https://files.pythonhosted.org/packages/65/90/774ddd08b2a1b41faa56da111f0fbfeb4f17ee537214c938ef41d61af949/ndindex-1.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e", size = 177348, upload-time = "2025-11-19T20:38:41.768Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ee/a423e857f5b45da3adc8ddbcfbfd4a0e9a047edce3915d3e3d6e189b6bd9/ndindex-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d", size = 176561, upload-time = "2025-11-19T20:38:43.06Z" }, + { url = "https://files.pythonhosted.org/packages/1f/40/139b6b050ba2b2a0bb40e0381a352b1eb6551302dcb8f86fb4c97dd34e92/ndindex-1.10.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78", size = 542901, upload-time = "2025-11-19T20:38:44.43Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/defd665dbbeb2fffa077491365ed160acaec49274ce8d4b979f55db71f18/ndindex-1.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959", size = 546875, upload-time = "2025-11-19T20:38:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/59/43/6d54d48e8eaee25cdab70d3e4c4f579ddb0255e4f1660040d5ad55e029c6/ndindex-1.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb", size = 1510036, upload-time = "2025-11-19T20:38:47.444Z" }, + { url = "https://files.pythonhosted.org/packages/09/61/e28ba3b98eacd18193176526526b34d7d70d2a6f9fd2b4d8309ab5692678/ndindex-1.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557", size = 1571849, upload-time = "2025-11-19T20:38:48.951Z" }, + { url = "https://files.pythonhosted.org/packages/8f/63/83fff78a3712cb9f478dd84a19ec389acf6f8c7b01dc347a65ae74e6123d/ndindex-1.10.1-cp312-cp312-win32.whl", hash = "sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67", size = 149792, upload-time = "2025-11-19T20:38:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/52/fd/a5e3c8c043d0dddea6cd4567bfaea568f022ac197301882b3d85d9c1e9b3/ndindex-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c", size = 158164, upload-time = "2025-11-19T20:38:52.242Z" }, ] [[package]] @@ -1568,83 +1260,38 @@ wheels = [ [[package]] name = "numexpr" -version = "2.10.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/67/c7415cf04ebe418193cfd6595ae03e3a64d76dac7b9c010098b39cc7992e/numexpr-2.10.2.tar.gz", hash = "sha256:b0aff6b48ebc99d2f54f27b5f73a58cb92fde650aeff1b397c71c8788b4fff1a", size = 106787, upload-time = "2024-11-23T13:34:23.127Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/dc/bd84219318826d138b7e729ac3ffce3c706ab9d810ce74326a55c7252dd1/numexpr-2.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b0e82d2109c1d9e63fcd5ea177d80a11b881157ab61178ddbdebd4c561ea46", size = 145011, upload-time = "2024-11-23T13:33:24.846Z" }, - { url = "https://files.pythonhosted.org/packages/31/6a/b1f08141283327478a57490c0ab3f26a634d4741ff33b9e22f760a7cedb0/numexpr-2.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc2b8035a0c2cdc352e58c3875cb668836018065cbf5752cb531015d9a568d8", size = 134777, upload-time = "2024-11-23T13:33:26.693Z" }, - { url = "https://files.pythonhosted.org/packages/7c/d6/6641864b0446ce472330de7644c78f90bd7e55d902046b44161f92721279/numexpr-2.10.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0db5ff5183935d1612653559c319922143e8fa3019007696571b13135f216458", size = 408893, upload-time = "2024-11-23T13:33:28.44Z" }, - { url = "https://files.pythonhosted.org/packages/25/ab/cb5809cb1f66431632d63dc028c58cb91492725c74dddc4b97ba62e88a92/numexpr-2.10.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f59655458056fdb3a621b1bb8e071581ccf7e823916c7568bb7c9a3e393025", size = 397305, upload-time = "2024-11-23T13:33:30.181Z" }, - { url = "https://files.pythonhosted.org/packages/9c/a0/29bcb31a9debb743e3dc46bacd55f4f6ee6a77d95eda5c8dca19a29c0627/numexpr-2.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce8cccf944339051e44a49a124a06287fe3066d0acbff33d1aa5aee10a96abb7", size = 1378789, upload-time = "2024-11-23T13:33:32.263Z" }, - { url = "https://files.pythonhosted.org/packages/cc/72/415262a7bdda706c41bf8254311a5ca13d3b8532341ab478be4583d7061a/numexpr-2.10.2-cp310-cp310-win32.whl", hash = "sha256:ba85371c9a8d03e115f4dfb6d25dfbce05387002b9bc85016af939a1da9624f0", size = 151935, upload-time = "2024-11-23T13:33:33.653Z" }, - { url = "https://files.pythonhosted.org/packages/71/fa/0124f0c2a502a0bac4553c8a171c551f154cf80a83a15e40d30c43e48a7e/numexpr-2.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:deb64235af9eeba59fcefa67e82fa80cfc0662e1b0aa373b7118a28da124d51d", size = 144961, upload-time = "2024-11-23T13:33:34.883Z" }, - { url = "https://files.pythonhosted.org/packages/de/b7/f25d6166f92ef23737c1c90416144492a664f0a56510d90f7c6577c2cd14/numexpr-2.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b360eb8d392483410fe6a3d5a7144afa298c9a0aa3e9fe193e89590b47dd477", size = 145055, upload-time = "2024-11-23T13:33:36.154Z" }, - { url = "https://files.pythonhosted.org/packages/66/64/428361ea6415826332f38ef2dd5c3abf4e7e601f033bfc9be68b680cb765/numexpr-2.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9a42f5c24880350d88933c4efee91b857c378aaea7e8b86221fff569069841e", size = 134743, upload-time = "2024-11-23T13:33:37.273Z" }, - { url = "https://files.pythonhosted.org/packages/3f/fb/639ec91d2ea7b4a5d66e26e8ef8e06b020c8e9b9ebaf3bab7b0a9bee472e/numexpr-2.10.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83fcb11988b57cc25b028a36d285287d706d1f536ebf2662ea30bd990e0de8b9", size = 410397, upload-time = "2024-11-23T13:33:38.474Z" }, - { url = "https://files.pythonhosted.org/packages/89/5a/0f5c5b8a3a6d34eeecb30d0e2f722d50b9b38c0e175937e7c6268ffab997/numexpr-2.10.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4213a92efa9770bc28e3792134e27c7e5c7e97068bdfb8ba395baebbd12f991b", size = 398902, upload-time = "2024-11-23T13:33:39.802Z" }, - { url = "https://files.pythonhosted.org/packages/a2/d5/ec734e735eba5a753efed5be3707ee7447ebd371772f8081b65a4153fb97/numexpr-2.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebdbef5763ca057eea0c2b5698e4439d084a0505d9d6e94f4804f26e8890c45e", size = 1380354, upload-time = "2024-11-23T13:33:41.68Z" }, - { url = "https://files.pythonhosted.org/packages/30/51/406e572531d817480bd612ee08239a36ee82865fea02fce569f15631f4ee/numexpr-2.10.2-cp311-cp311-win32.whl", hash = "sha256:3bf01ec502d89944e49e9c1b5cc7c7085be8ca2eb9dd46a0eafd218afbdbd5f5", size = 151938, upload-time = "2024-11-23T13:33:43.998Z" }, - { url = "https://files.pythonhosted.org/packages/04/32/5882ed1dbd96234f327a73316a481add151ff827cfaf2ea24fb4d5ad04db/numexpr-2.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e2d0ae24b0728e4bc3f1d3f33310340d67321d36d6043f7ce26897f4f1042db0", size = 144961, upload-time = "2024-11-23T13:33:45.329Z" }, - { url = "https://files.pythonhosted.org/packages/41/6a/06a225ac970c5921f41bc069a30438ff64fd79ef5e828f5ec2d4f6658307/numexpr-2.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0495f8111c3633e265248709b8b3b521bbfa646ba384909edd10e2b9a588a83a", size = 145100, upload-time = "2024-11-23T13:33:12.013Z" }, - { url = "https://files.pythonhosted.org/packages/bb/c5/9ecfa0da1d93d57e3f447d10da8cf6d695c93131cec085625e5092b37631/numexpr-2.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2aa05ac71bee3b1253e73173c4d7fa96a09a18970c0226f1c2c07a71ffe988dc", size = 134839, upload-time = "2024-11-23T13:33:13.608Z" }, - { url = "https://files.pythonhosted.org/packages/f5/30/f1a48c485183da517bd28e0df6fee337d12bbb0cd2d6bf13f8f5695afd37/numexpr-2.10.2-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3a23c3002ab330056fbdd2785871937a6f2f2fa85d06c8d0ff74ea8418119d1", size = 408149, upload-time = "2024-11-23T13:33:15.549Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f2/009d9dd8cd22f253fd6ead4165f81fafbe22489c1cfea612e18aa3dcb0fa/numexpr-2.10.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a018a7d81326f4c73d8b5aee61794d7d8514512f43957c0db61eb2a8a86848c7", size = 396740, upload-time = "2024-11-23T13:33:17.396Z" }, - { url = "https://files.pythonhosted.org/packages/47/90/e3f12670b3cca9bed85096671265e0f65cde6cf4646baadd4ee9c33944a8/numexpr-2.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:037859b17a0abe2b489d4c2cfdadd2bf458ec80dd83f338ea5544c7987e06b85", size = 1377883, upload-time = "2024-11-23T13:33:20.385Z" }, - { url = "https://files.pythonhosted.org/packages/06/1d/068c09a3c013c1178495f73a21ebd6ee25b9f0fc4202cea38b7a826c43a2/numexpr-2.10.2-cp39-cp39-win32.whl", hash = "sha256:eb278ccda6f893a312aa0452701bb17d098b7b14eb7c9381517d509cce0a39a3", size = 151878, upload-time = "2024-11-23T13:33:21.67Z" }, - { url = "https://files.pythonhosted.org/packages/70/81/affb9ff26e8accb210fe5585b095bd6872f5614d18b76cd53888e955ed9a/numexpr-2.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:734b64c6d6a597601ce9d0ef7b666e678ec015b446f1d1412c23903c021436c3", size = 144960, upload-time = "2024-11-23T13:33:23.617Z" }, -] - -[[package]] -name = "numpy" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, - { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, - { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, - { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, - { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, - { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, - { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, - { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, - { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942, upload-time = "2024-08-26T20:14:40.108Z" }, - { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512, upload-time = "2024-08-26T20:15:00.985Z" }, - { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976, upload-time = "2024-08-26T20:15:10.876Z" }, - { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494, upload-time = "2024-08-26T20:15:22.055Z" }, - { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596, upload-time = "2024-08-26T20:15:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099, upload-time = "2024-08-26T20:16:11.048Z" }, - { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823, upload-time = "2024-08-26T20:16:40.171Z" }, - { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424, upload-time = "2024-08-26T20:17:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809, upload-time = "2024-08-26T20:17:13.553Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314, upload-time = "2024-08-26T20:17:36.72Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288, upload-time = "2024-08-26T20:18:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793, upload-time = "2024-08-26T20:18:19.125Z" }, - { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885, upload-time = "2024-08-26T20:18:47.237Z" }, - { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784, upload-time = "2024-08-26T20:19:11.19Z" }, +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/2f/fdba158c9dbe5caca9c3eca3eaffffb251f2fb8674bf8e2d0aed5f38d319/numexpr-2.14.1.tar.gz", hash = "sha256:4be00b1086c7b7a5c32e31558122b7b80243fe098579b170967da83f3152b48b", size = 119400, upload-time = "2025-10-13T16:17:27.351Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/91/ccd504cbe5b88d06987c77f42ba37a13ef05065fdab4afe6dcfeb2961faf/numexpr-2.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0fab3fd06a04f6b86102552b26aa5d85e20ac7d8296c15764c726eeabae6cc8", size = 163200, upload-time = "2025-10-13T16:16:25.47Z" }, + { url = "https://files.pythonhosted.org/packages/f3/89/6b07977baf2af75fb6692f9e7a1fb612a15f600fc921f3f565366de01f4a/numexpr-2.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:64ae5dfd62d74a3ef82fe0b37f80527247f3626171ad82025900f46ffca4b39a", size = 152085, upload-time = "2025-10-13T16:16:29.508Z" }, + { url = "https://files.pythonhosted.org/packages/28/c2/c5775541256c4bf16b4d88fa1cffa74a0126703e513093c8774d911b0bb7/numexpr-2.14.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:955c92b064f9074d2970cf3138f5e3b965be673b82024962ed526f39bc25a920", size = 449435, upload-time = "2025-10-13T16:13:16.257Z" }, + { url = "https://files.pythonhosted.org/packages/34/d4/d1a410901c620f7a6a3c5c2b1fc9dab22170be05a89d2c02ae699e27bd3f/numexpr-2.14.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75440c54fc01e130396650fdf307aa9d41a67dc06ddbfb288971b591c13a395b", size = 440197, upload-time = "2025-10-13T16:14:44.109Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c8/fa85f0cc5c39db587ba4927b862a92477c017ee8476e415e8120a100457b/numexpr-2.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dde9fa47ed319e1e1728940a539df3cb78326b7754bc7c6ab3152afc91808f9b", size = 1414125, upload-time = "2025-10-13T16:13:19.882Z" }, + { url = "https://files.pythonhosted.org/packages/08/72/a58ddc05e0eabb3fa8d3fcd319f3d97870e6b41520832acfd04a6734c2c0/numexpr-2.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76db0bc6267e591ab9c4df405ffb533598e4c88239db7338d11ae9e4b368a85a", size = 1463041, upload-time = "2025-10-13T16:14:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c5/bdd1862302bb71a78dba941eaf7060e1274f1cf6af2d1b0f1880bfcb289b/numexpr-2.14.1-cp310-cp310-win32.whl", hash = "sha256:0d1dcbdc4d0374c0d523cee2f94f06b001623cbc1fd163612841017a3495427c", size = 166833, upload-time = "2025-10-13T16:17:03.543Z" }, + { url = "https://files.pythonhosted.org/packages/18/af/26773a246716922794388786529e5640676399efabb0ee217ce034df9d27/numexpr-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:823cd82c8e7937981339f634e7a9c6a92cb2d0b9d0a5cf627a5e394fffc05377", size = 160068, upload-time = "2025-10-13T16:17:05.191Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a3/67999bdd1ed1f938d38f3fedd4969632f2f197b090e50505f7cc1fa82510/numexpr-2.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d03fcb4644a12f70a14d74006f72662824da5b6128bf1bcd10cc3ed80e64c34", size = 163195, upload-time = "2025-10-13T16:16:31.212Z" }, + { url = "https://files.pythonhosted.org/packages/25/95/d64f680ea1fc56d165457287e0851d6708800f9fcea346fc1b9957942ee6/numexpr-2.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2773ee1133f77009a1fc2f34fe236f3d9823779f5f75450e183137d49f00499f", size = 152088, upload-time = "2025-10-13T16:16:33.186Z" }, + { url = "https://files.pythonhosted.org/packages/0e/7f/3bae417cb13ae08afd86d08bb0301c32440fe0cae4e6262b530e0819aeda/numexpr-2.14.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebe4980f9494b9f94d10d2e526edc29e72516698d3bf95670ba79415492212a4", size = 451126, upload-time = "2025-10-13T16:13:22.248Z" }, + { url = "https://files.pythonhosted.org/packages/4c/1a/edbe839109518364ac0bd9e918cf874c755bb2c128040e920f198c494263/numexpr-2.14.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a381e5e919a745c9503bcefffc1c7f98c972c04ec58fc8e999ed1a929e01ba6", size = 442012, upload-time = "2025-10-13T16:14:51.416Z" }, + { url = "https://files.pythonhosted.org/packages/66/b1/be4ce99bff769a5003baddac103f34681997b31d4640d5a75c0e8ed59c78/numexpr-2.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d08856cfc1b440eb1caaa60515235369654321995dd68eb9377577392020f6cb", size = 1415975, upload-time = "2025-10-13T16:13:26.088Z" }, + { url = "https://files.pythonhosted.org/packages/e7/33/b33b8fdc032a05d9ebb44a51bfcd4b92c178a2572cd3e6c1b03d8a4b45b2/numexpr-2.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03130afa04edf83a7b590d207444f05a00363c9b9ea5d81c0f53b1ea13fad55a", size = 1464683, upload-time = "2025-10-13T16:14:58.87Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b2/ddcf0ac6cf0a1d605e5aecd4281507fd79a9628a67896795ab2e975de5df/numexpr-2.14.1-cp311-cp311-win32.whl", hash = "sha256:db78fa0c9fcbaded3ae7453faf060bd7a18b0dc10299d7fcd02d9362be1213ed", size = 166838, upload-time = "2025-10-13T16:17:06.765Z" }, + { url = "https://files.pythonhosted.org/packages/64/72/4ca9bd97b2eb6dce9f5e70a3b6acec1a93e1fb9b079cb4cba2cdfbbf295d/numexpr-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:e9b2f957798c67a2428be96b04bce85439bed05efe78eb78e4c2ca43737578e7", size = 160069, upload-time = "2025-10-13T16:17:08.752Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/c473fc04a371f5e2f8c5749e04505c13e7a8ede27c09e9f099b2ad6f43d6/numexpr-2.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ebae0ab18c799b0e6b8c5a8d11e1fa3848eb4011271d99848b297468a39430", size = 162790, upload-time = "2025-10-13T16:16:34.903Z" }, + { url = "https://files.pythonhosted.org/packages/45/93/b6760dd1904c2a498e5f43d1bb436f59383c3ddea3815f1461dfaa259373/numexpr-2.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47041f2f7b9e69498fb311af672ba914a60e6e6d804011caacb17d66f639e659", size = 152196, upload-time = "2025-10-13T16:16:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/72/94/cc921e35593b820521e464cbbeaf8212bbdb07f16dc79fe283168df38195/numexpr-2.14.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d686dfb2c1382d9e6e0ee0b7647f943c1886dba3adbf606c625479f35f1956c1", size = 452468, upload-time = "2025-10-13T16:13:29.531Z" }, + { url = "https://files.pythonhosted.org/packages/d9/43/560e9ba23c02c904b5934496486d061bcb14cd3ebba2e3cf0e2dccb6c22b/numexpr-2.14.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee6d4fbbbc368e6cdd0772734d6249128d957b3b8ad47a100789009f4de7083", size = 443631, upload-time = "2025-10-13T16:15:02.473Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6c/78f83b6219f61c2c22d71ab6e6c2d4e5d7381334c6c29b77204e59edb039/numexpr-2.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3a2839efa25f3c8d4133252ea7342d8f81226c7c4dda81f97a57e090b9d87a48", size = 1417670, upload-time = "2025-10-13T16:13:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bb/1ccc9dcaf46281568ce769888bf16294c40e98a5158e4b16c241de31d0d3/numexpr-2.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9f9137f1351b310436662b5dc6f4082a245efa8950c3b0d9008028df92fefb9b", size = 1466212, upload-time = "2025-10-13T16:15:12.828Z" }, + { url = "https://files.pythonhosted.org/packages/31/9f/203d82b9e39dadd91d64bca55b3c8ca432e981b822468dcef41a4418626b/numexpr-2.14.1-cp312-cp312-win32.whl", hash = "sha256:36f8d5c1bd1355df93b43d766790f9046cccfc1e32b7c6163f75bcde682cda07", size = 166996, upload-time = "2025-10-13T16:17:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/ffe750b5452eb66de788c34e7d21ec6d886abb4d7c43ad1dc88ceb3d998f/numexpr-2.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:fdd886f4b7dbaf167633ee396478f0d0aa58ea2f9e7ccc3c6431019623e8d68f", size = 160187, upload-time = "2025-10-13T16:17:11.974Z" }, ] [[package]] @@ -1652,14 +1299,8 @@ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ @@ -1683,12 +1324,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, ] +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, +] + [[package]] name = "openpyxl" version = "3.1.5" @@ -1703,138 +1395,159 @@ wheels = [ [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.3" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/70/c853aec59839bceed032d52010ff5f1b8d87dc3114b762e4ba2727661a3b/pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5", size = 12580827, upload-time = "2024-09-20T13:08:42.347Z" }, - { url = "https://files.pythonhosted.org/packages/99/f2/c4527768739ffa4469b2b4fff05aa3768a478aed89a2f271a79a40eee984/pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348", size = 11303897, upload-time = "2024-09-20T13:08:45.807Z" }, - { url = "https://files.pythonhosted.org/packages/ed/12/86c1747ea27989d7a4064f806ce2bae2c6d575b950be087837bdfcabacc9/pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed", size = 66480908, upload-time = "2024-09-20T18:37:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/44/50/7db2cd5e6373ae796f0ddad3675268c8d59fb6076e66f0c339d61cea886b/pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57", size = 13064210, upload-time = "2024-09-20T13:08:48.325Z" }, - { url = "https://files.pythonhosted.org/packages/61/61/a89015a6d5536cb0d6c3ba02cebed51a95538cf83472975275e28ebf7d0c/pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42", size = 16754292, upload-time = "2024-09-20T19:01:54.443Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0d/4cc7b69ce37fac07645a94e1d4b0880b15999494372c1523508511b09e40/pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f", size = 14416379, upload-time = "2024-09-20T13:08:50.882Z" }, - { url = "https://files.pythonhosted.org/packages/31/9e/6ebb433de864a6cd45716af52a4d7a8c3c9aaf3a98368e61db9e69e69a9c/pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645", size = 11598471, upload-time = "2024-09-20T13:08:53.332Z" }, - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, - { url = "https://files.pythonhosted.org/packages/ca/8c/8848a4c9b8fdf5a534fe2077af948bf53cd713d77ffbcd7bd15710348fd7/pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39", size = 12595535, upload-time = "2024-09-20T13:09:51.339Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b9/5cead4f63b6d31bdefeb21a679bc5a7f4aaf262ca7e07e2bc1c341b68470/pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30", size = 11319822, upload-time = "2024-09-20T13:09:54.31Z" }, - { url = "https://files.pythonhosted.org/packages/31/af/89e35619fb573366fa68dc26dad6ad2c08c17b8004aad6d98f1a31ce4bb3/pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c", size = 15625439, upload-time = "2024-09-20T19:02:23.689Z" }, - { url = "https://files.pythonhosted.org/packages/3d/dd/bed19c2974296661493d7acc4407b1d2db4e2a482197df100f8f965b6225/pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c", size = 13068928, upload-time = "2024-09-20T13:09:56.746Z" }, - { url = "https://files.pythonhosted.org/packages/31/a3/18508e10a31ea108d746c848b5a05c0711e0278fa0d6f1c52a8ec52b80a5/pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea", size = 16783266, upload-time = "2024-09-20T19:02:26.247Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a5/3429bd13d82bebc78f4d78c3945efedef63a7cd0c15c17b2eeb838d1121f/pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761", size = 14450871, upload-time = "2024-09-20T13:09:59.779Z" }, - { url = "https://files.pythonhosted.org/packages/2f/49/5c30646e96c684570925b772eac4eb0a8cb0ca590fa978f56c5d3ae73ea1/pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e", size = 11618011, upload-time = "2024-09-20T13:10:02.351Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" } }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/07/c7087e003ceee9b9a82539b40414ec557aa795b584a1a346e89180853d79/pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea", size = 10323380, upload-time = "2026-02-17T22:18:16.133Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/90683c7122febeefe84a56f2cde86a9f05f68d53885cebcc473298dfc33e/pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796", size = 9923455, upload-time = "2026-02-17T22:18:19.13Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f1/ed17d927f9950643bc7631aa4c99ff0cc83a37864470bc419345b656a41f/pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389", size = 10753464, upload-time = "2026-02-17T22:18:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7c/870c7e7daec2a6c7ff2ac9e33b23317230d4e4e954b35112759ea4a924a7/pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7", size = 11255234, upload-time = "2026-02-17T22:18:24.175Z" }, + { url = "https://files.pythonhosted.org/packages/5c/39/3653fe59af68606282b989c23d1a543ceba6e8099cbcc5f1d506a7bae2aa/pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf", size = 11767299, upload-time = "2026-02-17T22:18:26.824Z" }, + { url = "https://files.pythonhosted.org/packages/9b/31/1daf3c0c94a849c7a8dab8a69697b36d313b229918002ba3e409265c7888/pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447", size = 12333292, upload-time = "2026-02-17T22:18:28.996Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/af63f83cd6ca603a00fe8530c10a60f0879265b8be00b5930e8e78c5b30b/pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79", size = 9892176, upload-time = "2026-02-17T22:18:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/79/ab/9c776b14ac4b7b4140788eca18468ea39894bc7340a408f1d1e379856a6b/pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1", size = 9151328, upload-time = "2026-02-17T22:18:35.721Z" }, + { url = "https://files.pythonhosted.org/packages/37/51/b467209c08dae2c624873d7491ea47d2b47336e5403309d433ea79c38571/pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d", size = 10344357, upload-time = "2026-02-17T22:18:38.262Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f1/e2567ffc8951ab371db2e40b2fe068e36b81d8cf3260f06ae508700e5504/pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955", size = 9884543, upload-time = "2026-02-17T22:18:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b", size = 10396030, upload-time = "2026-02-17T22:18:43.822Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4", size = 10876435, upload-time = "2026-02-17T22:18:45.954Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a6/2a75320849dd154a793f69c951db759aedb8d1dd3939eeacda9bdcfa1629/pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1", size = 11405133, upload-time = "2026-02-17T22:18:48.533Z" }, + { url = "https://files.pythonhosted.org/packages/58/53/1d68fafb2e02d7881df66aa53be4cd748d25cbe311f3b3c85c93ea5d30ca/pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821", size = 11932065, upload-time = "2026-02-17T22:18:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/75/08/67cc404b3a966b6df27b38370ddd96b3b023030b572283d035181854aac5/pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43", size = 9741627, upload-time = "2026-02-17T22:18:53.905Z" }, + { url = "https://files.pythonhosted.org/packages/86/4f/caf9952948fb00d23795f09b893d11f1cacb384e666854d87249530f7cbe/pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7", size = 9052483, upload-time = "2026-02-17T22:18:57.31Z" }, ] [[package]] name = "parso" -version = "0.8.4" +version = "0.8.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } +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/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, + { 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" }, ] [[package]] name = "phidget22" -version = "1.22.20250422" +version = "1.24.20260127" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/4b/4f86e6928ccd8e779da031c5dcc259ddb9e873c6810e006ae242f1b30002/phidget22-1.22.20250422.tar.gz", hash = "sha256:d330dbf3f9274f85521e8d6204046f32442747206b3cd92aed93eb8225bbf5cb", size = 50294, upload-time = "2025-04-22T21:53:44.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/25050232239d7ef72574f4e1577d3d4001d58c42d961ec5d506da465ba46/phidget22-1.24.20260127.tar.gz", hash = "sha256:34dea84daab41e370e9daac23193bcb5958a02a4c4f5727b7c4453792e9395fa", size = 53395, upload-time = "2026-01-27T19:09:52.215Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/6b/ae39a7f764f0259c55e9ef81714590fd5b9752a9f31cd18f6630f1c28d79/phidget22-1.22.20250422-py3-none-any.whl", hash = "sha256:a95ec9af51cfbaf969d9fbbfc2007c424bb52bff747e0cd3634bb16defe61409", size = 92589, upload-time = "2025-04-22T21:53:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/48/d4/fe6ea0ba9a6ef1da31b3d19fbd98cce1019209adcacf6e865fabc327e69f/phidget22-1.22.20250422-py3-none-macosx_10_11_universal2.whl", hash = "sha256:4fe258cd764374492ec909ead876553a79be16bf39a7a1b77e9f74e3a60cbe9b", size = 1250134, upload-time = "2025-04-22T21:53:31.252Z" }, - { url = "https://files.pythonhosted.org/packages/e0/56/3940ecb60e2c1abf8c14274cad9a6ff7e3d1da72b17e3579317f0e71ae10/phidget22-1.22.20250422-py3-none-macosx_10_11_x86_64.whl", hash = "sha256:f1576495cbf7613a7e028bbdbdb2948aea259befb31a28fcea2c0563cd320e0d", size = 685567, upload-time = "2025-04-22T21:53:32.623Z" }, - { url = "https://files.pythonhosted.org/packages/81/41/72d54d60b741beb857276e76dc009da6d2caaa52bacfee4cb7cceb0f4034/phidget22-1.22.20250422-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3804a1329da99895cf284f60340e3d74d33fae4afe88cb0b4ce95e88d5f3283b", size = 648757, upload-time = "2025-04-22T21:53:34.152Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e7/036f58f6a2a3062db6a2d90779375b6165edd87727d1103d48119635f9e1/phidget22-1.22.20250422-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:5771d71d6659b7cbb48a796b4a488b89f388d83cbcf9ab7f7269aa6b1dcfa637", size = 747216, upload-time = "2025-04-22T21:53:35.289Z" }, - { url = "https://files.pythonhosted.org/packages/0d/b4/a8f2ae373f2754e53a9c23259a3696205a81caf877fae4366c4d2e53925e/phidget22-1.22.20250422-py3-none-manylinux_2_28_armv7l.whl", hash = "sha256:75921934dcfc99f42427eda28e3e81401d59a05b00d167b496edb2e59cea03f2", size = 676301, upload-time = "2025-04-22T21:53:36.348Z" }, - { url = "https://files.pythonhosted.org/packages/bf/51/e9c1334917b117c33a13577c5f9881ca9b29b0622c33c75ccd9175fc7b08/phidget22-1.22.20250422-py3-none-manylinux_2_28_i686.whl", hash = "sha256:1470ce501e78d682e5dc11971b7c7c9b5d36d2265b065d0a632a2ff343aa61bc", size = 813557, upload-time = "2025-04-22T21:53:37.936Z" }, - { url = "https://files.pythonhosted.org/packages/af/fb/4ed8872e0035d671e565f42bcc3335cd8133834ed0bc0c5b8106205439ff/phidget22-1.22.20250422-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:e9dd19cc0c0add89f719de6f662edee74dad282fe8bce74ba8f057ae73938798", size = 770341, upload-time = "2025-04-22T21:53:39.523Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a2/94cb51782ddfa27e727dcee768c780a1980fc2ef924a08d722cab305bcdb/phidget22-1.22.20250422-py3-none-win32.whl", hash = "sha256:198d9077dd75d721ad036229d2f2d97acf84eafb9034676984229327ce8b0b68", size = 874385, upload-time = "2025-04-22T21:53:41.667Z" }, - { url = "https://files.pythonhosted.org/packages/f8/53/3bab570e10ad7ca02c7382f1417b9fdaaa1394321e65ce3f475e8095852c/phidget22-1.22.20250422-py3-none-win_amd64.whl", hash = "sha256:1bf8d36920f8e0bb4baa4948906f9f932523b58b2cfe088107a08cbb4d8a6f7d", size = 963999, upload-time = "2025-04-22T21:53:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/88/2b/cbfccb1c45443c9754aad6fbdf154f088907391e8d1b3d653da9cb388a4c/phidget22-1.24.20260127-py3-none-any.whl", hash = "sha256:aac36d85ba3d32b5805f6b3e32cb39cb38395c34c8f44c61d403c3f0ba56a543", size = 96608, upload-time = "2026-01-27T19:09:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/49/1f/a471e63269755a36da04e28ce7e3db9f3cb720b996179e823fcf20a0d9d4/phidget22-1.24.20260127-py3-none-macosx_10_11_universal2.whl", hash = "sha256:7e7e351bf95cee9f42e7c51472f006a0c37d41b13968ef18807dc4348f379845", size = 1284603, upload-time = "2026-01-27T19:09:36.809Z" }, + { url = "https://files.pythonhosted.org/packages/62/10/433f9596c2576a4d539e79d1be33454cf201aeeac228fbe780edf73babd5/phidget22-1.24.20260127-py3-none-macosx_10_11_x86_64.whl", hash = "sha256:d22c3a9805f7ad351185757d196cf3eeefc9f5ec6e86d33ffc926fc61a5ce721", size = 705637, upload-time = "2026-01-27T19:09:38.457Z" }, + { url = "https://files.pythonhosted.org/packages/87/62/4cbf6ae977bf486acbeca6f44ca4cf7228c29545413ceb4a60a0c301b55b/phidget22-1.24.20260127-py3-none-macosx_11_0_arm64.whl", hash = "sha256:46997a743e65318767291bc9e447a0092c63a11fb3612255e4dee703ebe3fec6", size = 665107, upload-time = "2026-01-27T19:09:40.293Z" }, + { url = "https://files.pythonhosted.org/packages/1f/18/2ffcda7a0a3b24f859d822eb2d2e7011ad70fa40df7c67aa16f700b7f3d9/phidget22-1.24.20260127-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9d1dbfdc7c5e0a6949979d7dcee282aa36f81c2a8cb863579fb1052beaf823a6", size = 770703, upload-time = "2026-01-27T19:09:41.941Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ff/6ffef76e27a8532a8f9193d1327a334f974c7b56648eb814985532603b49/phidget22-1.24.20260127-py3-none-manylinux_2_28_armv7l.whl", hash = "sha256:ec55397973b9ae45c377c04b2b25f79925f0ead2fecc38afcdcefe1de282c7a4", size = 699736, upload-time = "2026-01-27T19:09:43.53Z" }, + { url = "https://files.pythonhosted.org/packages/9c/16/afbc2a19f9b947026b6f7ce39004b5d3aadc07a6411e58fc695f064639a8/phidget22-1.24.20260127-py3-none-manylinux_2_28_i686.whl", hash = "sha256:576d2df880c9325ba52e63ca49d4b1996a89863c183deb09d429cfe9c46bf2a1", size = 836338, upload-time = "2026-01-27T19:09:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0c/1f28c25d37e4706a3f8ce05134113df1ace5cc524e3fd02f8ee3b232b19c/phidget22-1.24.20260127-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:df6b5ec48c492bf3b180e5a685c6af4d17ea34811f020cee85a16b021fd03842", size = 791446, upload-time = "2026-01-27T19:09:46.85Z" }, + { url = "https://files.pythonhosted.org/packages/d5/65/9d1c8a56d70fd23971b9927cc9b2ac0a1f69486d4818504f98421b856a5b/phidget22-1.24.20260127-py3-none-win32.whl", hash = "sha256:77edbf70eea87a8864cfd74865780013da670d484021512cf061167f9e3be739", size = 903701, upload-time = "2026-01-27T19:09:48.46Z" }, + { url = "https://files.pythonhosted.org/packages/81/2e/e0e484f16464973bbc36c6f933cc15d2cfb257d427c632dd29b2b1fc7006/phidget22-1.24.20260127-py3-none-win_amd64.whl", hash = "sha256:5f57b05fa7dff3e1c6d491c9d5e3e9df28477424cf01ba86c73256c35c67b1d1", size = 996750, upload-time = "2026-01-27T19:09:49.774Z" }, + { url = "https://files.pythonhosted.org/packages/05/93/628315458c4b1bf4bc086467d3f9c82c58663ed46cbb6798ef238f7cf249/phidget22-1.24.20260127-py3-none-win_arm64.whl", hash = "sha256:fb0f22f46fd1ddb5fb5a0e2e3fb3122e708ed6e0b1a71eb088050613c76f1a8c", size = 1012125, upload-time = "2026-01-27T19:09:51.091Z" }, ] [[package]] name = "pillow" -version = "11.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442, upload-time = "2025-04-12T17:47:10.666Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553, upload-time = "2025-04-12T17:47:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503, upload-time = "2025-04-12T17:47:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648, upload-time = "2025-04-12T17:47:17.37Z" }, - { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937, upload-time = "2025-04-12T17:47:19.066Z" }, - { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802, upload-time = "2025-04-12T17:47:21.404Z" }, - { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717, upload-time = "2025-04-12T17:47:23.571Z" }, - { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874, upload-time = "2025-04-12T17:47:25.783Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717, upload-time = "2025-04-12T17:47:28.922Z" }, - { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204, upload-time = "2025-04-12T17:47:31.283Z" }, - { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767, upload-time = "2025-04-12T17:47:34.655Z" }, - { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450, upload-time = "2025-04-12T17:47:37.135Z" }, - { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550, upload-time = "2025-04-12T17:47:39.345Z" }, - { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018, upload-time = "2025-04-12T17:47:41.128Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006, upload-time = "2025-04-12T17:47:42.912Z" }, - { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773, upload-time = "2025-04-12T17:47:44.611Z" }, - { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069, upload-time = "2025-04-12T17:47:46.46Z" }, - { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460, upload-time = "2025-04-12T17:47:49.255Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304, upload-time = "2025-04-12T17:47:51.067Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809, upload-time = "2025-04-12T17:47:54.425Z" }, - { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338, upload-time = "2025-04-12T17:47:56.535Z" }, - { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918, upload-time = "2025-04-12T17:47:58.217Z" }, - { url = "https://files.pythonhosted.org/packages/21/3a/c1835d1c7cf83559e95b4f4ed07ab0bb7acc689712adfce406b3f456e9fd/pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8", size = 3198391, upload-time = "2025-04-12T17:49:10.122Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4d/dcb7a9af3fc1e8653267c38ed622605d9d1793349274b3ef7af06457e257/pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909", size = 3030573, upload-time = "2025-04-12T17:49:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/9d/29/530ca098c1a1eb31d4e163d317d0e24e6d2ead907991c69ca5b663de1bc5/pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928", size = 4398677, upload-time = "2025-04-12T17:49:13.861Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ee/0e5e51db34de1690264e5f30dcd25328c540aa11d50a3bc0b540e2a445b6/pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79", size = 4484986, upload-time = "2025-04-12T17:49:15.948Z" }, - { url = "https://files.pythonhosted.org/packages/93/7d/bc723b41ce3d2c28532c47678ec988974f731b5c6fadd5b3a4fba9015e4f/pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35", size = 4501897, upload-time = "2025-04-12T17:49:17.839Z" }, - { url = "https://files.pythonhosted.org/packages/be/0b/532e31abc7389617ddff12551af625a9b03cd61d2989fa595e43c470ec67/pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb", size = 4592618, upload-time = "2025-04-12T17:49:19.7Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f0/21ed6499a6216fef753e2e2254a19d08bff3747108ba042422383f3e9faa/pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a", size = 4570493, upload-time = "2025-04-12T17:49:21.703Z" }, - { url = "https://files.pythonhosted.org/packages/68/de/17004ddb8ab855573fe1127ab0168d11378cdfe4a7ee2a792a70ff2e9ba7/pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36", size = 4647748, upload-time = "2025-04-12T17:49:23.579Z" }, - { url = "https://files.pythonhosted.org/packages/c7/23/82ecb486384bb3578115c509d4a00bb52f463ee700a5ca1be53da3c88c19/pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67", size = 2331731, upload-time = "2025-04-12T17:49:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/58/bb/87efd58b3689537a623d44dbb2550ef0bb5ff6a62769707a0fe8b1a7bdeb/pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1", size = 2676346, upload-time = "2025-04-12T17:49:27.342Z" }, - { url = "https://files.pythonhosted.org/packages/80/08/dc268475b22887b816e5dcfae31bce897f524b4646bab130c2142c9b2400/pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e", size = 2414623, upload-time = "2025-04-12T17:49:29.139Z" }, - { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727, upload-time = "2025-04-12T17:49:31.898Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833, upload-time = "2025-04-12T17:49:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472, upload-time = "2025-04-12T17:49:36.294Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976, upload-time = "2025-04-12T17:49:38.988Z" }, - { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133, upload-time = "2025-04-12T17:49:40.985Z" }, - { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555, upload-time = "2025-04-12T17:49:42.964Z" }, - { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713, upload-time = "2025-04-12T17:49:44.944Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734, upload-time = "2025-04-12T17:49:46.789Z" }, - { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841, upload-time = "2025-04-12T17:49:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470, upload-time = "2025-04-12T17:49:50.831Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013, upload-time = "2025-04-12T17:49:53.278Z" }, - { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165, upload-time = "2025-04-12T17:49:55.164Z" }, - { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586, upload-time = "2025-04-12T17:49:57.171Z" }, - { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload-time = "2025-04-12T17:49:59.628Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.3.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, + { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, + { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, + { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] [[package]] @@ -1869,17 +1582,18 @@ wheels = [ [[package]] name = "psutil" -version = "7.0.0" +version = "7.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { 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]] @@ -1889,31 +1603,28 @@ dependencies = [ { name = "arabic-reshaper" }, { name = "astunparse" }, { name = "beautifulsoup4" }, - { name = "cryptography" }, { name = "distro", marker = "sys_platform == 'linux'" }, { name = "ffpyplayer" }, { name = "freetype-py" }, - { name = "future" }, { name = "gevent" }, + { name = "i18next" }, { name = "imageio" }, { name = "imageio-ffmpeg" }, { name = "jedi" }, - { name = "markdown-it-py" }, - { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "meshpy", version = "2022.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "meshpy", version = "2025.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib" }, + { name = "meshpy" }, { name = "moviepy" }, { name = "msgpack" }, { name = "msgpack-numpy" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "openpyxl" }, { name = "packaging" }, - { name = "pandas" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pillow" }, { name = "psutil" }, - { name = "psychtoolbox", marker = "platform_machine != 'arm64'" }, + { name = "psychtoolbox" }, { name = "pyarrow" }, { name = "pyglet", version = "1.4.11", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, { name = "pyglet", version = "1.5.27", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" }, @@ -1932,12 +1643,12 @@ dependencies = [ { name = "pyzmq" }, { name = "questplus" }, { name = "requests" }, - { name = "scipy" }, - { name = "setuptools" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sounddevice" }, { name = "soundfile" }, - { name = "tables", version = "3.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "tables", version = "3.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "tables", version = "3.10.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tables", version = "3.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "tables", version = "3.11.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "ujson" }, { name = "websockets" }, { name = "xmlschema" }, @@ -1955,14 +1666,14 @@ building = [ ] docs = [ { name = "jinja2" }, - { name = "myst-parser", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "psychopy-sphinx-theme" }, - { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-copybutton" }, - { name = "sphinx-design" }, + { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinxcontrib-svg2pdfconverter" }, ] legacy = [ @@ -1971,14 +1682,11 @@ legacy = [ { name = "pyo" }, ] suggested = [ - { name = "badapted" }, { name = "egi-pynetstation" }, { name = "h5py" }, { name = "phidget22" }, { name = "pylsl" }, { name = "pyxid2" }, - { name = "sounddevice" }, - { name = "tobii-research" }, { name = "xlwt" }, ] tests = [ @@ -1994,24 +1702,21 @@ tests = [ requires-dist = [ { name = "arabic-reshaper" }, { name = "astunparse" }, - { name = "badapted", marker = "extra == 'suggested'", specifier = ">=0.0.3" }, { name = "bdist-mpkg", marker = "sys_platform == 'darwin' and extra == 'building'", specifier = ">=0.5.0" }, { name = "beautifulsoup4" }, - { name = "cryptography" }, { name = "distro", marker = "sys_platform == 'linux'" }, { name = "dmgbuild", marker = "sys_platform == 'darwin' and extra == 'building'" }, { name = "egi-pynetstation", marker = "extra == 'suggested'", specifier = ">=1.0.0" }, { name = "ffpyplayer" }, { name = "flake8", marker = "extra == 'tests'" }, { name = "freetype-py" }, - { name = "future" }, { name = "gevent", specifier = "==25.5.1" }, { name = "h5py", marker = "extra == 'suggested'" }, + { name = "i18next" }, { name = "imageio" }, { name = "imageio-ffmpeg" }, { name = "jedi", specifier = ">=0.16" }, { name = "jinja2", marker = "extra == 'docs'" }, - { name = "markdown-it-py" }, { name = "matplotlib" }, { name = "meshpy" }, { name = "moviepy" }, @@ -2027,7 +1732,7 @@ requires-dist = [ { name = "polib", marker = "extra == 'building'" }, { name = "psutil" }, { name = "psychopy-sphinx-theme", marker = "extra == 'docs'" }, - { name = "psychtoolbox", marker = "platform_machine != 'arm64'", specifier = "<3.0.20" }, + { name = "psychtoolbox" }, { name = "py2app", marker = "sys_platform == 'darwin' and extra == 'building'" }, { name = "pyarrow" }, { name = "pygame", marker = "extra == 'legacy'" }, @@ -2056,16 +1761,14 @@ requires-dist = [ { name = "pyzmq", specifier = ">=22.2.1" }, { name = "questplus", specifier = ">=2023.1" }, { name = "requests" }, - { name = "scipy", specifier = "<1.15" }, - { name = "setuptools", specifier = ">=70.3.0" }, - { name = "sounddevice", marker = "extra == 'suggested'" }, + { name = "scipy" }, + { name = "sounddevice" }, { name = "soundfile" }, { name = "sphinx", marker = "extra == 'docs'" }, { name = "sphinx-copybutton", marker = "extra == 'docs'" }, { name = "sphinx-design", marker = "extra == 'docs'" }, { name = "sphinxcontrib-svg2pdfconverter", marker = "extra == 'docs'" }, - { name = "tables", specifier = "!=3.9.2" }, - { name = "tobii-research", marker = "extra == 'suggested'" }, + { name = "tables" }, { name = "ujson" }, { name = "websockets" }, { name = "xlwt", marker = "extra == 'suggested'" }, @@ -2079,11 +1782,11 @@ provides-extras = ["tests", "docs", "building", "suggested", "legacy"] [[package]] name = "psychopy-sphinx-theme" -version = "0.0.5" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/8d/e879c131e8102ef2a66ea10aa5366f3a47649081a4e1e435726f42f2e81c/psychopy_sphinx_theme-0.0.5.tar.gz", hash = "sha256:e728940ad010113fba089f37bb442f43da97a63c268891247dd1f0ee784e777b", size = 3728511, upload-time = "2025-04-29T09:40:17.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/fb/b80985f75f938e351c69c255664395839c655b346266affd35d8257a504e/psychopy_sphinx_theme-1.0.0.tar.gz", hash = "sha256:ad9a102401478ae12872da609c6be6291f4e526861ab9a49cb4e2e7c856a4062", size = 3918963, upload-time = "2026-02-20T18:55:01.452Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/01/2d61ea5a4573ef67540f55297165cb1d143e0adf57ef368c05fe23bd61a4/psychopy_sphinx_theme-0.0.5-py3-none-any.whl", hash = "sha256:368f9c0b74ceef01c0f402d508845102531410d225ae798dea9248d848dfc825", size = 3743330, upload-time = "2025-04-29T09:40:15.827Z" }, + { url = "https://files.pythonhosted.org/packages/fe/98/4a4a20c144b0a9aef10a9e1479c170580c475932973ee25600d59965cc55/psychopy_sphinx_theme-1.0.0-py3-none-any.whl", hash = "sha256:62bb4bbea2b498113f959253f2cf524ef545db1442fce0e9401c2c2fce4426c2", size = 3933035, upload-time = "2026-02-20T18:54:58.031Z" }, ] [[package]] @@ -2091,8 +1794,8 @@ name = "psychtoolbox" version = "3.0.19.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.10' and platform_machine != 'arm64') or (python_full_version < '3.10' and sys_platform != 'darwin')" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/58/326a9c4ac9c8af113085e6a60bc6b4e01ae82ce672f77b027a1c4533bd58/psychtoolbox-3.0.19.14.tar.gz", hash = "sha256:3847730840a3ddbb6ff57f0e3203360ada67cb74bf535d999a6e313dcbea58ad", size = 3107277, upload-time = "2024-09-06T20:42:46.657Z" } wheels = [ @@ -2112,79 +1815,73 @@ wheels = [ [[package]] name = "py2app" -version = "0.28.8" +version = "0.28.10" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "altgraph", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "macholib", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "modulegraph", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "packaging", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "altgraph" }, + { name = "macholib" }, + { name = "modulegraph" }, + { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/d8/a81d296560df958e496a03e4373615db5157dacb388945110404cbd0879b/py2app-0.28.8.tar.gz", hash = "sha256:cab7aec752a8b83e7c6cef7c15271dc720155275e44cbf610e3162e0807313ec", size = 1173004, upload-time = "2024-05-25T16:39:52.409Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/82/79a2aaaf86c44c6018edce1a028cf821acec4c3ca63e2b5781f16822c99f/py2app-0.28.10.tar.gz", hash = "sha256:fd38f4a0083d4d1e91ea336eaef678b99d9e1b95ac6302315cad22fa5e859cb1", size = 1143601, upload-time = "2026-02-13T20:50:02.289Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/12/a0932851fe222d9cf9193e192f01d7f62c89d9690b17d731ef5385df4360/py2app-0.28.8-py2.py3-none-any.whl", hash = "sha256:38b80f0c91f8d2dddb6396e6bbff8a84875f073c510f4f1a307e8ae44c7d73d8", size = 835661, upload-time = "2024-05-25T16:31:50.8Z" }, + { url = "https://files.pythonhosted.org/packages/be/d8/a04a88b182613370a262f674929f0e284ea04e1803f2d38fc5639fbec2d7/py2app-0.28.10-py3-none-any.whl", hash = "sha256:bdb0cd2cbfa5160b5b11b8d612f6eb92d484a0282801e85b159f1930cd834714", size = 837349, upload-time = "2026-02-13T20:49:59.98Z" }, ] [[package]] name = "pyarrow" -version = "20.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload-time = "2025-04-27T12:34:23.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/23/77094eb8ee0dbe88441689cb6afc40ac312a1e15d3a7acc0586999518222/pyarrow-20.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c7dd06fd7d7b410ca5dc839cc9d485d2bc4ae5240851bcd45d85105cc90a47d7", size = 30832591, upload-time = "2025-04-27T12:27:27.89Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d5/48cc573aff00d62913701d9fac478518f693b30c25f2c157550b0b2565cb/pyarrow-20.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d5382de8dc34c943249b01c19110783d0d64b207167c728461add1ecc2db88e4", size = 32273686, upload-time = "2025-04-27T12:27:36.816Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/4099b69a432b5cb412dd18adc2629975544d656df3d7fda6d73c5dba935d/pyarrow-20.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6415a0d0174487456ddc9beaead703d0ded5966129fa4fd3114d76b5d1c5ceae", size = 41337051, upload-time = "2025-04-27T12:27:44.4Z" }, - { url = "https://files.pythonhosted.org/packages/4c/27/99922a9ac1c9226f346e3a1e15e63dee6f623ed757ff2893f9d6994a69d3/pyarrow-20.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15aa1b3b2587e74328a730457068dc6c89e6dcbf438d4369f572af9d320a25ee", size = 42404659, upload-time = "2025-04-27T12:27:51.715Z" }, - { url = "https://files.pythonhosted.org/packages/21/d1/71d91b2791b829c9e98f1e0d85be66ed93aff399f80abb99678511847eaa/pyarrow-20.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5605919fbe67a7948c1f03b9f3727d82846c053cd2ce9303ace791855923fd20", size = 40695446, upload-time = "2025-04-27T12:27:59.643Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/ae10fba419a6e94329707487835ec721f5a95f3ac9168500bcf7aa3813c7/pyarrow-20.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a5704f29a74b81673d266e5ec1fe376f060627c2e42c5c7651288ed4b0db29e9", size = 42278528, upload-time = "2025-04-27T12:28:07.297Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a6/aba40a2bf01b5d00cf9cd16d427a5da1fad0fb69b514ce8c8292ab80e968/pyarrow-20.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:00138f79ee1b5aca81e2bdedb91e3739b987245e11fa3c826f9e57c5d102fb75", size = 42918162, upload-time = "2025-04-27T12:28:15.716Z" }, - { url = "https://files.pythonhosted.org/packages/93/6b/98b39650cd64f32bf2ec6d627a9bd24fcb3e4e6ea1873c5e1ea8a83b1a18/pyarrow-20.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f2d67ac28f57a362f1a2c1e6fa98bfe2f03230f7e15927aecd067433b1e70ce8", size = 44550319, upload-time = "2025-04-27T12:28:27.026Z" }, - { url = "https://files.pythonhosted.org/packages/ab/32/340238be1eb5037e7b5de7e640ee22334417239bc347eadefaf8c373936d/pyarrow-20.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4a8b029a07956b8d7bd742ffca25374dd3f634b35e46cc7a7c3fa4c75b297191", size = 25770759, upload-time = "2025-04-27T12:28:33.702Z" }, - { url = "https://files.pythonhosted.org/packages/47/a2/b7930824181ceadd0c63c1042d01fa4ef63eee233934826a7a2a9af6e463/pyarrow-20.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:24ca380585444cb2a31324c546a9a56abbe87e26069189e14bdba19c86c049f0", size = 30856035, upload-time = "2025-04-27T12:28:40.78Z" }, - { url = "https://files.pythonhosted.org/packages/9b/18/c765770227d7f5bdfa8a69f64b49194352325c66a5c3bb5e332dfd5867d9/pyarrow-20.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:95b330059ddfdc591a3225f2d272123be26c8fa76e8c9ee1a77aad507361cfdb", size = 32309552, upload-time = "2025-04-27T12:28:47.051Z" }, - { url = "https://files.pythonhosted.org/packages/44/fb/dfb2dfdd3e488bb14f822d7335653092dde150cffc2da97de6e7500681f9/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f0fb1041267e9968c6d0d2ce3ff92e3928b243e2b6d11eeb84d9ac547308232", size = 41334704, upload-time = "2025-04-27T12:28:55.064Z" }, - { url = "https://files.pythonhosted.org/packages/58/0d/08a95878d38808051a953e887332d4a76bc06c6ee04351918ee1155407eb/pyarrow-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ff87cc837601532cc8242d2f7e09b4e02404de1b797aee747dd4ba4bd6313f", size = 42399836, upload-time = "2025-04-27T12:29:02.13Z" }, - { url = "https://files.pythonhosted.org/packages/f3/cd/efa271234dfe38f0271561086eedcad7bc0f2ddd1efba423916ff0883684/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:7a3a5dcf54286e6141d5114522cf31dd67a9e7c9133d150799f30ee302a7a1ab", size = 40711789, upload-time = "2025-04-27T12:29:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/46/1f/7f02009bc7fc8955c391defee5348f510e589a020e4b40ca05edcb847854/pyarrow-20.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a6ad3e7758ecf559900261a4df985662df54fb7fdb55e8e3b3aa99b23d526b62", size = 42301124, upload-time = "2025-04-27T12:29:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/4f/92/692c562be4504c262089e86757a9048739fe1acb4024f92d39615e7bab3f/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6bb830757103a6cb300a04610e08d9636f0cd223d32f388418ea893a3e655f1c", size = 42916060, upload-time = "2025-04-27T12:29:24.253Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ec/9f5c7e7c828d8e0a3c7ef50ee62eca38a7de2fa6eb1b8fa43685c9414fef/pyarrow-20.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96e37f0766ecb4514a899d9a3554fadda770fb57ddf42b63d80f14bc20aa7db3", size = 44547640, upload-time = "2025-04-27T12:29:32.782Z" }, - { url = "https://files.pythonhosted.org/packages/54/96/46613131b4727f10fd2ffa6d0d6f02efcc09a0e7374eff3b5771548aa95b/pyarrow-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3346babb516f4b6fd790da99b98bed9708e3f02e734c84971faccb20736848dc", size = 25781491, upload-time = "2025-04-27T12:29:38.464Z" }, - { url = "https://files.pythonhosted.org/packages/10/53/421820fa125138c868729b930d4bc487af2c4b01b1c6104818aab7e98f13/pyarrow-20.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:1bcbe471ef3349be7714261dea28fe280db574f9d0f77eeccc195a2d161fd861", size = 30844702, upload-time = "2025-04-27T12:33:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/2e/70/fd75e03312b715e90d928fb91ed8d45c9b0520346e5231b1c69293afd4c7/pyarrow-20.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:a18a14baef7d7ae49247e75641fd8bcbb39f44ed49a9fc4ec2f65d5031aa3b96", size = 32287180, upload-time = "2025-04-27T12:33:20.597Z" }, - { url = "https://files.pythonhosted.org/packages/c4/e3/21e5758e46219fdedf5e6c800574dd9d17e962e80014cfe08d6d475be863/pyarrow-20.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb497649e505dc36542d0e68eca1a3c94ecbe9799cb67b578b55f2441a247fbc", size = 41351968, upload-time = "2025-04-27T12:33:28.215Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f5/ed6a4c4b11f9215092a35097a985485bb7d879cb79d93d203494e8604f4e/pyarrow-20.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11529a2283cb1f6271d7c23e4a8f9f8b7fd173f7360776b668e509d712a02eec", size = 42415208, upload-time = "2025-04-27T12:33:37.04Z" }, - { url = "https://files.pythonhosted.org/packages/44/e5/466a63668ba25788ee8d38d55f853a60469ae7ad1cda343db9f3f45e0b0a/pyarrow-20.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fc1499ed3b4b57ee4e090e1cea6eb3584793fe3d1b4297bbf53f09b434991a5", size = 40708556, upload-time = "2025-04-27T12:33:46.483Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d7/4c4d4e4cf6e53e16a519366dfe9223ee4a7a38e6e28c1c0d372b38ba3fe7/pyarrow-20.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:db53390eaf8a4dab4dbd6d93c85c5cf002db24902dbff0ca7d988beb5c9dd15b", size = 42291754, upload-time = "2025-04-27T12:33:55.4Z" }, - { url = "https://files.pythonhosted.org/packages/07/d5/79effb32585b7c18897d3047a2163034f3f9c944d12f7b2fd8df6a2edc70/pyarrow-20.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:851c6a8260ad387caf82d2bbf54759130534723e37083111d4ed481cb253cc0d", size = 42936483, upload-time = "2025-04-27T12:34:03.694Z" }, - { url = "https://files.pythonhosted.org/packages/09/5c/f707603552c058b2e9129732de99a67befb1f13f008cc58856304a62c38b/pyarrow-20.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e22f80b97a271f0a7d9cd07394a7d348f80d3ac63ed7cc38b6d1b696ab3b2619", size = 44558895, upload-time = "2025-04-27T12:34:13.26Z" }, - { url = "https://files.pythonhosted.org/packages/26/cc/1eb6a01c1bbc787f596c270c46bcd2273e35154a84afcb1d0cb4cc72457e/pyarrow-20.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:9965a050048ab02409fb7cbbefeedba04d3d67f2cc899eff505cc084345959ca", size = 25785667, upload-time = "2025-04-27T12:34:19.739Z" }, +version = "23.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/a8/24e5dc6855f50a62936ceb004e6e9645e4219a8065f304145d7fb8a79d5d/pyarrow-23.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3fab8f82571844eb3c460f90a75583801d14ca0cc32b1acc8c361650e006fd56", size = 34307390, upload-time = "2026-02-16T10:08:08.654Z" }, + { url = "https://files.pythonhosted.org/packages/bc/8e/4be5617b4aaae0287f621ad31c6036e5f63118cfca0dc57d42121ff49b51/pyarrow-23.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3f91c038b95f71ddfc865f11d5876c42f343b4495535bd262c7b321b0b94507c", size = 35853761, upload-time = "2026-02-16T10:08:17.811Z" }, + { url = "https://files.pythonhosted.org/packages/2e/08/3e56a18819462210432ae37d10f5c8eed3828be1d6c751b6e6a2e93c286a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d0744403adabef53c985a7f8a082b502a368510c40d184df349a0a8754533258", size = 44493116, upload-time = "2026-02-16T10:08:25.792Z" }, + { url = "https://files.pythonhosted.org/packages/f8/82/c40b68001dbec8a3faa4c08cd8c200798ac732d2854537c5449dc859f55a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c33b5bf406284fd0bba436ed6f6c3ebe8e311722b441d89397c54f871c6863a2", size = 47564532, upload-time = "2026-02-16T10:08:34.27Z" }, + { url = "https://files.pythonhosted.org/packages/20/bc/73f611989116b6f53347581b02177f9f620efdf3cd3f405d0e83cdf53a83/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ddf743e82f69dcd6dbbcb63628895d7161e04e56794ef80550ac6f3315eeb1d5", size = 48183685, upload-time = "2026-02-16T10:08:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/6c6b3ecdae2a8c3aced99956187e8302fc954cc2cca2a37cf2111dad16ce/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e052a211c5ac9848ae15d5ec875ed0943c0221e2fcfe69eee80b604b4e703222", size = 50605582, upload-time = "2026-02-16T10:08:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/8d/94/d359e708672878d7638a04a0448edf7c707f9e5606cee11e15aaa5c7535a/pyarrow-23.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:5abde149bb3ce524782d838eb67ac095cd3fd6090eba051130589793f1a7f76d", size = 27521148, upload-time = "2026-02-16T10:08:58.077Z" }, + { url = "https://files.pythonhosted.org/packages/b0/41/8e6b6ef7e225d4ceead8459427a52afdc23379768f54dd3566014d7618c1/pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6f0147ee9e0386f519c952cc670eb4a8b05caa594eeffe01af0e25f699e4e9bb", size = 34302230, upload-time = "2026-02-16T10:09:03.859Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4a/1472c00392f521fea03ae93408bf445cc7bfa1ab81683faf9bc188e36629/pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0ae6e17c828455b6265d590100c295193f93cc5675eb0af59e49dbd00d2de350", size = 35850050, upload-time = "2026-02-16T10:09:11.877Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b2/bd1f2f05ded56af7f54d702c8364c9c43cd6abb91b0e9933f3d77b4f4132/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:fed7020203e9ef273360b9e45be52a2a47d3103caf156a30ace5247ffb51bdbd", size = 44491918, upload-time = "2026-02-16T10:09:18.144Z" }, + { url = "https://files.pythonhosted.org/packages/0b/62/96459ef5b67957eac38a90f541d1c28833d1b367f014a482cb63f3b7cd2d/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:26d50dee49d741ac0e82185033488d28d35be4d763ae6f321f97d1140eb7a0e9", size = 47562811, upload-time = "2026-02-16T10:09:25.792Z" }, + { url = "https://files.pythonhosted.org/packages/7d/94/1170e235add1f5f45a954e26cd0e906e7e74e23392dcb560de471f7366ec/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c30143b17161310f151f4a2bcfe41b5ff744238c1039338779424e38579d701", size = 48183766, upload-time = "2026-02-16T10:09:34.645Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/39a42af4570377b99774cdb47f63ee6c7da7616bd55b3d5001aa18edfe4f/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db2190fa79c80a23fdd29fef4b8992893f024ae7c17d2f5f4db7171fa30c2c78", size = 50607669, upload-time = "2026-02-16T10:09:44.153Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/db94101c187f3df742133ac837e93b1f269ebdac49427f8310ee40b6a58f/pyarrow-23.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:f00f993a8179e0e1c9713bcc0baf6d6c01326a406a9c23495ec1ba9c9ebf2919", size = 27527698, upload-time = "2026-02-16T10:09:50.263Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, + { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, ] [[package]] name = "pycodestyle" -version = "2.13.0" +version = "2.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312, upload-time = "2025-03-29T17:33:30.669Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424, upload-time = "2025-03-29T17:33:29.405Z" }, + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, ] [[package]] name = "pycparser" -version = "2.22" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] name = "pyflakes" -version = "3.3.2" +version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175, upload-time = "2025-03-31T13:21:20.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164, upload-time = "2025-03-31T13:21:18.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, ] [[package]] @@ -2207,16 +1904,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/a1/9ae2852ebd3a7cc7d9ae7ff7919ab983e4a5c1b7a14e840732f23b2b48f6/pygame-2.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce8cc108b92de9b149b344ad2e25eedbe773af0dc41dfb24d1f07f679b558c60", size = 13977107, upload-time = "2024-09-29T11:39:56.831Z" }, { url = "https://files.pythonhosted.org/packages/31/df/6788fd2e9a864d0496a77670e44a7c012184b7a5382866ab0e60c55c0f28/pygame-2.6.1-cp311-cp311-win32.whl", hash = "sha256:811e7b925146d8149d79193652cbb83e0eca0aae66476b1cb310f0f4226b8b5c", size = 10250863, upload-time = "2024-09-29T11:44:48.199Z" }, { url = "https://files.pythonhosted.org/packages/d2/55/ca3eb851aeef4f6f2e98a360c201f0d00bd1ba2eb98e2c7850d80aabc526/pygame-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:91476902426facd4bb0dad4dc3b2573bc82c95c71b135e0daaea072ed528d299", size = 10622016, upload-time = "2024-09-29T12:17:01.545Z" }, - { url = "https://files.pythonhosted.org/packages/a7/ed/9f49258c5012a4642fe931e3d3fdb87a210a76c4680ce47ec049bb93afae/pygame-2.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15efaa11a80a65dd589a95bebe812fa5bfc7e14946b638a424c5bd9ac6cca1a4", size = 12967001, upload-time = "2024-09-29T14:28:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/53/e1/620110f7aebf9ae28073f9576b9ef1bf90dceabc0a88007d0241d842a501/pygame-2.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:481cfe1bdbb7fe00acc5950c494c26f00240888619bdc396fc8c39a734797432", size = 12378764, upload-time = "2024-09-29T14:28:10.715Z" }, - { url = "https://files.pythonhosted.org/packages/d3/4d/3621df95571465fa09fc65d48b9c70b32c4271b5c11b60aeabf592d3222e/pygame-2.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d09fd950725d187aa5207c0cb8eb9ab0d2f8ce9ab8d189c30eeb470e71b617e", size = 13612295, upload-time = "2024-09-29T11:11:02.753Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7e/8f8357ea9b82bc2229a27f79ccff827a68033a6e5f2221da127422978a28/pygame-2.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:163e66de169bd5670c86e27d0b74aad0d2d745e3b63cf4e7eb5b2bff1231ca8d", size = 14307883, upload-time = "2024-09-29T11:40:24.514Z" }, - { url = "https://files.pythonhosted.org/packages/75/9c/5cee30344ea2c5c2292c036719322d28decd2699c813b99cb0e636212f99/pygame-2.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6e8d0547f30ddc845f4fd1e33070ef548233ad0dbf21f7ecea768883d1bbdc", size = 13980247, upload-time = "2024-09-29T11:40:26.822Z" }, - { url = "https://files.pythonhosted.org/packages/62/57/3e97f6c05632ac3424578b4683ef9c36882b8796862517f72236111f76b9/pygame-2.6.1-cp39-cp39-win32.whl", hash = "sha256:d29eb9a93f12aa3d997b6e3c447ac85b2a4b142ab2548441523a8fcf5e216042", size = 10254889, upload-time = "2024-09-29T11:36:35.71Z" }, - { url = "https://files.pythonhosted.org/packages/77/a9/6e8cfee4005d9ec165afd9146b930bcb5b921ec66395105316d00e7db6f5/pygame-2.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:6582aa71a681e02e55d43150a9ab41394e6bf4d783d2962a10aea58f424be060", size = 10622066, upload-time = "2024-09-29T12:09:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2f/8458240c8908a550254c80b64f8c03d6d46156664df3515a1331ae730b4e/pygame-2.6.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bbb7167c92103a2091366e9af26d4914ba3776666e8677d3c93551353fffa626", size = 12782440, upload-time = "2024-09-29T14:28:25.73Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a5/ef76a85da2cb7bc6b9fc54b0a56cf75f244c8adcd16bab8d0d9d7398bfed/pygame-2.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17498a2b043bc0e795faedef1b081199c688890200aef34991c1941caa2d2c89", size = 14182026, upload-time = "2024-09-29T11:40:28.978Z" }, - { url = "https://files.pythonhosted.org/packages/8b/11/5519d3dfc8046822289dbd8ffde407e30ddb56b6f4a78ca39121a545a322/pygame-2.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7103c60939bbc1e05cfc7ba3f1d2ad3bbf103b7828b82a7166a9ab6f51950146", size = 13869271, upload-time = "2024-09-29T11:40:31.176Z" }, + { url = "https://files.pythonhosted.org/packages/92/16/2c602c332f45ff9526d61f6bd764db5096ff9035433e2172e2d2cadae8db/pygame-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ee7f2771f588c966fa2fa8b829be26698c9b4836f82ede5e4edc1a68594942e", size = 13118279, upload-time = "2024-09-29T14:26:30.427Z" }, + { url = "https://files.pythonhosted.org/packages/cd/53/77ccbc384b251c6e34bfd2e734c638233922449a7844e3c7a11ef91cee39/pygame-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8040ea2ab18c6b255af706ec01355c8a6b08dc48d77fd4ee783f8fc46a843bf", size = 12384524, upload-time = "2024-09-29T14:26:49.996Z" }, + { url = "https://files.pythonhosted.org/packages/06/be/3ed337583f010696c3b3435e89a74fb29d0c74d0931e8f33c0a4246307a9/pygame-2.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47a6938de93fa610accd4969e638c2aebcb29b2fca518a84c3a39d91ab47116", size = 13587123, upload-time = "2024-09-29T11:10:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/b015586a450db59313535662991b34d24c1f0c0dc149cc5f496573900f4e/pygame-2.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33006f784e1c7d7e466fcb61d5489da59cc5f7eb098712f792a225df1d4e229d", size = 14275532, upload-time = "2024-09-29T11:39:59.356Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f2/d31e6ad42d657af07be2ffd779190353f759a07b51232b9e1d724f2cda46/pygame-2.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1206125f14cae22c44565c9d333607f1d9f59487b1f1432945dfc809aeaa3e88", size = 13952653, upload-time = "2024-09-29T11:40:01.781Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/8ea2a6979e6fa971702fece1747e862e2256d4a8558fe0da6364dd946c53/pygame-2.6.1-cp312-cp312-win32.whl", hash = "sha256:84fc4054e25262140d09d39e094f6880d730199710829902f0d8ceae0213379e", size = 10252421, upload-time = "2024-09-29T11:14:26.877Z" }, + { url = "https://files.pythonhosted.org/packages/5f/90/7d766d54bb95939725e9a9361f9c06b0cfbe3fe100aa35400f0a461a278a/pygame-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9e7396be0d9633831c3f8d5d82dd63ba373ad65599628294b7a4f8a5a01a65", size = 10624591, upload-time = "2024-09-29T11:52:54.489Z" }, ] [[package]] @@ -2225,11 +1919,10 @@ version = "1.4.11" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "python_full_version < '3.10' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform == 'win32'", ] dependencies = [ - { name = "future", marker = "sys_platform == 'win32'" }, + { name = "future" }, ] sdist = { url = "https://files.pythonhosted.org/packages/00/cd/e22352401f93f1f0ecc24d28f7b3f6896950c8cc4dacb5a8858e6aa65c19/pyglet-1.4.11.zip", hash = "sha256:e4cc8dc2f09d8487f7b3e2d93bd1961528afe989d058177b26a46d3508fd2c33", size = 7863507, upload-time = "2020-04-19T00:53:37.738Z" } wheels = [ @@ -2241,15 +1934,8 @@ name = "pyglet" version = "1.5.27" 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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version >= '3.11' and sys_platform != 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/44/34/c11af4ae44bdd601e7d837add3d5c11451fe10f8f3d364f0b3ec19dd5f6b/pyglet-1.5.27.zip", hash = "sha256:4d00e067451f3b10fd51b69764fddab65444372a2da344ee2b35f0a8e6ebf005", size = 6978692, upload-time = "2022-09-21T11:17:18.163Z" } wheels = [ @@ -2264,26 +1950,28 @@ sdist = { url = "https://files.pythonhosted.org/packages/73/d2/09224b2f0a66251b0 [[package]] name = "pygments" -version = "2.19.1" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] name = "pylsl" -version = "1.17.6" +version = "1.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/fd/2cb39e07d09f3aa40bc39d880adcc8bfa08fc9b8de993340e6a7555899f8/pylsl-1.17.6.tar.gz", hash = "sha256:8f3cea0c54a27785a43a27e9524f1dee885fe149f4703eed060168923b1695a3", size = 39856, upload-time = "2024-12-13T20:14:12.725Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/e3/150c0e54f94c42320046488e0b521fdf5f31c74c1690cb33ad65c2059f2a/pylsl-1.18.1.tar.gz", hash = "sha256:a422d379f22e72ab94c65d815d420c9961dbc80064240062a4cbc72ba885f419", size = 41202, upload-time = "2026-01-14T14:56:44.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/fa/38f3ec8ac9073e53c65d850d8d6f51cbb87dbfcb59db5215fe7c7584e6e5/pylsl-1.17.6-py2.py3-none-any.whl", hash = "sha256:78d935d3d944cd572464f6200fcdf3958866b2e3180dea3da83e43a19517acf5", size = 41775, upload-time = "2024-12-13T20:14:10.525Z" }, - { url = "https://files.pythonhosted.org/packages/5a/8d/0c8818c1a8aecc2a09d9f5df92b0bd321bd73f780c4928ccf0d5952951ad/pylsl-1.17.6-py2.py3-none-win32.whl", hash = "sha256:d9a68e86a073b59582b697c2baf1757b067da155e5fb017e30cefb7aa6d22f6d", size = 293781, upload-time = "2024-12-13T20:14:29.628Z" }, - { url = "https://files.pythonhosted.org/packages/92/a9/b24df99c2dcb128a404dff05a592aa457763d45274c793395919b9b120a6/pylsl-1.17.6-py2.py3-none-win_amd64.whl", hash = "sha256:a5ead3e28ccdd7a08a6523adc797d6f737a1e446f684a8bd4818d784b50d89ba", size = 364212, upload-time = "2024-12-13T20:14:24.111Z" }, + { url = "https://files.pythonhosted.org/packages/50/a3/6500a0b926ae84208db1d17004cf3903c813ecf0889d16e9446af7279cd2/pylsl-1.18.1-py2.py3-none-any.whl", hash = "sha256:61a2eafe1b72dacc1d0bcf0f0fa2ba571d3183e55096b2bf37d3412b04cf33dc", size = 42305, upload-time = "2026-01-14T14:56:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ec/4df5b087acc0cb84f0b32804006177e2f96feba539659d0b1bd05f7cd6c2/pylsl-1.18.1-py2.py3-none-macosx_11_0_universal2.whl", hash = "sha256:435346577a8e518450bf9babebcc8bf16973a6855a1fd083f1010dd6647d4e16", size = 663590, upload-time = "2026-01-14T14:56:38.857Z" }, + { url = "https://files.pythonhosted.org/packages/32/16/f83685655ae474e8096271ec90cb71bc7fa27a25d916a25196b8a6658789/pylsl-1.18.1-py2.py3-none-manylinux_2_35_x86_64.whl", hash = "sha256:be1363b0470b4763731dbb3973150ae9fd3102666a2df725f866213ce0dd1776", size = 982295, upload-time = "2026-01-14T14:56:42.036Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a5/6a534763ec6e4b608e3d8336c876bef3933e85f661c89f5478448210418e/pylsl-1.18.1-py2.py3-none-win32.whl", hash = "sha256:e1c3af9d1ec1e9c849316fd6abdad99ec3b33d81de7d7192b5edaa6c408c5819", size = 271745, upload-time = "2026-01-14T14:56:40.389Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d8/9d3ff8f00b228f3f41fbfaef2ae25dbc8f285d203051cc9d87b6c1365b4c/pylsl-1.18.1-py2.py3-none-win_amd64.whl", hash = "sha256:ea2418f54a8cd0635960525ff4b8d4d388384dfd95cd82efd056297e46879944", size = 306038, upload-time = "2026-01-14T14:56:43.116Z" }, ] [[package]] @@ -2299,2499 +1987,2508 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/bb/bd246a7901dc1991b97049376e6238cbb85b708515db6203617b46e16a00/pyo-1.0.5-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0e93466fa5c417ccf17c80c4e476047d4d12582e84ccbfd19c289a018212a8dc", size = 9722423, upload-time = "2023-03-26T13:46:45.028Z" }, { url = "https://files.pythonhosted.org/packages/98/d5/980fb66cd0ae6f7f5f9a8c6fe3c447b13a610f20f9586c22d1f1d11407dc/pyo-1.0.5-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:dc486007c1e16dea08509561052702fee43000be13c093a813cd94cb8f7483f8", size = 9702237, upload-time = "2023-03-26T13:46:48.65Z" }, { url = "https://files.pythonhosted.org/packages/18/71/59cd7ad1e51ec8b6388ccefdbb7e35a0f135723123e7558ee531de0670a4/pyo-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2034c1c5e22c7de4a400d1967c50d217bdd3bed68f1d2eb50b7a01d3d3454ab4", size = 8551643, upload-time = "2023-03-26T13:46:52.126Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b1/915256809eede37ef9c73f4602ec72963880ff81bad93918afae06e45f31/pyo-1.0.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:664af552a800011f4f91162c33990171e388200c18ac43a530be24e0e2122ce5", size = 7879240, upload-time = "2023-03-26T13:47:21.403Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9f/17b90abb599a79958602a911adc7de3d0458b672be1774c7dfae952f6ff5/pyo-1.0.5-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:9c0806d3b22045b9baf2de97a389db4f56d73edeafeea00a11fdb7fb6c0d7ecc", size = 9702305, upload-time = "2023-03-26T13:47:25.602Z" }, - { url = "https://files.pythonhosted.org/packages/b0/9c/a629fb1a77829258dff1b8d047da4d82267ebd2cd7dcf480cd1ee0cca64a/pyo-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7555ef42a1e413f1a1c86b546cfb40b51b4019944712666b364871034ceab107", size = 10866358, upload-time = "2023-03-26T13:47:30.199Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c0/e7b5db9fa0fb62e6a986ff197eb29527573a837548081cb8cfd2918df3b2/pyo-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:9f7437b48e8d5ada913050b0f99ae14cf8f2ac82f80e0fa228034a94acd64102", size = 8551000, upload-time = "2023-03-26T13:47:34.384Z" }, ] [[package]] name = "pyobjc" -version = "11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-accessibility", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-accounts", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-addressbook", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-adservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-adsupport", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-applescriptkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-applescriptobjc", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-applicationservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-apptrackingtransparency", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-audiovideobridging", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-authenticationservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-automaticassessmentconfiguration", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-automator", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-avfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '11.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '11.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '11.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-avkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-avrouting", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-backgroundassets", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-browserenginekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '23.4' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '23.4' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '23.4' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-businesschat", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-calendarstore", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-callkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-carbon", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cfnetwork", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cinematic", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '23.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '23.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '23.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-classkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-cloudkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-collaboration", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-colorsync", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-contacts", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-contactsui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coreaudio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreaudiokit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corebluetooth", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coredata", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corehaptics", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-corelocation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '11.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '11.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '11.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coremediaio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '11.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '11.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '11.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coremidi", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreml", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coremotion", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coreservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corespotlight", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-coretext", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corewlan", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-cryptotokenkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-datadetection", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-devicecheck", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-devicediscoveryextension", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '24.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '24.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '24.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-dictionaryservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-discrecording", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-discrecordingui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-diskarbitration", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-dvdplayback", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-eventkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-exceptionhandling", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-executionpolicy", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-extensionkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-externalaccessory", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-fileprovider", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-fileproviderui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-findersync", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-fsevents", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-gamecenter", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-gamecontroller", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-gamekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-gameplaykit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-healthkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-imagecapturecore", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-inputmethodkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-installerplugins", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-instantmessage", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-intents", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '16.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '16.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '16.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-intentsui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-iobluetooth", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-iobluetoothui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-iosurface", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-ituneslibrary", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-kernelmanagement", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-latentsemanticmapping", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-launchservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-libdispatch", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-libxpc", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-linkpresentation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-localauthentication", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-localauthenticationembeddedui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mailkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mapkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mediaaccessibility", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mediaextension", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '24.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '24.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '24.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-medialibrary", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mediaplayer", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '16.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '16.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '16.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mediatoolbox", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metal", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metalfx", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metalkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metalperformanceshaders", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metalperformanceshadersgraph", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-metrickit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-mlcompute", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-modelio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-multipeerconnectivity", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-naturallanguage", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-netfs", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-network", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-networkextension", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-notificationcenter", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '14.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '14.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '14.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-opendirectory", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-osakit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-oslog", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-passkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-pencilkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-phase", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-photos", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-photosui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '15.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '15.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '15.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-preferencepanes", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-pushkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quicklookthumbnailing", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-replaykit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-safariservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '16.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '16.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '16.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-safetykit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-scenekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '11.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '11.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '11.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-screencapturekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.4' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.4' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.4' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-screensaver", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-screentime", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-scriptingbridge", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '9.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '9.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '9.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-searchkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-security", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-securityfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-securityinterface", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-sensitivecontentanalysis", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '23.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '23.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '23.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-servicemanagement", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '10.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '10.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '10.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-sharedwithyou", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-sharedwithyoucore", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-shazamkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '21.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '21.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '21.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-social", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-soundanalysis", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-speech", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-spritekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '13.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '13.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '13.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-storekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '11.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '11.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '11.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-symbols", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '23.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '23.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '23.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-syncservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-systemconfiguration", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-systemextensions", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '19.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '19.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '19.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-threadnetwork", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '22.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '22.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '22.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-uniformtypeidentifiers", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-usernotifications", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-usernotificationsui", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-videosubscriberaccount", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '18.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '18.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '18.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-videotoolbox", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '12.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '12.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '12.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-virtualization", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '20.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '20.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '20.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-vision", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and platform_release >= '17.0' and sys_platform == 'linux') or (python_full_version < '3.10' and platform_release >= '17.0' and sys_platform != 'linux' and sys_platform != 'win32') or (platform_release >= '17.0' and sys_platform == 'darwin')" }, - { name = "pyobjc-framework-webkit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e1/d6/27b1c9a02f6cb4954984ce1a0239618e52f78c329c7e7450bf1f219b0f0a/pyobjc-11.0.tar.gz", hash = "sha256:a8f7baed65797f67afd46290b02f652c23f4b158ddf960bce0441b78f6803418", size = 11044, upload-time = "2025-01-14T19:02:12.55Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/55/d0971bccf8a5a347eaccf8caa4718766a68281baab83d2b5e211b2767504/pyobjc-11.0-py3-none-any.whl", hash = "sha256:3ed5e4e993192fd7fadd42a4148d266a3587af7453ea3b240bab724d02e34e64", size = 4169, upload-time = "2025-01-14T18:46:44.385Z" }, +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accessibility", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-accounts", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-addressbook" }, + { name = "pyobjc-framework-adservices", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-adsupport", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-applescriptkit" }, + { name = "pyobjc-framework-applescriptobjc", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-applicationservices" }, + { name = "pyobjc-framework-apptrackingtransparency", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-arkit", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-audiovideobridging", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-authenticationservices", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automaticassessmentconfiguration", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automator" }, + { name = "pyobjc-framework-avfoundation", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-avkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-avrouting", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-backgroundassets", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-browserenginekit", marker = "platform_release >= '23.4'" }, + { name = "pyobjc-framework-businesschat", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-calendarstore", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-callkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-carbon" }, + { name = "pyobjc-framework-cfnetwork" }, + { name = "pyobjc-framework-cinematic", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-classkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-cloudkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-collaboration", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-colorsync", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-compositorservices", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-contacts", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-contactsui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coreaudiokit" }, + { name = "pyobjc-framework-corebluetooth", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corehaptics", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-corelocation", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-coremedia", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremediaio", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremidi" }, + { name = "pyobjc-framework-coreml", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coremotion", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-coreservices" }, + { name = "pyobjc-framework-corespotlight", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-corewlan", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-cryptotokenkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-datadetection", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-devicecheck", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-devicediscoveryextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-dictionaryservices", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-discrecording" }, + { name = "pyobjc-framework-discrecordingui" }, + { name = "pyobjc-framework-diskarbitration" }, + { name = "pyobjc-framework-dvdplayback" }, + { name = "pyobjc-framework-eventkit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-exceptionhandling" }, + { name = "pyobjc-framework-executionpolicy", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-extensionkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-externalaccessory", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-fileprovider", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-fileproviderui", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-findersync", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-fsevents", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-fskit", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-gamecenter", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gamecontroller", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-gamekit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gameplaykit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-gamesave", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-healthkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-imagecapturecore", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-inputmethodkit", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-installerplugins" }, + { name = "pyobjc-framework-instantmessage", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-intents", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-intentsui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-iobluetooth" }, + { name = "pyobjc-framework-iobluetoothui" }, + { name = "pyobjc-framework-iosurface", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-ituneslibrary", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-kernelmanagement", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-latentsemanticmapping" }, + { name = "pyobjc-framework-launchservices" }, + { name = "pyobjc-framework-libdispatch", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-libxpc", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-linkpresentation", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-localauthentication", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-localauthenticationembeddedui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mailkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mapkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaaccessibility", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-medialibrary", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaplayer", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-mediatoolbox", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-metal", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalfx", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-metalkit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalperformanceshaders", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-metalperformanceshadersgraph", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-metrickit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mlcompute", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-modelio", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-multipeerconnectivity", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-naturallanguage", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-netfs", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-network", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-networkextension", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-notificationcenter", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-opendirectory", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-osakit" }, + { name = "pyobjc-framework-oslog", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-passkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-pencilkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-phase", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-photos", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-photosui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-preferencepanes" }, + { name = "pyobjc-framework-pushkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-quartz" }, + { name = "pyobjc-framework-quicklookthumbnailing", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-replaykit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-safariservices", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-safetykit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-scenekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-screencapturekit", marker = "platform_release >= '21.4'" }, + { name = "pyobjc-framework-screensaver" }, + { name = "pyobjc-framework-screentime", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-scriptingbridge", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-searchkit" }, + { name = "pyobjc-framework-security" }, + { name = "pyobjc-framework-securityfoundation" }, + { name = "pyobjc-framework-securityinterface" }, + { name = "pyobjc-framework-securityui", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-sensitivecontentanalysis", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-servicemanagement", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-sharedwithyou", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-sharedwithyoucore", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-shazamkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-social", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-soundanalysis", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-speech", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-spritekit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-storekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-symbols", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-syncservices" }, + { name = "pyobjc-framework-systemconfiguration" }, + { name = "pyobjc-framework-systemextensions", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-threadnetwork", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-uniformtypeidentifiers", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-usernotifications", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-usernotificationsui", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-videosubscriberaccount", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-videotoolbox", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-virtualization", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-vision", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-webkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/06/d77639ba166cc09aed2d32ae204811b47bc5d40e035cdc9bff7fff72ec5f/pyobjc-12.1.tar.gz", hash = "sha256:686d6db3eb3182fac9846b8ce3eedf4c7d2680b21b8b8d6e6df054a17e92a12d", size = 11345, upload-time = "2025-11-14T10:07:28.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/00/1085de7b73abf37ec27ad59f7a1d7a406e6e6da45720bced2e198fdf1ddf/pyobjc-12.1-py3-none-any.whl", hash = "sha256:6f8c36cf87b1159d2ca1aa387ffc3efcd51cc3da13ef47c65f45e6d9fbccc729", size = 4226, upload-time = "2025-11-14T09:30:25.185Z" }, ] [[package]] name = "pyobjc-core" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/94/a111239b98260869780a5767e5d74bfd3a8c13a40457f479c28dcd91f89d/pyobjc_core-11.0.tar.gz", hash = "sha256:63bced211cb8a8fb5c8ff46473603da30e51112861bd02c438fbbbc8578d9a70", size = 994931, upload-time = "2025-01-14T19:02:13.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/b6/d5612eb40be4fd5ef88c259339e6313f46ba67577a95d86c3470b951fce0/pyobjc_core-12.1.tar.gz", hash = "sha256:2bb3903f5387f72422145e1466b3ac3f7f0ef2e9960afa9bcd8961c5cbf8bd21", size = 1000532, upload-time = "2025-11-14T10:08:28.292Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/21/ccc992b38670176a615fb67686d709e03be989511da687f6f49ddc4ff6c8/pyobjc_core-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:10866b3a734d47caf48e456eea0d4815c2c9b21856157db5917b61dee06893a1", size = 732162, upload-time = "2025-01-14T18:46:47.176Z" }, - { url = "https://files.pythonhosted.org/packages/52/05/fa97309c3b1bc1ec90d701db89902e0bd5e1024023aa2c5387b889458b1b/pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd", size = 727295, upload-time = "2025-01-14T18:46:50.208Z" }, - { url = "https://files.pythonhosted.org/packages/14/ba/1c459d0f1fc4c80314040ea6efea433c0641adffa6701679ec3a917b51a3/pyobjc_core-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:02406ece449d0f41b31e579e47ca77ced3eb57533df955281bfcecc99da74fba", size = 732648, upload-time = "2025-01-14T18:46:59.268Z" }, + { url = "https://files.pythonhosted.org/packages/63/bf/3dbb1783388da54e650f8a6b88bde03c101d9ba93dfe8ab1b1873f1cd999/pyobjc_core-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93418e79c1655f66b4352168f8c85c942707cb1d3ea13a1da3e6f6a143bacda7", size = 676748, upload-time = "2025-11-14T09:30:50.023Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/d2b290708e9da86d6e7a9a2a2022b91915cf2e712a5a82e306cb6ee99792/pyobjc_core-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c918ebca280925e7fcb14c5c43ce12dcb9574a33cccb889be7c8c17f3bcce8b6", size = 671263, upload-time = "2025-11-14T09:31:35.231Z" }, + { url = "https://files.pythonhosted.org/packages/64/5a/6b15e499de73050f4a2c88fff664ae154307d25dc04da8fb38998a428358/pyobjc_core-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:818bcc6723561f207e5b5453efe9703f34bc8781d11ce9b8be286bb415eb4962", size = 678335, upload-time = "2025-11-14T09:32:20.107Z" }, ] [[package]] name = "pyobjc-framework-accessibility" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/61/7484cc4ad3aa7854cd4c969379a5f044261259d08f7c20b6718493b484f9/pyobjc_framework_accessibility-11.0.tar.gz", hash = "sha256:097450c641fa9ac665199762e77867f2a82775be2f749b8fa69223b828f60656", size = 44597, upload-time = "2025-01-14T19:02:17.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/87/8ca40428d05a668fecc638f2f47dba86054dbdc35351d247f039749de955/pyobjc_framework_accessibility-12.1.tar.gz", hash = "sha256:5ff362c3425edc242d49deec11f5f3e26e565cefb6a2872eda59ab7362149772", size = 29800, upload-time = "2025-11-14T10:08:31.949Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/35/9edbe3bc2e4b706e8b66c30b11faa829c265a3dc170c50d472689564cfe0/pyobjc_framework_Accessibility-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:429122cc8822aff514ff220316c047cc079b8e6cb2e78afc531ba76ae624f8b5", size = 10946, upload-time = "2025-01-14T18:47:33.323Z" }, - { url = "https://files.pythonhosted.org/packages/52/2e/babcd02cd833c0aba34e10c34a2184021b8a3c7cb45d1ae806156c2b519d/pyobjc_framework_Accessibility-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c3a751d17b288bb56a98a10b52b253b3002c885fe686b604788acac1e9739437", size = 10948, upload-time = "2025-01-14T18:47:34.37Z" }, - { url = "https://files.pythonhosted.org/packages/04/f0/ee962bd5a47f995f91e6c412d318dd94d9079e258e9a97febed3b714fb5b/pyobjc_framework_Accessibility-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:333fb98b255e17b33026469f3fc6ebe935ab2b7cc1a523f014b8804d544cf3a6", size = 10932, upload-time = "2025-01-14T18:47:40.037Z" }, + { url = "https://files.pythonhosted.org/packages/7a/49/ff2da96d70cd96d5cc16015be0103474be75c71fb5c56e35d0a39517c4a2/pyobjc_framework_accessibility-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ca72a049a9dc56686cfe7b8c0bbb556205fb7a955a48cabf7f90447708d89651", size = 11300, upload-time = "2025-11-14T09:35:26.7Z" }, + { url = "https://files.pythonhosted.org/packages/76/00/182c57584ad8e5946a82dacdc83c9791567e10bffdea1fe92272b3fdec14/pyobjc_framework_accessibility-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5e29dac0ce8327cd5a8b9a5a8bd8aa83e4070018b93699e97ac0c3af09b42a9a", size = 11301, upload-time = "2025-11-14T09:35:28.678Z" }, + { url = "https://files.pythonhosted.org/packages/cc/95/9ea0d1c16316b4b5babf4b0515e9a133ac64269d3ec031f15ee9c7c2a8c1/pyobjc_framework_accessibility-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:537691a0b28fedb8385cd093df069a6e5d7e027629671fc47b50210404eca20b", size = 11335, upload-time = "2025-11-14T09:35:30.81Z" }, ] [[package]] name = "pyobjc-framework-accounts" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/fa/b64f3f02e0a8b189dc07c391546e2dbe30ef1b3515d1427cdab743545b90/pyobjc_framework_accounts-11.0.tar.gz", hash = "sha256:afc4ae277be1e3e1f90269001c2fd886093a5465e365d7f9a3a0af3e17f06210", size = 17340, upload-time = "2025-01-14T19:02:18.625Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/10/f6fe336c7624d6753c1f6edac102310ce4434d49b548c479e8e6420d4024/pyobjc_framework_accounts-12.1.tar.gz", hash = "sha256:76d62c5e7b831eb8f4c9ca6abaf79d9ed961dfffe24d89a041fb1de97fe56a3e", size = 15202, upload-time = "2025-11-14T10:08:33.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/45/5dfc72c82087d458ce7ddb17a338a38ae1848e72620537f31ed97192c65e/pyobjc_framework_Accounts-11.0-py2.py3-none-any.whl", hash = "sha256:3e4b494e1158e3250e4b4a09e9ff33b38f82d31aefe50dd47152c4a20ecdeec4", size = 5035, upload-time = "2025-01-14T18:47:40.92Z" }, - { url = "https://files.pythonhosted.org/packages/96/96/39b0cc9ced1180a93c75924a06598f24d0a7554b3e8ddfcb0828c0957476/pyobjc_framework_Accounts-11.0-py3-none-any.whl", hash = "sha256:ad0e378bd07ca7c88b45cda63b85424bc344e81ea44c0ae7327872d91cad311a", size = 5104, upload-time = "2025-01-14T18:47:41.967Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/5f9214250f92fbe2e07f35778875d2771d612f313af2a0e4bacba80af28e/pyobjc_framework_accounts-12.1-py2.py3-none-any.whl", hash = "sha256:e1544ad11a2f889a7aaed649188d0e76d58595a27eec07ca663847a7adb21ae5", size = 5104, upload-time = "2025-11-14T09:35:40.246Z" }, ] [[package]] name = "pyobjc-framework-addressbook" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/ef/5b5f6b61907ae43509fbf1654e043115d9a64d97efdc28fbb90d06c199f6/pyobjc_framework_addressbook-11.0.tar.gz", hash = "sha256:87073c85bb342eb27faa6eceb7a0e8a4c1e32ad1f2b62bb12dafb5e7b9f15837", size = 97116, upload-time = "2025-01-14T19:02:19.527Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/28/0404af2a1c6fa8fd266df26fb6196a8f3fb500d6fe3dab94701949247bea/pyobjc_framework_addressbook-12.1.tar.gz", hash = "sha256:c48b740cf981103cef1743d0804a226d86481fcb839bd84b80e9a586187e8000", size = 44359, upload-time = "2025-11-14T10:08:37.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/52/968fab9d1dab89e6429b3866cdb2da377bf310a9379a90df0e24f9a8d7bf/pyobjc_framework_AddressBook-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8daa1eb6883089e7ab8366bb809b28bbca7a1dca751b0c7bb235107eaa3f43a3", size = 13013, upload-time = "2025-01-14T18:47:46.671Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/8b874a52ff57dad999330ac1f899e6df8e35cec2cad8a90d8002d3c5f196/pyobjc_framework_AddressBook-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af7de23aac7571a3b9dad5b2881d8f186653aa72903db8d7dbfd2c7b993156b9", size = 13010, upload-time = "2025-01-14T18:47:47.925Z" }, - { url = "https://files.pythonhosted.org/packages/75/93/73dcb93f7266772bedb9b576e2359e76eae07ac6ef41c89275d2a502a204/pyobjc_framework_AddressBook-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fef82569157d6e24d5b25e39f5bdba21eae8f14fa35467abb8a093577432aa2", size = 12993, upload-time = "2025-01-14T18:47:54.682Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e0/e483b773845f7944a008d060361deca8eef3692674a0c9c126fc0a1fd143/pyobjc_framework_addressbook-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e6291d67436112057df27f76d758a8fb9a6ff1557420dee0baf52e61cf174872", size = 12881, upload-time = "2025-11-14T09:35:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5a/2ecaa94e5f56c6631f0820ec4209f8075c1b7561fe37495e2d024de1c8df/pyobjc_framework_addressbook-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:681755ada6c95bd4a096bc2b9f9c24661ffe6bff19a96963ee3fad34f3d61d2b", size = 12879, upload-time = "2025-11-14T09:35:45.21Z" }, + { url = "https://files.pythonhosted.org/packages/b6/33/da709c69cbb60df9522cd614d5c23c15b649b72e5d62fed1048e75c70e7b/pyobjc_framework_addressbook-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7893dd784322f4674299fb3ca40cb03385e5eddb78defd38f08c0b730813b56c", size = 12894, upload-time = "2025-11-14T09:35:47.498Z" }, ] [[package]] name = "pyobjc-framework-adservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/7c/0c6e01f83b0c5c7968564a40146f4d07080df278457bdb5a982c8f26a74d/pyobjc_framework_adservices-11.0.tar.gz", hash = "sha256:d2e1a2f395e93e1bbe754ab0d76ce1d64c0d3928472634437e0382eafc6765cd", size = 12732, upload-time = "2025-01-14T19:02:20.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/04/1c3d3e0a1ac981664f30b33407dcdf8956046ecde6abc88832cf2aa535f4/pyobjc_framework_adservices-12.1.tar.gz", hash = "sha256:7a31fc8d5c6fd58f012db87c89ba581361fc905114bfb912e0a3a87475c02183", size = 11793, upload-time = "2025-11-14T10:08:39.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/10/601c9f5a07450ce75e166042d9ac5efe6286ac2d15212885a920260af9e3/pyobjc_framework_AdServices-11.0-py2.py3-none-any.whl", hash = "sha256:7cd1458f60175cd46bd88061c20e82f04b2576fc00bc5d54d67c18dcb870e27f", size = 3420, upload-time = "2025-01-14T18:47:42.812Z" }, - { url = "https://files.pythonhosted.org/packages/89/40/98a9116790e163d6c9ac0d19ce66307b03f9ac5ee64631db69899457b154/pyobjc_framework_AdServices-11.0-py3-none-any.whl", hash = "sha256:6426d4e4a43f5ee5ce7bab44d85647dbded3e17c0c62d8923cebaf927c4162ca", size = 3486, upload-time = "2025-01-14T18:47:43.845Z" }, + { url = "https://files.pythonhosted.org/packages/ad/13/f7796469b25f50750299c4b0e95dc2f75c7c7fc4c93ef2c644f947f10529/pyobjc_framework_adservices-12.1-py2.py3-none-any.whl", hash = "sha256:9ca3c55e35b2abb3149a0bce5de9a1f7e8ee4f8642036910ca8586ab2e161538", size = 3492, upload-time = "2025-11-14T09:35:57.344Z" }, ] [[package]] name = "pyobjc-framework-adsupport" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/07/b8b5f741d1e2cad97100444b255e6ecaca3668e7414039981799aa330035/pyobjc_framework_adsupport-11.0.tar.gz", hash = "sha256:20eb8a683d34fb7a6efeceaf964a24b88c3434875c44f66db5e1b609e678043a", size = 12819, upload-time = "2025-01-14T19:02:23.032Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/77/f26a2e9994d4df32e9b3680c8014e350b0f1c78d7673b3eba9de2e04816f/pyobjc_framework_adsupport-12.1.tar.gz", hash = "sha256:9a68480e76de567c339dca29a8c739d6d7b5cad30e1cd585ff6e49ec2fc283dd", size = 11645, upload-time = "2025-11-14T10:08:41.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/7f/2023c0a973f8823175c7e409fdbd306b275b0bb2723acf12ffade6ba5dbe/pyobjc_framework_AdSupport-11.0-py2.py3-none-any.whl", hash = "sha256:59161f5046def176d3aa6fdd6a05916029ca69ac69f836c67e0dd780a5efcf0f", size = 3334, upload-time = "2025-01-14T18:47:44.747Z" }, - { url = "https://files.pythonhosted.org/packages/cf/84/26c4275732952416603026888ca5462ed84372d412d0ccd7a1c750c01673/pyobjc_framework_AdSupport-11.0-py3-none-any.whl", hash = "sha256:91ba05eb5602911287bd04b0efefb7a485f9af255095b87c3e77bb7d1d1242ed", size = 3405, upload-time = "2025-01-14T18:47:45.767Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1a/3e90d5a09953bde7b60946cd09cca1411aed05dea855cb88cb9e944c7006/pyobjc_framework_adsupport-12.1-py2.py3-none-any.whl", hash = "sha256:97dcd8799dd61f047bb2eb788bbde81f86e95241b5e5173a3a61cfc05b5598b1", size = 3401, upload-time = "2025-11-14T09:35:59.039Z" }, ] [[package]] name = "pyobjc-framework-applescriptkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/c3/d7f9a33de7ab8e3950350e0862214e66f27ed6bff1a491bc391c377ab83e/pyobjc_framework_applescriptkit-11.0.tar.gz", hash = "sha256:4bafac4a036f0fb8ba01488b8e91d3ac861ce6e61154ffbd0b26f82b99779b50", size = 12638, upload-time = "2025-01-14T19:02:25.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/f1/e0c07b2a9eb98f1a2050f153d287a52a92f873eeddb41b74c52c144d8767/pyobjc_framework_applescriptkit-12.1.tar.gz", hash = "sha256:cb09f88cf0ad9753dedc02720065818f854b50e33eb4194f0ea34de6d7a3eb33", size = 11451, upload-time = "2025-11-14T10:08:43.328Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/4b/5e7f6a182129be6f229ee6c036d84359b46b0f5f695824315c47b19d3149/pyobjc_framework_AppleScriptKit-11.0-py2.py3-none-any.whl", hash = "sha256:e8acc5ca99f5123ec4e60cb356c7cc407d5fe533ca53e5fa341b51f65495973b", size = 4246, upload-time = "2025-01-14T18:47:59.508Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ce/7965604f553c91fbd5602e17057b0935c100542abaf76291921335b6f75c/pyobjc_framework_AppleScriptKit-11.0-py3-none-any.whl", hash = "sha256:92cffd943a4d17f684bb51245744e9d0bb8992b2967125845dfeab09d26fc624", size = 4317, upload-time = "2025-01-14T18:48:02.221Z" }, + { url = "https://files.pythonhosted.org/packages/3b/70/6c399c6ebc37a4e48acf63967e0a916878aedfe420531f6d739215184c0c/pyobjc_framework_applescriptkit-12.1-py2.py3-none-any.whl", hash = "sha256:b955fc017b524027f635d92a8a45a5fd9fbae898f3e03de16ecd94aa4c4db987", size = 4352, upload-time = "2025-11-14T09:36:00.705Z" }, ] [[package]] name = "pyobjc-framework-applescriptobjc" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/9f/bb4fdbcea418f8472d7a67d4d2e4a15fca11fed04648db5208b0fce84807/pyobjc_framework_applescriptobjc-11.0.tar.gz", hash = "sha256:baff9988b6e886aed0e76441358417707de9088be5733f22055fed7904ca1001", size = 12675, upload-time = "2025-01-14T19:02:25.947Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/4b/e4d1592207cbe17355e01828bdd11dd58f31356108f6a49f5e0484a5df50/pyobjc_framework_applescriptobjc-12.1.tar.gz", hash = "sha256:dce080ed07409b0dda2fee75d559bd312ea1ef0243a4338606440f282a6a0f5f", size = 11588, upload-time = "2025-11-14T10:08:45.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/7d/b3e28759df060f26a31407282e789a1a321612afcee3871134fdac8dc75f/pyobjc_framework_AppleScriptObjC-11.0-py2.py3-none-any.whl", hash = "sha256:a4c8d417fdb64180a283eadf8ddb804ba7f9e3cef149216a11b65e1d3509c55b", size = 4347, upload-time = "2025-01-14T18:48:03.193Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e7/c080a1cd77ce04e3bf4079a941105d3d670b9ba0fc91a54d4a1764bea02d/pyobjc_framework_AppleScriptObjC-11.0-py3-none-any.whl", hash = "sha256:681006b0cdf0279cd06b6d0f62b542b7f3b3b9b5d2391f7aa3798d8b355d67bf", size = 4416, upload-time = "2025-01-14T18:48:04.219Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5f/9ce6706399706930eb29c5308037109c30cfb36f943a6df66fdf38cc842a/pyobjc_framework_applescriptobjc-12.1-py2.py3-none-any.whl", hash = "sha256:79068f982cc22471712ce808c0a8fd5deea11258fc8d8c61968a84b1962a3d10", size = 4454, upload-time = "2025-11-14T09:36:02.276Z" }, ] [[package]] name = "pyobjc-framework-applicationservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coretext", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/fb/4e42573b0d3baa3fa18ec53614cf979f951313f1451e8f2e17df9429da1f/pyobjc_framework_applicationservices-11.0.tar.gz", hash = "sha256:d6ea18dfc7d5626a3ecf4ac72d510405c0d3a648ca38cae8db841acdebecf4d2", size = 224334, upload-time = "2025-01-14T19:02:26.828Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/6a/d4e613c8e926a5744fc47a9e9fea08384a510dc4f27d844f7ad7a2d793bd/pyobjc_framework_applicationservices-12.1.tar.gz", hash = "sha256:c06abb74f119bc27aeb41bf1aef8102c0ae1288aec1ac8665ea186a067a8945b", size = 103247, upload-time = "2025-11-14T10:08:52.18Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/2e/23d996e8294cc4d4ac719c410b1d210dfb1f64eecf87170d5e72c966592a/pyobjc_framework_ApplicationServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc8f34b5b59ffd3c210ae883d794345c1197558ff3da0f5800669cf16435271e", size = 30839, upload-time = "2025-01-14T18:48:05.11Z" }, - { url = "https://files.pythonhosted.org/packages/99/37/3d4dc6c004aaeb67bd43f7261d7c169ff45b8fc0eefbc7ba8cd6b0c881bc/pyobjc_framework_ApplicationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61a99eef23abb704257310db4f5271137707e184768f6407030c01de4731b67b", size = 30846, upload-time = "2025-01-14T18:48:06.286Z" }, - { url = "https://files.pythonhosted.org/packages/a7/db/e8895fffa91031ab348ccad426dbd4c7d787ee0f48e1590ccba841669755/pyobjc_framework_ApplicationServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:74963e15a751d1454c1b8060914f116956e3a68f6a117c2163f491609125283b", size = 30809, upload-time = "2025-01-14T18:48:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/52/9d/3cf36e7b08832e71f5d48ddfa1047865cf2dfc53df8c0f2a82843ea9507a/pyobjc_framework_applicationservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c4fd1b008757182b9e2603a63c6ffa930cc412fab47294ec64260ab3f8ec695d", size = 32791, upload-time = "2025-11-14T09:36:05.576Z" }, + { url = "https://files.pythonhosted.org/packages/17/86/d07eff705ff909a0ffa96d14fc14026e9fc9dd716233648c53dfd5056b8e/pyobjc_framework_applicationservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdddd492eeac6d14ff2f5bd342aba29e30dffa72a2d358c08444da22129890e2", size = 32784, upload-time = "2025-11-14T09:36:08.755Z" }, + { url = "https://files.pythonhosted.org/packages/37/a7/55fa88def5c02732c4b747606ff1cbce6e1f890734bbd00f5596b21eaa02/pyobjc_framework_applicationservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c8f6e2fb3b3e9214ab4864ef04eee18f592b46a986c86ea0113448b310520532", size = 32835, upload-time = "2025-11-14T09:36:11.855Z" }, ] [[package]] name = "pyobjc-framework-apptrackingtransparency" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/40/c1c48ed49b5e55c7a635aa1e7ca41ffa1c5547e26243f26489c4768cd730/pyobjc_framework_apptrackingtransparency-11.0.tar.gz", hash = "sha256:cd5c834b5b19c21ad6c317ba5d29f30a8d0ae5d14e7cf557da22abc0850f1e91", size = 13385, upload-time = "2025-01-14T19:02:29.226Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/de/f24348982ecab0cb13067c348fc5fbc882c60d704ca290bada9a2b3e594b/pyobjc_framework_apptrackingtransparency-12.1.tar.gz", hash = "sha256:e25bf4e4dfa2d929993ee8e852b28fdf332fa6cde0a33328fdc3b2f502fa50ec", size = 12407, upload-time = "2025-11-14T10:08:54.118Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/72/6e460cd763a3048c4d75769ed60a5af7832122b78224f710e40a9eb1c5cf/pyobjc_framework_AppTrackingTransparency-11.0-py2.py3-none-any.whl", hash = "sha256:1bf6d4f148d9f5d5befe90fcfd88ce988458a52719d53d5989b08e4fbed58864", size = 3805, upload-time = "2025-01-14T18:47:57.492Z" }, - { url = "https://files.pythonhosted.org/packages/33/cb/ef2622ee08349293aae6f81216cfee2423ad37d8a1d14ba4690b537d8850/pyobjc_framework_AppTrackingTransparency-11.0-py3-none-any.whl", hash = "sha256:347f876aea9d9f47d9fbf6dfa6d3f250ecd46f56a7c4616386327061e2ecc4e9", size = 3878, upload-time = "2025-01-14T18:47:58.595Z" }, + { url = "https://files.pythonhosted.org/packages/19/b2/90120b93ecfb099b6af21696c26356ad0f2182bdef72b6cba28aa6472ca6/pyobjc_framework_apptrackingtransparency-12.1-py2.py3-none-any.whl", hash = "sha256:23a98ade55495f2f992ecf62c3cbd8f648cbd68ba5539c3f795bf66de82e37ca", size = 3879, upload-time = "2025-11-14T09:36:26.425Z" }, +] + +[[package]] +name = "pyobjc-framework-arkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/8b/843fe08e696bca8e7fc129344965ab6280f8336f64f01ba0a8862d219c3f/pyobjc_framework_arkit-12.1.tar.gz", hash = "sha256:0c5c6b702926179700b68ba29b8247464c3b609fd002a07a3308e72cfa953adf", size = 35814, upload-time = "2025-11-14T10:08:57.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/1e/64c55b409243b3eb9abc7a99e7b27ad4e16b9e74bc4b507fb7e7b81fd41a/pyobjc_framework_arkit-12.1-py2.py3-none-any.whl", hash = "sha256:f6d39e28d858ee03f052d6780a552247e682204382dbc090f1d3192fa1b21493", size = 8302, upload-time = "2025-11-14T09:36:28.127Z" }, ] [[package]] name = "pyobjc-framework-audiovideobridging" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/89/5f/0bd5beded0415b53f443da804410eda6a53e1bc64f8779ed9a592719da8c/pyobjc_framework_audiovideobridging-11.0.tar.gz", hash = "sha256:dbc45b06418dd780c365956fdfd69d007436b5ee54c51e671196562eb8290ba6", size = 72418, upload-time = "2025-01-14T19:02:30.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/51/f81581e7a3c5cb6c9254c6f1e1ee1d614930493761dec491b5b0d49544b9/pyobjc_framework_audiovideobridging-12.1.tar.gz", hash = "sha256:6230ace6bec1f38e8a727c35d054a7be54e039b3053f98e6dd8d08d6baee2625", size = 38457, upload-time = "2025-11-14T10:09:01.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/64/9ab9f69a85eb4922ffc4bca7351b0276637dcfd45f0476c09d57b304ef9f/pyobjc_framework_AudioVideoBridging-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:224c311d01466ecfba44c2dde3c4f17d4a54d214686d58501c97280a28a9890f", size = 10949, upload-time = "2025-01-14T18:48:10.997Z" }, - { url = "https://files.pythonhosted.org/packages/3c/33/2ee33542febb40174d40ae8bbdf672b4e438a3fb41ba6a4d4a3e6800121b/pyobjc_framework_AudioVideoBridging-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d025e49ca6238be96d0a1c22942b548a8d445ef8eb71259b4769e119810f42c6", size = 10944, upload-time = "2025-01-14T18:48:11.978Z" }, - { url = "https://files.pythonhosted.org/packages/de/4b/f96031429db01b6a9446a31bfa714a4404768adfc462149168858f5db8ec/pyobjc_framework_AudioVideoBridging-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:74118a6a37ce422e63960523fb16b23d92326cefabf4bb93d973fe42928d999a", size = 10927, upload-time = "2025-01-14T18:48:16.857Z" }, + { url = "https://files.pythonhosted.org/packages/07/7c/9b1a3a8f138ff171e08bbf8af8bb66e0e6e98a23b62658ab9e47dc3cb610/pyobjc_framework_audiovideobridging-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c2fa51d674ba30801cfe67d1b5e71424635b62f6377b96602bce124ae3086823", size = 11037, upload-time = "2025-11-14T09:36:30.574Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f8/c614630fa382720bbd42a0ff567378630c36d10f114476d6c70b73f73b49/pyobjc_framework_audiovideobridging-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6bc24a7063b08c7d9f1749a4641430d363b6dba642c04d09b58abcee7a5260cb", size = 11037, upload-time = "2025-11-14T09:36:32.583Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8e/a28badfcc6c731696e3d3a8a83927bd844d992f9152f903c2fee355702ca/pyobjc_framework_audiovideobridging-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:010021502649e2cca4e999a7c09358d48c6b0ed83530bbc0b85bba6834340e4b", size = 11052, upload-time = "2025-11-14T09:36:34.475Z" }, ] [[package]] name = "pyobjc-framework-authenticationservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/0f/2de0d941e9c9b2eb1ce8b22eb31adc7227badfe1e53f615431d3a7fdcd48/pyobjc_framework_authenticationservices-11.0.tar.gz", hash = "sha256:6a060ce651df142e8923d1383449bc6f2c7f5eb0b517152dac609bde3901064e", size = 140036, upload-time = "2025-01-14T19:02:31.115Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/18/86218de3bf67fc1d810065f353d9df70c740de567ebee8550d476cb23862/pyobjc_framework_authenticationservices-12.1.tar.gz", hash = "sha256:cef71faeae2559f5c0ff9a81c9ceea1c81108e2f4ec7de52a98c269feff7a4b6", size = 58683, upload-time = "2025-11-14T10:09:06.003Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/06/b1911ca7903e7c6dd14201e13d66c68c75eb4c35c456fe559080159e8abe/pyobjc_framework_AuthenticationServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cd4d3d94cdeb75305cc7239efd17ca89f7b7076e7d279d6b40b6305c40a37f2", size = 20082, upload-time = "2025-01-14T18:48:17.931Z" }, - { url = "https://files.pythonhosted.org/packages/45/16/6246cf10e2d245f4018c02f351f8eb4cc93823f6e7e4dd584ab292cda786/pyobjc_framework_AuthenticationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e3b23478cf8995883acfe6c1a24503c84caf2f8dbe540377fe19fb787ce9b2", size = 20079, upload-time = "2025-01-14T18:48:19.023Z" }, - { url = "https://files.pythonhosted.org/packages/cf/0b/3011942e0ab95ec36cff31b1989d4e3f1f010683c8d07063552f5491fd7a/pyobjc_framework_AuthenticationServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e70439bcdedce5bcc9a8c138b46dc7b8122c45c1598e229a06ad6121b9ae17d6", size = 20070, upload-time = "2025-01-14T18:48:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8e/8547d8b8574c8d42802b6b904e3354243fb23daed9106333a59323b5154b/pyobjc_framework_authenticationservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39bba6cc6041467d0046a04610e8aacc852961c82055d84bf3981971780ee5eb", size = 20636, upload-time = "2025-11-14T09:36:45.048Z" }, + { url = "https://files.pythonhosted.org/packages/c2/16/2f19d8a95f0cf8e940f7b7fb506ced805d5522b4118336c8e640c34517ae/pyobjc_framework_authenticationservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c15bb81282356f3f062ac79ff4166c93097448edc44b17dcf686e1dac78cc832", size = 20636, upload-time = "2025-11-14T09:36:48.35Z" }, + { url = "https://files.pythonhosted.org/packages/f1/1d/e9f296fe1ee9a074ff6c45ce9eb109fc3b45696de000f373265c8e42fd47/pyobjc_framework_authenticationservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6fd5ce10fe5359cbbfe03eb12cab3e01992b32ab65653c579b00ac93cf674985", size = 20738, upload-time = "2025-11-14T09:36:51.094Z" }, ] [[package]] name = "pyobjc-framework-automaticassessmentconfiguration" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/d5/5febfee260b88e426c7e799cc95990818feeaa9f740fb9dd516559c96520/pyobjc_framework_automaticassessmentconfiguration-11.0.tar.gz", hash = "sha256:5d3691af2b94e44ca594b6791556e15a9f0a3f9432df51cb891f5f859a65e467", size = 24420, upload-time = "2025-01-14T19:02:32.101Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/24/080afe8189c47c4bb3daa191ccfd962400ca31a67c14b0f7c2d002c2e249/pyobjc_framework_automaticassessmentconfiguration-12.1.tar.gz", hash = "sha256:2b732c02d9097682ca16e48f5d3b10056b740bc091e217ee4d5715194c8970b1", size = 21895, upload-time = "2025-11-14T10:09:08.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/fa/a58ecd574ea89be598a4e03cbf031b7b7da889e5c07e5231259ff24f6985/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b74262d376ce3eda53c8d7d822d5d59e33141e51c1ed9b224389dd2bf235dc35", size = 9016, upload-time = "2025-01-14T18:48:24.668Z" }, - { url = "https://files.pythonhosted.org/packages/50/3f/b593adce2f5b9f9427d784db56d8195adc2cfb340d4d3578914539a17faa/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25f2db399eb0a47e345d0471c7af930f5a3be899ba6edb40bd9125719e4b526f", size = 9015, upload-time = "2025-01-14T18:48:25.686Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9b/a49c3d4bf2e145b78abc08d269875bc7f05a2617d682b6d72767bafebaf4/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fccb936592da0ab8e2269a329de7e5d0fd10ecdb151b91f1634a6b39d611fff", size = 9004, upload-time = "2025-01-14T18:48:30.085Z" }, + { url = "https://files.pythonhosted.org/packages/50/4d/e9c86cd84905f565d3bdef675f0b90516b280f18aa2f20c84be0f02e0f49/pyobjc_framework_automaticassessmentconfiguration-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:096c1f0dcd96a6e9903b70b3090747e76344324c02066026c4f7c347bc1823ae", size = 9320, upload-time = "2025-11-14T09:37:03.234Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c9/4d2785565cc470daa222f93f3d332af97de600aef6bd23507ec07501999d/pyobjc_framework_automaticassessmentconfiguration-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d94a4a3beb77b3b2ab7b610c4b41e28593d15571724a9e6ab196b82acc98dc13", size = 9316, upload-time = "2025-11-14T09:37:05.052Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b2/fbec3d649bf275d7a9604e5f56015be02ef8dcf002f4ae4d760436b8e222/pyobjc_framework_automaticassessmentconfiguration-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c2e22ea67d7e6d6a84d968169f83d92b59857a49ab12132de07345adbfea8a62", size = 9332, upload-time = "2025-11-14T09:37:07.083Z" }, ] [[package]] name = "pyobjc-framework-automator" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/1b/1ba4eb296c3915f2e367e45470cb310a9c78b4dd65a37bd522f458f245aa/pyobjc_framework_automator-11.0.tar.gz", hash = "sha256:412d330f8c6f30066cad15e1bdecdc865510bbce469cc7d9477384c4e9f2550f", size = 200905, upload-time = "2025-01-14T19:02:33.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/08/362bf6ac2bba393c46cf56078d4578b692b56857c385e47690637a72f0dd/pyobjc_framework_automator-12.1.tar.gz", hash = "sha256:7491a99347bb30da3a3f744052a03434ee29bee3e2ae520576f7e796740e4ba7", size = 186068, upload-time = "2025-11-14T10:09:20.82Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/03/a7c01ed1c030b7d38509a461df5f19304741c1a6deec149af449dd2385b3/pyobjc_framework_Automator-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8e7366d78206d028312675a9466a80084baecad1950144ddd7fc3c0f10c125ef", size = 9810, upload-time = "2025-01-14T18:48:30.976Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/bfe673491042849ad400bebf557b8047317757283b98ad9921fbb6f6cae9/pyobjc_framework_Automator-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:850f9641a54cc8d9a3d02c2d87a4e80aed2413b37aa6c26a7046088b77da5b42", size = 9811, upload-time = "2025-01-14T18:48:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/5f/13/9ae3b8e99b2c5f2e20b63d50db27ef37b794706b8ca9d354d01361bd0da2/pyobjc_framework_Automator-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34dba2a86fa1a9b10fafabaa19adb538d798b9fb740a43af063f2eb81006d18f", size = 9799, upload-time = "2025-01-14T18:48:37.151Z" }, + { url = "https://files.pythonhosted.org/packages/64/30/57d6e93adfac2d19d8607700352fb1a2e3a11a952da9986847da2e7b20b3/pyobjc_framework_automator-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa9189b481db4429e3aea6b567b0888f8c6f6ba388064be2ce6f287e19cea096", size = 10014, upload-time = "2025-11-14T09:37:16.34Z" }, + { url = "https://files.pythonhosted.org/packages/e7/99/480e07eef053a2ad2a5cf1e15f71982f21d7f4119daafac338fa0352309c/pyobjc_framework_automator-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f3d96da10d28c5c197193a9d805a13157b1cb694b6c535983f8572f5f8746ea", size = 10016, upload-time = "2025-11-14T09:37:18.621Z" }, + { url = "https://files.pythonhosted.org/packages/e3/36/2e8c36ddf20d501f9d344ed694e39021190faffc44b596f3a430bf437174/pyobjc_framework_automator-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4df9aec77f0fbca66cd3534d1b8398fe6f3e3c2748c0fc12fec2546c7f2e3ffd", size = 10034, upload-time = "2025-11-14T09:37:20.293Z" }, ] [[package]] name = "pyobjc-framework-avfoundation" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreaudio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/06/018ad0e2a38dbdbc5c126d7ce37488c4d581d4e2a2b9ef678162bb36d5f6/pyobjc_framework_avfoundation-11.0.tar.gz", hash = "sha256:269a592bdaf8a16948d8935f0cf7c8cb9a53e7ea609a963ada0e55f749ddb530", size = 871064, upload-time = "2025-01-14T19:02:35.757Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/42/c026ab308edc2ed5582d8b4b93da6b15d1b6557c0086914a4aabedd1f032/pyobjc_framework_avfoundation-12.1.tar.gz", hash = "sha256:eda0bb60be380f9ba2344600c4231dd58a3efafa99fdc65d3673ecfbb83f6fcb", size = 310047, upload-time = "2025-11-14T10:09:40.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/76/532cc41808d99c8d36aa889234008ebfe24b5cca4ece1c97a83dba299d2d/pyobjc_framework_AVFoundation-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effb2d8eac6b9ad42008043bd31e69423885c78a11e4e414dc01dd03fff79876", size = 71341, upload-time = "2025-01-14T18:47:03.346Z" }, - { url = "https://files.pythonhosted.org/packages/44/b5/327654548fa210b4637350de016183fbb1f6f8f9213d2c6c9b492eb8b44c/pyobjc_framework_AVFoundation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87db350311c1d7e07d68036cdde3d01c09d97b8ba502241c0c1699d7a9c6f2e4", size = 71345, upload-time = "2025-01-14T18:47:04.589Z" }, - { url = "https://files.pythonhosted.org/packages/84/42/74e94bb07281b4aa6a38d3374009744e2980b2c69ae9d507bdb51d242d65/pyobjc_framework_AVFoundation-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8509f0322d27be4eb20007fca3b0497dc420852cfd2467b68100d0102a9a051f", size = 71312, upload-time = "2025-01-14T18:47:11.091Z" }, + { url = "https://files.pythonhosted.org/packages/71/f3/9e59aea0a3568766f3c75ab9d5f4abf661ed9e288292ef0997a71065ca1d/pyobjc_framework_avfoundation-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:370d5f1149c1041028cb1f5fb61b9f56655fe53bbffafc79393b0824a474bef0", size = 83325, upload-time = "2025-11-14T09:37:34.346Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5a/4ef36b309138840ff8cd85364f66c29e27023f291004c335a99f6e87e599/pyobjc_framework_avfoundation-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82cc2c2d9ab6cc04feeb4700ff251d00f1fcafff573c63d4e87168ff80adb926", size = 83328, upload-time = "2025-11-14T09:37:40.808Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/ca471e5dd33f040f69320832e45415d00440260bf7f8221a9df4c4662659/pyobjc_framework_avfoundation-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bf634f89265b4d93126153200d885b6de4859ed6b3bc65e69ff75540bc398406", size = 83375, upload-time = "2025-11-14T09:37:47.262Z" }, ] [[package]] name = "pyobjc-framework-avkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/79/5b2fcb94b051da32a24b54bb0d90b1d01b190e1402b6303747de47fb17ac/pyobjc_framework_avkit-11.0.tar.gz", hash = "sha256:5fa40919320277b820df3e4c6e84cba91ef7221a28f4eb5374e3dbd80d1e521a", size = 46311, upload-time = "2025-01-14T19:02:37.018Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/a9/e44db1a1f26e2882c140f1d502d508b1f240af9048909dcf1e1a687375b4/pyobjc_framework_avkit-12.1.tar.gz", hash = "sha256:a5c0ddb0cb700f9b09c8afeca2c58952d554139e9bb078236d2355b1fddfb588", size = 28473, upload-time = "2025-11-14T10:09:43.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/ae/77ff579fe7ec884f5b3f243a3f78e51ec55f9ffcc21852f1bdcb1935223d/pyobjc_framework_AVKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b5509a4e54965f48fa20b9bb37783905afe0c0893e793910041af0e06fb6fd3e", size = 11962, upload-time = "2025-01-14T18:47:13.277Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ae/aed1023150483a288922c447e1997f4f4e9d0460038e1a070a3a53b85c19/pyobjc_framework_AVKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16b5560860c1e13e692c677ad04d8e194d0b9931dd3f15e3df4dbd7217cc8ab1", size = 11960, upload-time = "2025-01-14T18:47:15.738Z" }, - { url = "https://files.pythonhosted.org/packages/3a/1d/4b1699a3e875420524d59185937f3fd12bcca9561a0e91819c43c72ab602/pyobjc_framework_AVKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:475e7a457519761037474203c465556ec08d67bad4ccd5c97e03a95fc10945ed", size = 11948, upload-time = "2025-01-14T18:47:19.677Z" }, + { url = "https://files.pythonhosted.org/packages/e6/10/128070679c48e6289167d3498a9e6ea5ddc758f74c8d1377aa69cefc2a08/pyobjc_framework_avkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec696a9ba354cdf4271d0076ed2daf7e4779ce809a7dc3d6c9cff4e14c88c1b0", size = 11591, upload-time = "2025-11-14T09:38:15.428Z" }, + { url = "https://files.pythonhosted.org/packages/8c/68/409ee30f3418b76573c70aa05fa4c38e9b8b1d4864093edcc781d66019c2/pyobjc_framework_avkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:78bd31a8aed48644e5407b444dec8b1e15ff77af765607b52edf88b8f1213ac7", size = 11583, upload-time = "2025-11-14T09:38:17.569Z" }, + { url = "https://files.pythonhosted.org/packages/75/34/e77b18f7ed0bd707afd388702e910bdf2d0acee39d1139e8619c916d3eb4/pyobjc_framework_avkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eef2c0a51465de025a4509db05ef18ca2b678bb00ee0a8fbad7fd470edfd58f9", size = 11613, upload-time = "2025-11-14T09:38:19.78Z" }, ] [[package]] name = "pyobjc-framework-avrouting" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/80/63680dc7788bc3573a20fc5421dfcf606970a0cd3b2457829d9b66603ae0/pyobjc_framework_avrouting-11.0.tar.gz", hash = "sha256:54ec9ea0b5adb5149b554e23c07c6b4f4bdb2892ca2ed7b3e88a5de936313025", size = 20561, upload-time = "2025-01-14T19:02:38.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/83/15bf6c28ec100dae7f92d37c9e117b3b4ee6b4873db062833e16f1cfd6c4/pyobjc_framework_avrouting-12.1.tar.gz", hash = "sha256:6a6c5e583d14f6501df530a9d0559a32269a821fc8140e3646015f097155cd1c", size = 20031, upload-time = "2025-11-14T10:09:45.701Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/bb/ebe713cddbdb99d6a6ea48ca365477ee5702e1fb83c7e22ae14f8dca871f/pyobjc_framework_AVRouting-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96a1a12b83de8d8b75252e6616a79426c98488af47fe2dc3a49f4dd689dc581d", size = 8070, upload-time = "2025-01-14T18:47:24.075Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9c/ea6924de09e13f858210d6dd934f00773b1e3db6af886c72841ed545560f/pyobjc_framework_AVRouting-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:54e58cd0292f734aba035599f37a0c00f03761e9ff5cf53a0857cec7949bb39c", size = 8067, upload-time = "2025-01-14T18:47:26.354Z" }, - { url = "https://files.pythonhosted.org/packages/a6/30/5fd5593b25167fc9d4a27ac7ea750acf5a601e003e0082b7dfebed0ff78b/pyobjc_framework_AVRouting-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8df64a3074d26aeef8ed41372d0cd4b4d78862776caaa9ebcf19e0c7a5e0adac", size = 8054, upload-time = "2025-01-14T18:47:32.47Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/3172fb969eaa782859ed466f9cbeb2ee8771da5a340bb052a34b54efda90/pyobjc_framework_avrouting-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9724fcd834a8ee206df25139c3033bd508a4a830ac6d91dd7c611a03085386", size = 8431, upload-time = "2025-11-14T09:38:30.93Z" }, + { url = "https://files.pythonhosted.org/packages/69/a7/5c5725db9c91b492ffbd4ae3e40025deeb9e60fcc7c8fbd5279b52280b95/pyobjc_framework_avrouting-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a79f05fb66e337cabc19a9d949c8b29a5145c879f42e29ba02b601b7700d1bb", size = 8431, upload-time = "2025-11-14T09:38:33.018Z" }, + { url = "https://files.pythonhosted.org/packages/68/54/fa24f666525c1332a11b2de959c9877b0fe08f00f29ecf96964b24246c13/pyobjc_framework_avrouting-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c0fb0d3d260527320377a70c87688ca5e4a208b09fddcae2b4257d7fe9b1e18", size = 8450, upload-time = "2025-11-14T09:38:34.941Z" }, ] [[package]] name = "pyobjc-framework-backgroundassets" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/17/83b873069b0c0763365de88648ad4a2472e9e96fcac39fa534f3633552e8/pyobjc_framework_backgroundassets-11.0.tar.gz", hash = "sha256:9488c3f86bf427898a88b7100e77200c08a487a35c75c1b5735bd69c57ba38cb", size = 23658, upload-time = "2025-01-14T19:02:42.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/d1/e917fba82790495152fd3508c5053827658881cf7e9887ba60def5e3f221/pyobjc_framework_backgroundassets-12.1.tar.gz", hash = "sha256:8da34df9ae4519c360c429415477fdaf3fbba5addbc647b3340b8783454eb419", size = 26210, upload-time = "2025-11-14T10:09:48.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/e7934e4f52da666738986e53348f1e7a5fc8db3d8a95266b9e00a72a0c78/pyobjc_framework_BackgroundAssets-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bdcef4c0d0149d827a307de1426aeb93eb0507d8ba43686adab300977c943bb", size = 9499, upload-time = "2025-01-14T18:48:38.126Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9d/bea4408649199340ec7ed154bbaa1942a0b0955006b3153088b3f35e6ff6/pyobjc_framework_BackgroundAssets-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:812bcc4eaf71c1cc42e94edc2b5ad0414d16cfe1da5c421edd9382417d625f06", size = 9499, upload-time = "2025-01-14T18:48:39.156Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2b/844855c7feedb0317ca38664e07d5333fe008f424b86f440300603a170d1/pyobjc_framework_BackgroundAssets-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fe7c350b1bde594241485b67d06a7370f2a676267fc6eca3a99ee31f76d19bec", size = 9488, upload-time = "2025-01-14T18:48:42.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/28/6684b16c1d69305e8802732c7069d0e0d9b72b8f9b020ebec8f9da719798/pyobjc_framework_backgroundassets-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5af9d7db623e14876e3cbb79cd4234558162dad307fd341d141089652bb94bed", size = 10761, upload-time = "2025-11-14T09:38:44.917Z" }, + { url = "https://files.pythonhosted.org/packages/c1/49/33c1c3eaf26a7d89dd414e14939d4f02063d66252d0f51c02082350223e0/pyobjc_framework_backgroundassets-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17de7990b5ea8047d447339f9e9e6f54b954ffc06647c830932a1688c4743fea", size = 10763, upload-time = "2025-11-14T09:38:46.671Z" }, + { url = "https://files.pythonhosted.org/packages/de/34/bbba61f0e8ecb0fe0da7aa2c9ea15f7cb0dca2fb2914fcdcd77b782b5c11/pyobjc_framework_backgroundassets-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2c11cb98650c1a4bc68eeb4b040541ba96613434c5957e98e9bb363413b23c91", size = 10786, upload-time = "2025-11-14T09:38:48.341Z" }, ] [[package]] name = "pyobjc-framework-browserenginekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreaudio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/2e/df3d2f7e53132d398c2922d331dd1d2aa352997a1a4a1390e59db51c1d13/pyobjc_framework_browserenginekit-11.0.tar.gz", hash = "sha256:51971527f5103c0e09a4ef438c352ebb037fcad8971f8420a781c72ee421f758", size = 31352, upload-time = "2025-01-14T19:02:45.499Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/b9/39f9de1730e6f8e73be0e4f0c6087cd9439cbe11645b8052d22e1fb8e69b/pyobjc_framework_browserenginekit-12.1.tar.gz", hash = "sha256:6a1a34a155778ab55ab5f463e885f2a3b4680231264e1fe078e62ddeccce49ed", size = 29120, upload-time = "2025-11-14T10:09:51.582Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/f9/a4b3d26670424c1599b395b74154c68550dfa49ad0a73286d1c7eaddea12/pyobjc_framework_BrowserEngineKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b519e5f1441c12e4df0042bfee7f743dd9dc93972190b1f2d65cad71013f753d", size = 10914, upload-time = "2025-01-14T18:48:43.793Z" }, - { url = "https://files.pythonhosted.org/packages/da/6d/6aa929d4993453817523db9c82a4e6e2cce7104fa59e29ee857f9e926b0d/pyobjc_framework_BrowserEngineKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:58494bc3ccc21a63751b7c9f8788d0240c3f1aad84cf221c0e42c9764a069ba4", size = 10913, upload-time = "2025-01-14T18:48:44.801Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d7/eacd2dc2e6293bb934c296b33c0589c6e8a693779565ac3d98db7cda90d2/pyobjc_framework_BrowserEngineKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9503aac83931662c6823c635b90ef18d5e45fc77c657db01edc4941dbbf30b32", size = 10898, upload-time = "2025-01-14T18:48:50.214Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/3d8dadd9f2da1f5a754fa7b2433013addeb56b1a3c512b6e147503b25eb7/pyobjc_framework_browserenginekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8161ac3a9e19b794d47c0022cd2b956818956bda355e4897a687850faf6ab380", size = 11527, upload-time = "2025-11-14T09:38:56.874Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a4/2d576d71b2e4b3e1a9aa9fd62eb73167d90cdc2e07b425bbaba8edd32ff5/pyobjc_framework_browserenginekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:41229c766fb3e5bba2de5e580776388297303b4d63d3065fef3f67b77ec46c3f", size = 11526, upload-time = "2025-11-14T09:38:58.861Z" }, + { url = "https://files.pythonhosted.org/packages/46/e0/8d2cebbfcfd6aacb805ae0ae7ba931f6a39140540b2e1e96719e7be28359/pyobjc_framework_browserenginekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d15766bb841b081447015c9626e2a766febfe651f487893d29c5d72bef976b94", size = 11545, upload-time = "2025-11-14T09:39:00.988Z" }, ] [[package]] name = "pyobjc-framework-businesschat" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/f2/4541989f2c9c5fc3cdfc94ebf31fc6619554b6c22dafdbb57f866a392bc1/pyobjc_framework_businesschat-11.0.tar.gz", hash = "sha256:20fe1c8c848ef3c2e132172d9a007a8aa65b08875a9ca5c27afbfc4396b16dbb", size = 12953, upload-time = "2025-01-14T19:02:46.378Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/da/bc09b6ed19e9ea38ecca9387c291ca11fa680a8132d82b27030f82551c23/pyobjc_framework_businesschat-12.1.tar.gz", hash = "sha256:f6fa3a8369a1a51363e1757530128741d9d09ed90692a1d6777a4c0fbad25868", size = 12055, upload-time = "2025-11-14T10:09:53.436Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/5b/d7313368ea4056092400c7a4ed5c705d3d21a443641d98b140054edbd930/pyobjc_framework_BusinessChat-11.0-py2.py3-none-any.whl", hash = "sha256:1f732fdace31d2abdd14b3054f27a5e0f4591c7e1bef069b6aeb4f9c8d9ec487", size = 3408, upload-time = "2025-01-14T18:48:51.116Z" }, - { url = "https://files.pythonhosted.org/packages/8a/e6/c82e2eb2b4ad4407f1ada6d41ef583eb211cce88ffcc2e05c826760f721d/pyobjc_framework_BusinessChat-11.0-py3-none-any.whl", hash = "sha256:47a2e4da9b061daa89a6367cb0e6bb8cdea0627379dd6d5095a8fd20243d8613", size = 3477, upload-time = "2025-01-14T18:48:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/53/88/4c727424b05efa33ed7f6c45e40333e5a8a8dc5bb238e34695addd68463b/pyobjc_framework_businesschat-12.1-py2.py3-none-any.whl", hash = "sha256:f66ce741507b324de3c301d72ba0cfa6aaf7093d7235972332807645c118cc29", size = 3474, upload-time = "2025-11-14T09:39:10.771Z" }, ] [[package]] name = "pyobjc-framework-calendarstore" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/d3/722c1b16c7d9bdd5c408735c15193e8396f2d22ab6410b0af4569f39c46e/pyobjc_framework_calendarstore-11.0.tar.gz", hash = "sha256:40173f729df56b70ec14f9680962a248c3ce7b4babb46e8b0d760a13975ef174", size = 68475, upload-time = "2025-01-14T19:02:48.544Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/41/ae955d1c44dcc18b5b9df45c679e9a08311a0f853b9d981bca760cf1eef2/pyobjc_framework_calendarstore-12.1.tar.gz", hash = "sha256:f9a798d560a3c99ad4c0d2af68767bc5695d8b1aabef04d8377861cd1d6d1670", size = 52272, upload-time = "2025-11-14T10:09:58.48Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/e1/02bda98aae43957943adb09700265603f8ff8ff2197e57b082237a8e1a8f/pyobjc_framework_CalendarStore-11.0-py2.py3-none-any.whl", hash = "sha256:67ddc18c96bba42118fc92f1117b053c58c8888edb74193f0be67a10051cc9e2", size = 5183, upload-time = "2025-01-14T18:49:01.649Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5b/922df21b738e8d349df27b2a73eaf8bba93c84c8c4d0d133fdd5de2ff236/pyobjc_framework_CalendarStore-11.0-py3-none-any.whl", hash = "sha256:9b310fe66ac12e0feb7c8e3166034bec357a45f7f8b8916e93eddc6f199d08c8", size = 5251, upload-time = "2025-01-14T18:49:03.224Z" }, + { url = "https://files.pythonhosted.org/packages/fa/70/f68aebdb7d3fa2dec2e9da9e9cdaa76d370de326a495917dbcde7bb7711e/pyobjc_framework_calendarstore-12.1-py2.py3-none-any.whl", hash = "sha256:18533e0fcbcdd29ee5884dfbd30606710f65df9b688bf47daee1438ee22e50cc", size = 5285, upload-time = "2025-11-14T09:39:12.473Z" }, ] [[package]] name = "pyobjc-framework-callkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/0a/9d39ebac92006960b8059f664d8eb7b9cdb8763fe4e8102b2d24b853004f/pyobjc_framework_callkit-11.0.tar.gz", hash = "sha256:52e44a05d0357558e1479977ed2bcb325fabc8d337f641f0249178b5b491fc59", size = 39720, upload-time = "2025-01-14T19:02:50.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c0/1859d4532d39254df085309aff55b85323576f00a883626325af40da4653/pyobjc_framework_callkit-12.1.tar.gz", hash = "sha256:fd6dc9688b785aab360139d683be56f0844bf68bf5e45d0eb770cb68221083cc", size = 29171, upload-time = "2025-11-14T10:10:01.336Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/86/8d7dc24702ae810b6230d8b2cebb1c31e12abc31507095b1a9655715c921/pyobjc_framework_CallKit-11.0-py2.py3-none-any.whl", hash = "sha256:f19d94b61ecd981f4691fd244f536f947687b872ac793ccc2b3122b3854e887a", size = 5248, upload-time = "2025-01-14T18:49:05.438Z" }, - { url = "https://files.pythonhosted.org/packages/25/bd/ff89f7e5438c767fc43f603bee42a447315be48a09f64b9aa4da719ecdfc/pyobjc_framework_CallKit-11.0-py3-none-any.whl", hash = "sha256:95394b7f7a50916debe4f7a884ce9135d11733a14e07a8c502171e77bd0087a4", size = 5314, upload-time = "2025-01-14T18:49:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/bc/00/cca0a68bc794afe570a0633d886d0476fe9cecaf6800364eeec77f1a3e6a/pyobjc_framework_callkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57e8c04d8e4f9358d0fe1f14862caf9aa74ae5ba90c8cae1751798a24b459166", size = 11275, upload-time = "2025-11-14T09:39:14.458Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f6/aafd14b31e00d59d830f9a8e8e46c4f41a249f0370499d5b017599362cf1/pyobjc_framework_callkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e73beae08e6a32bcced8d5bdb45b52d6a0866dd1485eaaddba6063f17d41fcb0", size = 11273, upload-time = "2025-11-14T09:39:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b7/b3a498b14751b4be6af5272c9be9ded718aa850ebf769b052c7d610a142a/pyobjc_framework_callkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:12adc0ace464a057f8908187698e1d417c6c53619797a69d096f4329bffb1089", size = 11334, upload-time = "2025-11-14T09:39:18.622Z" }, ] [[package]] name = "pyobjc-framework-carbon" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/15/51964f36a8ae1002b16d213d2e5ba11cc861bdd9369f1e3f116350d788c5/pyobjc_framework_carbon-11.0.tar.gz", hash = "sha256:476f690f0b34aa9e4cb3923e61481aefdcf33e38ec6087b530a94871eee2b914", size = 37538, upload-time = "2025-01-14T19:02:51.62Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/0f/9ab8e518a4e5ac4a1e2fdde38a054c32aef82787ff7f30927345c18b7765/pyobjc_framework_carbon-12.1.tar.gz", hash = "sha256:57a72807db252d5746caccc46da4bd20ff8ea9e82109af9f72735579645ff4f0", size = 37293, upload-time = "2025-11-14T10:10:04.464Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/fb/e5724934c3a2bbed4fbda4230e15a8b7b86313b39491876647300cb4fb11/pyobjc_framework_Carbon-11.0-py2.py3-none-any.whl", hash = "sha256:beef5095269d8e5427e09f9687963515c1b79fbf6927ff756a8414445892987d", size = 4700, upload-time = "2025-01-14T18:49:07.341Z" }, - { url = "https://files.pythonhosted.org/packages/1a/3d/b53c2d8949067f3f45491e250620e437569f1b4e6a028f2f5e721726283e/pyobjc_framework_Carbon-11.0-py3-none-any.whl", hash = "sha256:9a269042e8f5705897ac64d2b48515ba055462c88460cf140f5d8d4b8c806a42", size = 4768, upload-time = "2025-01-14T18:49:10.256Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/91853c8f98b9d5bccf464113908620c94cc12c2a3e4625f3ce172e3ea4bc/pyobjc_framework_carbon-12.1-py2.py3-none-any.whl", hash = "sha256:f8b719b3c7c5cf1d61ac7c45a8a70b5e5e5a83fa02f5194c2a48a7e81a3d1b7f", size = 4625, upload-time = "2025-11-14T09:39:27.937Z" }, ] [[package]] name = "pyobjc-framework-cfnetwork" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/36/7cebdfb621c7d46eeab3173256bc2e1cba1bbbbe6c0ac8aeb9a4fe2a4627/pyobjc_framework_cfnetwork-11.0.tar.gz", hash = "sha256:eb742fc6a42b248886ff09c3cf247d56e65236864bbea4264e70af8377948d96", size = 78532, upload-time = "2025-01-14T19:02:52.777Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/6a/f5f0f191956e187db85312cbffcc41bf863670d121b9190b4a35f0d36403/pyobjc_framework_cfnetwork-12.1.tar.gz", hash = "sha256:2d16e820f2d43522c793f55833fda89888139d7a84ca5758548ba1f3a325a88d", size = 44383, upload-time = "2025-11-14T10:10:08.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/2c/be8b61bb1f31df7cd7420c299c1592dc88b5c8f7978d4f268aab9333dc2a/pyobjc_framework_CFNetwork-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f6c2508d6daf2e8777b29a77f93e39517e8617def7fe5f6f31952897f8e9ed2", size = 18987, upload-time = "2025-01-14T18:48:53.67Z" }, - { url = "https://files.pythonhosted.org/packages/d9/85/11047cfe2d31c242694d780783f0dea81d73cbb09929c7d4b918ce2d29bf/pyobjc_framework_CFNetwork-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e6905c86ccb5608f4153aacb931758ad39af8b708fcebb497431f9741f39e6d", size = 18988, upload-time = "2025-01-14T18:48:54.869Z" }, - { url = "https://files.pythonhosted.org/packages/dc/49/5616f6a46b7b180562aa22049f549941e4e55aa22e21a7672bc8b5744a01/pyobjc_framework_CFNetwork-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8a0615a76b68315d1e71fb28ad42c187a3b9b212678b2d3640937ecdd33d4a3b", size = 18971, upload-time = "2025-01-14T18:49:00.598Z" }, + { url = "https://files.pythonhosted.org/packages/62/21/1cebc1396e966d4acede1e3368b3cf8c2def32f4b35f8c65fd003a3f5510/pyobjc_framework_cfnetwork-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d54206b13f44f2503db53efbdb76d892c719959fb620266875d9934ceb586f2d", size = 18945, upload-time = "2025-11-14T09:39:30.172Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7e/82aca783499b690163dd19d5ccbba580398970874a3431bfd7c14ceddbb3/pyobjc_framework_cfnetwork-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3bf93c0f3d262f629e72f8dd43384d0930ed8e610b3fc5ff555c0c1a1e05334a", size = 18949, upload-time = "2025-11-14T09:39:32.924Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0b/28034e63f3a25b30ede814469c3f57d44268cbced19664c84a8664200f9d/pyobjc_framework_cfnetwork-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:92760da248c757085fc39bce4388a0f6f0b67540e51edf60a92ad60ca907d071", size = 19135, upload-time = "2025-11-14T09:39:36.382Z" }, ] [[package]] name = "pyobjc-framework-cinematic" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-avfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-metal", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-metal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/ef/b5857d567cd6e0366f61c381ebea52383b98d1ac03341f39e779a085812a/pyobjc_framework_cinematic-11.0.tar.gz", hash = "sha256:94a2de8bf3f38bd190311b6bf98d1e2cea7888840b3ce3aa92e464c0216a5cdb", size = 25740, upload-time = "2025-01-14T19:02:54.95Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/4e/f4cc7f9f7f66df0290c90fe445f1ff5aa514c6634f5203fe049161053716/pyobjc_framework_cinematic-12.1.tar.gz", hash = "sha256:795068c30447548c0e8614e9c432d4b288b13d5614622ef2f9e3246132329b06", size = 21215, upload-time = "2025-11-14T10:10:10.795Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/cf/a60e131bddf5cced32a3c0050d264f2255d63c45be398cede1db03ea8b51/pyobjc_framework_Cinematic-11.0-py2.py3-none-any.whl", hash = "sha256:281721969978d726ded9bae38c4acd6713495c399025ff2b4179fc02ec68b336", size = 4508, upload-time = "2025-01-14T18:49:11.202Z" }, - { url = "https://files.pythonhosted.org/packages/09/a8/4ea347c1fc5774e2bbe7bb688fc625d583103d1e212f7b896ed19d14844b/pyobjc_framework_Cinematic-11.0-py3-none-any.whl", hash = "sha256:3a24f3528d7f77637f51fd1862cc8c79e4d0da4ba6fd3dd02b54adddec365826", size = 4580, upload-time = "2025-01-14T18:49:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a0/cd85c827ce5535c08d936e5723c16ee49f7ff633f2e9881f4f58bf83e4ce/pyobjc_framework_cinematic-12.1-py2.py3-none-any.whl", hash = "sha256:c003543bb6908379680a93dfd77a44228686b86c118cf3bc930f60241d0cd141", size = 5031, upload-time = "2025-11-14T09:39:49.003Z" }, ] [[package]] name = "pyobjc-framework-classkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/81/126075eaf5ccf254ddb4cfd99d92a266c30803c5b4572ea3a920fd85e850/pyobjc_framework_classkit-11.0.tar.gz", hash = "sha256:dc5b3856612cafdc7071fbebc252b8908dbf2433e0e5ddb15a0bcd1ee282d27c", size = 39301, upload-time = "2025-01-14T19:02:55.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/ef/67815278023b344a79c7e95f748f647245d6f5305136fc80615254ad447c/pyobjc_framework_classkit-12.1.tar.gz", hash = "sha256:8d1e9dd75c3d14938ff533d88b72bca2d34918e4461f418ea323bfb2498473b4", size = 26298, upload-time = "2025-11-14T10:10:13.406Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/e4/1d533bf433f687c875dae7afa438ab73aa65cb31a3aed9939ed5b5739574/pyobjc_framework_ClassKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cb0554218dfd22c61f51b108a286ad17696d5cd7349b5309233c9c9edaee0ed", size = 8770, upload-time = "2025-01-14T18:49:13.103Z" }, - { url = "https://files.pythonhosted.org/packages/a8/77/2e31bcf1e9b63f6723c01329c1191ac163e79b0f548b7cd92414115c26ff/pyobjc_framework_ClassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:723a07591e1e40380c339b58033e8491e58be4080c0f77a26be0728f1c5025c8", size = 8776, upload-time = "2025-01-14T18:49:14.05Z" }, - { url = "https://files.pythonhosted.org/packages/19/09/46bd32512e9f412d6f6dea4c65f3ee72aec70e922f4e8f942ec6042a85f2/pyobjc_framework_ClassKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:77697228c5a3f039dbe4a315bfc6f82ca647b3e497bb03e9d6f3215826f6a3db", size = 8761, upload-time = "2025-01-14T18:49:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/59/23/75ce71520f0f1930cea460522a217819094f074ae8e6296166f86f872ed9/pyobjc_framework_classkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7fbca9dbd9485ec21c3bc64f0e27ce1037095db71bd16718f883b6f22ab0f9a0", size = 8858, upload-time = "2025-11-14T09:39:50.778Z" }, + { url = "https://files.pythonhosted.org/packages/14/e2/67bd062fbc9761c34b9911ed099ee50ccddc3032779ce420ca40083ee15c/pyobjc_framework_classkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bd90aacc68eff3412204a9040fa81eb18348cbd88ed56d33558349f3e51bff52", size = 8857, upload-time = "2025-11-14T09:39:53.283Z" }, + { url = "https://files.pythonhosted.org/packages/87/5e/cf43c647af872499fc8e80cc6ac6e9ad77d9c77861dc2e62bdd9b01473ce/pyobjc_framework_classkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c027a3cd9be5fee3f605589118b8b278297c384a271f224c1a98b224e0c087e6", size = 8877, upload-time = "2025-11-14T09:39:54.979Z" }, ] [[package]] name = "pyobjc-framework-cloudkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-accounts", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coredata", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corelocation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accounts" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corelocation" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/89/6c/b0709fed7fc5a1e81de311b9273bb7ba3820a636f8ba880e90510bb6d460/pyobjc_framework_cloudkit-11.0.tar.gz", hash = "sha256:e3f6bf2c3358dd394174b1e69fcec6859951fcd15f6433c6fa3082e3b7e2656d", size = 123034, upload-time = "2025-01-14T19:02:56.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/09/762ee4f3ae8568b8e0e5392c705bc4aa1929aa454646c124ca470f1bf9fc/pyobjc_framework_cloudkit-12.1.tar.gz", hash = "sha256:1dddd38e60863f88adb3d1d37d3b4ccb9cbff48c4ef02ab50e36fa40c2379d2f", size = 53730, upload-time = "2025-11-14T10:10:17.831Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/db/9f914422be88eb2c917d67aebac9dde2e272ea1b510ca1e0db17a09db125/pyobjc_framework_CloudKit-11.0-py2.py3-none-any.whl", hash = "sha256:10cb153d7185dd260d21596f75fca8502236f6afd8e72e866cff8acd9c025f14", size = 10785, upload-time = "2025-01-14T18:49:21.369Z" }, - { url = "https://files.pythonhosted.org/packages/53/73/239581763a1bd56475ebd9bdde52a79cf0b6cac20b3d4442283b1ef8705c/pyobjc_framework_CloudKit-11.0-py3-none-any.whl", hash = "sha256:b2376d92d5822ce7e4feefcffdc3f4d1d230929f1735793da6d36b52b161b552", size = 10854, upload-time = "2025-01-14T18:49:23.612Z" }, + { url = "https://files.pythonhosted.org/packages/35/71/cbef7179bf1a594558ea27f1e5ad18f5c17ef71a8a24192aae16127bc849/pyobjc_framework_cloudkit-12.1-py2.py3-none-any.whl", hash = "sha256:875e37bf1a2ce3d05c2492692650104f2d908b56b71a0aedf6620bc517c6c9ca", size = 11090, upload-time = "2025-11-14T09:40:04.207Z" }, ] [[package]] name = "pyobjc-framework-cocoa" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/32/53809096ad5fc3e7a2c5ddea642590a5f2cb5b81d0ad6ea67fdb2263d9f9/pyobjc_framework_cocoa-11.0.tar.gz", hash = "sha256:00346a8cb81ad7b017b32ff7bf596000f9faa905807b1bd234644ebd47f692c5", size = 6173848, upload-time = "2025-01-14T19:03:00.125Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/a3/16ca9a15e77c061a9250afbae2eae26f2e1579eb8ca9462ae2d2c71e1169/pyobjc_framework_cocoa-12.1.tar.gz", hash = "sha256:5556c87db95711b985d5efdaaf01c917ddd41d148b1e52a0c66b1a2e2c5c1640", size = 2772191, upload-time = "2025-11-14T10:13:02.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/16/905a32c5241848ddd91d94bae346342750f28f49fadb3746e9e796f929f3/pyobjc_framework_Cocoa-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fbc65f260d617d5463c7fb9dbaaffc23c9a4fabfe3b1a50b039b61870b8daefd", size = 385509, upload-time = "2025-01-14T18:49:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/23/97/81fd41ad90e9c241172110aa635a6239d56f50d75923aaedbbe351828580/pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33", size = 385534, upload-time = "2025-01-14T18:49:27.898Z" }, - { url = "https://files.pythonhosted.org/packages/27/29/459cacd815c2e13de60b919c0af3d1056f74ff52172a4841684b5b946492/pyobjc_framework_Cocoa-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ddff25b0755d59873d186e1e07d6aaddb19d55e3ae890d69ff2d9babf8627657", size = 385407, upload-time = "2025-01-14T18:49:34.56Z" }, + { url = "https://files.pythonhosted.org/packages/b2/aa/2b2d7ec3ac4b112a605e9bd5c5e5e4fd31d60a8a4b610ab19cc4838aa92a/pyobjc_framework_cocoa-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9b880d3bdcd102809d704b6d8e14e31611443aa892d9f60e8491e457182fdd48", size = 383825, upload-time = "2025-11-14T09:40:28.354Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/5760735c0fffc65107e648eaf7e0991f46da442ac4493501be5380e6d9d4/pyobjc_framework_cocoa-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52228bcf38da64b77328787967d464e28b981492b33a7675585141e1b0a01e6", size = 383812, upload-time = "2025-11-14T09:40:53.169Z" }, + { url = "https://files.pythonhosted.org/packages/95/bf/ee4f27ec3920d5c6fc63c63e797c5b2cc4e20fe439217085d01ea5b63856/pyobjc_framework_cocoa-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:547c182837214b7ec4796dac5aee3aa25abc665757b75d7f44f83c994bcb0858", size = 384590, upload-time = "2025-11-14T09:41:17.336Z" }, ] [[package]] name = "pyobjc-framework-collaboration" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/ee/1f6893eb882af5ecc6a6f4182b2ec85df777c4bc6b9a20a6b42c23abff3f/pyobjc_framework_collaboration-11.0.tar.gz", hash = "sha256:9f53929dd6d5b1a5511494432bf83807041c6f8b9ab6cf6ff184eee0b6f8226f", size = 17084, upload-time = "2025-01-14T19:03:01.98Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/21/77fe64b39eae98412de1a0d33e9c735aa9949d53fff6b2d81403572b410b/pyobjc_framework_collaboration-12.1.tar.gz", hash = "sha256:2afa264d3233fc0a03a56789c6fefe655ffd81a2da4ba1dc79ea0c45931ad47b", size = 14299, upload-time = "2025-11-14T10:13:04.631Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ee/95883b6fbdbeecd99217c50c415ca024db5beb1923b935189a113412203d/pyobjc_framework_Collaboration-11.0-py2.py3-none-any.whl", hash = "sha256:acf11e584e21f6342e6d7be1675f36c92804082c29d2f373d1ca623a63959e76", size = 4807, upload-time = "2025-01-14T18:49:37.145Z" }, - { url = "https://files.pythonhosted.org/packages/c0/e5/d3ba7e3e3f306ba93c021c083287c668704d84605e0f788583abcfde815f/pyobjc_framework_Collaboration-11.0-py3-none-any.whl", hash = "sha256:e7789503ea9280ba365ce2c4e6c7c8b13dfa9174b2ecf9d174bbf9773f25f97a", size = 4876, upload-time = "2025-01-14T18:49:39.887Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/1507de01f1e2b309f8e11553a52769e4e2e9939ed770b5b560ef5bc27bc1/pyobjc_framework_collaboration-12.1-py2.py3-none-any.whl", hash = "sha256:182d6e6080833b97f9bef61738ae7bacb509714538f0d7281e5f0814c804b315", size = 4907, upload-time = "2025-11-14T09:42:55.781Z" }, ] [[package]] name = "pyobjc-framework-colorsync" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/24/397a80cd2313cc9e1b73b9acb1de66b740bbece4fe87ed4ea158de8fcef8/pyobjc_framework_colorsync-11.0.tar.gz", hash = "sha256:4f531f6075d9cc4b9d426620a1b04d3aaeb56b5ff178d0a6b0e93d068a5db0d2", size = 39249, upload-time = "2025-01-14T19:03:02.887Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/b4/706e4cc9db25b400201fc90f3edfaa1ab2d51b400b19437b043a68532078/pyobjc_framework_colorsync-12.1.tar.gz", hash = "sha256:d69dab7df01245a8c1bd536b9231c97993a5d1a2765d77692ce40ebbe6c1b8e9", size = 25269, upload-time = "2025-11-14T10:13:07.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/16/d806b5c3ff5bf8f46a4770f89b2076d2596c1301c851c60bb43aea457cd3/pyobjc_framework_ColorSync-11.0-py2.py3-none-any.whl", hash = "sha256:24f5c3e0987bfdfe6a0de36f2f908e30ea52000eb649db7b0373928140518163", size = 5916, upload-time = "2025-01-14T18:49:41.273Z" }, - { url = "https://files.pythonhosted.org/packages/06/18/777bad37aab42f75d2ef2efb9240308c15c33b3a0636278111ec6c5df550/pyobjc_framework_ColorSync-11.0-py3-none-any.whl", hash = "sha256:cbee2211f64be927eb4e4717bf6e275bf28954ed86e4a4655d367c30f856494d", size = 5987, upload-time = "2025-01-14T18:49:42.286Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e1/82e45c712f43905ee1e6d585180764e8fa6b6f1377feb872f9f03c8c1fb8/pyobjc_framework_colorsync-12.1-py2.py3-none-any.whl", hash = "sha256:41e08d5b9a7af4b380c9adab24c7ff59dfd607b3073ae466693a3e791d8ffdc9", size = 6020, upload-time = "2025-11-14T09:42:57.504Z" }, +] + +[[package]] +name = "pyobjc-framework-compositorservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/c5/0ba31d7af7e464b7f7ece8c2bd09112bdb0b7260848402e79ba6aacc622c/pyobjc_framework_compositorservices-12.1.tar.gz", hash = "sha256:028e357bbee7fbd3723339a321bbe14e6da5a772708a661a13eea5f17c89e4ab", size = 23292, upload-time = "2025-11-14T10:13:10.392Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/34/5a2de8d531dbb88023898e0b5d2ce8edee14751af6c70e6103f6aa31a669/pyobjc_framework_compositorservices-12.1-py2.py3-none-any.whl", hash = "sha256:9ef22d4eacd492e13099b9b8936db892cdbbef1e3d23c3484e0ed749f83c4984", size = 5910, upload-time = "2025-11-14T09:42:59.154Z" }, ] [[package]] name = "pyobjc-framework-contacts" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/a2/89053853b28c1f2f2e69092d3e81b7c26073bc8396fc87772b3b1bfb9d57/pyobjc_framework_contacts-11.0.tar.gz", hash = "sha256:fc215baa9f66dbf9ffa1cb8170d102a3546cfd708b2b42de4e9d43645aec03d9", size = 84253, upload-time = "2025-01-14T19:03:03.743Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/a0/ce0542d211d4ea02f5cbcf72ee0a16b66b0d477a4ba5c32e00117703f2f0/pyobjc_framework_contacts-12.1.tar.gz", hash = "sha256:89bca3c5cf31404b714abaa1673577e1aaad6f2ef49d4141c6dbcc0643a789ad", size = 42378, upload-time = "2025-11-14T10:13:14.203Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/90/1ec0c9beee4bdb7106454f1132424b0adbf60c968fbcc54e2ca50a014aea/pyobjc_framework_Contacts-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:562b284c44366eaacfbc4bd65d541888e12e21e888acb6bcbf721beaeb69d411", size = 11878, upload-time = "2025-01-14T18:49:43.198Z" }, - { url = "https://files.pythonhosted.org/packages/91/4f/b7a7b08535015494940a62fd63825eccf4cace7f8ca87050f0837470eca8/pyobjc_framework_Contacts-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b16758fc1edc40f0ec288d67b7e39b59609fb1df2523f4362c958d150619dbe5", size = 11880, upload-time = "2025-01-14T18:49:44.316Z" }, - { url = "https://files.pythonhosted.org/packages/b2/57/0ee0fa747df6ce9c925877385ce39ff34a343d659a3248397e07fc22ec15/pyobjc_framework_Contacts-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:71ce63f364a3bedb065a3c34ad40157e34e84b0fe3d648b6944cace2958c23b9", size = 11863, upload-time = "2025-01-14T18:49:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/fe/49/a95ea5ab95170b1e497275928e275d871ab698c4d65611fcc2a685b6bf4d/pyobjc_framework_contacts-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b570807aaead01b51c25cb425526f4ac3527eec25fa8672fd450a1b558c037", size = 12086, upload-time = "2025-11-14T09:43:01.115Z" }, + { url = "https://files.pythonhosted.org/packages/94/f5/5d2c03cf5219f2e35f3f908afa11868e9096aff33b29b41d63f2de3595f2/pyobjc_framework_contacts-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8ab86070895a005239256d207e18209b1a79d35335b6604db160e8375a7165e6", size = 12086, upload-time = "2025-11-14T09:43:03.225Z" }, + { url = "https://files.pythonhosted.org/packages/32/c8/2c4638c0d06447886a34070eebb9ba57407d4dd5f0fcb7ab642568272b88/pyobjc_framework_contacts-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e5ce33b686eb9c0a39351938a756442ea8dea88f6ae2f16bff5494a8569c687", size = 12165, upload-time = "2025-11-14T09:43:05.119Z" }, ] [[package]] name = "pyobjc-framework-contactsui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-contacts", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-contacts" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/67/122b16fd7f2da7f0f48c1d7fcaf0f1951253ddd5489d909a1b5fb80f3925/pyobjc_framework_contactsui-11.0.tar.gz", hash = "sha256:d0f2a4afea807fbe4db1518c4f81f0dc9aa1817fe7cb16115308fc00375a70db", size = 19486, upload-time = "2025-01-14T19:03:04.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/0c/7bb7f898456a81d88d06a1084a42e374519d2e40a668a872b69b11f8c1f9/pyobjc_framework_contactsui-12.1.tar.gz", hash = "sha256:aaeca7c9e0c9c4e224d73636f9a558f9368c2c7422155a41fd4d7a13613a77c1", size = 18769, upload-time = "2025-11-14T10:13:16.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/ff/c1cbcb3a0eeaf847d11e78c717c60640dd834c671768eaf4d051baa052e7/pyobjc_framework_ContactsUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:415bc82c0e995197b10f2638d56519383cbdf3b087a0126014ebf241b6ab212e", size = 7733, upload-time = "2025-01-14T18:49:51.742Z" }, - { url = "https://files.pythonhosted.org/packages/fc/47/b1dbe48c64e2d061bf8b4ee532413b97e6c5748fdba43598a30421086fcc/pyobjc_framework_ContactsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd3efaf3f67e92704f41927c5de06ccc4aa9daa09865cba7ac476da9c6e1c3c2", size = 7734, upload-time = "2025-01-14T18:49:52.765Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a7/3f5cc1d1ffa8ff0feb73e0fd1cc064bf49832d35f3870652257442967bb0/pyobjc_framework_ContactsUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:dfa32df15da9b4ebb77ce09ac3bea7765f7402cedfb7e489f4d44a056cfd1fd6", size = 7713, upload-time = "2025-01-14T18:49:58.523Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6d/4d5070c4ce85e0aaf95aed8a1d482fafd031ebe30f70f7788c2a7737d661/pyobjc_framework_contactsui-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9aedac00f41c1fae02befc70263f22f74518cc392fe19b66cc325d8f95e78b2c", size = 7874, upload-time = "2025-11-14T09:43:14.698Z" }, + { url = "https://files.pythonhosted.org/packages/04/e3/8d330640bf0337289834334c54c599fec2dad38a8a3b736d40bcb5d8db6e/pyobjc_framework_contactsui-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:10e7ce3b105795919605be89ebeecffd656e82dbf1bafa5db6d51d6def2265ee", size = 7871, upload-time = "2025-11-14T09:43:16.973Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ab/319aa52dfe6f836f4dc542282c2c13996222d4f5c9ea7ff8f391b12dac83/pyobjc_framework_contactsui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:057f40d2f6eb1b169a300675ec75cc7a747cddcbcee8ece133e652a7086c5ab5", size = 7888, upload-time = "2025-11-14T09:43:18.502Z" }, ] [[package]] name = "pyobjc-framework-coreaudio" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/e6/3b7a8af3defec012d6cacf277fd8d5c3e254ceace63a05447dc1119f3a7e/pyobjc_framework_coreaudio-11.0.tar.gz", hash = "sha256:38b6b531381119be6998cf704d04c9ea475aaa33f6dd460e0584351475acd0ae", size = 140507, upload-time = "2025-01-14T19:03:05.612Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/d1/0b884c5564ab952ff5daa949128c64815300556019c1bba0cf2ca752a1a0/pyobjc_framework_coreaudio-12.1.tar.gz", hash = "sha256:a9e72925fcc1795430496ce0bffd4ddaa92c22460a10308a7283ade830089fe1", size = 75077, upload-time = "2025-11-14T10:13:22.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/a2/9d6774031b49edad65cb7c860405ba800d799f422c3260372743688a16b6/pyobjc_framework_CoreAudio-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0d8c2c6850f75718a7c8999d78ada52c57acfae5001437823761fc72f6fa1d5", size = 35753, upload-time = "2025-01-14T18:49:59.434Z" }, - { url = "https://files.pythonhosted.org/packages/78/f8/6f583376d2ef6a6123141d310f7f7e3e93ba9129ffbbc6eb26e25c4289c5/pyobjc_framework_CoreAudio-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:143cd44d5c069aee1abc5a88794e9531250b9fe70a98f6a08e493184dcf64b3e", size = 35750, upload-time = "2025-01-14T18:50:00.665Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b6/83af557d2f406433e8dc79bdc92e77c644699fcd3b606c82b17c5cbbb8c2/pyobjc_framework_CoreAudio-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:861d210d54b2cf44824e0d74634558f38acc504d30b61e52b22f528bdc8df658", size = 35736, upload-time = "2025-01-14T18:50:06.866Z" }, + { url = "https://files.pythonhosted.org/packages/2a/15/4a635daa2c08133da5556d4fc7aee59de718031b79bb5cb24480e571f734/pyobjc_framework_coreaudio-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d676c85bb9dc51217d94adc3b5b60e7e5b59a81167446f06821b2687d92641d3", size = 35330, upload-time = "2025-11-14T09:43:29.016Z" }, + { url = "https://files.pythonhosted.org/packages/9e/25/491ff549fd9a40be4416793d335bff1911d3d1d1e1635e3b0defbd2cf585/pyobjc_framework_coreaudio-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a452de6b509fa4a20160c0410b72330ac871696cd80237883955a5b3a4de8f2a", size = 35327, upload-time = "2025-11-14T09:43:32.523Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/05b5192122e23140cf583eac99ccc5bf615591d6ff76483ba986c38ee750/pyobjc_framework_coreaudio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a5ad6309779663f846ab36fe6c49647e470b7e08473c3e48b4f004017bdb68a4", size = 36908, upload-time = "2025-11-14T09:43:36.108Z" }, ] [[package]] name = "pyobjc-framework-coreaudiokit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreaudio", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/1a/604cac8d992b6e66adbb98edb1f65820116f5d74d8decd6d43898ae2929d/pyobjc_framework_coreaudiokit-11.0.tar.gz", hash = "sha256:1a4c3de4a02b0dfa7410c012c7f0939edd2e127d439fb934aeafc68450615f1d", size = 21450, upload-time = "2025-01-14T19:03:06.681Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/1c/5c7e39b9361d4eec99b9115b593edd9825388acd594cb3b4519f8f1ac12c/pyobjc_framework_coreaudiokit-12.1.tar.gz", hash = "sha256:b83624f8de3068ab2ca279f786be0804da5cf904ff9979d96007b69ef4869e1e", size = 20137, upload-time = "2025-11-14T10:13:24.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/e9/6732e254aae45272754d857fbe2229ee0d847d60da0a0facd86419480506/pyobjc_framework_CoreAudioKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f33ea1a67497a5492340f885e1eede5ba3f96d6cf41be71735ef8bb7280815c1", size = 7190, upload-time = "2025-01-14T18:50:08.427Z" }, - { url = "https://files.pythonhosted.org/packages/4c/b9/d75a4da2d6a3cb75bafd363c447d45e134fe78a340dee408423a40c04aac/pyobjc_framework_CoreAudioKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dbf01f2625689b392c2ba02f3ab8186c914d84d6bd896bdef5181a15a9463df", size = 7192, upload-time = "2025-01-14T18:50:09.524Z" }, - { url = "https://files.pythonhosted.org/packages/3d/34/055a43239d47a2c2ec133f04499bbb22107d58ff99af4c400ddec3745ae1/pyobjc_framework_CoreAudioKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cc72362a34e3d88b571d5a6e1a4949a350c5478f7e9f338bf9df0b16fb58d57e", size = 7175, upload-time = "2025-01-14T18:50:14.043Z" }, + { url = "https://files.pythonhosted.org/packages/5d/fb/3ba9f67d04014e0d367cddd920aeaa9f2be997878eefb049015c16ad8889/pyobjc_framework_coreaudiokit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7b7230cf4f34f2e35fc40928fa723c43193c359b21b690485001ca3616829b6c", size = 7253, upload-time = "2025-11-14T09:43:51.477Z" }, + { url = "https://files.pythonhosted.org/packages/c2/53/e4233fbe5b94b124f5612e1edc130a9280c4674a1d1bf42079ea14b816e1/pyobjc_framework_coreaudiokit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e1144c272f8d6429a34a6757700048f4631eb067c4b08d4768ddc28c371a7014", size = 7250, upload-time = "2025-11-14T09:43:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/19/d7/f171c04c6496afeaad2ab658b0c810682c8407127edc94d4b3f3b90c2bb1/pyobjc_framework_coreaudiokit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:97d5dd857e73d5b597cfc980972b021314b760e2f5bdde7bbba0334fbf404722", size = 7273, upload-time = "2025-11-14T09:43:55.411Z" }, ] [[package]] name = "pyobjc-framework-corebluetooth" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/74/66a62a36da9db5924ee15de6fe1eb544930609b307b3bfbc021b5cf43781/pyobjc_framework_corebluetooth-11.0.tar.gz", hash = "sha256:1dcb7c039c2efa7c72dc14cdda80e677240b49fa38999941a77ee02ca142998d", size = 59797, upload-time = "2025-01-14T19:03:07.584Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/25/d21d6cb3fd249c2c2aa96ee54279f40876a0c93e7161b3304bf21cbd0bfe/pyobjc_framework_corebluetooth-12.1.tar.gz", hash = "sha256:8060c1466d90bbb9100741a1091bb79975d9ba43911c9841599879fc45c2bbe0", size = 33157, upload-time = "2025-11-14T10:13:28.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/15/ce0d1beff032d01bc135055d5e20760d26a6775d7b92695a8437fcd8714e/pyobjc_framework_CoreBluetooth-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3dd55feb3b03b7aa5695b8c9f16c5ec0c59bff89e731fc3275272d115079ed79", size = 13684, upload-time = "2025-01-14T18:50:14.928Z" }, - { url = "https://files.pythonhosted.org/packages/53/a8/df866e8a84fd33d29af1ee383f13715bbd98ad67d5795dfb276a3887560f/pyobjc_framework_CoreBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:044069d63447554ba2c65cb1bf58d489d14ea279344810386392e583a2e611ef", size = 13683, upload-time = "2025-01-14T18:50:16.231Z" }, - { url = "https://files.pythonhosted.org/packages/94/bd/061aad46b71b7ee4bdfbe7928a469499e5e5c0261d951efcbb42373dad2c/pyobjc_framework_CoreBluetooth-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55c05e19f8f71eecfa45a33b215ceaab1040db4a08e9b3d30ab71cdef341e78e", size = 13672, upload-time = "2025-01-14T18:50:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1b/06914f4eb1bd8ce598fdd210e1a7411556286910fc8d8919ab7dbaebe629/pyobjc_framework_corebluetooth-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:937849f4d40a33afbcc56cbe90c8d1fbf30fb27a962575b9fb7e8e2c61d3c551", size = 13187, upload-time = "2025-11-14T09:44:04.098Z" }, + { url = "https://files.pythonhosted.org/packages/57/7a/26ae106beb97e9c4745065edb3ce3c2bdd91d81f5b52b8224f82ce9d5fb9/pyobjc_framework_corebluetooth-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:37e6456c8a076bd5a2bdd781d0324edd5e7397ef9ac9234a97433b522efb13cf", size = 13189, upload-time = "2025-11-14T09:44:06.229Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/01fef62a479cdd6ff9ee40b6e062a205408ff386ce5ba56d7e14a71fcf73/pyobjc_framework_corebluetooth-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe72c9732ee6c5c793b9543f08c1f5bdd98cd95dfc9d96efd5708ec9d6eeb213", size = 13209, upload-time = "2025-11-14T09:44:08.203Z" }, ] [[package]] name = "pyobjc-framework-coredata" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/22/6787205b91cb6d526b6b472ebaa5baff275200774050a55b4b25d2bd957a/pyobjc_framework_coredata-11.0.tar.gz", hash = "sha256:b11acb51ff31cfb69a53f4e127996bf194bcac770e8fa67cb5ba3fb16a496058", size = 260029, upload-time = "2025-01-14T19:03:08.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/c5/8cd46cd4f1b7cf88bdeed3848f830ea9cdcc4e55cd0287a968a2838033fb/pyobjc_framework_coredata-12.1.tar.gz", hash = "sha256:1e47d3c5e51fdc87a90da62b97cae1bc49931a2bb064db1305827028e1fc0ffa", size = 124348, upload-time = "2025-11-14T10:13:36.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/77/5fe9df714a344604abb26dbc21e47654bb52532fb481e6f3a0653c955fad/pyobjc_framework_CoreData-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6c2a081b19fce6ef14b3873d74840717c5aee8991e6d38181b5c442a4f138bbc", size = 16191, upload-time = "2025-01-14T18:50:21.718Z" }, - { url = "https://files.pythonhosted.org/packages/86/b0/32c23ee168e5081391daa8737fddde79670b083e948dffb8d74308f1dd43/pyobjc_framework_CoreData-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74ac5e7658df10544708f6017a8823a100fbe41dc3aa9f61bf2fd4f8773c3dd7", size = 16194, upload-time = "2025-01-14T18:50:22.924Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/d7b3bf6cd9685ae6a408bc8809eca9af1d128228558b38df2f022bfe0d6c/pyobjc_framework_CoreData-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:71988fa045f6401ea980a79701a18a1b8c134b8852ecba16152beb6a9d95b016", size = 16183, upload-time = "2025-01-14T18:50:30.383Z" }, + { url = "https://files.pythonhosted.org/packages/d5/66/d08c3d412a12f4032e432c770185bc9cd3521789d8f3eafa2c0c78f8ca4e/pyobjc_framework_coredata-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:547115df2391dafe9dbc0ae885a7d87e1c5f1710384effd8638857e5081c75ec", size = 16395, upload-time = "2025-11-14T09:44:18.709Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a8/4c694c85365071baef36013a7460850dcf6ebfea0ba239e52d7293cdcb93/pyobjc_framework_coredata-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c861dc42b786243cbd96d9ea07d74023787d03637ef69a2f75a1191a2f16d9d6", size = 16395, upload-time = "2025-11-14T09:44:21.105Z" }, + { url = "https://files.pythonhosted.org/packages/a3/29/fe24dc81e0f154805534923a56fe572c3b296092f086cf5a239fccc2d46a/pyobjc_framework_coredata-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3ee3581ca23ead0b152257e98622fe0bf7e7948f30a62a25a17cafe28fe015e", size = 16409, upload-time = "2025-11-14T09:44:23.582Z" }, ] [[package]] name = "pyobjc-framework-corehaptics" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/b8/66481497362171e7ad42fc8fcc0272c04b95a707c5c1e7e8f8a8bfe58917/pyobjc_framework_corehaptics-11.0.tar.gz", hash = "sha256:1949b56ac0bd4219eb04c466cdd0f7f93d6826ed92ee61f01a4b5e98139ee039", size = 42956, upload-time = "2025-01-14T19:03:09.753Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/2f/74a3da79d9188b05dd4be4428a819ea6992d4dfaedf7d629027cf1f57bfc/pyobjc_framework_corehaptics-12.1.tar.gz", hash = "sha256:521dd2986c8a4266d583dd9ed9ae42053b11ae7d3aa89bf53fbee88307d8db10", size = 22164, upload-time = "2025-11-14T10:13:38.941Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/16/16d4365c8da1f708e145500237a3cdbbdde3e83b7f3f8673b038efac03b9/pyobjc_framework_CoreHaptics-11.0-py2.py3-none-any.whl", hash = "sha256:ff1d8f58dd3b29287dfad16a60bb45706c91f1910e400b632cb664eb2e56588b", size = 5307, upload-time = "2025-01-14T18:50:33.074Z" }, - { url = "https://files.pythonhosted.org/packages/12/72/b9fca92b3704af8f5f3b5507d0d9f3d0f5eb16605664de669f4468858627/pyobjc_framework_CoreHaptics-11.0-py3-none-any.whl", hash = "sha256:33f7a767efe6867fa6821ad73872ea88aec44650a22217bcdc9c1ec7c41fd9dc", size = 5377, upload-time = "2025-01-14T18:50:34.484Z" }, + { url = "https://files.pythonhosted.org/packages/25/f4/f469d6a9cac7c195f3d08fa65f94c32dd1dcf97a54b481be648fb3a7a5f3/pyobjc_framework_corehaptics-12.1-py2.py3-none-any.whl", hash = "sha256:a3b07d36ddf5c86a9cdaa411ab53d09553d26ea04fc7d4f82d21a84f0fc05fc0", size = 5382, upload-time = "2025-11-14T09:44:34.725Z" }, ] [[package]] name = "pyobjc-framework-corelocation" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/2d/b21ca49a34db49390420a9d7d05fd9eb89850dbec0a555c9ee408f52609c/pyobjc_framework_corelocation-11.0.tar.gz", hash = "sha256:05055c3b567f7f8f796845da43fb755d84d630909b927a39f25cf706ef52687d", size = 103955, upload-time = "2025-01-14T19:03:10.707Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/79/b75885e0d75397dc2fe1ed9ca80be2b64c18b817f5fb924277cb1bf7b163/pyobjc_framework_corelocation-12.1.tar.gz", hash = "sha256:3674e9353f949d91dde6230ad68f6d5748a7f0424751e08a2c09d06050d66231", size = 53511, upload-time = "2025-11-14T10:13:43.384Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/b8/be5734c08ef0f96866c0ff80f1268c94dcc2e582e142b5ce0084683fb48f/pyobjc_framework_CoreLocation-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aacfe9f048c9cdc328ebae6619fa74987961a5428dd8d3ab27bac3816daf49d3", size = 13074, upload-time = "2025-01-14T18:50:35.409Z" }, - { url = "https://files.pythonhosted.org/packages/10/99/c7844f6e583f4764c6fab4a5b5ad9e949c6fce8c30f95226118bead41e01/pyobjc_framework_CoreLocation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:046f211a23de55364c8553cfd660dc5adeff28af4d25f5ed9b5a8bfa83266b4d", size = 13075, upload-time = "2025-01-14T18:50:37.789Z" }, - { url = "https://files.pythonhosted.org/packages/35/dc/95ec5759f0b42ddf906be8cd521a77944fefb0b0d78b2d450454f731ed29/pyobjc_framework_CoreLocation-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72421f2a5cae04d996744250432c39df2cfbf1a71d55dd06efd6b1fe426ca9e4", size = 13058, upload-time = "2025-01-14T18:50:41.462Z" }, + { url = "https://files.pythonhosted.org/packages/df/1c/e515e91de901715d33f6da49c5b6dd588262f5471265feda27bb5586acce/pyobjc_framework_corelocation-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:833678750636976833d905a1575896167841394b77936074774b8921c94653e5", size = 12701, upload-time = "2025-11-14T09:44:36.763Z" }, + { url = "https://files.pythonhosted.org/packages/34/ac/44b6cb414ce647da8328d0ed39f0a8b6eb54e72189ce9049678ce2cb04c3/pyobjc_framework_corelocation-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ffc96b9ba504b35fe3e0fcfb0153e68fdfca6fe71663d240829ceab2d7122588", size = 12700, upload-time = "2025-11-14T09:44:38.717Z" }, + { url = "https://files.pythonhosted.org/packages/71/57/1b670890fbf650f1a00afe5ee897ea3856a4a1417c2304c633ee2e978ed0/pyobjc_framework_corelocation-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8c35ad29a062fea7d417fd8997a9309660ba7963f2847c004e670efbe6bb5b00", size = 12721, upload-time = "2025-11-14T09:44:41.185Z" }, ] [[package]] name = "pyobjc-framework-coremedia" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/60/7c7b9f13c94910882de6cc08f48a52cce9739e75cc3b3b6de5c857e6536a/pyobjc_framework_coremedia-11.0.tar.gz", hash = "sha256:a414db97ba30b43c9dd96213459d6efb169f9e92ce1ad7a75516a679b181ddfb", size = 249161, upload-time = "2025-01-14T19:03:12.291Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/7d/5ad600ff7aedfef8ba8f51b11d9aaacdf247b870bd14045d6e6f232e3df9/pyobjc_framework_coremedia-12.1.tar.gz", hash = "sha256:166c66a9c01e7a70103f3ca44c571431d124b9070612ef63a1511a4e6d9d84a7", size = 89566, upload-time = "2025-11-14T10:13:49.788Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/b9/4148fe4dc0bb372e854c905595d2e6b89d648cb8ca80d00991f8b22a5681/pyobjc_framework_CoreMedia-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0c0613bea009f206a5584a828cbb56699cf3d00e7332e2dcbf2708536adca08e", size = 29418, upload-time = "2025-01-14T18:50:55.332Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/7baca352ddd7256840a4eb8f38fda39bc2e023b222b86d11c1a77cc0a8fa/pyobjc_framework_CoreMedia-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:057e63e533577fe5d764a5a9d307f60e8d9c58803112951ace42183abe9437e3", size = 29422, upload-time = "2025-01-14T18:50:56.964Z" }, - { url = "https://files.pythonhosted.org/packages/3f/43/04397da5cb89f17f4dca89423ae481e8ccb7e7c58859f250941e774b69d2/pyobjc_framework_CoreMedia-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:26bec528d75ea699519ee3d9739488ecdf8cbe178b3a35f515a1da88e7969092", size = 29388, upload-time = "2025-01-14T18:51:02.555Z" }, + { url = "https://files.pythonhosted.org/packages/d3/35/9310566c24aad764b619057a5d583781f2e615388bcdeb28113b3a8b054f/pyobjc_framework_coremedia-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4fce8570db3eaa7b841456a7890b24546504d1059157dc33e700b14d9d3073d8", size = 29501, upload-time = "2025-11-14T09:44:51.605Z" }, + { url = "https://files.pythonhosted.org/packages/c8/bc/e66de468b3777d8fece69279cf6d2af51d2263e9a1ccad21b90c35c74b1b/pyobjc_framework_coremedia-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ee7b822c9bb674b5b0a70bfb133410acae354e9241b6983f075395f3562f3c46", size = 29503, upload-time = "2025-11-14T09:44:54.716Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ae/f773cdc33c34a3f9ce6db829dbf72661b65c28ea9efaec8940364185b977/pyobjc_framework_coremedia-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:161a627f5c8cd30a5ebb935189f740e21e6cd94871a9afd463efdb5d51e255fa", size = 29396, upload-time = "2025-11-14T09:44:57.563Z" }, ] [[package]] name = "pyobjc-framework-coremediaio" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/59/904af57d302caa4c20d3bfebb9fb9300ccc3c396134460821c9f1e8ab65b/pyobjc_framework_coremediaio-11.0.tar.gz", hash = "sha256:7d652cf1a2a75c78ea6e8dbc7fc8b782bfc0f07eafc84b700598172c82f373d8", size = 107856, upload-time = "2025-01-14T19:03:14.225Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/8e/23baee53ccd6c011c965cff62eb55638b4088c3df27d2bf05004105d6190/pyobjc_framework_coremediaio-12.1.tar.gz", hash = "sha256:880b313b28f00b27775d630174d09e0b53d1cdbadb74216618c9dd5b3eb6806a", size = 51100, upload-time = "2025-11-14T10:13:54.277Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/f6/484e360c67133883bebd49d1345b088bb9382abd2668ae402f765f3de95c/pyobjc_framework_CoreMediaIO-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:183bba91cd2cb0a4f0cfecc377d1203d30f845d1b690cd33976d6e8ebb638f69", size = 17492, upload-time = "2025-01-14T18:51:03.5Z" }, - { url = "https://files.pythonhosted.org/packages/27/02/09fda96c4727ff0c632c3cf4b09faa5b82be9f18422860dd80b5bc676ae1/pyobjc_framework_CoreMediaIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4182b91c72923d5c4d52eca3c221cc6f149d80a96242c0caab1d5bc9ccbcbbb", size = 17492, upload-time = "2025-01-14T18:51:04.559Z" }, - { url = "https://files.pythonhosted.org/packages/1d/02/3c0c913980994f098afa4c58a6be8315766a88f988ccc19deb2f4ae8f0ce/pyobjc_framework_CoreMediaIO-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:06b9d0cbb50d68ddd278750303e2a68ae11f81b03b1bdc95c44c1f74c24c5492", size = 17477, upload-time = "2025-01-14T18:51:10.779Z" }, + { url = "https://files.pythonhosted.org/packages/14/33/9ab6ac724ae14b464fa183cc92f15a426f0aed0ecc296836bf114e4fc4e7/pyobjc_framework_coremediaio-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a471e82fddeaa8a172d96dd897c3489f0a0ad8d5e5d2b46ae690e273c254cd0", size = 17219, upload-time = "2025-11-14T09:45:12.656Z" }, + { url = "https://files.pythonhosted.org/packages/46/6c/88514f8938719f74aa13abb9fd5492499f1834391133809b4e125c3e7150/pyobjc_framework_coremediaio-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3da79c5b9785c5ccc1f5982de61d4d0f1ba29717909eb6720734076ccdc0633c", size = 17218, upload-time = "2025-11-14T09:45:15.294Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0c/9425c53c9a8c26e468e065ba12ef076bab20197ff7c82052a6dddd46d42b/pyobjc_framework_coremediaio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1108f8a278928fbca465f95123ea4a56456bd6571c1dc8b91793e6c61d624517", size = 17277, upload-time = "2025-11-14T09:45:17.457Z" }, ] [[package]] name = "pyobjc-framework-coremidi" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/90/d004cdf4c52b8b16842e15135495de882d743b4f0217946bd8ae1a920173/pyobjc_framework_coremidi-11.0.tar.gz", hash = "sha256:acace4448b3e4802ab5dd75bbf875aae5e1f6c8cab2b2f1d58af20fc8b2a5a7f", size = 107342, upload-time = "2025-01-14T19:03:15.235Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/96/2d583060a71a73c8a7e6d92f2a02675621b63c1f489f2639e020fae34792/pyobjc_framework_coremidi-12.1.tar.gz", hash = "sha256:3c6f1fd03997c3b0f20ab8545126b1ce5f0cddcc1587dffacad876c161da8c54", size = 55587, upload-time = "2025-11-14T10:13:58.903Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/7b/f4b463b126615264e82d51de6b68f7f3628d14e0f2d7c629e79db504b83c/pyobjc_framework_CoreMIDI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4f042988f6f515f612b0af258c8892b095ccfa722bfeb23efc18e0fa83b74c", size = 24319, upload-time = "2025-01-14T18:50:43.683Z" }, - { url = "https://files.pythonhosted.org/packages/4d/b9/c67886891ad3cd21107cf1e65f1431cbdcff33acd74bf55ad3d6e10f3adf/pyobjc_framework_CoreMIDI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:78dec1bcd253a0385ac0b758a455e2a9367fc3cb9e2306d410c61bafa8d4c2eb", size = 24314, upload-time = "2025-01-14T18:50:44.817Z" }, - { url = "https://files.pythonhosted.org/packages/57/58/41ee4025658a68f2f3844bea8d4216fa6b31694b196ae4fccb2456a495aa/pyobjc_framework_CoreMIDI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9ed5d425436e24c0ab429475956af9d65c8ef2fc1b6cc5fb0909d9ee84bea1a", size = 24293, upload-time = "2025-01-14T18:50:48.762Z" }, + { url = "https://files.pythonhosted.org/packages/67/77/36f4a45832c17bbc676dfec19215ae741c2f3a5083134159e39834993aa6/pyobjc_framework_coremidi-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bcbe70bdd5f79999d028aee7a8b34e72ff955547c7d277357c4d67afd8a23024", size = 24284, upload-time = "2025-11-14T09:45:29.528Z" }, + { url = "https://files.pythonhosted.org/packages/76/d5/49b8720ec86f64e3dc3c804bd7e16fabb2a234a9a8b1b6753332ed343b4e/pyobjc_framework_coremidi-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af3cdf195e8d5e30d1203889cc4107bebc6eb901aaa81bf3faf15e9ffaca0735", size = 24282, upload-time = "2025-11-14T09:45:32.288Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2d/99520f6f1685e4cad816e55cbf6d85f8ce6ea908107950e2d37dc17219d8/pyobjc_framework_coremidi-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e84ffc1de59691c04201b0872e184fe55b5589f3a14876bd14460f3b5f3cd109", size = 24317, upload-time = "2025-11-14T09:45:34.92Z" }, ] [[package]] name = "pyobjc-framework-coreml" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/64/4f0a990ec0955fe9b88f1fa58303c8471c551996670216527b4ac559ed8f/pyobjc_framework_coreml-11.0.tar.gz", hash = "sha256:143a1f73a0ea0a0ea103f3175cb87a61bbcb98f70f85320ed4c61302b9156d58", size = 81452, upload-time = "2025-01-14T19:03:16.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/2d/baa9ea02cbb1c200683cb7273b69b4bee5070e86f2060b77e6a27c2a9d7e/pyobjc_framework_coreml-12.1.tar.gz", hash = "sha256:0d1a4216891a18775c9e0170d908714c18e4f53f9dc79fb0f5263b2aa81609ba", size = 40465, upload-time = "2025-11-14T10:14:02.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/fa/69b6f5875232bfc86eca3556c11a8655dcc3e1479ae3d0523db21b6d07ee/pyobjc_framework_CoreML-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:87991c6ed2510e9143b5d200a946cb1f1396e321ccd4b8b22a32616333b1cf32", size = 11318, upload-time = "2025-01-14T18:50:49.739Z" }, - { url = "https://files.pythonhosted.org/packages/50/dc/334823bb3faa490259df7611772e804eb883c56436fc69123e8a3a5ba0ea/pyobjc_framework_CoreML-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e290ad9c0ac5f057ce3885d35e33fadc115f59111f2e04f168c45e2890cb86e8", size = 11320, upload-time = "2025-01-14T18:50:50.914Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8b/707e39b28551c2185f8f3e44ee692622953cbfb0205b97f51d1749c167af/pyobjc_framework_CoreML-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9359e87e7f15c9db418be4a4bbbe2c4e70bf535599e92966432f91bd94ff5154", size = 11308, upload-time = "2025-01-14T18:50:54.432Z" }, + { url = "https://files.pythonhosted.org/packages/47/f6/e8afa7143d541f6f0b9ac4b3820098a1b872bceba9210ae1bf4b5b4d445d/pyobjc_framework_coreml-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df4e9b4f97063148cc481f72e2fbe3cc53b9464d722752aa658d7c0aec9f02fd", size = 11334, upload-time = "2025-11-14T09:45:48.42Z" }, + { url = "https://files.pythonhosted.org/packages/34/0f/f55369da4a33cfe1db38a3512aac4487602783d3a1d572d2c8c4ccce6abc/pyobjc_framework_coreml-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16dafcfb123f022e62f47a590a7eccf7d0cb5957a77fd5f062b5ee751cb5a423", size = 11331, upload-time = "2025-11-14T09:45:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/bb/39/4defef0deb25c5d7e3b7826d301e71ac5b54ef901b7dac4db1adc00f172d/pyobjc_framework_coreml-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:10dc8e8db53d7631ebc712cad146e3a9a9a443f4e1a037e844149a24c3c42669", size = 11356, upload-time = "2025-11-14T09:45:52.271Z" }, ] [[package]] name = "pyobjc-framework-coremotion" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/79/5c4ff39a48f0dc0f764d1330b2360e9f31e3a32414e8690e7f20e4574e93/pyobjc_framework_coremotion-11.0.tar.gz", hash = "sha256:d1e7ca418897e35365d07c6fd5b5d625a3c44261b6ce46dcf80787f634ad6fa5", size = 66508, upload-time = "2025-01-14T19:03:17.254Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/eb/abef7d405670cf9c844befc2330a46ee59f6ff7bac6f199bf249561a2ca6/pyobjc_framework_coremotion-12.1.tar.gz", hash = "sha256:8e1b094d34084cc8cf07bedc0630b4ee7f32b0215011f79c9e3cd09d205a27c7", size = 33851, upload-time = "2025-11-14T10:14:05.619Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/6e/94675a13277d0922d97c99e31c01decea8a6eb7c40c985bb2b2d6a31e3df/pyobjc_framework_CoreMotion-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03575381b5e16c6d83c88e79a026ad0ca39cddfc0a629bd8489ef7226bcaba6c", size = 10227, upload-time = "2025-01-14T18:51:11.714Z" }, - { url = "https://files.pythonhosted.org/packages/01/35/da29fd7350cd68bfe70f30a9e03e1350d7363c7c4fcdb5b0cd16f4bb47e2/pyobjc_framework_CoreMotion-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8e32de44e30028500e4d17c114eea69e7e74e5ae7aef6c208edc5bac34dfc21e", size = 10229, upload-time = "2025-01-14T18:51:12.825Z" }, - { url = "https://files.pythonhosted.org/packages/1a/be/66c337e73a8a6b30d65f9caf804015085d0df7c40f039125ca8cabcaa0c8/pyobjc_framework_CoreMotion-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9c3766a917d5ddb1fa6dcbb7adfc6acf4538d96e0947276a133936d7117c9c2b", size = 10222, upload-time = "2025-01-14T18:51:17.276Z" }, + { url = "https://files.pythonhosted.org/packages/38/bc/48ca9905725779de71543522d96e2e265f486df3fd5eecfabfee775e554c/pyobjc_framework_coremotion-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0da3c3e82744cf555537d65ad796e9ad2687d26aeb458078c74896496538eace", size = 10384, upload-time = "2025-11-14T09:46:01.584Z" }, + { url = "https://files.pythonhosted.org/packages/77/fd/0d24796779e4d8187abbce5d06cfd7614496d57a68081c5ff1e978b398f9/pyobjc_framework_coremotion-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed8cb67927985d97b1dd23ab6a4a1b716fc7c409c35349816108781efdcbb5b6", size = 10382, upload-time = "2025-11-14T09:46:03.438Z" }, + { url = "https://files.pythonhosted.org/packages/bc/75/89fa4aab818aeca21ac0a60b7ceb89a9e685df0ddd3828d36a6f84a0cff0/pyobjc_framework_coremotion-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a77908ab83c422030f913a2a761d196359ab47f6d1e7c76f21de2c6c05ea2f5f", size = 10406, upload-time = "2025-11-14T09:46:05.076Z" }, ] [[package]] name = "pyobjc-framework-coreservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-fsevents", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-fsevents" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/b5/19c096b9938d6e2fdb1b436f21ad989b77dbeb4e59b3db4bd344800fa1e8/pyobjc_framework_coreservices-11.0.tar.gz", hash = "sha256:ac96954f1945a1153bdfef685611665749eaa8016b5af6f34bd56a274952b03a", size = 1244406, upload-time = "2025-01-14T19:03:19.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/b3/52338a3ff41713f7d7bccaf63bef4ba4a8f2ce0c7eaff39a3629d022a79a/pyobjc_framework_coreservices-12.1.tar.gz", hash = "sha256:fc6a9f18fc6da64c166fe95f2defeb7ac8a9836b3b03bb6a891d36035260dbaa", size = 366150, upload-time = "2025-11-14T10:14:28.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/cf/e2adbdabc33fad06c3cbe943aaf343cc896245b052980c582620beb36376/pyobjc_framework_CoreServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7570bcfe23c327c0055df42bdf03604dcbb4a9b413311c7c15b3209657a4f84", size = 30256, upload-time = "2025-01-14T18:51:19.403Z" }, - { url = "https://files.pythonhosted.org/packages/e9/cc/3899a59ed62fa36d2c1b95b94ff52e181ac48fde4011b68ca6abcbddd47a/pyobjc_framework_CoreServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7538ca6e22f4da0c3a70ddd9781f9240a3fe2fd7a7aa4dfb31c31f2532f008e", size = 30258, upload-time = "2025-01-14T18:51:20.487Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bf/2a2f8eee06232eca8c43fbf9a6d805891c5b611ae117b9dd01a6d8954907/pyobjc_framework_CoreServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f4dd7665d2e4bddb1ed21135f4bc7eba4b016e64e8a1c7d78a6e24b95a33a21", size = 30234, upload-time = "2025-01-14T18:51:25.517Z" }, + { url = "https://files.pythonhosted.org/packages/11/b0/a4e97059aba12d0940cfac08f440c061e1b9e9df8da7a38d5aafdb6fd7b5/pyobjc_framework_coreservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:38856a89ccab766a03270c415a6bf5ea0f87134134fe4c122af9894d50162d77", size = 30195, upload-time = "2025-11-14T09:46:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/55/56/c905deb5ab6f7f758faac3f2cbc6f62fde89f8364837b626801bba0975c3/pyobjc_framework_coreservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b6ef07bcf99e941395491f1efcf46e99e5fb83eb6bfa12ae5371135d83f731e1", size = 30196, upload-time = "2025-11-14T09:46:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/61/6c/33984caaf497fc5a6f86350d7ca4fac8abeb2bc33203edc96955a21e8c05/pyobjc_framework_coreservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8751dc2edcb7cfa248bf8a274c4d6493e8d53ef28a843827a4fc9a0a8b04b8be", size = 30206, upload-time = "2025-11-14T09:46:22.732Z" }, ] [[package]] name = "pyobjc-framework-corespotlight" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/6a/6707d7ef339b9ad2dd0994d1df42969ee3b231f2d098f3377d40aed60b4f/pyobjc_framework_corespotlight-11.0.tar.gz", hash = "sha256:a96c9b4ba473bc3ee19afa01a9af989458e6a56e9656c2cdea1850d2b13720e6", size = 86130, upload-time = "2025-01-14T19:03:20.457Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/d0/88ca73b0cf23847af463334989dd8f98e44f801b811e7e1d8a5627ec20b4/pyobjc_framework_corespotlight-12.1.tar.gz", hash = "sha256:57add47380cd0bbb9793f50a4a4b435a90d4ebd2a33698e058cb353ddfb0d068", size = 38002, upload-time = "2025-11-14T10:14:31.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/fc/cd84076098363b693140bc931efdcc2727444b54fad9fa6e8b8934914aa0/pyobjc_framework_CoreSpotlight-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ea85b770a6ed36f3edf29e8e2c1dd380839b9d250a251217f2e83e5f674cfc0", size = 9578, upload-time = "2025-01-14T18:51:26.422Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/54f9522d7f6ec7a6618c86abe0236869f61dd371b49df02dff7930433656/pyobjc_framework_CoreSpotlight-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:551878bfb9cc815fe2532fdf455f500dda44f8cd203dd836a6f1eb5cc0d49a9a", size = 9579, upload-time = "2025-01-14T18:51:28.889Z" }, - { url = "https://files.pythonhosted.org/packages/af/14/b1ac01a5f5cba6dafe8ab9f5850bef95d416993efdbbca74433da75953e3/pyobjc_framework_CoreSpotlight-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8fda442469783fd82651823924758897a79ecdf3f14001c9608fda84b971480a", size = 9568, upload-time = "2025-01-14T18:51:33.539Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/d9efae11e4fde82c38a747b48c72b00cfeefe1f7f2aa7bc7b60ffdeac6be/pyobjc_framework_corespotlight-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9299ebabe2031433c384aec52074c52f6258435152d3bdbbed0ed68e37ad1f45", size = 9977, upload-time = "2025-11-14T09:46:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/1e7bacb9307a8df52234923e054b7303783e7a48a4637d44ce390b015921/pyobjc_framework_corespotlight-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:404a1e362fe19f0dff477edc1665d8ad90aada928246802da777399f7c06b22e", size = 9976, upload-time = "2025-11-14T09:46:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/f6/3b/d3031eddff8029859de6d92b1f741625b1c233748889141a6a5a89b96f0e/pyobjc_framework_corespotlight-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bfcea64ab3250e2886d202b8731be3817b5ac0c8c9f43e77d0d5a0b6602e71a7", size = 9996, upload-time = "2025-11-14T09:46:47.157Z" }, ] [[package]] name = "pyobjc-framework-coretext" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/e8/9b68dc788828e38143a3e834e66346713751cb83d7f0955016323005c1a2/pyobjc_framework_coretext-11.0.tar.gz", hash = "sha256:a68437153e627847e3898754dd3f13ae0cb852246b016a91f9c9cbccb9f91a43", size = 274222, upload-time = "2025-01-14T19:03:21.521Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/da/682c9c92a39f713bd3c56e7375fa8f1b10ad558ecb075258ab6f1cdd4a6d/pyobjc_framework_coretext-12.1.tar.gz", hash = "sha256:e0adb717738fae395dc645c9e8a10bb5f6a4277e73cba8fa2a57f3b518e71da5", size = 90124, upload-time = "2025-11-14T10:14:38.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/af/aa4ab3e029a9f539e782eab894c57590791700d892cda73a324fe22e09a6/pyobjc_framework_CoreText-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6939b4ea745b349b5c964823a2071f155f5defdc9b9fc3a13f036d859d7d0439", size = 30395, upload-time = "2025-01-14T18:51:34.479Z" }, - { url = "https://files.pythonhosted.org/packages/f6/20/b8a967101b585a2425ffe645135f8618edd51e1430aeb668373475a07d1f/pyobjc_framework_CoreText-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56a4889858308b0d9f147d568b4d91c441cc0ffd332497cb4f709bb1990450c1", size = 30397, upload-time = "2025-01-14T18:51:35.844Z" }, - { url = "https://files.pythonhosted.org/packages/c8/26/d18fd9fbb71dac6f43bd85d74aae3f3b4294ca96f0375878710763140b4b/pyobjc_framework_CoreText-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a76e1307747f2ee8180d38844cd62b8bb1701b4203d9234cc41f6603d4ae654", size = 30377, upload-time = "2025-01-14T18:51:40.43Z" }, + { url = "https://files.pythonhosted.org/packages/27/1c/ddecc72a672d681476c668bcedcfb8ade16383c028eac566ac7458fb91ef/pyobjc_framework_coretext-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1c8315dcef6699c2953461d97117fe81402f7c29cff36d2950dacce028a362fd", size = 29987, upload-time = "2025-11-14T09:46:58.028Z" }, + { url = "https://files.pythonhosted.org/packages/f0/81/7b8efc41e743adfa2d74b92dec263c91bcebfb188d2a8f5eea1886a195ff/pyobjc_framework_coretext-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f6742ba5b0bb7629c345e99eff928fbfd9e9d3d667421ac1a2a43bdb7ba9833", size = 29990, upload-time = "2025-11-14T09:47:01.206Z" }, + { url = "https://files.pythonhosted.org/packages/cd/0f/ddf45bf0e3ba4fbdc7772de4728fd97ffc34a0b5a15e1ab1115b202fe4ae/pyobjc_framework_coretext-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d246fa654bdbf43bae3969887d58f0b336c29b795ad55a54eb76397d0e62b93c", size = 30108, upload-time = "2025-11-14T09:47:04.228Z" }, ] [[package]] name = "pyobjc-framework-corewlan" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/a9/cda522b270adb75d62bae447b2131da62912b5eda058a07e3a433689116f/pyobjc_framework_corewlan-11.0.tar.gz", hash = "sha256:8803981d64e3eb4fa0ea56657a9b98e4004de5a84d56e32e5444815d8ed6fa6f", size = 65254, upload-time = "2025-01-14T19:03:23.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/71/739a5d023566b506b3fd3d2412983faa95a8c16226c0dcd0f67a9294a342/pyobjc_framework_corewlan-12.1.tar.gz", hash = "sha256:a9d82ec71ef61f37e1d611caf51a4203f3dbd8caf827e98128a1afaa0fd2feb5", size = 32417, upload-time = "2025-11-14T10:14:41.921Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/2a/6f4d562a7cf9a17354d62472e8f194862c3b1eecc17c0c2dad8a0692c859/pyobjc_framework_CoreWLAN-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d0319bb3605a2c4001eb42dad2f20685da538f0f170fbfa60ec13b7216e1e40e", size = 9890, upload-time = "2025-01-14T18:51:41.531Z" }, - { url = "https://files.pythonhosted.org/packages/da/e7/a869bf3e8673c8fdf496706672dac77fc305493db3c1057e3ca5f8d49c3f/pyobjc_framework_CoreWLAN-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4384ba68d4beb4d610ca0d661593e16efe541faf1790222b898b3f4dd389c98a", size = 9895, upload-time = "2025-01-14T18:51:43.245Z" }, - { url = "https://files.pythonhosted.org/packages/31/ea/3286987ddedb641c860e6fa8733014bd790ea305217530c02e9c34e56d43/pyobjc_framework_CoreWLAN-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b900aa2b261d1a08a2c6ea1c9b3e61c5eca9812b2570237934b3631aadfa4574", size = 9880, upload-time = "2025-01-14T18:51:48.134Z" }, + { url = "https://files.pythonhosted.org/packages/98/cb/97f07239a9e2dacc8b8db56be765527361963fb2582f531a28a0706c0e84/pyobjc_framework_corewlan-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:440db62f4ecc0c3b636fa06928d51f147b58c4cb000c0ba2dfc820ad484c2358", size = 9936, upload-time = "2025-11-14T09:47:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/f5/74/4d8a52b930a276f6f9b4f3b1e07cd518cb6d923cb512e39c935e3adb0b86/pyobjc_framework_corewlan-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3e3f2614eb37dfd6860d6a0683877c2f3b909758ef78b68e5f6b7ea9c858cc51", size = 9931, upload-time = "2025-11-14T09:47:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/4e/31/3e9cf2c0ac3c979062958eae7a275b602515c9c76fd30680e1ee0fea82ae/pyobjc_framework_corewlan-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5cba04c0550fc777767cd3a5471e4ed837406ab182d7d5c273bc5ce6ea237bfe", size = 9958, upload-time = "2025-11-14T09:47:22.474Z" }, ] [[package]] name = "pyobjc-framework-cryptotokenkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/72/b871fa5476479e4a22a4a0e971fb4724b0eb94c721365539ad55f4dc3135/pyobjc_framework_cryptotokenkit-11.0.tar.gz", hash = "sha256:a1bbfe9170c35cb427d39167af55aefea651c5c8a45c0de60226dae04b61a6b1", size = 58734, upload-time = "2025-01-14T19:03:24.851Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/7c/d03ff4f74054578577296f33bc669fce16c7827eb1a553bb372b5aab30ca/pyobjc_framework_cryptotokenkit-12.1.tar.gz", hash = "sha256:c95116b4b7a41bf5b54aff823a4ef6f4d9da4d0441996d6d2c115026a42d82f5", size = 32716, upload-time = "2025-11-14T10:14:45.024Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/f4/715e8f7622d4704ed89efb2ac76de4ed06a3d4cbb1662d1ce6d5569c6b71/pyobjc_framework_CryptoTokenKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b075264b65f095f8a1cd370f1058cda9e181b9753f93a808cfc6b258f84397d8", size = 12946, upload-time = "2025-01-14T18:51:49.043Z" }, - { url = "https://files.pythonhosted.org/packages/ac/60/ddf022ce94f829a605992f11b9bfa861d7a1579f794e03d969c209d0de2a/pyobjc_framework_CryptoTokenKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3c42620047cc75a749fbed045d181dc76284bc27edea904b97df1ad82c2fdafc", size = 12949, upload-time = "2025-01-14T18:51:50.055Z" }, - { url = "https://files.pythonhosted.org/packages/f4/8b/0c5a1f2ac4b9eb346ef60b29a737b6fa6bbe35144010ee64143470341fc6/pyobjc_framework_CryptoTokenKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3a2a09a1b82c2c18a60248302a8a1e9cd9fd05fdf05080d65a8291d9910fc64b", size = 12933, upload-time = "2025-01-14T18:51:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/013410837cebf67e40b470cd8ffc524bd85f0ff72b62021ddf7b6e32f2b2/pyobjc_framework_cryptotokenkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cfdefb1d9b1bf2223055378ee84ad40b771b1a0ba02258fbf06be54d6b30a689", size = 12597, upload-time = "2025-11-14T09:47:31.743Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/1623b60d6189db08f642777374fd32287b06932c51dfeb1e9ed5bbf67f35/pyobjc_framework_cryptotokenkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d84b75569054fa0886e3e341c00d7179d5fe287e6d1509630dd698ee60ec5af1", size = 12598, upload-time = "2025-11-14T09:47:33.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c7/aecba253cf21303b2c9f3ce03fc0e987523609d7839ea8e0a688ae816c96/pyobjc_framework_cryptotokenkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ef51a86c1d0125fabdfad0b3efa51098fb03660d8dad2787d82e8b71c9f189de", size = 12633, upload-time = "2025-11-14T09:47:35.707Z" }, ] [[package]] name = "pyobjc-framework-datadetection" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/6b/b896feb16e914dc81b6ed6cdbd0b6e6390eaafc80fff5297ec17eb0bd716/pyobjc_framework_datadetection-11.0.tar.gz", hash = "sha256:9967555151892f8400cffac86e8656f2cb8d7866963fdee255e0747fa1386533", size = 13738, upload-time = "2025-01-14T19:03:27.054Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/97/9b03832695ec4d3008e6150ddfdc581b0fda559d9709a98b62815581259a/pyobjc_framework_datadetection-12.1.tar.gz", hash = "sha256:95539e46d3bc970ce890aa4a97515db10b2690597c5dd362996794572e5d5de0", size = 12323, upload-time = "2025-11-14T10:14:46.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/a1/63653827a78c8329a0106ac06e68ec0434e7f104f022dee5929bdf8fed62/pyobjc_framework_DataDetection-11.0-py2.py3-none-any.whl", hash = "sha256:0fd191ddee9bc6a491e05dfb7de780c0266fd6c90ca783e168786c4b0b5d7d7c", size = 3428, upload-time = "2025-01-14T18:51:58.111Z" }, - { url = "https://files.pythonhosted.org/packages/1b/61/ee4579efb7c02b794d26ab0458722598726678d0bb227c9aa925a34f36af/pyobjc_framework_DataDetection-11.0-py3-none-any.whl", hash = "sha256:21b4a1dbf6cb56fdc971224476453dd1a7a4bb72d2c670444e81ae96fde97cb2", size = 3501, upload-time = "2025-01-14T18:51:59.104Z" }, + { url = "https://files.pythonhosted.org/packages/70/1c/5d2f941501e84da8fef8ef3fd378b5c083f063f083f97dd3e8a07f0404b3/pyobjc_framework_datadetection-12.1-py2.py3-none-any.whl", hash = "sha256:4dc8e1d386d655b44b2681a4a2341fb2fc9addbf3dda14cb1553cd22be6a5387", size = 3497, upload-time = "2025-11-14T09:47:45.826Z" }, ] [[package]] name = "pyobjc-framework-devicecheck" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/f8/237a92dd9ba8a88b7027f78cba83e61b0011bfc2a49351ecaa177233f639/pyobjc_framework_devicecheck-11.0.tar.gz", hash = "sha256:66cff0323dc8eef1b76d60f9c9752684f11e534ebda60ecbf6858a9c73553f64", size = 14198, upload-time = "2025-01-14T19:03:27.918Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/af/c676107c40d51f55d0a42043865d7246db821d01241b518ea1d3b3ef1394/pyobjc_framework_devicecheck-12.1.tar.gz", hash = "sha256:567e85fc1f567b3fe64ac1cdc323d989509331f64ee54fbcbde2001aec5adbdb", size = 12885, upload-time = "2025-11-14T10:14:48.804Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/c1/d889e1c515c23b911594aa0b53a9d8ab6173e07adaaad8db89324a731fb7/pyobjc_framework_DeviceCheck-11.0-py2.py3-none-any.whl", hash = "sha256:d9252173a57dfba09ae37ccc3049f4b4990c1cbdcde338622b42c66296a8740e", size = 3612, upload-time = "2025-01-14T18:52:00.097Z" }, - { url = "https://files.pythonhosted.org/packages/65/8b/fa0cc2da2d49897f64e27a8a4e2a68f5784515f1adcea3a90f90b8ae8d44/pyobjc_framework_DeviceCheck-11.0-py3-none-any.whl", hash = "sha256:e8ed3965808963b2f0a7e069537d752bc659b75db1901cc24e5138925b9a7052", size = 3684, upload-time = "2025-01-14T18:52:02.389Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d8/1f1b13fa4775b6474c9ad0f4b823953eaeb6c11bd6f03fa8479429b36577/pyobjc_framework_devicecheck-12.1-py2.py3-none-any.whl", hash = "sha256:ffd58148bdef4a1ee8548b243861b7d97a686e73808ca0efac5bef3c430e4a15", size = 3684, upload-time = "2025-11-14T09:47:47.25Z" }, ] [[package]] name = "pyobjc-framework-devicediscoveryextension" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/48/178a1879109128f34334fdae2fe4463c7620f169593bea96704f347d945e/pyobjc_framework_devicediscoveryextension-11.0.tar.gz", hash = "sha256:576dac3f418cfc4f71020a45f06231d14e4b2a8e182ef0020dd9da3cf238d02f", size = 14511, upload-time = "2025-01-14T19:03:32.132Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/b0/e6e2ed6a7f4b689746818000a003ff7ab9c10945df66398ae8d323ae9579/pyobjc_framework_devicediscoveryextension-12.1.tar.gz", hash = "sha256:60e12445fad97ff1f83472255c943685a8f3a9d95b3126d887cfe769b7261044", size = 14718, upload-time = "2025-11-14T10:14:50.723Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/be/3353a87691796a277ff4c048c4fa9a43db6f353fd683e8bb9e297651950c/pyobjc_framework_DeviceDiscoveryExtension-11.0-py2.py3-none-any.whl", hash = "sha256:82032e567d0031839d626947368d6d3d4ca97c915f15d2779a444cf4b2ffa4a3", size = 4194, upload-time = "2025-01-14T18:52:03.253Z" }, - { url = "https://files.pythonhosted.org/packages/06/87/52137a60498c03ab0acd3b9eadafe3c371c12e0549718e6a1f0fff8b7725/pyobjc_framework_DeviceDiscoveryExtension-11.0-py3-none-any.whl", hash = "sha256:9c94057173f13472089d561b780d93b5aa244d048b4760a0e1ab54fe7c2253c5", size = 4265, upload-time = "2025-01-14T18:52:05.101Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/005fe8db1e19135f493a3de8c8d38031e1ad2d626de4ef89f282acf4aff7/pyobjc_framework_devicediscoveryextension-12.1-py2.py3-none-any.whl", hash = "sha256:d6d6b606d27d4d88efc0bed4727c375e749149b360290c3ad2afc52337739a1b", size = 4321, upload-time = "2025-11-14T09:47:48.78Z" }, ] [[package]] name = "pyobjc-framework-dictionaryservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/cf/2913c7df737eb8519acb7ef6429127e40d6c334415e38cfa18d6481150eb/pyobjc_framework_dictionaryservices-11.0.tar.gz", hash = "sha256:6b5f27c75424860f169e7c7e182fabffdba22854fedb8023de180e8770661dce", size = 10823, upload-time = "2025-01-14T19:03:32.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/c0/daf03cdaf6d4e04e0cf164db358378c07facd21e4e3f8622505d72573e2c/pyobjc_framework_dictionaryservices-12.1.tar.gz", hash = "sha256:354158f3c55d66681fa903c7b3cb05a435b717fa78d0cef44d258d61156454a7", size = 10573, upload-time = "2025-11-14T10:14:53.961Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/68/5ea9766a8a6301f1a2ee39d595fe03d50b84b979d3d059e3e0ff541eab45/pyobjc_framework_DictionaryServices-11.0-py2.py3-none-any.whl", hash = "sha256:7c081371855240ac8e22783a71f32393c0f1e0b94d2fd193e8fef0a8be007080", size = 3829, upload-time = "2025-01-14T18:52:07.379Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c4/62b73f813c012f72a3a8e2f6326506803b45e91dc4ce6683e02a52a7f414/pyobjc_framework_DictionaryServices-11.0-py3-none-any.whl", hash = "sha256:15cdc3b64cb73713ee928cdcc0a12c845729f117bb8e73c7511f6e3f256d9d39", size = 3901, upload-time = "2025-01-14T18:52:08.403Z" }, + { url = "https://files.pythonhosted.org/packages/e7/13/ab308e934146cfd54691ddad87e572cd1edb6659d795903c4c75904e2d7d/pyobjc_framework_dictionaryservices-12.1-py2.py3-none-any.whl", hash = "sha256:578854eec17fa473ac17ab30050a7bbb2ab69f17c5c49b673695254c3e88ad4b", size = 3930, upload-time = "2025-11-14T09:47:50.782Z" }, ] [[package]] name = "pyobjc-framework-discrecording" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/cc/f36612b67ca1fff7659d7933b563dce61f8c84dad0bf79fab08bb34949ad/pyobjc_framework_discrecording-11.0.tar.gz", hash = "sha256:6bdc533f067d049ea5032f65af70b5cdab68673574ac32dacb46509a9411d256", size = 122426, upload-time = "2025-01-14T19:03:35.589Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/87/8bd4544793bfcdf507174abddd02b1f077b48fab0004b3db9a63142ce7e9/pyobjc_framework_discrecording-12.1.tar.gz", hash = "sha256:6defc8ea97fb33b4d43870c673710c04c3dc48be30cdf78ba28191a922094990", size = 55607, upload-time = "2025-11-14T10:14:58.276Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/96/94d64843b25987cd32ccc274906b567bbaf3825a39588ba2657beea63164/pyobjc_framework_DiscRecording-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:249c50bc16e54b5a46ccb9346084f7324c102bcdd9e0a1cd2e95da9b523ded87", size = 14493, upload-time = "2025-01-14T18:52:09.296Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0b/fbe460ccddb4c613eb04e2b81cc9c75b0e0c407fd9fb91776381416f99af/pyobjc_framework_DiscRecording-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eab79d83c2d974aa5564f3f6f4415218573dca69010026d2d000d232494a9d81", size = 14491, upload-time = "2025-01-14T18:52:10.415Z" }, - { url = "https://files.pythonhosted.org/packages/71/78/d128664064029b26883668cdabb1bd1af73a631e9fc2072df74a8b0d1167/pyobjc_framework_DiscRecording-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ea2edecc7f4d39d7b1232e304367659e7c93d6da76c75addee117e4077f39426", size = 14479, upload-time = "2025-01-14T18:52:15.722Z" }, + { url = "https://files.pythonhosted.org/packages/48/99/bd915504fd2a8b15b65817bc2d06c29846d312b972ce57acf0a5911ecfa2/pyobjc_framework_discrecording-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b940e018b57ce637f5ada4d44ed6775d349dbc4e67c6e563f682fc3277c7affe", size = 14545, upload-time = "2025-11-14T09:47:52.678Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ce/89df4d53a0a5e3a590d6e735eca4f0ba4d1ccc0e0acfbc14164026a3c502/pyobjc_framework_discrecording-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7d815f28f781e20de0bf278aaa10b0de7e5ea1189aa17676c0bf5b99e9e0d52", size = 14540, upload-time = "2025-11-14T09:47:55.442Z" }, + { url = "https://files.pythonhosted.org/packages/c8/70/14a5aa348a5eba16e8773bb56698575cf114aa55aa303037b7000fc53959/pyobjc_framework_discrecording-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:865f1551e58459da6073360afc8f2cc452472c676ba83dcaa9b0c44e7775e4b5", size = 14566, upload-time = "2025-11-14T09:47:57.503Z" }, ] [[package]] name = "pyobjc-framework-discrecordingui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-discrecording", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-discrecording" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/6b/3c120c59a939854dd4b7a162fad47011375c5ba00a12940f7217aea90eeb/pyobjc_framework_discrecordingui-11.0.tar.gz", hash = "sha256:bec8a252fd2022dce6c58b1f3366a7295efb0c7c77817f11f9efcce70527d7a2", size = 19614, upload-time = "2025-01-14T19:03:36.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/63/8667f5bb1ecb556add04e86b278cb358dc1f2f03862705cae6f09097464c/pyobjc_framework_discrecordingui-12.1.tar.gz", hash = "sha256:6793d4a1a7f3219d063f39d87f1d4ebbbb3347e35d09194a193cfe16cba718a8", size = 16450, upload-time = "2025-11-14T10:15:00.254Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/45/4852afc5e093b76ba8f718d80fe1cc8604122a752806354379a7dbc41dc3/pyobjc_framework_DiscRecordingUI-11.0-py2.py3-none-any.whl", hash = "sha256:1af226c9350bb1d49960c02505e1e2f286e9377040dc2777a3f9a318925e081b", size = 4671, upload-time = "2025-01-14T18:52:16.645Z" }, - { url = "https://files.pythonhosted.org/packages/98/01/c5645513eeaadf0b9e387849fa656fc22524a1881f0d3a44d5b78784f836/pyobjc_framework_DiscRecordingUI-11.0-py3-none-any.whl", hash = "sha256:943df030f497a5ab73e969a04df8a653138fb67ebcf2380fedb4b4886d4ffba0", size = 4736, upload-time = "2025-01-14T18:52:17.655Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4e/76016130c27b98943c5758a05beab3ba1bc9349ee881e1dfc509ea954233/pyobjc_framework_discrecordingui-12.1-py2.py3-none-any.whl", hash = "sha256:6544ef99cad3dee95716c83cb207088768b6ecd3de178f7e1b17df5997689dfd", size = 4702, upload-time = "2025-11-14T09:48:08.01Z" }, ] [[package]] name = "pyobjc-framework-diskarbitration" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/fb/5d3ff093144f499904b1e1bce18d010fe2171b9be62b4679d3dda8b3ad19/pyobjc_framework_diskarbitration-11.0.tar.gz", hash = "sha256:1c3e21398b366a1ce96cf68501a2e415f5ccad4b43a3e7cc901e09e896dfb545", size = 20096, upload-time = "2025-01-14T19:03:37.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/42/f75fcabec1a0033e4c5235cc8225773f610321d565b63bf982c10c6bbee4/pyobjc_framework_diskarbitration-12.1.tar.gz", hash = "sha256:6703bc5a09b38a720c9ffca356b58f7e99fa76fc988c9ec4d87112344e63dfc2", size = 17121, upload-time = "2025-11-14T10:15:02.223Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/f4/f7ad86b2bb922b94745c369b90420cda984e6ad1ac9eb79ec32f5e332123/pyobjc_framework_DiskArbitration-11.0-py2.py3-none-any.whl", hash = "sha256:58823297eb09ff020ee156649170ab824fec32825bd32f2814c32e005920a72c", size = 4793, upload-time = "2025-01-14T18:52:18.561Z" }, - { url = "https://files.pythonhosted.org/packages/8e/87/bf0fc2aa781a819421e572cf6315fae7d0baf46607f9a67c86525c7e0e03/pyobjc_framework_DiskArbitration-11.0-py3-none-any.whl", hash = "sha256:7d41189a2d82045a7195c4661d8ec16195b6325a2f68f9d960e9a9f6649d1131", size = 4865, upload-time = "2025-01-14T18:52:19.786Z" }, + { url = "https://files.pythonhosted.org/packages/48/65/c1f54c47af17cb6b923eab85e95f22396c52f90ee8f5b387acffad9a99ea/pyobjc_framework_diskarbitration-12.1-py2.py3-none-any.whl", hash = "sha256:54caf3079fe4ae5ac14466a9b68923ee260a1a88a8290686b4a2015ba14c2db6", size = 4877, upload-time = "2025-11-14T09:48:09.945Z" }, ] [[package]] name = "pyobjc-framework-dvdplayback" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/89ebee4863fd6f173bff9373b5bda4ffa87eba6197337617ab086e23c7d5/pyobjc_framework_dvdplayback-11.0.tar.gz", hash = "sha256:9a005f441afbc34aea301857e166fd650d82762a75d024253e18d1102b21b2f8", size = 64798, upload-time = "2025-01-14T19:03:38.491Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/dd/7859a58e8dd336c77f83feb76d502e9623c394ea09322e29a03f5bc04d32/pyobjc_framework_dvdplayback-12.1.tar.gz", hash = "sha256:279345d4b5fb2c47dd8e5c2fd289e644b6648b74f5c25079805eeb61bfc4a9cd", size = 32332, upload-time = "2025-11-14T10:15:05.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/7f/6073ef2c5170abf55a15750cd069b0c3fdd03e48f3c86761a6a8ecaa0a38/pyobjc_framework_DVDPlayback-11.0-py2.py3-none-any.whl", hash = "sha256:2013289aa38166d81bcbf25d6600ead1996e50de2bc689e5cf36f36a45346424", size = 8171, upload-time = "2025-01-14T18:51:55.282Z" }, - { url = "https://files.pythonhosted.org/packages/db/e4/97ed8d41491f366908581efb8644376fd81ede07ec2cf204cdb3c300ed1e/pyobjc_framework_DVDPlayback-11.0-py3-none-any.whl", hash = "sha256:c6be6ae410d8dce7179d6ee8c9bc421468d4b9c19af3ff0e59c93ae71cfc33e0", size = 8245, upload-time = "2025-01-14T18:51:57.205Z" }, + { url = "https://files.pythonhosted.org/packages/29/7d/22c07c28fab1f15f0d364806e39a6ca63c737c645fe7e98e157878b5998c/pyobjc_framework_dvdplayback-12.1-py2.py3-none-any.whl", hash = "sha256:af911cc222272a55b46a1a02a46a355279aecfd8132231d8d1b279e252b8ad4c", size = 8243, upload-time = "2025-11-14T09:48:11.824Z" }, ] [[package]] name = "pyobjc-framework-eventkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/13/38a98e5cee62e1655d84cfb88cad54fdec4ec272b5fd0c5ac3fc21e33e49/pyobjc_framework_eventkit-11.0.tar.gz", hash = "sha256:3d412203a510b3d62a5eb0987406e0951b13ed39c3351c0ec874afd72496627c", size = 75399, upload-time = "2025-01-14T19:03:39.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/42/4ec97e641fdcf30896fe76476181622954cb017117b1429f634d24816711/pyobjc_framework_eventkit-12.1.tar.gz", hash = "sha256:7c1882be2f444b1d0f71e9a0cd1e9c04ad98e0261292ab741fc9de0b8bbbbae9", size = 28538, upload-time = "2025-11-14T10:15:07.878Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/d5/e866c951237fb1b6423b85e1623a7f8cc417862261196e276ecc23141976/pyobjc_framework_EventKit-11.0-py2.py3-none-any.whl", hash = "sha256:934e31f4c82f887e1bf01f96d33de4c7c6727de3fdb55bc739e1c686c10cc151", size = 6717, upload-time = "2025-01-14T18:52:20.684Z" }, - { url = "https://files.pythonhosted.org/packages/dc/47/3c0cc7b8c95e6759804b426e78510f65b8e7409c425b85f1b0109d14cdcc/pyobjc_framework_EventKit-11.0-py3-none-any.whl", hash = "sha256:5467977c79649dac9e0183dc72511f7dd49aab0260b67c2cfa25079a5a303f11", size = 6789, upload-time = "2025-01-14T18:52:21.73Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/142f43227627d6324993869d354b9e57eb1e88c4e229e2271592254daf25/pyobjc_framework_eventkit-12.1-py2.py3-none-any.whl", hash = "sha256:3d2d36d5bd9e0a13887a6ac7cdd36675985ebe2a9cb3cdf8cec0725670c92c60", size = 6820, upload-time = "2025-11-14T09:48:14.035Z" }, ] [[package]] name = "pyobjc-framework-exceptionhandling" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/46/6c2c4805697a0cfb8413eb7bc6901298e7a1febd49bb1ea960274fc33af3/pyobjc_framework_exceptionhandling-11.0.tar.gz", hash = "sha256:b11562c6eeaef5d8d43e9d817cf50feceb02396e5eb6a7f61df2c0cec93d912b", size = 18157, upload-time = "2025-01-14T19:03:40.393Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/17/5c9d4164f7ccf6b9100be0ad597a7857395dd58ea492cba4f0e9c0b77049/pyobjc_framework_exceptionhandling-12.1.tar.gz", hash = "sha256:7f0719eeea6695197fce0e7042342daa462683dc466eb6a442aad897032ab00d", size = 16694, upload-time = "2025-11-14T10:15:10.173Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9d/c25b0bc0d300dd5aedd61f0cbd94a91ec6608b550821108d554e9eea0ed7/pyobjc_framework_ExceptionHandling-11.0-py2.py3-none-any.whl", hash = "sha256:972e0a376fee4d3d4c5161f82a8e5f6305392dbf19e98c4c6486d737759ebd89", size = 6993, upload-time = "2025-01-14T18:52:22.621Z" }, - { url = "https://files.pythonhosted.org/packages/cb/04/4b75e083325313e80e66f42d9a932c3febd2db48609d5d960a319b568f7c/pyobjc_framework_ExceptionHandling-11.0-py3-none-any.whl", hash = "sha256:d7f95fdb60a2636416066d3d12fad06cbf597e038576f8ed46fd3c742cc22252", size = 7063, upload-time = "2025-01-14T18:52:24.447Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ad/8e05acf3635f20ea7d878be30d58a484c8b901a8552c501feb7893472f86/pyobjc_framework_exceptionhandling-12.1-py2.py3-none-any.whl", hash = "sha256:2f1eae14cf0162e53a0888d9ffe63f047501fe583a23cdc9c966e89f48cf4713", size = 7113, upload-time = "2025-11-14T09:48:15.685Z" }, ] [[package]] name = "pyobjc-framework-executionpolicy" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/91/2e4cacbdabf01bc1207817edacc814b6bc486df12e857a8d86964d98fef4/pyobjc_framework_executionpolicy-11.0.tar.gz", hash = "sha256:de953a8acae98079015b19e75ec8154a311ac1a70fb6d885e17fab09464c98a9", size = 13753, upload-time = "2025-01-14T19:03:42.353Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/11/db765e76e7b00e1521d7bb3a61ae49b59e7573ac108da174720e5d96b61b/pyobjc_framework_executionpolicy-12.1.tar.gz", hash = "sha256:682866589365cd01d3a724d8a2781794b5cba1e152411a58825ea52d7b972941", size = 12594, upload-time = "2025-11-14T10:15:12.077Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/03/a433c64c21c754ed796ae5ca0bad63fcb1d51134968ce0c53d4ee806ccd8/pyobjc_framework_ExecutionPolicy-11.0-py2.py3-none-any.whl", hash = "sha256:fdf78bf22fa6ea6f27b574f73856a8a22992d0c0d5a6ed64823e00000c06ffe7", size = 3668, upload-time = "2025-01-14T18:52:28.64Z" }, - { url = "https://files.pythonhosted.org/packages/0b/47/da969dd9d56403e23cc95e68c4816563f64ed6fde7ff4e3c3710e8e8efcf/pyobjc_framework_ExecutionPolicy-11.0-py3-none-any.whl", hash = "sha256:d2dba6f3f7803d1cd0a5608a7ad75085b73097b6c3a935b7f1326c7202249751", size = 3737, upload-time = "2025-01-14T18:52:30.841Z" }, + { url = "https://files.pythonhosted.org/packages/51/2c/f10352398f10f244401ab8f53cabd127dc3f5dbbfc8de83464661d716671/pyobjc_framework_executionpolicy-12.1-py2.py3-none-any.whl", hash = "sha256:c3a9eca3bd143cf202787dd5e3f40d954c198f18a5e0b8b3e2fcdd317bf33a52", size = 3739, upload-time = "2025-11-14T09:48:17.35Z" }, ] [[package]] name = "pyobjc-framework-extensionkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/98/803e3cb000dac227eb0d223802a0aeb052d34a741e572d9584e7d83afca7/pyobjc_framework_extensionkit-11.0.tar.gz", hash = "sha256:82d9e79532e5a0ff0eadf1ccac236c5d3dca344e1090a0f3e88519faa24143c7", size = 19200, upload-time = "2025-01-14T19:03:43.188Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/d4/e9b1f74d29ad9dea3d60468d59b80e14ed3a19f9f7a25afcbc10d29c8a1e/pyobjc_framework_extensionkit-12.1.tar.gz", hash = "sha256:773987353e8aba04223dbba3149253db944abfb090c35318b3a770195b75da6d", size = 18694, upload-time = "2025-11-14T10:15:14.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/2f/c4714fe6d7a641734494a383d2284756542a3ce663c1dca394057308ff30/pyobjc_framework_ExtensionKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f6815bf25ff17ded53d66543e32fac3c89a20f7138389d291816bef04f85da48", size = 7784, upload-time = "2025-01-14T18:52:31.804Z" }, - { url = "https://files.pythonhosted.org/packages/a7/1d/ed580ce024d7e9a1ea88ee592d03b34f0b688414793bf8b7be5a367ecea8/pyobjc_framework_ExtensionKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98957dd51f0a4e02aa3d9d3a184f37ca5f99f4cb9e11282a2fc793d18de02af8", size = 7781, upload-time = "2025-01-14T18:52:32.843Z" }, - { url = "https://files.pythonhosted.org/packages/43/47/79ec40a400c6fea4b7b15e1e2547f1060075d32c922b01067822e21d8e6f/pyobjc_framework_ExtensionKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5724789647b04c058a4a7b081f765939639bb49cd5dd1ad071ee88fcee6111c9", size = 7760, upload-time = "2025-01-14T18:52:37.662Z" }, + { url = "https://files.pythonhosted.org/packages/ff/22/2714fe409dda791152bfe9463807a3deefcee316089af1a123019871a3cf/pyobjc_framework_extensionkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6764f7477bb0f6407a5217cbfc2da13a71a5d402ac5f005300958886e25fd9b5", size = 7919, upload-time = "2025-11-14T09:48:19.403Z" }, + { url = "https://files.pythonhosted.org/packages/4f/02/3d1df48f838dc9d64f03bedd29f0fdac6c31945251c9818c3e34083eb731/pyobjc_framework_extensionkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9139c064e1c7f21455411848eb39f092af6085a26cad322aa26309260e7929d9", size = 7919, upload-time = "2025-11-14T09:48:22.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/8064dad6114a489e5439cc20d9fb0dd64cfc406d875b4a3c87015b3f6266/pyobjc_framework_extensionkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7e01d705c7ac6d080ae34a81db6d9b81875eabefa63fd6eafbfa30f676dd780b", size = 7932, upload-time = "2025-11-14T09:48:23.653Z" }, ] [[package]] name = "pyobjc-framework-externalaccessory" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/b0/ac0a02fe26e66c33fee751a65c1ed06bbd2934db8636e08bb491e8334bad/pyobjc_framework_externalaccessory-11.0.tar.gz", hash = "sha256:39e59331ced75cdcccf23bb5ffe0fa9d67e0c190c1da8887a0e4349b7e27584f", size = 22577, upload-time = "2025-01-14T19:03:44.021Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/35/86c097ae2fdf912c61c1276e80f3e090a3fc898c75effdf51d86afec456b/pyobjc_framework_externalaccessory-12.1.tar.gz", hash = "sha256:079f770a115d517a6ab87db1b8a62ca6cdf6c35ae65f45eecc21b491e78776c0", size = 20958, upload-time = "2025-11-14T10:15:16.419Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/3c/a0fa0c31cea4f32a0d578aa453581bea467df5b1876c373cfa4b5e933f9f/pyobjc_framework_ExternalAccessory-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c176fa6be74d25cd2f01c060fad0924ac0fda1ba54763c2c5fa1199311487a84", size = 8787, upload-time = "2025-01-14T18:52:39.207Z" }, - { url = "https://files.pythonhosted.org/packages/a3/96/bddfe9f72a59a3038ec3208a7d2a62332d5e171d7e3c338ccff6bd6e76b8/pyobjc_framework_ExternalAccessory-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:319f66edb96505f833fe7fe9ba810cb3b0d0c65605b8674bea52f040e8caebd6", size = 8785, upload-time = "2025-01-14T18:52:40.529Z" }, - { url = "https://files.pythonhosted.org/packages/d2/7e/15d5e2b76e57b38772f7d35cc7e52c603be103dbdb159cb075a3a09cbe4d/pyobjc_framework_ExternalAccessory-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ebe16f961bd9e62cc8bedc536e57b3df4e33da8f48c960500c4133ab8acea8a", size = 8777, upload-time = "2025-01-14T18:52:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/e1/af/754d05e6411be3464efffd8111bc12ce1b29d615910b19e532f39083dfc3/pyobjc_framework_externalaccessory-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ee55a06fe8ef7ff07a435d75544d8c7177e790afaff60b5a55e3ceea1c9f03e7", size = 8908, upload-time = "2025-11-14T09:48:33.173Z" }, + { url = "https://files.pythonhosted.org/packages/18/01/2a83b63e82ce58722277a00521c3aeec58ac5abb3086704554e47f8becf3/pyobjc_framework_externalaccessory-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:32208e05c9448c8f41b3efdd35dbea4a8b119af190f7a2db0d580be8a5cf962e", size = 8911, upload-time = "2025-11-14T09:48:35.349Z" }, + { url = "https://files.pythonhosted.org/packages/ec/52/984034396089766b6e5ff3be0f93470e721c420fa9d1076398557532234f/pyobjc_framework_externalaccessory-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dedbf7a09375ac19668156c1417bd7829565b164a246b714e225b9cbb6a351ad", size = 8932, upload-time = "2025-11-14T09:48:37.393Z" }, ] [[package]] name = "pyobjc-framework-fileprovider" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/fc/b8593d8645b9933e60a885f451d0c12d9c0e1b00e62121d8660d95852dff/pyobjc_framework_fileprovider-11.0.tar.gz", hash = "sha256:dcc3ac3c90117c1b8027ea5f26dad6fe5045f688ce3e60d07ece12ec56e17ab3", size = 78701, upload-time = "2025-01-14T19:03:44.931Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/9a/724b1fae5709f8860f06a6a2a46de568f9bb8bdb2e2aae45b4e010368f51/pyobjc_framework_fileprovider-12.1.tar.gz", hash = "sha256:45034e0d00ae153c991aa01cb1fd41874650a30093e77ba73401dcce5534c8ad", size = 43071, upload-time = "2025-11-14T10:15:19.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/67/9cdfe7ca203d5219c004097160655b3cc271b10d44975aaf60b3136cb32e/pyobjc_framework_FileProvider-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d95c589f6e1f114b67be82c1933c32d29aa65f8b3f0d97e4b3676517f6f1092d", size = 19177, upload-time = "2025-01-14T18:53:00.526Z" }, - { url = "https://files.pythonhosted.org/packages/4a/57/1f959ec54650d1afc08e89d2995a1534f44229b1371cf66429a45b27c32d/pyobjc_framework_FileProvider-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c7e803a37f7327c191a4de7dbb36e5fbf8bd08dadbcc7f626e491451c7a3849", size = 19179, upload-time = "2025-01-14T18:53:01.659Z" }, - { url = "https://files.pythonhosted.org/packages/87/14/465178c8b20b0bc07a0032ff25fcd47a1718cf3e07b0cae6eb61a73f6e81/pyobjc_framework_FileProvider-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e9ceddc93957840735508c594cb9e1efa34647db65f0d15b469681f83f59a814", size = 19162, upload-time = "2025-01-14T18:53:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/f7/eb/3ead14806cb784692504f331756f2c03a7254e384c01a6a08e0e16ba0115/pyobjc_framework_fileprovider-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6f672069340bd8e994f9ef144949d807485ced5b1b9e21917cc7810e1aa8cda0", size = 20976, upload-time = "2025-11-14T09:48:47.745Z" }, + { url = "https://files.pythonhosted.org/packages/1d/37/2f56167e9f43d3b25a5ed073305ca0cfbfc66bedec7aae9e1f2c9c337265/pyobjc_framework_fileprovider-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d527c417f06d27c4908e51d4e6ccce0adcd80c054f19e709626e55c511dc963", size = 20970, upload-time = "2025-11-14T09:48:50.557Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f5/56f0751a2988b2caca89d6800c8f29246828d1a7498bb676ef1ab28000b7/pyobjc_framework_fileprovider-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:89b140ea8369512ddf4164b007cbe35b4d97d1dcb8affa12a7264c0ab8d56e45", size = 21003, upload-time = "2025-11-14T09:48:53.128Z" }, ] [[package]] name = "pyobjc-framework-fileproviderui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-fileprovider", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-fileprovider" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/9d/ca4aed36e6188623e9da633634af772f239bee74934322e1c19ae7b79a53/pyobjc_framework_fileproviderui-11.0.tar.gz", hash = "sha256:cf5c7d32b29d344b65217397eea7b1a2913ce52ce923c9e04135a7a298848d04", size = 13419, upload-time = "2025-01-14T19:03:46.016Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/00/234f9b93f75255845df81d9d5ea20cb83ecb5c0a4e59147168b622dd0b9d/pyobjc_framework_fileproviderui-12.1.tar.gz", hash = "sha256:15296429d9db0955abc3242b2920b7a810509a85118dbc185f3ac8234e5a6165", size = 12437, upload-time = "2025-11-14T10:15:22.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2e/8a91cfa9485a2e9ad295da8bb5505d0dc1046dec8557d2ae17eef75f3912/pyobjc_framework_FileProviderUI-11.0-py2.py3-none-any.whl", hash = "sha256:5102651febb5a6140f99b116b73d0fd6c9822372a5203506e4904ac0ebb1313c", size = 3642, upload-time = "2025-01-14T18:53:06.378Z" }, - { url = "https://files.pythonhosted.org/packages/75/9b/a542159b1aefedb24f01440a929b7bbc6f4bbae3a74d09ad05a7f4adb9c0/pyobjc_framework_FileProviderUI-11.0-py3-none-any.whl", hash = "sha256:b75f70eef2af3696f3cb2e0de88bbb437343b53070078573ae72d64bf56fce9d", size = 3712, upload-time = "2025-01-14T18:53:07.403Z" }, + { url = "https://files.pythonhosted.org/packages/e8/65/cc4397511bd0af91993d6302a2aed205296a9ad626146eefdfc8a9624219/pyobjc_framework_fileproviderui-12.1-py2.py3-none-any.whl", hash = "sha256:521a914055089e28631018bd78df4c4f7416e98b4150f861d4a5bc97d5b1ffe4", size = 3715, upload-time = "2025-11-14T09:49:04.213Z" }, ] [[package]] name = "pyobjc-framework-findersync" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/e3/24df6e24b589073815be13f2943b93feb12afbf558f6e54c4033b57c29ee/pyobjc_framework_findersync-11.0.tar.gz", hash = "sha256:8dab3feff5debd6bc3746a21ded991716723d98713d1ba37cec1c5e2ad78ee63", size = 15295, upload-time = "2025-01-14T19:03:46.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/63/c8da472e0910238a905bc48620e005a1b8ae7921701408ca13e5fb0bfb4b/pyobjc_framework_findersync-12.1.tar.gz", hash = "sha256:c513104cef0013c233bf8655b527df665ce6f840c8bc0b3781e996933d4dcfa6", size = 13507, upload-time = "2025-11-14T10:15:24.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/f1/42797ae9065e0127df4b5bb7a45e06eff8568a476edbc8d590cea9d25228/pyobjc_framework_FinderSync-11.0-py2.py3-none-any.whl", hash = "sha256:cafb262d1ad1e3a86af333f673aeda4f9bdcf528ded97c2232fd1cf440d1db5a", size = 4788, upload-time = "2025-01-14T18:53:09.559Z" }, - { url = "https://files.pythonhosted.org/packages/d8/96/2ed2ca5536f76102ea3bfb886cdc7b34ec51f53b122b9c535b4ac9b1ee03/pyobjc_framework_FinderSync-11.0-py3-none-any.whl", hash = "sha256:d00285b85038c5546e8566bec9cd3a4615708f0e6cb774d0ea804c69546ec915", size = 4860, upload-time = "2025-01-14T18:53:11.765Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/ec7f393e3e2fd11cbdf930d884a0ba81078bdb61920b3cba4f264de8b446/pyobjc_framework_findersync-12.1-py2.py3-none-any.whl", hash = "sha256:e07abeca52c486cf14927f617afc27afa7a3828b99fab3ad02355105fb29203e", size = 4889, upload-time = "2025-11-14T09:49:05.763Z" }, ] [[package]] name = "pyobjc-framework-fsevents" -version = "11.0" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/17/21f45d2bca2efc72b975f2dfeae7a163dbeabb1236c1f188578403fd4f09/pyobjc_framework_fsevents-12.1.tar.gz", hash = "sha256:a22350e2aa789dec59b62da869c1b494a429f8c618854b1383d6473f4c065a02", size = 26487, upload-time = "2025-11-14T10:15:26.796Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/97/8c0cc7fb5e3e2c94fa11b3e2a1e6a2546af067263c6da1eafe09485492c3/pyobjc_framework_fsevents-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b3af4e030325672679e3fce55d34fff2a6d9da0cf27810f3cfc0eec0880e45e8", size = 13057, upload-time = "2025-11-14T09:49:07.774Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3f/a7fe5656b205ee3a9fd828e342157b91e643ee3e5c0d50b12bd4c737f683/pyobjc_framework_fsevents-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:459cc0aac9850c489d238ba778379d09f073bbc3626248855e78c4bc4d97fe46", size = 13059, upload-time = "2025-11-14T09:49:09.814Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/2c5eeea390c0b053e2d73b223af3ec87a3e99a8106e8d3ee79942edb0822/pyobjc_framework_fsevents-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a2949358513fd7bc622fb362b5c4af4fc24fc6307320070ca410885e5e13d975", size = 13141, upload-time = "2025-11-14T09:49:11.947Z" }, +] + +[[package]] +name = "pyobjc-framework-fskit" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/37/4c09cc7b8678e2bb5b68ebc62e817eb88c409b1c41bdc1510d7d24a0372d/pyobjc_framework_fsevents-11.0.tar.gz", hash = "sha256:e01dab04704a518e4c3e1f7d8722819a4f228d5082978e11618aa7abba3883fe", size = 29078, upload-time = "2025-01-14T19:03:49.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/55/d00246d6e6d9756e129e1d94bc131c99eece2daa84b2696f6442b8a22177/pyobjc_framework_fskit-12.1.tar.gz", hash = "sha256:ec54e941cdb0b7d800616c06ca76a93685bd7119b8aa6eb4e7a3ee27658fc7ba", size = 42372, upload-time = "2025-11-14T10:15:30.411Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/bc/baa0bcc0253d187f50dcb94eff71d96ed804105aa28578e911bbe45da48f/pyobjc_framework_FSEvents-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4a9470216da0be78c07b8b9fe02da050da2bbf968a2d0b723453b167592ae463", size = 13207, upload-time = "2025-01-14T18:52:48.077Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8a/75fd630865c9f9d69b1364208582872fc818b4c1a70fd9ae85a5cf7a2c5a/pyobjc_framework_FSEvents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0b3c7835251a35453e3079cf929b9e5329d02e2f4eaac2ebabbe19e1abd18ab", size = 13209, upload-time = "2025-01-14T18:52:49.478Z" }, - { url = "https://files.pythonhosted.org/packages/d7/80/c2bed2600d524a8d28f3a75be757bffa5ef30f798e7b6e97c04e9f992fc3/pyobjc_framework_FSEvents-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d0935758429486480c9f667ee5c0a36dccdcdc548075d9579b37acda8738802", size = 13200, upload-time = "2025-01-14T18:52:58.227Z" }, + { url = "https://files.pythonhosted.org/packages/d1/14/b76574b79afe10d6365915868c168c2c7d3825c6be212cadc55add85f319/pyobjc_framework_fskit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:521423e7dfc4d2c5c262ba1db0adeb0e0b60976a2d74dec285642914f50252b2", size = 20228, upload-time = "2025-11-14T09:49:22.913Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1a/5a0b6b8dc18b9dbcb7d1ef7bebdd93f12560097dafa6d7c4b3c15649afba/pyobjc_framework_fskit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:95b9135eea81eeed319dcca32c9db04b38688301586180b86c4585fef6b0e9cd", size = 20228, upload-time = "2025-11-14T09:49:25.324Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a9/0c47469fe80fa14bc698bb0a5b772b44283cc3aca0f67e7f70ab45e09b24/pyobjc_framework_fskit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:50972897adea86508cfee33ec4c23aa91dede97e9da1640ea2fe74702b065be1", size = 20250, upload-time = "2025-11-14T09:49:28.065Z" }, ] [[package]] name = "pyobjc-framework-gamecenter" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/3b/e66caebc948d9fe3b2671659caab220aff6d5e80ac25442d83331b523d23/pyobjc_framework_gamecenter-11.0.tar.gz", hash = "sha256:18a05500dbcf2cca4a0f05839ec010c76ee08ab65b65020c9538a31feb274483", size = 31459, upload-time = "2025-01-14T19:03:50.766Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/f8/b5fd86f6b722d4259228922e125b50e0a6975120a1c4d957e990fb84e42c/pyobjc_framework_gamecenter-12.1.tar.gz", hash = "sha256:de4118f14c9cf93eb0316d49da410faded3609ce9cd63425e9ef878cebb7ea72", size = 31473, upload-time = "2025-11-14T10:15:33.38Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/9a/369feafb0c784a7bd2b4a2bb5d9bd2b6b8e5f32eeb43796ec4b8a026dbf2/pyobjc_framework_GameCenter-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a92d63b5a6ba7c27c80c13f69fd8aabc84bdacf619ef7da74552cd73ab93581", size = 18470, upload-time = "2025-01-14T18:53:12.718Z" }, - { url = "https://files.pythonhosted.org/packages/1e/7e/8a41ab9880e415143baf771d55566e2a863ec538837480a5ee17e1ddc08b/pyobjc_framework_GameCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8bff2a36cf3cb52cbe321203147766e95997f881062143171cdd8ef2fde9e53", size = 18472, upload-time = "2025-01-14T18:53:13.794Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a9/407cee8478212c5c7a7dcd354b3e3160710a758326138f06dc75eac85f2f/pyobjc_framework_GameCenter-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:807517f8e6ab27b2fc6fd2d9450df71cd927e2be73097abcb8be073e16e7599e", size = 18461, upload-time = "2025-01-14T18:53:18.017Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e4/6a8223224d58e68ffef3809f6d6cf6bbabff89d373b27df9e56454f911b7/pyobjc_framework_gamecenter-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25f6a403352aaf8755a3874477fb70b1107ca28769e585541b52727ec50834be", size = 18827, upload-time = "2025-11-14T09:49:40.148Z" }, + { url = "https://files.pythonhosted.org/packages/ca/17/6491f9e96664e05ec00af7942a6c2f69217771522c9d1180524273cac7cb/pyobjc_framework_gamecenter-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:30943512f2aa8cb129f8e1abf951bf06922ca20b868e918b26c19202f4ee5cc4", size = 18824, upload-time = "2025-11-14T09:49:42.543Z" }, + { url = "https://files.pythonhosted.org/packages/16/ee/b496cc4248c5b901e159d6d9a437da9b86a3105fc3999a66744ba2b2c884/pyobjc_framework_gamecenter-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e8d6d10b868be7c00c2d5a0944cc79315945735dcf17eaa3fec1a7986d26be9b", size = 18868, upload-time = "2025-11-14T09:49:44.767Z" }, ] [[package]] name = "pyobjc-framework-gamecontroller" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/30/02ca5a4fb911acf3e8018abcbd29631a842aeac02958ae91fab1acb13ad1/pyobjc_framework_gamecontroller-11.0.tar.gz", hash = "sha256:6d62f4493d634eba03a43a14c4d1e4511e1e3a2ca2e9cbefa6ae9278a272c1d0", size = 115318, upload-time = "2025-01-14T19:03:52.264Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/14/353bb1fe448cd833839fd199ab26426c0248088753e63c22fe19dc07530f/pyobjc_framework_gamecontroller-12.1.tar.gz", hash = "sha256:64ed3cc4844b67f1faeb540c7cc8d512c84f70b3a4bafdb33d4663a2b2a2b1d8", size = 54554, upload-time = "2025-11-14T10:15:37.591Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/a2/1e8c21f5e6d1bba8e6da7c698a1250b3b5c1d7cc06953447f98aaf33fa80/pyobjc_framework_GameController-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f0d3400fe3ebacdcd52af3ff9de1dc104206bcbc9615d42270b6f997b18af76d", size = 20992, upload-time = "2025-01-14T18:53:18.953Z" }, - { url = "https://files.pythonhosted.org/packages/98/ec/05f356ab2d747a385c2a68908f2f67ee1b1e7a169b1497b0771b2226a174/pyobjc_framework_GameController-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:30e8f251be49ff67491df758c73149e7c7e87bee89919966ed1b2bf56fdaacf7", size = 20995, upload-time = "2025-01-14T18:53:19.979Z" }, - { url = "https://files.pythonhosted.org/packages/75/12/3f1d243ae87854251a95b22d06079867622277537f2331425bec7ca4175b/pyobjc_framework_GameController-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34462baf39568df57567300edb2954d65e788d277abca2e6e59e08c603cd0bce", size = 20993, upload-time = "2025-01-14T18:53:25.188Z" }, + { url = "https://files.pythonhosted.org/packages/50/20/998ad37fe6640b1ccb91bb9bb99e9baefd95238d8b2de43d4a0e07d5b80a/pyobjc_framework_gamecontroller-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:38b290dfb8f5999c599b883fd13d3cade78f26111d010bc003b19ee400182aa5", size = 20916, upload-time = "2025-11-14T09:49:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/e4/dc/1d8bd4845a46cb5a5c1f860d85394e64729b2447bbe149bb33301bc99056/pyobjc_framework_gamecontroller-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2633c2703fb30ce068b2f5ce145edbd10fd574d2670b5cdee77a9a126f154fec", size = 20913, upload-time = "2025-11-14T09:49:58.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/28/9f03d0ef7c78340441f78b19fb2d2c952af04a240da5ed30c7cf2d0d0f4e/pyobjc_framework_gamecontroller-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:878aa6590c1510e91bfc8710d6c880e7a8f3656a7b7b6f4f3af487a6f677ccd5", size = 20949, upload-time = "2025-11-14T09:50:01.608Z" }, ] [[package]] name = "pyobjc-framework-gamekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/df/c161460e5736a34f9b59aa0a3f2d6ad1d1cd9a913aa63c89c41a6ba3b6ae/pyobjc_framework_gamekit-11.0.tar.gz", hash = "sha256:29b5464ca78f0de62e6b6d56e80bbeccb96dc13820b6d5b4e835ab1cc127e5b9", size = 164394, upload-time = "2025-01-14T19:03:53.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/7b/d625c0937557f7e2e64200fdbeb867d2f6f86b2f148b8d6bfe085e32d872/pyobjc_framework_gamekit-12.1.tar.gz", hash = "sha256:014d032c3484093f1409f8f631ba8a0fd2ff7a3ae23fd9d14235340889854c16", size = 63833, upload-time = "2025-11-14T10:15:42.842Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/fa/871432b993bdc2455a966ecfb6935b80ee661ef4114423f70d0f63500c1d/pyobjc_framework_GameKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e5420b9aa29bb66bc2b9b167929d6f31937f029ee5f3f63a49a14ac226aa4d56", size = 21665, upload-time = "2025-01-14T18:53:26.138Z" }, - { url = "https://files.pythonhosted.org/packages/88/4d/9fe843671c7b94d8e8a925662775d4b2632c138c6a0a9d1bb2c379f225c0/pyobjc_framework_GameKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dabe856c8638940d2b346abc7a1828cca12d00b47d2951d0ac9f4e27ecc8d3ec", size = 21667, upload-time = "2025-01-14T18:53:27.239Z" }, - { url = "https://files.pythonhosted.org/packages/87/80/6a338cfcd1f19ff4a470aca1b7e556d9a965a87e934aad296e87f95a51d4/pyobjc_framework_GameKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:047de8c3aaf1036fd18af846a4793ec8f5224d7da5c38388f682ccf9b4caa326", size = 21647, upload-time = "2025-01-14T18:53:31.726Z" }, + { url = "https://files.pythonhosted.org/packages/3c/dc/0cd33dcfc9730a8ba22e848d431a7212a7aa0b4559101c389ae9bab77c7e/pyobjc_framework_gamekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b15492801dafcbb569dee8c58d26e16ce06b33912872e85dfd50cf39b8f98f1e", size = 22457, upload-time = "2025-11-14T09:50:13.772Z" }, + { url = "https://files.pythonhosted.org/packages/06/47/d3b78cf57bc2d62dc1408aaad226b776d167832063bbaa0c7cc7a9a6fa12/pyobjc_framework_gamekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb263e90a6af3d7294bc1b1ea5907f8e33bb77d62fb806696f8df7e14806ccad", size = 22463, upload-time = "2025-11-14T09:50:16.444Z" }, + { url = "https://files.pythonhosted.org/packages/c4/05/1c49e1030dc9f2812fa8049442158be76c32f271075f4571f94e4389ea86/pyobjc_framework_gamekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eee796d5781157f2c5684f7ef4c2a7ace9d9b408a26a9e7e92e8adf5a3f63d7", size = 22493, upload-time = "2025-11-14T09:50:19.129Z" }, ] [[package]] name = "pyobjc-framework-gameplaykit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-spritekit", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-spritekit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/f0/980c4fc3c594d9726b7eb6ae83f73127b22560e1541c7d272d23d17fdf0d/pyobjc_framework_gameplaykit-11.0.tar.gz", hash = "sha256:90eeec464fba992d75a406ccbddb35ed7420a4f5226f19c018982fa3ba7bf431", size = 72837, upload-time = "2025-01-14T19:03:56.127Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/11/c310bbc2526f95cce662cc1f1359bb11e2458eab0689737b4850d0f6acb7/pyobjc_framework_gameplaykit-12.1.tar.gz", hash = "sha256:935ebd806d802888969357946245d35a304c530c86f1ffe584e2cf21f0a608a8", size = 41511, upload-time = "2025-11-14T10:15:46.529Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/2a/d967a1f803cae450b2c427160474a3ff39ea3b4b9834be89d6b27bcfb4a6/pyobjc_framework_GameplayKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d407e9df8a157c3cd7ed15723f761f10e0354d9d54377e3b5a618435941c586", size = 13379, upload-time = "2025-01-14T18:53:33.143Z" }, - { url = "https://files.pythonhosted.org/packages/30/e7/3530071bf1897f2fe2e5f0c54620f0df9fcac586b9ba6bb5726fc9d295c2/pyobjc_framework_GameplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:01f59bbf5beb0cfcfea17011987995f1cccf2ec081d91269f95e71283dd83c67", size = 13381, upload-time = "2025-01-14T18:53:34.217Z" }, - { url = "https://files.pythonhosted.org/packages/fe/92/5fe2a369aa2e567cda03b583f3bf3fc7834ee4bfbe5cf2a92adcdde55ce1/pyobjc_framework_GameplayKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c71926d946040c1d64fde656e28bc6a63dcf567e4a18a8be76f076d75616d4ff", size = 13364, upload-time = "2025-01-14T18:53:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0f/9ff71cf1871603d12f19a11b6287c2d6dff9d250efff5e40453003bac796/pyobjc_framework_gameplaykit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1af3963897c1ff2dfbcc6782ff162d6bf34488f6736e60cfc73411fdfaba2b31", size = 13129, upload-time = "2025-11-14T09:50:32.249Z" }, + { url = "https://files.pythonhosted.org/packages/3b/84/7a4a2c358770f5ffdb6bdabb74dcefdfa248b17c250a7c0f9d16d3b8d987/pyobjc_framework_gameplaykit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b2fb27f9f48c3279937e938a0456a5231b5c89e53e3199b9d54009a0bbd1228a", size = 13125, upload-time = "2025-11-14T09:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/35/1f/e5fe404f92ec0f9c8c37b00d6cb3ba96ee396c7f91b0a41a39b64bfc2743/pyobjc_framework_gameplaykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:309b0d7479f702830c9be92dbe5855ac2557a9d23f05f063caf9d9fdb85ff5f0", size = 13150, upload-time = "2025-11-14T09:50:36.884Z" }, +] + +[[package]] +name = "pyobjc-framework-gamesave" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/1f/8d05585c844535e75dbc242dd6bdfecfc613d074dcb700362d1c908fb403/pyobjc_framework_gamesave-12.1.tar.gz", hash = "sha256:eb731c97aa644e78a87838ed56d0e5bdbaae125bdc8854a7772394877312cc2e", size = 12654, upload-time = "2025-11-14T10:15:48.344Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/ec/93d48cb048a1b35cea559cc9261b07f0d410078b3af029121302faa410d0/pyobjc_framework_gamesave-12.1-py2.py3-none-any.whl", hash = "sha256:432e69f8404be9290d42c89caba241a3156ed52013947978ac54f0f032a14ffd", size = 3689, upload-time = "2025-11-14T09:50:47.263Z" }, ] [[package]] name = "pyobjc-framework-healthkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/2f/d79d2ec7c23bfc94bfaa7b7c6f6487a8bffdb73263eea6900aab56135889/pyobjc_framework_healthkit-11.0.tar.gz", hash = "sha256:e78ccb05f747ae3e70b5d73522030b7ba01ef2d390155fba7d50c1c614ae241f", size = 201558, upload-time = "2025-01-14T19:03:57.117Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/67/436630d00ba1028ea33cc9df2fc28e081481433e5075600f2ea1ff00f45e/pyobjc_framework_healthkit-12.1.tar.gz", hash = "sha256:29c5e5de54b41080b7a4b0207698ac6f600dcb9149becc9c6b3a69957e200e5c", size = 91802, upload-time = "2025-11-14T10:15:54.661Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/c9/2b8195a4284ca3feacb3d7a1685c1ea43b299c0e620dee39e6137fc47e31/pyobjc_framework_HealthKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c99393643da1f33310ab7a91ec00e2f787d9855f01d02d8576d973451b6b8452", size = 20141, upload-time = "2025-01-14T18:53:42.964Z" }, - { url = "https://files.pythonhosted.org/packages/f0/66/36a2fa7ef61b54a8e283355518ed003aa28b26e1dfad9ecbb7f543a08acd/pyobjc_framework_HealthKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ee87453c28bd4040b12a3bc834f0ea1989e331400845a14079e8f4a6ede70aa2", size = 20139, upload-time = "2025-01-14T18:53:44.342Z" }, - { url = "https://files.pythonhosted.org/packages/74/43/05729b83a036fc7e40028b1ab3ba55b8778a8bd7c5f27252316c729a36a2/pyobjc_framework_HealthKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e2b83399cbd24f095ea870f24093f9d83fa96a0ef2a382e13079eed69311f6ae", size = 20129, upload-time = "2025-01-14T18:53:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/2bbcb7816a46ede9bc99239208ec4787188ed522a7a2983483dd8b72acea/pyobjc_framework_healthkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1850c4f079374aaa3e91f22ab22b83817872460cc3a9c5310fe18c6140dc307", size = 20791, upload-time = "2025-11-14T09:50:49.708Z" }, + { url = "https://files.pythonhosted.org/packages/1e/37/b23d3c04ee37cbb94ff92caedc3669cd259be0344fcf6bdf1ff75ff0a078/pyobjc_framework_healthkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67bce41f8f63c11000394c6ce1dc694655d9ff0458771340d2c782f9eafcc6e", size = 20785, upload-time = "2025-11-14T09:50:52.152Z" }, + { url = "https://files.pythonhosted.org/packages/65/87/bb1c438de51c4fa733a99ce4d3301e585f14d7efd94031a97707c0be2b46/pyobjc_framework_healthkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:15b6fc958ff5de42888b18dffdec839cb36d2dd8b82076ed2f21a51db5271109", size = 20799, upload-time = "2025-11-14T09:50:54.531Z" }, ] [[package]] name = "pyobjc-framework-imagecapturecore" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/fe/db1fc3ffd784a9010070cd87a05d7fd2542c400395589341fab5970a01e1/pyobjc_framework_imagecapturecore-11.0.tar.gz", hash = "sha256:f5d185d8c8b564f8b4a815381bcdb424b10d203ba5bdf0fc887085e007df6f7a", size = 99935, upload-time = "2025-01-14T19:03:58.548Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/a1/39347381fc7d3cd5ab942d86af347b25c73f0ddf6f5227d8b4d8f5328016/pyobjc_framework_imagecapturecore-12.1.tar.gz", hash = "sha256:c4776c59f4db57727389d17e1ffd9c567b854b8db52198b3ccc11281711074e5", size = 46397, upload-time = "2025-11-14T10:15:58.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/81/73cae8b7a4d5cb4198d4706411d8abe018775cbd32f0af56e9c1d52c1a9c/pyobjc_framework_ImageCaptureCore-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad2066693bfdce17da0cb5370b85213e4a4ae728bfd8360eae542db503205e73", size = 16609, upload-time = "2025-01-14T18:54:04.163Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fb/29f20521e0df5da0110f1d6a48e4ed3530a2c0b670bf62d89ceeddd42c18/pyobjc_framework_ImageCaptureCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3fd78aa4a69e24caed38ae17a69b973e505324d966df86b47441318800a52db9", size = 16611, upload-time = "2025-01-14T18:54:05.308Z" }, - { url = "https://files.pythonhosted.org/packages/5b/6f/645769ccd5a5162525e83f562a9a0ae0811d4731c0326d8c790c8b4ba8ea/pyobjc_framework_ImageCaptureCore-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f09f4c4e2be3529e01cd78dab7f932cf3d84f2bd649d2ef52263f63ba3b51173", size = 16603, upload-time = "2025-01-14T18:54:10.433Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f0/249b7897425f3dbcde1df6c3e0b23112966ff026125747030e3e66e1ba2d/pyobjc_framework_imagecapturecore-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7cb050fcbfc3cd20cf0427523f080939f6d815cd85f58a2ebcac930567764384", size = 15986, upload-time = "2025-11-14T09:51:07.029Z" }, + { url = "https://files.pythonhosted.org/packages/b4/6b/b34d5c9041e90b8a82d87025a1854b60a8ec2d88d9ef9e715f3a40109ed5/pyobjc_framework_imagecapturecore-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:64d1eb677fe5b658a6b6ed734b7120998ea738ca038ec18c4f9c776e90bd9402", size = 15983, upload-time = "2025-11-14T09:51:09.978Z" }, + { url = "https://files.pythonhosted.org/packages/50/13/632957b284dec3743d73fb30dbdf03793b3cf1b4c62e61e6484d870f3879/pyobjc_framework_imagecapturecore-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a2777e17ff71fb5a327a897e48c5c7b5a561723a80f990d26e6ed5a1b8748816", size = 16012, upload-time = "2025-11-14T09:51:12.058Z" }, ] [[package]] name = "pyobjc-framework-inputmethodkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/e9/13d007285582e598903264a7d25cc6771a2a52d6c2a96a68fe91db0844fb/pyobjc_framework_inputmethodkit-11.0.tar.gz", hash = "sha256:86cd648bf98c4e777c884b7f69ebcafba84866740430d297645bf388eee6ce52", size = 26684, upload-time = "2025-01-14T19:03:59.525Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/b8/d33dd8b7306029bbbd80525bf833fc547e6a223c494bf69a534487283a28/pyobjc_framework_inputmethodkit-12.1.tar.gz", hash = "sha256:f63b6fe2fa7f1412eae63baea1e120e7865e3b68ccfb7d8b0a4aadb309f2b278", size = 23054, upload-time = "2025-11-14T10:16:01.464Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/e3/a2aedb5939b8cca4ece4fd75c42bbcaaaa08bea47d6205d5f4f99b99ab8e/pyobjc_framework_InputMethodKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:195a82fcd7282ff39960cb1b63e199b35a33384c0a970608243ec33e0209ff4c", size = 9371, upload-time = "2025-01-14T18:54:11.356Z" }, - { url = "https://files.pythonhosted.org/packages/b5/08/18572def66bf1e0ee6d079b45b34f8b4cbf2ab40b3024c351e4bd83cfa4c/pyobjc_framework_InputMethodKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a58273233e236cb9fa2d8d9295017c6bf26d6f47cc3a5dc9ba81f1c1e64a346", size = 9369, upload-time = "2025-01-14T18:54:12.452Z" }, - { url = "https://files.pythonhosted.org/packages/79/93/6333407c446a0079f3d9e6d72824fa6c4914dd8371b0c3a9fedf99b8126c/pyobjc_framework_InputMethodKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfb8e824282f03ddeed2abcef4db0a9f2c63196251d0676f17a5137076092cc1", size = 9351, upload-time = "2025-01-14T18:54:17.02Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8a/16b91f6744fcb6e978bb2eb9dd9c6da55c55e677087dcc426f34b1460795/pyobjc_framework_inputmethodkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e655947e314e6fe743ce225fc3170466003030b0186b8a7db161b54e87ee5c0e", size = 9500, upload-time = "2025-11-14T09:51:22.631Z" }, + { url = "https://files.pythonhosted.org/packages/a7/04/1315f84dba5704a4976ea0185f877f0f33f28781473a817010cee209a8f0/pyobjc_framework_inputmethodkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4e02f49816799a31d558866492048d69e8086178770b76f4c511295610e02ab", size = 9502, upload-time = "2025-11-14T09:51:24.708Z" }, + { url = "https://files.pythonhosted.org/packages/01/c2/59bea66405784b25f5d4e821467ba534a0b92dfc98e07257c971e2a8ed73/pyobjc_framework_inputmethodkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b7d813d46a060572fc0c14ef832e4fe538ebf64e5cab80ee955191792ce0110", size = 9506, upload-time = "2025-11-14T09:51:26.924Z" }, ] [[package]] name = "pyobjc-framework-installerplugins" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f2/f3/0379655e8ea3566002768d5e7b3ccd72ca845390632a8dabf801348af3a7/pyobjc_framework_installerplugins-11.0.tar.gz", hash = "sha256:88ec84e6999e8b2df874758b09878504a4fbfc8471cf3cd589d57e556f5b916e", size = 27687, upload-time = "2025-01-14T19:04:00.515Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/60/ca4ab04eafa388a97a521db7d60a812e2f81a3c21c2372587872e6b074f9/pyobjc_framework_installerplugins-12.1.tar.gz", hash = "sha256:1329a193bd2e92a2320a981a9a421a9b99749bade3e5914358923e94fe995795", size = 25277, upload-time = "2025-11-14T10:16:04.379Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/db/0f3334648a53c8ad663fd19d5421863cb0b711e38a2eb742798d50ed33ef/pyobjc_framework_InstallerPlugins-11.0-py2.py3-none-any.whl", hash = "sha256:cb21bfd5597233a2de3d8c0a8d50f23cf92c43e8963edf85787430ac3cadf4a3", size = 4716, upload-time = "2025-01-14T18:54:17.885Z" }, - { url = "https://files.pythonhosted.org/packages/f7/56/fe6f50d74d19b0f85035aba977db7039eedbd2de5ac991278a6a5be475a0/pyobjc_framework_InstallerPlugins-11.0-py3-none-any.whl", hash = "sha256:2221301f466d30d6fd32c7317560c85926a3ee93f1de52d320e3b3cd826a8f93", size = 4784, upload-time = "2025-01-14T18:54:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/99/1f/31dca45db3342882a628aa1b27707a283d4dc7ef558fddd2533175a0661a/pyobjc_framework_installerplugins-12.1-py2.py3-none-any.whl", hash = "sha256:d2201c81b05bdbe0abf0af25db58dc230802573463bea322f8b2863e37b511d5", size = 4813, upload-time = "2025-11-14T09:51:37.836Z" }, ] [[package]] name = "pyobjc-framework-instantmessage" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/4d/6810a1f2039ff24d9498858b3ebb46357d4091aa5cec9ff4e41bbcdb25de/pyobjc_framework_instantmessage-11.0.tar.gz", hash = "sha256:ec5c4c70c9b0e61ae82888067246e4f931e700d625b3c42604e54759d4fbf65c", size = 34027, upload-time = "2025-01-14T19:04:01.405Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/67/66754e0d26320ba24a33608ca94d3f38e60ee6b2d2e094cb6269b346fdd4/pyobjc_framework_instantmessage-12.1.tar.gz", hash = "sha256:f453118d5693dc3c94554791bd2aaafe32a8b03b0e3d8ec3934b44b7fdd1f7e7", size = 31217, upload-time = "2025-11-14T10:16:07.693Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/41/4c0ec3d59f9930e9c52570f7e26d79055881e0009e07466b4988c107ef7c/pyobjc_framework_InstantMessage-11.0-py2.py3-none-any.whl", hash = "sha256:ce364e4e18ec8551512b7d968c0d950ccf7de4bb470f66fe524f3bc8d23df0d1", size = 5334, upload-time = "2025-01-14T18:54:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/19/d9/e3620a5316c986b27361d2f21dd74b48f70c6f7bfe580075e970ca9d7bd6/pyobjc_framework_InstantMessage-11.0-py3-none-any.whl", hash = "sha256:a2817353eaf8f37fe6063c28006b2a0889892e3de801b51b059c153a9d3f35f8", size = 5402, upload-time = "2025-01-14T18:54:21.261Z" }, + { url = "https://files.pythonhosted.org/packages/c1/38/6ae95b5c87d887c075bd5f4f7cca3d21dafd0a77cfdde870e87ca17579eb/pyobjc_framework_instantmessage-12.1-py2.py3-none-any.whl", hash = "sha256:cd91d38e8f356afd726b6ea8c235699316ea90edfd3472965c251efbf4150bc9", size = 5436, upload-time = "2025-11-14T09:51:39.557Z" }, ] [[package]] name = "pyobjc-framework-intents" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/88/07e47b0c5c46fe97c23c883ae7a053c2ca6f6fd6afe851d1c2c784644f0f/pyobjc_framework_intents-11.0.tar.gz", hash = "sha256:6405c816dfed8ffa8b3f8b0fae75f61d64787dbae8db1c475bb4450cf8fdf6b5", size = 447921, upload-time = "2025-01-14T19:04:02.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/a1/3bab6139e94b97eca098e1562f5d6840e3ff10ea1f7fd704a17111a97d5b/pyobjc_framework_intents-12.1.tar.gz", hash = "sha256:bd688c3ab34a18412f56e459e9dae29e1f4152d3c2048fcacdef5fc49dfb9765", size = 132262, upload-time = "2025-11-14T10:16:16.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/da/05f562c2d8a7a5549180e256b7d2a5e14672a6a56617e0b724ee9f345dfb/pyobjc_framework_Intents-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9e3e4bc09db930b37b98a545a3e4deb48ffaf15e9a86dca52f53923633fd5a4b", size = 32018, upload-time = "2025-01-14T18:54:22.203Z" }, - { url = "https://files.pythonhosted.org/packages/86/2e/cd8a4aa10a1d3808dd6f71195a28906c573345673dd92b774fbb8c93dd75/pyobjc_framework_Intents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9a445a3d4a0622ebf96c65b0ac0be7cec1e72cf7fd9900cd5ace6acf4e84bce", size = 32021, upload-time = "2025-01-14T18:54:23.325Z" }, - { url = "https://files.pythonhosted.org/packages/91/2a/214b6a6eb0816685626b39d7582e2b1a702ed1fb664f03b175f7b9da68fe/pyobjc_framework_Intents-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8422d592fbe4c188216ec18f9c2a253747cd7cb0036f7f8ee0bb74ff7ab31d1e", size = 32006, upload-time = "2025-01-14T18:54:27.982Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4d/6ce09716747342e5833fb7b1b428017566d9e1633481159688ea955ab578/pyobjc_framework_intents-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4dcca96da5b302583e3f8792f697e1d60a86f62b16ee07e9db11ce4186ca243c", size = 32137, upload-time = "2025-11-14T09:51:42.793Z" }, + { url = "https://files.pythonhosted.org/packages/d0/25/648db47b9c3879fa50c65ab7cc5fbe0dd400cc97141ac2658ef2e196c0b6/pyobjc_framework_intents-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dc68dc49f1f8d9f8d2ffbc0f57ad25caac35312ddc444899707461e596024fec", size = 32134, upload-time = "2025-11-14T09:51:46.369Z" }, + { url = "https://files.pythonhosted.org/packages/7a/90/e9489492ae90b4c1ffd02c1221c0432b8768d475787e7887f79032c2487a/pyobjc_framework_intents-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0ea9f3e79bf4baf6c7b0fd2d2797184ed51a372bf7f32974b4424f9bd067ef50", size = 32156, upload-time = "2025-11-14T09:51:49.438Z" }, ] [[package]] name = "pyobjc-framework-intentsui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-intents", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-intents" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/96/3b3b367f70a4d0a60d2c6251e4a1f4bf470945ae939e0ba20e6d56d10c7a/pyobjc_framework_intentsui-11.0.tar.gz", hash = "sha256:4ce04f926c823fbc1fba7d9c5b33d512b514396719e6bc50ef65b82774e42bc5", size = 20774, upload-time = "2025-01-14T19:04:03.648Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/cf/f0e385b9cfbf153d68efe8d19e5ae672b59acbbfc1f9b58faaefc5ec8c9e/pyobjc_framework_intentsui-12.1.tar.gz", hash = "sha256:16bdf4b7b91c0d1ec9d5513a1182861f1b5b7af95d4f4218ff7cf03032d57f99", size = 19784, upload-time = "2025-11-14T10:16:18.716Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/4a/588c502af4b81234784ac98d16e035ae24424f8b69cb402f4b0e48893009/pyobjc_framework_IntentsUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a97eff9239538e5179aba5c3c458ce6686f642b7492704d4a637f226e976e87", size = 8774, upload-time = "2025-01-14T18:54:28.924Z" }, - { url = "https://files.pythonhosted.org/packages/89/19/f32a14585e749258bb945805da93fd71e05534b14e09fab243fb5ec507ff/pyobjc_framework_IntentsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c677225d38fffc5e00df803f93a6a627c466b35a362ed27173f7901e185882e", size = 8772, upload-time = "2025-01-14T18:54:29.958Z" }, - { url = "https://files.pythonhosted.org/packages/79/e9/cf45dae007967eb79264384ee2c34d39c7a4495599fe6b8097c9e332e0c9/pyobjc_framework_IntentsUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7ea9d7139d4454cc2f871d6004b0b557fc6b098220ec12079a1fb3843c51b4c", size = 8755, upload-time = "2025-01-14T18:54:35.001Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c1/f7bc2d220354740dcbc2e8d2b416f7ab84e0664d1ef45321341726390a01/pyobjc_framework_intentsui-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:631baf74bc8ca65ebab6ed8914a116d12af8323dfa89b156a9f64f55a7fdde5b", size = 8959, upload-time = "2025-11-14T09:52:03.84Z" }, + { url = "https://files.pythonhosted.org/packages/84/cc/7678f901cbf5bca8ccace568ae85ee7baddcd93d78754ac43a3bb5e5a7ac/pyobjc_framework_intentsui-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a877555e313d74ac3b10f7b4e738647eea9f744c00a227d1238935ac3f9d7968", size = 8961, upload-time = "2025-11-14T09:52:05.595Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/06812542a9028f5b2dcce56f52f25633c08b638faacd43bad862aad1b41d/pyobjc_framework_intentsui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb894fcc4c9ea613a424dcf6fb48142d51174559b82cfdafac8cb47555c842cf", size = 8983, upload-time = "2025-11-14T09:52:07.667Z" }, ] [[package]] name = "pyobjc-framework-iobluetooth" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/46/62913f8e5ac307b154b3dd50a7a0b167c9d7ac2a579223e33208c141c387/pyobjc_framework_iobluetooth-11.0.tar.gz", hash = "sha256:869f01f573482da92674abbae4a154143e993b1fe4b2c3523f9e0f9c48b798d4", size = 300463, upload-time = "2025-01-14T19:04:04.582Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/aa/ca3944bbdfead4201b4ae6b51510942c5a7d8e5e2dc3139a071c74061fdf/pyobjc_framework_iobluetooth-12.1.tar.gz", hash = "sha256:8a434118812f4c01dfc64339d41fe8229516864a59d2803e9094ee4cbe2b7edd", size = 155241, upload-time = "2025-11-14T10:16:28.896Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/a9/02e8b11eec138e4a84f06b929c7d64f7ad1af097dc816f1a04a05bd7f075/pyobjc_framework_IOBluetooth-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:451e8df0042a8bf1fc3810015f1f91f44a154d53d5bfca69a0f8dc06bee7acff", size = 41011, upload-time = "2025-01-14T18:53:50.447Z" }, - { url = "https://files.pythonhosted.org/packages/7a/2e/2037b1c3459008ccdc41d65ab236d7919eed9bbadd0f02f65dc0193bb170/pyobjc_framework_IOBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7d2005d3eff2afed4b5930613ae3c1b50004ebabffb86c0d5dd28d54436e16e6", size = 41010, upload-time = "2025-01-14T18:53:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/46/12/e40261b83f59b113358fbad399d0caf3a77606ce080ab57b1f0cfb148465/pyobjc_framework_IOBluetooth-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6bd591c920458cda0cd80deae21fea377844b4a14babd6f89478eebce5477f27", size = 40998, upload-time = "2025-01-14T18:53:55.771Z" }, + { url = "https://files.pythonhosted.org/packages/a4/92/1bd6d76a005f0eb54e15608534cb7ce73f5d37afdcf82dc86e2ab54314e2/pyobjc_framework_iobluetooth-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8963d7115fdcd753598f0757f36b19267d01d00ac84cf617c02d38889c3a40fd", size = 40409, upload-time = "2025-11-14T09:52:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/ad6b36f574c3d52b5e935b1d57ab0f14f4e4cd328cc922d2b6ba6428c12d/pyobjc_framework_iobluetooth-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77959f2ecf379aa41eb0848fdb25da7c322f9f4a82429965c87c4bc147137953", size = 40415, upload-time = "2025-11-14T09:52:22.069Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b6/933b56afb5e84c3c35c074c9e30d7b701c6038989d4867867bdaa7ab618b/pyobjc_framework_iobluetooth-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:111a6e54be9e9dcf77fa2bf84fdac09fae339aa33087d8647ea7ffbd34765d4c", size = 40439, upload-time = "2025-11-14T09:52:26.071Z" }, ] [[package]] name = "pyobjc-framework-iobluetoothui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-iobluetooth", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-iobluetooth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/55/d194de8cfa63c96970e6c90c35e80ce3fceb42934a85d3728736a0e416ff/pyobjc_framework_iobluetoothui-11.0.tar.gz", hash = "sha256:a583758d3e54149ee2dcf00374685aa99e8ae407e044f7c378acc002f9f27e63", size = 23091, upload-time = "2025-01-14T19:04:05.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/39/31d9a4e8565a4b1ec0a9ad81480dc0879f3df28799eae3bc22d1dd53705d/pyobjc_framework_iobluetoothui-12.1.tar.gz", hash = "sha256:81f8158bdfb2966a574b6988eb346114d6a4c277300c8c0a978c272018184e6f", size = 16495, upload-time = "2025-11-14T10:16:31.212Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/75/9401ae099f32a6be2e5759f8d25c573bcf103833343457ca5981153262ab/pyobjc_framework_IOBluetoothUI-11.0-py2.py3-none-any.whl", hash = "sha256:0f94afeb5ecbde07712ea7658a38d6b0e3558154a6bc29c9a33b633f5952b2c3", size = 3972, upload-time = "2025-01-14T18:53:57.925Z" }, - { url = "https://files.pythonhosted.org/packages/11/a3/75e473de9d25084bfbfa4c0ba24edf038956a604d78219894dc0b412e501/pyobjc_framework_IOBluetoothUI-11.0-py3-none-any.whl", hash = "sha256:5bc366a9904532168ac2c49523e7f090f81b6acbb7b8929ffc7855be0b1d4cf7", size = 4043, upload-time = "2025-01-14T18:54:00.086Z" }, + { url = "https://files.pythonhosted.org/packages/e3/c9/69aeda0cdb5d25d30dc4596a1c5b464fc81b5c0c4e28efc54b7e11bde51c/pyobjc_framework_iobluetoothui-12.1-py2.py3-none-any.whl", hash = "sha256:a6d8ab98efa3029130577a57ee96b183c35c39b0f1c53a7534f8838260fab993", size = 4045, upload-time = "2025-11-14T09:52:42.201Z" }, ] [[package]] name = "pyobjc-framework-iosurface" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/91/ae9ca9e1a777eb786d9d43649437d01d24386736cffe9bb2f504b57e8db6/pyobjc_framework_iosurface-11.0.tar.gz", hash = "sha256:24da8d1cf9356717b1c7e75a1c61e9a9417b62f051d13423a4a7b0978d3dcda5", size = 20555, upload-time = "2025-01-14T19:04:09.475Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/61/0f12ad67a72d434e1c84b229ec760b5be71f53671ee9018593961c8bfeb7/pyobjc_framework_iosurface-12.1.tar.gz", hash = "sha256:4b9d0c66431aa296f3ca7c4f84c00dc5fc961194830ad7682fdbbc358fa0db55", size = 17690, upload-time = "2025-11-14T10:16:33.282Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/08/b96f84b623e2dd2ef733ccdd67a1694f51bfdb4dfd81d38e7755566ab9e5/pyobjc_framework_IOSurface-11.0-py2.py3-none-any.whl", hash = "sha256:58c6e79401a00dc63a5797cd3cc067542d4f94fcd2fc8979dc248c3b06c3b829", size = 4905, upload-time = "2025-01-14T18:54:00.978Z" }, - { url = "https://files.pythonhosted.org/packages/2d/af/4d7ece43c993369a8593c36e0f239b739b78c01e71d74553a630dadd1599/pyobjc_framework_IOSurface-11.0-py3-none-any.whl", hash = "sha256:f2bc13cbfd178396bde6e7558b05a49f69cce376885a07f645a5dd69d2b578fc", size = 4972, upload-time = "2025-01-14T18:54:03.244Z" }, + { url = "https://files.pythonhosted.org/packages/88/ad/793d98a7ed9b775dc8cce54144cdab0df1808a1960ee017e46189291a8f3/pyobjc_framework_iosurface-12.1-py2.py3-none-any.whl", hash = "sha256:e784e248397cfebef4655d2c0025766d3eaa4a70474e363d084fc5ce2a4f2a3f", size = 4902, upload-time = "2025-11-14T09:52:43.899Z" }, ] [[package]] name = "pyobjc-framework-ituneslibrary" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/fe/881ab1058d795fe68ccc1e14df0d5e161601dced15d3be84105ecc44bae6/pyobjc_framework_ituneslibrary-11.0.tar.gz", hash = "sha256:2e15dcfbb9d5e95634ddff153de159a28f5879f1a13fdf95504e011773056c6e", size = 47647, upload-time = "2025-01-14T19:04:11.333Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/46/d9bcec88675bf4ee887b9707bd245e2a793e7cb916cf310f286741d54b1f/pyobjc_framework_ituneslibrary-12.1.tar.gz", hash = "sha256:7f3aa76c4d05f6fa6015056b88986cacbda107c3f29520dd35ef0936c7367a6e", size = 23730, upload-time = "2025-11-14T10:16:36.127Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/d2/52d1c71ec91ec299e1324658d023954cf62ce4c275155dc66cd298517ae2/pyobjc_framework_iTunesLibrary-11.0-py2.py3-none-any.whl", hash = "sha256:3836fccec315f5186e4b029b486fd18d4b1f24a4c2e73f2d9f3e157ee66d294d", size = 5147, upload-time = "2025-01-14T19:01:49.97Z" }, - { url = "https://files.pythonhosted.org/packages/dc/97/c23c522d506ae01740c04982a1db5861888056dc65d56876a2de0fc490bc/pyobjc_framework_iTunesLibrary-11.0-py3-none-any.whl", hash = "sha256:bfd40fde3f057318329e5fb6e256051eea3f6cd2e2adb9c1f1f51fcb87deb05a", size = 5210, upload-time = "2025-01-14T19:01:51.573Z" }, + { url = "https://files.pythonhosted.org/packages/de/92/b598694a1713ee46f45c4bfb1a0425082253cbd2b1caf9f8fd50f292b017/pyobjc_framework_ituneslibrary-12.1-py2.py3-none-any.whl", hash = "sha256:fb678d7c3ff14c81672e09c015e25880dac278aa819971f4d5f75d46465932ef", size = 5205, upload-time = "2025-11-14T09:52:45.733Z" }, ] [[package]] name = "pyobjc-framework-kernelmanagement" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/ea/8ef534fce78817fc577f18de2b34e363873f785894f2bbbfc694823f5088/pyobjc_framework_kernelmanagement-11.0.tar.gz", hash = "sha256:812479d5f85eae27aeeaa22f64c20b926b28b5b9b2bf31c8eab9496d3e038028", size = 12794, upload-time = "2025-01-14T19:04:14.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/7e/ecbac119866e8ac2cce700d7a48a4297946412ac7cbc243a7084a6582fb1/pyobjc_framework_kernelmanagement-12.1.tar.gz", hash = "sha256:488062893ac2074e0c8178667bf864a21f7909c11111de2f6a10d9bc579df59d", size = 11773, upload-time = "2025-11-14T10:16:38.216Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/fe/ad7278325d8c760d5366b08d6162193612a3bf33bb0fa98d83d7dcc41918/pyobjc_framework_KernelManagement-11.0-py2.py3-none-any.whl", hash = "sha256:e2ad0efd00c0dce90fc05efac296733282c482d54ec7c5fdcb86b4fb8dff1eb8", size = 3604, upload-time = "2025-01-14T18:54:36.643Z" }, - { url = "https://files.pythonhosted.org/packages/1e/20/8aff6699bf780c88770214f72e92b9db736de078aa1aaaea45312758116e/pyobjc_framework_KernelManagement-11.0-py3-none-any.whl", hash = "sha256:90baacf8bea2883fd62ffb5d7dc6e6ae43fcc6f444458c884da8d92170fcaa5e", size = 3675, upload-time = "2025-01-14T18:54:37.62Z" }, + { url = "https://files.pythonhosted.org/packages/94/32/04325a20f39d88d6d712437e536961a9e6a4ec19f204f241de6ed54d1d84/pyobjc_framework_kernelmanagement-12.1-py2.py3-none-any.whl", hash = "sha256:926381bfbfbc985c3e6dfcb7004af21bb16ff66ecbc08912b925989a705944ff", size = 3704, upload-time = "2025-11-14T09:52:47.268Z" }, ] [[package]] name = "pyobjc-framework-latentsemanticmapping" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/29/8838eefeb82da95931134b06624364812dedf7e9cc905f36d95d497f2904/pyobjc_framework_latentsemanticmapping-11.0.tar.gz", hash = "sha256:6f578c3e0a171706bdbfcfc2c572a8059bf8039d22c1475df13583749a35cec1", size = 17704, upload-time = "2025-01-14T19:04:14.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/3c/b621dac54ae8e77ac25ee75dd93e310e2d6e0faaf15b8da13513258d6657/pyobjc_framework_latentsemanticmapping-12.1.tar.gz", hash = "sha256:f0b1fa823313eefecbf1539b4ed4b32461534b7a35826c2cd9f6024411dc9284", size = 15526, upload-time = "2025-11-14T10:16:40.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/87/a8d2f508c021afa4f8af51773ab22cbd883270bfda8368a86d473736b05a/pyobjc_framework_LatentSemanticMapping-11.0-py2.py3-none-any.whl", hash = "sha256:87fd91320fb7ce0b2c482fda41a5c38388f5a694ee2d7208725d22ff75438c00", size = 5369, upload-time = "2025-01-14T18:54:38.493Z" }, - { url = "https://files.pythonhosted.org/packages/df/f0/cea2a0d25ad20aef6eb38c432d2c93bda2cb2239c6286b6086f8687a8072/pyobjc_framework_LatentSemanticMapping-11.0-py3-none-any.whl", hash = "sha256:073b8a4e7a22e6abd58005b7d7091144aec4fc1d4b519e9f972b3aee9da30009", size = 5435, upload-time = "2025-01-14T18:54:39.643Z" }, + { url = "https://files.pythonhosted.org/packages/29/8e/74a7eb29b545f294485cd3cf70557b4a35616555fe63021edbb3e0ea4c20/pyobjc_framework_latentsemanticmapping-12.1-py2.py3-none-any.whl", hash = "sha256:7d760213b42bc8b1bc1472e1873c0f78ee80f987225978837b1fecdceddbdbf4", size = 5471, upload-time = "2025-11-14T09:52:48.939Z" }, ] [[package]] name = "pyobjc-framework-launchservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/59/eb847389224c670c885ae3d008b1ffe3b996bbe094b43e49dfa84f3947a9/pyobjc_framework_launchservices-11.0.tar.gz", hash = "sha256:7c5c8a8cec013e2cb3fa82a167ca2d61505c36a79f75c718f3f913e597f9ffee", size = 20691, upload-time = "2025-01-14T19:04:15.884Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/d0/24673625922b0ad21546be5cf49e5ec1afaa4553ae92f222adacdc915907/pyobjc_framework_launchservices-12.1.tar.gz", hash = "sha256:4d2d34c9bd6fb7f77566155b539a2c70283d1f0326e1695da234a93ef48352dc", size = 20470, upload-time = "2025-11-14T10:16:42.499Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/46/72937390e3eb0f31809f0d56004a388d20b49724495885e8be677707c07c/pyobjc_framework_LaunchServices-11.0-py2.py3-none-any.whl", hash = "sha256:654572e5f2997d8f802b97f619fc6c7d4f927abb03ce53b3dad89b376517b2d1", size = 3807, upload-time = "2025-01-14T18:54:40.579Z" }, - { url = "https://files.pythonhosted.org/packages/c0/12/74b96f187beb2f5605f9d487c3141ac8d25193556f2f5febff3580e8b2cb/pyobjc_framework_LaunchServices-11.0-py3-none-any.whl", hash = "sha256:dbc169442deae53f881d1d07fc79c9da6459e5f0b411e8dd1cfd1c519b3a99c8", size = 3876, upload-time = "2025-01-14T18:54:41.577Z" }, + { url = "https://files.pythonhosted.org/packages/08/af/9a0aebaab4c15632dc8fcb3669c68fa541a3278d99541d9c5f966fbc0909/pyobjc_framework_launchservices-12.1-py2.py3-none-any.whl", hash = "sha256:e63e78fceeed4d4dc807f9dabd5cf90407e4f552fab6a0d75a8d0af63094ad3c", size = 3905, upload-time = "2025-11-14T09:52:50.71Z" }, ] [[package]] name = "pyobjc-framework-libdispatch" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/33/4ec96a9edd37948f09e94635852c2db695141430cc1adc7b25968e1f3a95/pyobjc_framework_libdispatch-11.0.tar.gz", hash = "sha256:d22df11b07b1c3c8e7cfc4ba9e876a95c19f44acd36cf13d40c5cccc1ffda04b", size = 53496, upload-time = "2025-01-14T19:04:16.82Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/e8/75b6b9b3c88b37723c237e5a7600384ea2d84874548671139db02e76652b/pyobjc_framework_libdispatch-12.1.tar.gz", hash = "sha256:4035535b4fae1b5e976f3e0e38b6e3442ffea1b8aa178d0ca89faa9b8ecdea41", size = 38277, upload-time = "2025-11-14T10:16:46.235Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/d0/5aa60e680478c41054d4e28c551b018cba87761c275d09105055c456b504/pyobjc_framework_libdispatch-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a02e057d72af6a71ad69613c24162ca45e377c918a010889e7c366e035ad23c3", size = 20615, upload-time = "2025-01-14T19:01:52.473Z" }, - { url = "https://files.pythonhosted.org/packages/24/1f/f3273cc8261d45a6bef1fa48ac39cd94f6a1e77b1ec70f79bae52ad54015/pyobjc_framework_libdispatch-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cebdc33a1a771c9ab03fe5c8a2b0ed9698804e7bccdbfcd3cc0045c4b4aad4f3", size = 20607, upload-time = "2025-01-14T19:01:53.577Z" }, - { url = "https://files.pythonhosted.org/packages/50/9a/a0bd041e8abe4dad34ac215eeb5f44766f37d9b786468f373d60e7b7fc74/pyobjc_framework_libdispatch-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d7f9ea0ef2ad093c3c948d4716b9683ad4ebdab85f9cc292fa8cbca2a4de1b4", size = 20582, upload-time = "2025-01-14T19:02:00.252Z" }, + { url = "https://files.pythonhosted.org/packages/a5/76/9936d97586dbae4d7d10f3958d899ee7a763930af69b5ad03d4516178c7c/pyobjc_framework_libdispatch-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:50a81a29506f0e35b4dc313f97a9d469f7b668dae3ba597bb67bbab94de446bd", size = 20471, upload-time = "2025-11-14T09:52:53.134Z" }, + { url = "https://files.pythonhosted.org/packages/1f/75/c4aeab6ce7268373d4ceabbc5c406c4bbf557038649784384910932985f8/pyobjc_framework_libdispatch-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:954cc2d817b71383bd267cc5cd27d83536c5f879539122353ca59f1c945ac706", size = 20463, upload-time = "2025-11-14T09:52:55.703Z" }, + { url = "https://files.pythonhosted.org/packages/83/6f/96e15c7b2f7b51fc53252216cd0bed0c3541bc0f0aeb32756fefd31bed7d/pyobjc_framework_libdispatch-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e9570d7a9a3136f54b0b834683bf3f206acd5df0e421c30f8fd4f8b9b556789", size = 15650, upload-time = "2025-11-14T09:52:59.284Z" }, ] [[package]] name = "pyobjc-framework-libxpc" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/7e/9fa73ce6925db9cfd8a6b45d97943af8fe59f92251e7fd201b6e4608c172/pyobjc_framework_libxpc-11.0.tar.gz", hash = "sha256:e0c336913ab6a526b036915aa9038de2a5281e696ac2d3db3347b3040519c11d", size = 48627, upload-time = "2025-01-14T19:04:17.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/e4/364db7dc26f235e3d7eaab2f92057f460b39800bffdec3128f113388ac9f/pyobjc_framework_libxpc-12.1.tar.gz", hash = "sha256:e46363a735f3ecc9a2f91637750623f90ee74f9938a4e7c833e01233174af44d", size = 35186, upload-time = "2025-11-14T10:16:49.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/ff/1d37d8da6c762d9c3890679ab89b76271aecda89e5338d5480696e0f62a5/pyobjc_framework_libxpc-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:38432068d7684bc695f187b54c9cd86b83ba610a26f157e04553b77620778041", size = 19685, upload-time = "2025-01-14T19:02:01.286Z" }, - { url = "https://files.pythonhosted.org/packages/21/c2/b77019e344b3f46ca4169c19e0539cff9586c8db0a97715590696993bd00/pyobjc_framework_libxpc-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5f05f9eb3662df5832ff09ab788d6f6099f4674cb015200db317ea8c69f8c5e8", size = 19683, upload-time = "2025-01-14T19:02:02.364Z" }, - { url = "https://files.pythonhosted.org/packages/34/0d/1dbf0490fd65ce542c8f31e85f61da9a97e8de5d2eabe3b144ed2ec8c495/pyobjc_framework_libxpc-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65f750f3a8d2ed342a8f506ae2e67bb858976301c97945114b8e378599f6029b", size = 19666, upload-time = "2025-01-14T19:02:08.085Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f1/95af3a601744e1bc9b08d889f0bf0032b0d0ae8725976654e0d5fbe9a5f8/pyobjc_framework_libxpc-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f135b9734ee461c30dc692e58ce4b58c84c9a455738afe9ac70040c893625f4f", size = 19616, upload-time = "2025-11-14T09:53:10.139Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c9/701630d025407497b7af50a795ddb6202c184da7f12b46aa683dae3d3552/pyobjc_framework_libxpc-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8d7201db995e5dcd38775fd103641d8fb69b8577d8e6a405c5562e6c0bb72fd1", size = 19620, upload-time = "2025-11-14T09:53:12.529Z" }, + { url = "https://files.pythonhosted.org/packages/82/7f/fdec72430f90921b154517a6f9bbeefa7bacfb16b91320742eb16a5955c5/pyobjc_framework_libxpc-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ba93e91e9ca79603dd265382e9f80e9bd32309cd09c8ac3e6489fc5b233676c8", size = 19730, upload-time = "2025-11-14T09:53:17.113Z" }, ] [[package]] name = "pyobjc-framework-linkpresentation" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/5c/dac9fe4ad0a4076c863b5ac9925e751fc18c637ae411e4891c4b7558a5b3/pyobjc_framework_linkpresentation-11.0.tar.gz", hash = "sha256:bc4ace4aab4da4a4e4df10517bd478b6d51ebf00b423268ee8d9f356f9e87be9", size = 15231, upload-time = "2025-01-14T19:04:20.763Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/58/c0c5919d883485ccdb6dccd8ecfe50271d2f6e6ab7c9b624789235ccec5a/pyobjc_framework_linkpresentation-12.1.tar.gz", hash = "sha256:84df6779591bb93217aa8bd82c10e16643441678547d2d73ba895475a02ade94", size = 13330, upload-time = "2025-11-14T10:16:52.169Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/fc/aa3f0016e2246c4574cce0e323416303992411a012266b5bdda74095ebef/pyobjc_framework_LinkPresentation-11.0-py2.py3-none-any.whl", hash = "sha256:c10ee1ac48bb7cd2d67ade7f354ec71af1f4244a8deb8530ba646fd4ba327b21", size = 3799, upload-time = "2025-01-14T18:54:43.137Z" }, - { url = "https://files.pythonhosted.org/packages/85/0b/77c16f2d4541a4490723e18c03c3bd6ecf7db789cf4988e628753e2e4526/pyobjc_framework_LinkPresentation-11.0-py3-none-any.whl", hash = "sha256:5b063900715c5bcf58f533e6c9672473cb07fe3eaa0f0454d93947defa09f13e", size = 3865, upload-time = "2025-01-14T18:54:44.287Z" }, + { url = "https://files.pythonhosted.org/packages/ad/51/226eb45f196f3bf93374713571aae6c8a4760389e1d9435c4a4cc3f38ea4/pyobjc_framework_linkpresentation-12.1-py2.py3-none-any.whl", hash = "sha256:853a84c7b525b77b114a7a8d798aef83f528ed3a6803bda12184fe5af4e79a47", size = 3865, upload-time = "2025-11-14T09:53:28.386Z" }, ] [[package]] name = "pyobjc-framework-localauthentication" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-security", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/b1/bea4b5f8adbb69c0b34eddee63e052f35271cc630db43fbef6873352e21f/pyobjc_framework_localauthentication-11.0.tar.gz", hash = "sha256:eb55a3de647894092d6ed3f8f13fdc38e5dbf4850be320ea14dd2ac83176b298", size = 40020, upload-time = "2025-01-14T19:04:22.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/0e/7e5d9a58bb3d5b79a75d925557ef68084171526191b1c0929a887a553d4f/pyobjc_framework_localauthentication-12.1.tar.gz", hash = "sha256:2284f587d8e1206166e4495b33f420c1de486c36c28c4921d09eec858a699d05", size = 29947, upload-time = "2025-11-14T10:16:54.923Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/1c/a5b0084f77a6734783df32e1de0909eea4e6ca7b47dce422d0273e925af4/pyobjc_framework_LocalAuthentication-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3aa2b161d897a50576d2a05b2ea1095877789116073aaefc52a379d651b7487f", size = 10514, upload-time = "2025-01-14T18:54:45.177Z" }, - { url = "https://files.pythonhosted.org/packages/d1/dd/eaa44e4fe3b5c312190c0468afcab0a4372da29535fe9f860b6b9e1e6b4a/pyobjc_framework_LocalAuthentication-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6500bb5b195799d70f2a622d89a9c2531cb13d6afe30916cf073a195dd86eb", size = 10515, upload-time = "2025-01-14T18:54:46.214Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1a/7c1965b18dfabc76f3ba9fcee712039f528eae5755a1dae4dd3d7dbaecbf/pyobjc_framework_LocalAuthentication-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:23c6074c435c385a47aaf256e5b9054ee81f7a22c403354857c2f3de9fcddf93", size = 10503, upload-time = "2025-01-14T18:54:51.159Z" }, + { url = "https://files.pythonhosted.org/packages/23/bd/f5b5b2bdce4340b917dedbd95cca90ea74dc549fa33235315a3013871fbb/pyobjc_framework_localauthentication-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b1b24c9b453c3b3eb862a78a3a7387f357a90b99ec61cd1950b38e1cf08307ec", size = 10762, upload-time = "2025-11-14T09:53:30.228Z" }, + { url = "https://files.pythonhosted.org/packages/6e/cb/cf9d13943e13dc868a68844448a7714c16f4ee6ecac384d21aaa5ac43796/pyobjc_framework_localauthentication-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d7e1b3f987dc387361517525c2c38550dc44dfb3ba42dec3a9fbf35015831a6", size = 10762, upload-time = "2025-11-14T09:53:32.035Z" }, + { url = "https://files.pythonhosted.org/packages/05/93/91761ad4e5fa1c3ec25819865d1ccfbee033987147087bff4fcce67a4dc4/pyobjc_framework_localauthentication-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3af1acd287d830cc7f912f46cde0dab054952bde0adaf66c8e8524311a68d279", size = 10773, upload-time = "2025-11-14T09:53:34.074Z" }, ] [[package]] name = "pyobjc-framework-localauthenticationembeddedui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-localauthentication", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-localauthentication" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/ee/821f2d2e9da4cba3dc47e50c8367c6405e91551fb7d8ec842858d5b1d45d/pyobjc_framework_localauthenticationembeddedui-11.0.tar.gz", hash = "sha256:7e9bf6df77ff12a4e827988d8578c15b4431694b2fcfd5b0dad5d7738757ee6a", size = 14204, upload-time = "2025-01-14T19:04:23.566Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/20/83ab4180e29b9a4a44d735c7f88909296c6adbe6250e8e00a156aff753e1/pyobjc_framework_localauthenticationembeddedui-12.1.tar.gz", hash = "sha256:a15ec44bf2769c872e86c6b550b6dd4f58d4eda40ad9ff00272a67d279d1d4e9", size = 13611, upload-time = "2025-11-14T10:16:57.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/66/2151e5ee7fb97b34c7eda9f8b1442683cced27bcb273d34c8aa2c564e528/pyobjc_framework_LocalAuthenticationEmbeddedUI-11.0-py2.py3-none-any.whl", hash = "sha256:0ccbbdd8c7142b1670885881c803f684ee356df83a5338be9135f46462caae6c", size = 3914, upload-time = "2025-01-14T18:54:52.074Z" }, - { url = "https://files.pythonhosted.org/packages/d8/a9/c362ac3586bb2d46868b8ea9da3747c9aae3f0c9448ee09934a1be805383/pyobjc_framework_LocalAuthenticationEmbeddedUI-11.0-py3-none-any.whl", hash = "sha256:e8da98dc38a88995e344742585d3735af9b5bd9926a29774d77e2aa6dd46b7af", size = 3984, upload-time = "2025-01-14T18:54:54.974Z" }, + { url = "https://files.pythonhosted.org/packages/30/7d/0d46639c7a26b6af928ab4c822cd28b733791e02ac28cc84c3014bcf7dc7/pyobjc_framework_localauthenticationembeddedui-12.1-py2.py3-none-any.whl", hash = "sha256:a7ce7b56346597b9f4768be61938cbc8fc5b1292137225b6c7f631b9cde97cd7", size = 3991, upload-time = "2025-11-14T09:53:42.958Z" }, ] [[package]] name = "pyobjc-framework-mailkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/79/9c9140f726ba14898762ddc19e7142724e0ce5930f08eb20f33f78b05be8/pyobjc_framework_mailkit-11.0.tar.gz", hash = "sha256:d08a2dcc95b5e7955c7c385fe6e018325113d02c007c4178d3fb3c9ab326c163", size = 32274, upload-time = "2025-01-14T19:04:25.086Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/98/3d9028620c1cd32ff4fb031155aba3b5511e980cdd114dd51383be9cb51b/pyobjc_framework_mailkit-12.1.tar.gz", hash = "sha256:d5574b7259baec17096410efcaacf5d45c7bb5f893d4c25cbb7072369799b652", size = 20996, upload-time = "2025-11-14T10:16:59.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/38/f9bcd204c1ba0943365f3cc505d934ea93fe4b99d61e961ced0f0991a4f9/pyobjc_framework_MailKit-11.0-py2.py3-none-any.whl", hash = "sha256:78e54ff3988fd1af16c06e0c39dea3b7ff522e367d262f58e88962772291c7f9", size = 4803, upload-time = "2025-01-14T18:54:58.295Z" }, - { url = "https://files.pythonhosted.org/packages/64/4a/f3596583795c608838c7fa84fc4836f365c5744a3e412392d47a200a6221/pyobjc_framework_MailKit-11.0-py3-none-any.whl", hash = "sha256:0573ee0be66419130774aca36b611d0d07fcf7c756524860acba8fe17eefeec2", size = 4874, upload-time = "2025-01-14T18:55:00.648Z" }, + { url = "https://files.pythonhosted.org/packages/70/8d/3c968b736a3a8bd9d8e870b39b1c772a013eea1b81b89fc4efad9021a6cb/pyobjc_framework_mailkit-12.1-py2.py3-none-any.whl", hash = "sha256:536ac0c4ea3560364cd159a6512c3c18a744a12e4e0883c07df0f8a2ff21e3fe", size = 4871, upload-time = "2025-11-14T09:53:44.697Z" }, ] [[package]] name = "pyobjc-framework-mapkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-corelocation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-corelocation" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/7e/ef86c6e218a58bb9497ce9754a77f12ffe01c4b3609279727b7d7e44655a/pyobjc_framework_mapkit-11.0.tar.gz", hash = "sha256:cd8a91df4c0b442fcf1b14d735e566a06b21b3f48a2a4afe269fca45bfa49117", size = 165080, upload-time = "2025-01-14T19:04:26.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/bb/2a668203c20e509a648c35e803d79d0c7f7816dacba74eb5ad8acb186790/pyobjc_framework_mapkit-12.1.tar.gz", hash = "sha256:dbc32dc48e821aaa9b4294402c240adbc1c6834e658a07677b7c19b7990533c5", size = 63520, upload-time = "2025-11-14T10:17:04.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/fb/a6169828fc52f793c2f2987afb2a884eef6e0b6b2b29649012900eb511b6/pyobjc_framework_MapKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6ebeb4068f226fe865815e5e493995f267eeda66450d3e25a997866aac4b32e", size = 23041, upload-time = "2025-01-14T18:55:01.554Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7e/f0457c7ca001a01f47aa944c1f86a24d2d04db0aa1c19f51cbf77a65cc9b/pyobjc_framework_MapKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83128d79aa7644e5b966b32346f7da749b1dbb110dadba857b93ecf5663e24e6", size = 23045, upload-time = "2025-01-14T18:55:02.629Z" }, - { url = "https://files.pythonhosted.org/packages/53/2a/c37f4c7a996023c125d1f73bcb4df14c2780d8342b874ce0dccfa6ed991b/pyobjc_framework_MapKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f67fc5ac978462507a8c7424109dbe26fd4ae954aeb0a609f593bb6a1d02c0d8", size = 23017, upload-time = "2025-01-14T18:55:07.228Z" }, + { url = "https://files.pythonhosted.org/packages/6a/54/d6cc71c8dd456c36367f198e9373948bb012b8c690c9fb0966d3adf03488/pyobjc_framework_mapkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48a5c9a95735d41a12929446fc45fd43913367faddedf852ab02e0452e06db4", size = 22492, upload-time = "2025-11-14T09:53:47.342Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8f/411067e5c5cd23b9fe4c5edfb02ed94417b94eefe56562d36e244edc70ff/pyobjc_framework_mapkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8aa82d4aae81765c05dcd53fd362af615aa04159fc7a1df1d0eac9c252cb7d5", size = 22493, upload-time = "2025-11-14T09:53:50.112Z" }, + { url = "https://files.pythonhosted.org/packages/11/00/a3de41cdf3e6cd7a144e38999fe1ea9777ad19e19d863f2da862e7affe7b/pyobjc_framework_mapkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84ad7766271c114bdc423e4e2ff5433e5fc6771a3338b5f8e4b54d0340775800", size = 22518, upload-time = "2025-11-14T09:53:52.727Z" }, ] [[package]] name = "pyobjc-framework-mediaaccessibility" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/8e/9fe2cb251ff6107a03bafa07f63b6593df145a2579fffb096023fb21b167/pyobjc_framework_mediaaccessibility-11.0.tar.gz", hash = "sha256:1298cc0128e1c0724e8f8e63a6167ea6809a985922c67399b997f8243de59ab4", size = 18671, upload-time = "2025-01-14T19:04:27.624Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/10/dc1007e56944ed2e981e69e7b2fed2b2202c79b0d5b742b29b1081d1cbdd/pyobjc_framework_mediaaccessibility-12.1.tar.gz", hash = "sha256:cc4e3b1d45e84133d240318d53424eff55968f5c6873c2c53267598853445a3f", size = 16325, upload-time = "2025-11-14T10:17:07.454Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/1f/36b1115cfd02d68d39cc3fe976fe3d40bad1d1a0a9c8175c66d230bb7276/pyobjc_framework_MediaAccessibility-11.0-py2.py3-none-any.whl", hash = "sha256:901961f171f7af184decbf5a3899debfa56dbd1a63a53d0ff3d93eff90f2f464", size = 4637, upload-time = "2025-01-14T18:55:08.968Z" }, - { url = "https://files.pythonhosted.org/packages/72/3f/fa350681a6599ed6756dc598fcd17fda1521249e4570a57b4a9b9c900f47/pyobjc_framework_MediaAccessibility-11.0-py3-none-any.whl", hash = "sha256:3f4b9e4d1ac8e7f8cdb7a2e9839ab75cb358dead3e6365ccd8d6017d7e93811e", size = 4708, upload-time = "2025-01-14T18:55:09.939Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0c/7fb5462561f59d739192c6d02ba0fd36ad7841efac5a8398a85a030ef7fc/pyobjc_framework_mediaaccessibility-12.1-py2.py3-none-any.whl", hash = "sha256:2ff8845c97dd52b0e5cf53990291e6d77c8a73a7aac0e9235d62d9a4256916d1", size = 4800, upload-time = "2025-11-14T09:54:05.04Z" }, ] [[package]] name = "pyobjc-framework-mediaextension" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-avfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/1f/e31d9431bc71077b09583ea863b3c91b7de9371d0cc17a8be99be8119daa/pyobjc_framework_mediaextension-11.0.tar.gz", hash = "sha256:ecd8a64939e1c16be005690117c21fd406fc04d3036e2adea7600d2a0c53f4ea", size = 57931, upload-time = "2025-01-14T19:04:28.65Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/aa/1e8015711df1cdb5e4a0aa0ed4721409d39971ae6e1e71915e3ab72423a3/pyobjc_framework_mediaextension-12.1.tar.gz", hash = "sha256:44409d63cc7d74e5724a68e3f9252cb62fd0fd3ccf0ca94c6a33e5c990149953", size = 39425, upload-time = "2025-11-14T10:17:11.486Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/d9/5a95fdba4690ede76eec451bf0752c80b2d76a2c0a5ad23f1745342aa036/pyobjc_framework_MediaExtension-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bfee87fcd8a696d9c33d2791a57d4c81b4ec6016725fc26e4cbef273414fd94d", size = 39780, upload-time = "2025-01-14T18:55:12.152Z" }, - { url = "https://files.pythonhosted.org/packages/4d/94/1e4aa67e424a043dfa886c946bb872f9653cc12ad59bd7c2c24e3d19a4f5/pyobjc_framework_MediaExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f25d674f381bae800761efe1628959293009d287f7127616f75318a87e4543d", size = 39781, upload-time = "2025-01-14T18:55:13.454Z" }, - { url = "https://files.pythonhosted.org/packages/5a/45/4950bdda75cd634f8311a279052e87d545d5ae9ca72e5028dba504bb6a13/pyobjc_framework_MediaExtension-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a37abfb6e811f2d6a62da7f8b72c8f784ff631aed8fbc65824f1207ff39142c9", size = 39766, upload-time = "2025-01-14T18:55:19.386Z" }, + { url = "https://files.pythonhosted.org/packages/49/fa/8b3f2dc9cbf39ba7b647d70da464112bcaa7159118d688bdbdb64b062d5a/pyobjc_framework_mediaextension-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1aa7964ffa9e1d877a45c86692047928dbe2735188d89b52aad7d6e24b2fbcb9", size = 38961, upload-time = "2025-11-14T09:54:09.549Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6f/60b63edf5d27acf450e4937b7193c1a2bd6195fee18e15df6a5734dedb71/pyobjc_framework_mediaextension-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9555f937f2508bd2b6264cba088e2c2e516b2f94a6c804aee40e33fd89c2fb78", size = 38957, upload-time = "2025-11-14T09:54:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ed/99038bcf72ec68e452709af10a087c1377c2d595ba4e66d7a2b0775145d2/pyobjc_framework_mediaextension-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:442bc3a759efb5c154cb75d643a5e182297093533fcdd1c24be6f64f68b93371", size = 38973, upload-time = "2025-11-14T09:54:16.701Z" }, ] [[package]] name = "pyobjc-framework-medialibrary" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/a4/8c7d1635994800dc412a5db2c4b43ed499184651efcec0c8da3cf8e2bcc7/pyobjc_framework_medialibrary-11.0.tar.gz", hash = "sha256:692889fab1e479a9c207f0ff23c900dad5f47caf47c05cc995d9bb7c1e56e8b9", size = 18975, upload-time = "2025-01-14T19:04:29.739Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/e9/848ebd02456f8fdb41b42298ec585bfed5899dbd30306ea5b0a7e4c4b341/pyobjc_framework_medialibrary-12.1.tar.gz", hash = "sha256:690dcca09b62511df18f58e8566cb33d9652aae09fe63a83f594bd018b5edfcd", size = 15995, upload-time = "2025-11-14T10:17:15.45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/b6/c079b41a7a4b6b856b4ba7196500f058fb9d9f4f021269b49cf0861ace1f/pyobjc_framework_MediaLibrary-11.0-py2.py3-none-any.whl", hash = "sha256:3d273d4db7e1894fd2a95448c26eeced6e13e33555f727988aeec4b2762246fb", size = 4288, upload-time = "2025-01-14T18:55:20.473Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ae/05f2ee15f5e8524b27d6e446822edfed977c1ed0d3201644ae4d5d78bdde/pyobjc_framework_MediaLibrary-11.0-py3-none-any.whl", hash = "sha256:b8b97bb9067cf81942ce69d3273e2b18d093290c3fd692172a54f012ab64c0b3", size = 4359, upload-time = "2025-01-14T18:55:21.491Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/eeaf8585a343fda5b8cf3b8f144c872d1057c845202098b9441a39b76cb0/pyobjc_framework_medialibrary-12.1-py2.py3-none-any.whl", hash = "sha256:1f03ad6802a5c6e19ee3208b065689d3ec79defe1052cb80e00f54e1eff5f2a0", size = 4361, upload-time = "2025-11-14T09:54:32.259Z" }, ] [[package]] name = "pyobjc-framework-mediaplayer" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-avfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/ce/3d2783f2f96ddf51bebcf6537a4a0f2a8a1fe4e520de218fc1b7c5b219ed/pyobjc_framework_mediaplayer-11.0.tar.gz", hash = "sha256:c61be0ba6c648db6b1d013a52f9afb8901a8d7fbabd983df2175c1b1fbff81e5", size = 94020, upload-time = "2025-01-14T19:04:30.617Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/f0/851f6f47e11acbd62d5f5dcb8274afc969135e30018591f75bf3cbf6417f/pyobjc_framework_mediaplayer-12.1.tar.gz", hash = "sha256:5ef3f669bdf837d87cdb5a486ec34831542360d14bcba099c7c2e0383380794c", size = 35402, upload-time = "2025-11-14T10:17:18.97Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/b2/57b7b75bb5f2b624ce48cd48fb7d651d2f24d279918b352ae8fb03384b47/pyobjc_framework_MediaPlayer-11.0-py2.py3-none-any.whl", hash = "sha256:b124b0f18444b69b64142bad2579287d0b1a4a35cb6b14526523a822066d527d", size = 6903, upload-time = "2025-01-14T18:55:24.375Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8e/4969374f0fb243dd06336f2edc8c755743a683e73a57c3253279d048a455/pyobjc_framework_MediaPlayer-11.0-py3-none-any.whl", hash = "sha256:1a051624b536666feb5fd1a4bb54000ab45dac0c8aea4cd4707cbde1773acf57", size = 6977, upload-time = "2025-01-14T18:55:25.359Z" }, + { url = "https://files.pythonhosted.org/packages/58/c0/038ee3efd286c0fbc89c1e0cb688f4670ed0e5803aa36e739e79ffc91331/pyobjc_framework_mediaplayer-12.1-py2.py3-none-any.whl", hash = "sha256:85d9baec131807bfdf0f4c24d4b943e83cce806ab31c95c7e19c78e3fb7eefc8", size = 7120, upload-time = "2025-11-14T09:54:33.901Z" }, ] [[package]] name = "pyobjc-framework-mediatoolbox" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/46/cf5f3bde6cad32f10095850ca44f24ba241d18b26379187c412be1260f39/pyobjc_framework_mediatoolbox-11.0.tar.gz", hash = "sha256:de949a44f10b5a15e5a7131ee53b2806b8cb753fd01a955970ec0f475952ba24", size = 23067, upload-time = "2025-01-14T19:04:32.823Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/71/be5879380a161f98212a336b432256f307d1dcbaaaeb8ec988aea2ada2cd/pyobjc_framework_mediatoolbox-12.1.tar.gz", hash = "sha256:385b48746a5f08756ee87afc14037e552954c427ed5745d7ece31a21a7bad5ab", size = 22305, upload-time = "2025-11-14T10:17:22.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/8a/904c2a95f507fd5d3425f2486de5e5ed937eb12bfaf5de3ff78b77911150/pyobjc_framework_MediaToolbox-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:49ce94f1673e2cc1dba802182b9eb7f99694a0a8860079879ba3569befb91e45", size = 12751, upload-time = "2025-01-14T18:55:26.924Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d5/ee184e33bd743c363d7ab59d8412289c6ac14c78a035545a067b98704ae2/pyobjc_framework_MediaToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df09e4db52d4efeafe4a324600b9c5062fd87c1d1217ebec2df65c8b6b0ce9ef", size = 12776, upload-time = "2025-01-14T18:55:30.277Z" }, - { url = "https://files.pythonhosted.org/packages/f5/71/3a06b69120c540cad6c83dc4a1931227a5cad3ebc20b8f50f03772acda96/pyobjc_framework_MediaToolbox-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c3ace26066452b0d17828231a46f8a5f43b06f22584df636a6aca481befe9e9", size = 12742, upload-time = "2025-01-14T18:55:36.83Z" }, + { url = "https://files.pythonhosted.org/packages/91/f0/e567b73e1bf1740339114b71faf724859927e68b06ff6a5c6791e5b7d66a/pyobjc_framework_mediatoolbox-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91e039f988d2fd8cb852ee880e853a90902bb0fe9c337d1947241b79db145244", size = 12647, upload-time = "2025-11-14T09:54:35.832Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7a/f20ebd3c590b2cc85cde3e608e49309bfccf9312e4aca7b7ea60908d36d7/pyobjc_framework_mediatoolbox-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74de0cb2d5aaa77e81f8b97eab0f39cd2fab5bf6fa7c6fb5546740cbfb1f8c1f", size = 12656, upload-time = "2025-11-14T09:54:39.215Z" }, + { url = "https://files.pythonhosted.org/packages/9c/94/d5ee221f2afbc64b2a7074efe25387cd8700e8116518904b28091ea6ad74/pyobjc_framework_mediatoolbox-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d7bcfeeff3fbf7e9e556ecafd8eaed2411df15c52baf134efa7480494e6faf6d", size = 12818, upload-time = "2025-11-14T09:54:41.251Z" }, ] [[package]] name = "pyobjc-framework-metal" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/e0/a6d18a1183410a5d8610ca1ae6c065b8944586441f8669faee7509817246/pyobjc_framework_metal-11.0.tar.gz", hash = "sha256:cad390150aa63502d5cfe242026b55ed39ffaf816342ddf51e44a9aead6c24be", size = 446102, upload-time = "2025-01-14T19:04:34.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/06/a84f7eb8561d5631954b9458cfca04b690b80b5b85ce70642bc89335f52a/pyobjc_framework_metal-12.1.tar.gz", hash = "sha256:bb554877d5ee2bf3f340ad88e8fe1b85baab7b5ec4bd6ae0f4f7604147e3eae7", size = 181847, upload-time = "2025-11-14T10:17:34.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/cd/6b3712961afad2981c70c88a90e758b5a41a15b1e6f3db1c45421af0a9e1/pyobjc_framework_Metal-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:00a11acc8a6dc256c70312ba9f197bd36c1176128b30735530a85c6a6a6743ad", size = 57324, upload-time = "2025-01-14T18:55:37.803Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fe/083727028e63ffcf7455d10288df05696737ee74a31decdc671e32624f58/pyobjc_framework_Metal-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ac5f317d52cd7523dea2e172fbe8b03e7452b907da42a0a5e5c5ab427c5e9de", size = 57321, upload-time = "2025-01-14T18:55:39.025Z" }, - { url = "https://files.pythonhosted.org/packages/29/13/8d202932a2221842dc6456824e6fc6ce7c38a52cae2a2d41da8aa6f4d377/pyobjc_framework_Metal-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41e3d636079e731ed5f3a17da4ec0d3138906d7dab98952b87b7b983f22caf29", size = 57301, upload-time = "2025-01-14T18:55:43.687Z" }, + { url = "https://files.pythonhosted.org/packages/0c/be/6edbdb4ef80fa1806562294bd7afe607d09f1b3e83291d9fa2f85c7a8457/pyobjc_framework_metal-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d563b540ef659176938f0eaa7d8353d5b7d4235aa76fc7fddb1beb00391c0905", size = 75919, upload-time = "2025-11-14T09:54:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/1d/cf/edbb8b6dd084df3d235b74dbeb1fc5daf4d063ee79d13fa3bc1cb1779177/pyobjc_framework_metal-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59e10f9b36d2e409f80f42b6175457a07b18a21ca57ff268f4bc519cd30db202", size = 75920, upload-time = "2025-11-14T09:55:01.048Z" }, + { url = "https://files.pythonhosted.org/packages/d0/48/9286d06e1b14c11b65d3fea1555edc0061d9ebe11898dff8a14089e3a4c9/pyobjc_framework_metal-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38ab566b5a2979a43e13593d3eb12000a45e574576fe76996a5e1eb75ad7ac78", size = 75841, upload-time = "2025-11-14T09:55:06.801Z" }, ] [[package]] name = "pyobjc-framework-metalfx" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-metal", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/cf/ff9367e4737a12ebd12a17e693ec247028cf065761acc073ebefb2b2393a/pyobjc_framework_metalfx-11.0.tar.gz", hash = "sha256:2ae41991bf7a733c44fcd5b6550cedea3accaaf0f529643975d3da113c9f0caa", size = 26436, upload-time = "2025-01-14T19:04:36.161Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/09/ce5c74565677fde66de3b9d35389066b19e5d1bfef9d9a4ad80f0c858c0c/pyobjc_framework_metalfx-12.1.tar.gz", hash = "sha256:1551b686fb80083a97879ce0331bdb1d4c9b94557570b7ecc35ebf40ff65c90b", size = 29470, upload-time = "2025-11-14T10:17:37.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/94/f43987a9a3fb53499361ef71b9539bf4be2b60680ec17e5238566ecfe29a/pyobjc_framework_MetalFX-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:43cc72ea1dab54e0001a5e87c8f31a21014f70abbc7edb1332b6c2c21b8dddf7", size = 10310, upload-time = "2025-01-14T18:55:45.371Z" }, - { url = "https://files.pythonhosted.org/packages/16/f1/4140b63b3128cb2f12e136c4158a082ce170e4eb979bccb628768c59fd98/pyobjc_framework_MetalFX-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3a3847812d40cb6bb7a5f0e735f9f28cba83a1e1264d4dafc630ce894e98a20", size = 10308, upload-time = "2025-01-14T18:55:47.719Z" }, - { url = "https://files.pythonhosted.org/packages/0c/80/62b6d624b414a6f9b112e1f54aa4e42bdbb4c95383d5f399eb58b46e2e02/pyobjc_framework_MetalFX-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1d7184fb3feacfe613257d92dc9242b0db48a63fa369a4e754d9e9a9be392cc2", size = 10297, upload-time = "2025-01-14T18:55:53.243Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f6/c179930896e287ec9b4498154b00eeb3ecb9c9d4fe7e55a4e02f5532b7fa/pyobjc_framework_metalfx-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c28d875f8817cb80c44afaebdbc2960af66ea8eef63e0236fab3dde9be685d50", size = 15021, upload-time = "2025-11-14T09:55:33.081Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e5/5494639c927085bbba1a310e73662e0bda44b90cdff67fa03a4e1c24d4c4/pyobjc_framework_metalfx-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ec3f7ab036eae45e067fbf209676f98075892aa307d73bb9394304960746cd2", size = 15026, upload-time = "2025-11-14T09:55:35.239Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0b/508e3af499694f4eec74cc3ab0530e38db76e43a27db9ecb98c50c68f5f9/pyobjc_framework_metalfx-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a4418ae5c2eb77ec00695fa720a547638dc252dfd77ecb6feb88f713f5a948fd", size = 15062, upload-time = "2025-11-14T09:55:37.352Z" }, ] [[package]] name = "pyobjc-framework-metalkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-metal", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/27/fb3c1b10914abf2ae6682837abf76bcd8cb7af2ba613fbc55fb9d055bb95/pyobjc_framework_metalkit-11.0.tar.gz", hash = "sha256:1bbbe35c7c6a481383d32f6eaae59a1cd8084319a65c1aa343d63a257d8b4ddb", size = 44628, upload-time = "2025-01-14T19:04:36.977Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/15/5091147aae12d4011a788b93971c3376aaaf9bf32aa935a2c9a06a71e18b/pyobjc_framework_metalkit-12.1.tar.gz", hash = "sha256:14cc5c256f0e3471b412a5b3582cb2a0d36d3d57401a8aa09e433252d1c34824", size = 25473, upload-time = "2025-11-14T10:17:39.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/92/b0fa128488e7911636e87343ed75d28de76c78e33d147848057c2167c1e7/pyobjc_framework_MetalKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:89a3641a56f6bb8e71178a4f796f7f5184e52253815ee9905b6d3c17fc664cd9", size = 8597, upload-time = "2025-01-14T18:55:54.372Z" }, - { url = "https://files.pythonhosted.org/packages/d3/44/e7eb6746d9e1ad0ad08ab0a8ac20d264b049960363a8f28a744d1d9c319c/pyobjc_framework_MetalKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f314478a5d772d2f7b4db09957ecb63acd6e3f0cde8c18b1b6b35caa9ea7def2", size = 8598, upload-time = "2025-01-14T18:55:56.761Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ba/064cba7d8cf2169271b71b61242d33429ec2dfe2a93f0fee0dd2e86115ce/pyobjc_framework_MetalKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:17d289b1b0fc95f96291aa0add4d9657eb86507f3166ebe19d708215eadb4880", size = 8583, upload-time = "2025-01-14T18:56:00.926Z" }, + { url = "https://files.pythonhosted.org/packages/5a/fa/aa992323c039a68afb211196200f6e2b7331c2a8e515986ba6bf4df48791/pyobjc_framework_metalkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e8d2cfdf2dc4e8fc229dafe7c76787caa5430a0588d205bc9b61affd2d35d26a", size = 8734, upload-time = "2025-11-14T09:55:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/10/c5/f72cbc3a5e83211cbfa33b60611abcebbe893854d0f2b28ff6f444f97549/pyobjc_framework_metalkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:28636454f222d9b20cb61f6e8dc1ebd48237903feb4d0dbdf9d7904c542475e5", size = 8735, upload-time = "2025-11-14T09:55:50.053Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c0/c8b5b060895cd51493afe3f09909b7e34893b1161cf4d93bc8e3cd306129/pyobjc_framework_metalkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c4869076571d94788fe539fabfdd568a5c8e340936c7726d2551196640bd152", size = 8755, upload-time = "2025-11-14T09:55:51.683Z" }, ] [[package]] name = "pyobjc-framework-metalperformanceshaders" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-metal", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/c2/c08996a8c6cfef09fb9e726cc99b0bf3ad0ffcef66d5c2543e6b35dd4e2e/pyobjc_framework_metalperformanceshaders-11.0.tar.gz", hash = "sha256:41179e3a11e55325153fffd84f48946d47c1dc1944677febd871a127021e056d", size = 301444, upload-time = "2025-01-14T19:04:38.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/68/58da38e54aa0d8c19f0d3084d8c84e92d54cc8c9254041f07119d86aa073/pyobjc_framework_metalperformanceshaders-12.1.tar.gz", hash = "sha256:b198e755b95a1de1525e63c3b14327ae93ef1d88359e6be1ce554a3493755b50", size = 137301, upload-time = "2025-11-14T10:17:49.554Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b3/d82362b9a8336e1f03735bd58c925772c031a13520bcf6174d78443dc653/pyobjc_framework_MetalPerformanceShaders-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:97931653b6d1fbde0d177aadd4be41a799940acaa48cf8197d47fe97047e26bf", size = 33013, upload-time = "2025-01-14T18:56:01.83Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e9/3741ac0e745e1014961f12cf967eac1d4ec5b110d3ed13fdf9dd4ce27933/pyobjc_framework_MetalPerformanceShaders-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:460a30ff31f04bbe82bf3304949171e148e3171ba0c0773dd9bfc42dad766d2e", size = 33004, upload-time = "2025-01-14T18:56:02.993Z" }, - { url = "https://files.pythonhosted.org/packages/57/22/770f29def4acda3d6ee8138e4a82dc1ca4a86de2ff89ba91ebf05a5d0535/pyobjc_framework_MetalPerformanceShaders-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1332cfdf2f355cb0beb92b273d8b0ac46f0487088f92bd2b63dddc4ec71c9381", size = 32980, upload-time = "2025-01-14T18:56:09.244Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/6bf7d8e5ce093463e70d73dfad1cc2d100a0dd8bd8cfd6a1c1d3365902d0/pyobjc_framework_metalperformanceshaders-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b7a3a0dbe2a26c2c579e28124ec6ddd0d664a9557cbf64029d48b766d5af0209", size = 32994, upload-time = "2025-11-14T09:56:02.146Z" }, + { url = "https://files.pythonhosted.org/packages/00/0f/6dc06a08599a3bc211852a5e6dcb4ed65dfbf1066958feb367ba7702798a/pyobjc_framework_metalperformanceshaders-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0159a6f731dc0fd126481a26490683586864e9d47c678900049a8ffe0135f56", size = 32988, upload-time = "2025-11-14T09:56:05.323Z" }, + { url = "https://files.pythonhosted.org/packages/62/84/d505496fca9341e0cb11258ace7640cd986fe3e831f8b4749035e9f82109/pyobjc_framework_metalperformanceshaders-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c00e786c352b3ff5d86cf0cf3a830dc9f6fc32a03ae1a7539d20d11324adb2e8", size = 33242, upload-time = "2025-11-14T09:56:09.354Z" }, ] [[package]] name = "pyobjc-framework-metalperformanceshadersgraph" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-metalperformanceshaders", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metalperformanceshaders" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/b8/353852c76eb437e907ca0acf8a5b5f9255e9b9ee8c0706b69b0c17498f97/pyobjc_framework_metalperformanceshadersgraph-11.0.tar.gz", hash = "sha256:33077ebbbe1aa7787de2552a83534be6c439d7f4272de17915a85fda8fd3b72d", size = 105381, upload-time = "2025-01-14T19:04:39.831Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/56/7ad0cd085532f7bdea9a8d4e9a2dfde376d26dd21e5eabdf1a366040eff8/pyobjc_framework_metalperformanceshadersgraph-12.1.tar.gz", hash = "sha256:b8fd017b47698037d7b172d41bed7a4835f4c4f2a288235819d200005f89ee35", size = 42992, upload-time = "2025-11-14T10:17:53.502Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/8c/3d8f1cc6cfe7f9fd73f3911bb62256fdefc4d7f5375b8be84870d8c15650/pyobjc_framework_MetalPerformanceShadersGraph-11.0-py2.py3-none-any.whl", hash = "sha256:d48ffe401fbc8273a23e908685635a51c64d4ebfb5ad32742664ab9fac6c5194", size = 6403, upload-time = "2025-01-14T18:56:10.236Z" }, - { url = "https://files.pythonhosted.org/packages/ef/26/ca0441ac11d5ecc7814b48b3af9df467ead93622f0edc67e947f1a4afe97/pyobjc_framework_MetalPerformanceShadersGraph-11.0-py3-none-any.whl", hash = "sha256:f0702a6e91b273e552283ff2782220ce08eb65325aa45ad428e0b7f3b45cf211", size = 6474, upload-time = "2025-01-14T18:56:11.479Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c9/5e7fd0d4bc9bdf7b442f36e020677c721ba9b4c1dc1fa3180085f22a4ef9/pyobjc_framework_metalperformanceshadersgraph-12.1-py2.py3-none-any.whl", hash = "sha256:85a1c7a6114ada05c7924b3235a1a98c45359410d148097488f15aee5ebb6ab9", size = 6481, upload-time = "2025-11-14T09:56:23.66Z" }, ] [[package]] name = "pyobjc-framework-metrickit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/82/605ad654f40ff4480ba9366ad3726da80c98e33b73f122fb91259be1ce81/pyobjc_framework_metrickit-11.0.tar.gz", hash = "sha256:ee3da403863beec181a2d6dc7b7eeb4d07e954b88bbabac58a82523b2f83fdc7", size = 40414, upload-time = "2025-01-14T19:04:41.186Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/13/5576ddfbc0b174810a49171e2dbe610bdafd3b701011c6ecd9b3a461de8a/pyobjc_framework_metrickit-12.1.tar.gz", hash = "sha256:77841daf6b36ba0c19df88545fd910c0516acf279e6b7b4fa0a712a046eaa9f1", size = 27627, upload-time = "2025-11-14T10:17:56.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/fa/e591f71e8e31643707a46d194bb7a4bc5cb99eb9c919434831bbd232f8e6/pyobjc_framework_MetricKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7540a0cb57a319e7625b09ad0e90afff3eab75d9dc9ac676b204f99cb64f9be8", size = 7949, upload-time = "2025-01-14T18:56:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/13/1f/cc897b07b3ed96a26a3008f43e0deefaa60e280ac13118a2ff4224fca0d8/pyobjc_framework_MetricKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:422b6ca1f082dae864df8cc4aa0bac3829be95675b72ef63cd3ee00d30966b97", size = 7958, upload-time = "2025-01-14T18:56:13.428Z" }, - { url = "https://files.pythonhosted.org/packages/26/e3/7e5be2436d9e4bb5c909c2c3d944e0caa708a0b7f48f30ecdf5e0fa0a9fc/pyobjc_framework_MetricKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:121d8ea837e21e22a8c823380cadbe9e3d3696a083dcb1c331065c2d5686cce5", size = 7934, upload-time = "2025-01-14T18:56:18.465Z" }, + { url = "https://files.pythonhosted.org/packages/28/25/7396861f228697190b3bde09341761c75e4fcc96eba0456cf459286e7652/pyobjc_framework_metrickit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c074060cef54004451a1f919dfc6ef46b5479ead464ae791480f8d1d044a8dc", size = 8096, upload-time = "2025-11-14T09:56:25.266Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b0/e57c60af3e9214e05309dca201abb82e10e8cf91952d90d572b641d62027/pyobjc_framework_metrickit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da6650afd9523cf7a9cae177f4bbd1ad45cc122d97784785fa1482847485142c", size = 8102, upload-time = "2025-11-14T09:56:27.194Z" }, + { url = "https://files.pythonhosted.org/packages/b7/04/8da5126e47306438c99750f1dfed430d7cc388f6b7f420ae748f3060ab96/pyobjc_framework_metrickit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3ec96e9ec7dc37fbce57dae277f0d89c66ffe1c3fa2feaca1b7125f8b2b29d87", size = 8120, upload-time = "2025-11-14T09:56:28.73Z" }, ] [[package]] name = "pyobjc-framework-mlcompute" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/c9/22fe4720685724ec1444c8e5cdb41d360b1434d0971fb3e43cf3e9bf51fd/pyobjc_framework_mlcompute-11.0.tar.gz", hash = "sha256:1a1ee9ab43d1824300055ff94b042a26f38f1d18f6f0aa08be1c88278e7284d9", size = 89265, upload-time = "2025-01-14T19:04:43.326Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/69/15f8ce96c14383aa783c8e4bc1e6d936a489343bb197b8e71abb3ddc1cb8/pyobjc_framework_mlcompute-12.1.tar.gz", hash = "sha256:3281db120273dcc56e97becffd5cedf9c62042788289f7be6ea067a863164f1e", size = 40698, upload-time = "2025-11-14T10:17:59.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/06/a5865c0e4db4e7289bf6b40242b7149af87d5779f34ca168df5cabf2d5a4/pyobjc_framework_MLCompute-11.0-py2.py3-none-any.whl", hash = "sha256:16ec2942af9915f931df76b42e7f42348109b599faef955f5bea540735f87677", size = 6729, upload-time = "2025-01-14T18:54:55.927Z" }, - { url = "https://files.pythonhosted.org/packages/b5/15/3c69df5b5b99cea4a573e1d0e3c0b607cfe4ea1404ea1fe3a302361eb452/pyobjc_framework_MLCompute-11.0-py3-none-any.whl", hash = "sha256:bcdf94fe060fb034aed41db84af1cfcdbf3925e69b2b11df89d4546fac6cf0bf", size = 6799, upload-time = "2025-01-14T18:54:56.893Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f7/4614b9ccd0151795e328b9ed881fbcbb13e577a8ec4ae3507edb1a462731/pyobjc_framework_mlcompute-12.1-py2.py3-none-any.whl", hash = "sha256:4f0fc19551d710a03dfc4c7129299897544ff8ea76db6c7539ecc2f9b2571bde", size = 6744, upload-time = "2025-11-14T09:56:36.973Z" }, ] [[package]] name = "pyobjc-framework-modelio" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/7c/b75b84d41e7854ffe9c9a42846f8105227a5fd0b02b690b4a75018b2caa3/pyobjc_framework_modelio-11.0.tar.gz", hash = "sha256:c875eb6ff7f94d18362a00faaa3016ae0c28140326338d18aa03c0b62f1c6b9d", size = 122652, upload-time = "2025-01-14T19:04:44.263Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/11/32c358111b623b4a0af9e90470b198fffc068b45acac74e1ba711aee7199/pyobjc_framework_modelio-12.1.tar.gz", hash = "sha256:d041d7bca7c2a4526344d3e593347225b7a2e51a499b3aa548895ba516d1bdbb", size = 66482, upload-time = "2025-11-14T10:18:04.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/36/47239d8d10897112ce8b834d8e6c5a0a176bdcc082f5279389a9d5234ed4/pyobjc_framework_ModelIO-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc5dd7403990e5931d72ef486db6fdf8c77b03e14640e8ef51a3b28a4fadbef8", size = 20717, upload-time = "2025-01-14T18:56:19.357Z" }, - { url = "https://files.pythonhosted.org/packages/11/98/a30e8df5624c7929dfcd9748bf859929e8aa2c7d836efe5888dafc05f729/pyobjc_framework_ModelIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c126318b878ffb31c39b0c7c91ca20a3b46c14c18f000e3bfb854e4541fe0147", size = 20715, upload-time = "2025-01-14T18:56:22.163Z" }, - { url = "https://files.pythonhosted.org/packages/d3/51/50251fbc2579fdcfd4f4b6ea8cda69be1a1b3847e27a7ff16d67fb58d3e6/pyobjc_framework_ModelIO-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:573c1333e7f731b06bf3901df5fbe42b09a95135680822a438d664bca5db71eb", size = 20699, upload-time = "2025-01-14T18:56:28.087Z" }, + { url = "https://files.pythonhosted.org/packages/fb/84/76322f49840776f7255d7bdf9a548925fd8a6ba0efc50e4aef3e6d6f4667/pyobjc_framework_modelio-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e25d153ab231ca95954e3d12082f48aea4ec72db48269421011679f926638d07", size = 20183, upload-time = "2025-11-14T09:56:39.377Z" }, + { url = "https://files.pythonhosted.org/packages/35/c0/c67b806f3f2bb6264a4f7778a2aa82c7b0f50dfac40f6a60366ffc5afaf5/pyobjc_framework_modelio-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1c2c99d47a7e4956a75ce19bddbe2d8ada7d7ce9e2f56ff53fc2898367187749", size = 20180, upload-time = "2025-11-14T09:56:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0e/b8331100f0d658ecb3e87e75c108e2ae8ac7c78b521fd5ad0205b60a2584/pyobjc_framework_modelio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:68d971917c289fdddf69094c74915d2ccb746b42b150e0bdc16d8161e6164022", size = 20193, upload-time = "2025-11-14T09:56:44.296Z" }, ] [[package]] name = "pyobjc-framework-multipeerconnectivity" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/80/4137cb9751aa3846c4954b3e61f948aae17afeb6851e01194aa50683caef/pyobjc_framework_multipeerconnectivity-11.0.tar.gz", hash = "sha256:8278a3483c0b6b88a8888ca76c46fd85808f9df56d45708cbc4e4182a5565cd3", size = 25534, upload-time = "2025-01-14T19:04:45.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/35/0d0bb6881004cb238cfd7bf74f4b2e42601a1accdf27b2189ec61cf3a2dc/pyobjc_framework_multipeerconnectivity-12.1.tar.gz", hash = "sha256:7123f734b7174cacbe92a51a62b4645cc9033f6b462ff945b504b62e1b9e6c1c", size = 22816, upload-time = "2025-11-14T10:18:07.363Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/7a/f8dda4e626ea2a6c0ed85f30bb0f61d1329f03f7c45b5f40a8c456af6ad5/pyobjc_framework_MultipeerConnectivity-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:668c9adfa55f167c59679b5a23bc3d0ed483beb8941dff3f27b726c6f23c267f", size = 12426, upload-time = "2025-01-14T18:56:29.051Z" }, - { url = "https://files.pythonhosted.org/packages/2d/d2/a4144f966cbe998f8da46b936783561bcd3e7e84b8f2dc45eb49ee3f6f21/pyobjc_framework_MultipeerConnectivity-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e338b22f5b0fcb398e316552398c252bedfc3375c058340861eb205e3cdf994e", size = 12423, upload-time = "2025-01-14T18:56:30.132Z" }, - { url = "https://files.pythonhosted.org/packages/1c/90/b094e801106bc2879bed4b06f76da48972cfc9be082d1919193a76a6336b/pyobjc_framework_MultipeerConnectivity-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fbe483c580fba0963ec76c0a49fde687d3333988069d4ca831858486e47fd3d3", size = 12406, upload-time = "2025-01-14T18:56:33.748Z" }, + { url = "https://files.pythonhosted.org/packages/40/da/3f6ab6d80c1cf1deb23df34ccb16b3e94ff634454dd7b9cceecffa1cd57c/pyobjc_framework_multipeerconnectivity-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39eff9abbd40cb7306cfbc6119a95ce583074102081571c6c90569968e655787", size = 11978, upload-time = "2025-11-14T09:56:56.049Z" }, + { url = "https://files.pythonhosted.org/packages/12/eb/e3e4ba158167696498f6491f91a8ac7e24f1ebbab5042cd34318e5d2035c/pyobjc_framework_multipeerconnectivity-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7372e505ed050286aeb83d7e158fda65ad379eae12e1526f32da0a260a8b7d06", size = 11981, upload-time = "2025-11-14T09:56:58.858Z" }, + { url = "https://files.pythonhosted.org/packages/33/8d/0646ff7db36942829f0e84be18ba44bc5cd96d6a81651f8e7dc0974821c1/pyobjc_framework_multipeerconnectivity-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c3bd254a16debed321debf4858f9c9b7d41572ddf1058a4bacf6a5bcfedeeff", size = 12001, upload-time = "2025-11-14T09:57:01.027Z" }, ] [[package]] name = "pyobjc-framework-naturallanguage" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/64/63e97635fa637384bc8c980796573dc7a9e7074a6866aef073b1faf3e11d/pyobjc_framework_naturallanguage-11.0.tar.gz", hash = "sha256:4c9471fa2c48a8fd4899de4406823e66cb0292dbba7b471622017f3647d53fa4", size = 46385, upload-time = "2025-01-14T19:04:46.185Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/d1/c81c0cdbb198d498edc9bc5fbb17e79b796450c17bb7541adbf502f9ad65/pyobjc_framework_naturallanguage-12.1.tar.gz", hash = "sha256:cb27a1e1e5b2913d308c49fcd2fd04ab5ea87cb60cac4a576a91ebf6a50e52f6", size = 23524, upload-time = "2025-11-14T10:18:09.883Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/72/2246c0a6dc2d087951a626157f52c81cf88fe28393994163e9572fd1eb61/pyobjc_framework_NaturalLanguage-11.0-py2.py3-none-any.whl", hash = "sha256:0744a2871690dcc9ec9e7169023b492abdde63ef97abde46013c01477b4d047c", size = 5250, upload-time = "2025-01-14T18:56:34.675Z" }, - { url = "https://files.pythonhosted.org/packages/3a/49/f5faf3fab0f1ffb21882115878f1e5023257239aa576d6c01c31e42dd1da/pyobjc_framework_NaturalLanguage-11.0-py3-none-any.whl", hash = "sha256:7c021b270fda5469b56b9804e860cf5a80a485b817fc5fd3bb002383b2982d94", size = 5321, upload-time = "2025-01-14T18:56:36.377Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d8/715a11111f76c80769cb267a19ecf2a4ac76152a6410debb5a4790422256/pyobjc_framework_naturallanguage-12.1-py2.py3-none-any.whl", hash = "sha256:a02ef383ec88948ca28f03ab8995523726b3bc75c49f593b5c89c218bcbce7ce", size = 5320, upload-time = "2025-11-14T09:57:10.294Z" }, ] [[package]] name = "pyobjc-framework-netfs" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/29/eb569870b52c7581104ed2806cae2d425d60b5ab304128cd58155d5b567f/pyobjc_framework_netfs-11.0.tar.gz", hash = "sha256:3de5f627a62addf4aab8a4d2d07213e9b2b6c8adbe6cc4c332ee868075785a6a", size = 16173, upload-time = "2025-01-14T19:04:47.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/68/4bf0e5b8cc0780cf7acf0aec54def58c8bcf8d733db0bd38f5a264d1af06/pyobjc_framework_netfs-12.1.tar.gz", hash = "sha256:e8d0c25f41d7d9ced1aa2483238d0a80536df21f4b588640a72e1bdb87e75c1e", size = 14799, upload-time = "2025-11-14T10:18:11.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/e7/4be35bc2adbebffb5ac7ede2b8459432194a82bd8f325af12b77b7c26248/pyobjc_framework_NetFS-11.0-py2.py3-none-any.whl", hash = "sha256:11e06da73a1d590b8462f3a1412604758d49b5e04d134b6e991282453b76abb8", size = 4088, upload-time = "2025-01-14T18:56:37.646Z" }, - { url = "https://files.pythonhosted.org/packages/fe/83/b7c8dfaee82c0312af25c2b31621505ce19f01fab7bb55eec69c0b4d24ad/pyobjc_framework_NetFS-11.0-py3-none-any.whl", hash = "sha256:9b69a36e3a6782ce37cd3140c584dd7d5c96f7355662d004a2927583b112b4dd", size = 4162, upload-time = "2025-01-14T18:56:38.682Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6b/8c2f223879edd3e3f030d0a9c9ba812775519c6d0c257e3e7255785ca6e7/pyobjc_framework_netfs-12.1-py2.py3-none-any.whl", hash = "sha256:0021f8b141e693d3821524c170e9c645090eb320e80c2935ddb978a6e8b8da81", size = 4163, upload-time = "2025-11-14T09:57:11.845Z" }, ] [[package]] name = "pyobjc-framework-network" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/8e/18e55aff83549e041484d2ee94dd91b29cec9de40508e7fe9c4afec110a7/pyobjc_framework_network-11.0.tar.gz", hash = "sha256:d4dcc02773d7d642a385c7f0d951aeb7361277446c912a49230cddab60a65ab8", size = 124160, upload-time = "2025-01-14T19:04:50.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/13/a71270a1b0a9ec979e68b8ec84b0f960e908b17b51cb3cac246a74d52b6b/pyobjc_framework_network-12.1.tar.gz", hash = "sha256:dbf736ff84d1caa41224e86ff84d34b4e9eb6918ae4e373a44d3cb597648a16a", size = 56990, upload-time = "2025-11-14T10:18:16.714Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/79/4f9c7b7e3d184967fd71732927856ec4b9e3cae843e9a2f4ab3bf452d6ce/pyobjc_framework_Network-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5009c59df2a24412c6e834633447ee4c7c6b584f91c3a69fcb1ecc9442966a46", size = 19505, upload-time = "2025-01-14T18:56:40.444Z" }, - { url = "https://files.pythonhosted.org/packages/24/b5/16800524e6d8d99467f53dbafa661abb1405d08d50def7edb933504197a3/pyobjc_framework_Network-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6fc797537690a241b555475923bcee28824efacd501e235457daeb4496b4b700", size = 19507, upload-time = "2025-01-14T18:56:41.544Z" }, - { url = "https://files.pythonhosted.org/packages/8e/eb/7d68fda3df09a3055fc0b9ed758ccf8da6aa09584480cbf19b1c4bd5f65b/pyobjc_framework_Network-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40fcac8efa3742c798a3ab56b9a9fc6bafe6e83cefdcc51d5b889bb66cda2fd5", size = 19494, upload-time = "2025-01-14T18:56:47.437Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b7/8c29d66920d026532b4acb4ed4e608fd1ee41db602217d6abf2c5f9ea14f/pyobjc_framework_network-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:07264f1dc5d7c437dfbbbf9302a60ead87bbce14692c4cc20b2a259a9fe20b3d", size = 19591, upload-time = "2025-11-14T09:57:14.127Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/4f9fc6b94be3e949b7579128cbb9171943e27d1d7841db12d66b76aeadc3/pyobjc_framework_network-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d1ad948b9b977f432bf05363381d7d85a7021246ebf9d50771b35bf8d4548d2b", size = 19593, upload-time = "2025-11-14T09:57:17.027Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ef/a53f04f43e93932817f2ea71689dcc8afe3b908d631c21d11ec30c7b2e87/pyobjc_framework_network-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5e53aad64eae2933fe12d49185d66aca62fb817abf8a46f86b01e436ce1b79e4", size = 19613, upload-time = "2025-11-14T09:57:19.571Z" }, ] [[package]] name = "pyobjc-framework-networkextension" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/59/90/97dcfac5895b07e891adf634c3a074b68992d132ccfab386c186ac1a598c/pyobjc_framework_networkextension-11.0.tar.gz", hash = "sha256:5ba2254e2c13010b6c4f1e2948047d95eff86bfddfc77716747718fa3a8cb1af", size = 188551, upload-time = "2025-01-14T19:04:51.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/3e/ac51dbb2efa16903e6af01f3c1f5a854c558661a7a5375c3e8767ac668e8/pyobjc_framework_networkextension-12.1.tar.gz", hash = "sha256:36abc339a7f214ab6a05cb2384a9df912f247163710741e118662bd049acfa2e", size = 62796, upload-time = "2025-11-14T10:18:21.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/a7/5db99a863b15a6a30c98a3cf9c5dc37eea170ce3275ee874065725194aac/pyobjc_framework_NetworkExtension-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f42fa3d41e457fa71434b28f8abf83b339893c6896b394255365128977db4117", size = 13947, upload-time = "2025-01-14T18:56:49.572Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a4/120aba6e1ccf473d7294c200687f500b096947fec58d94dc772b1a444ecc/pyobjc_framework_NetworkExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bba4f338748c8ad2cb4320c4dd64b64772a863c6b6f991c2636b2a2f4cb839a", size = 13945, upload-time = "2025-01-14T18:56:53.477Z" }, - { url = "https://files.pythonhosted.org/packages/f6/e9/716fa52d05ff5e9723c276b0bf0e1ccf300857b20ab3a6174d946638ee62/pyobjc_framework_NetworkExtension-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66ec0b117aea56cb1fd88f1ebec00a63f775c4c9c1e671d6e111f696145ec557", size = 13923, upload-time = "2025-01-14T18:57:00.873Z" }, + { url = "https://files.pythonhosted.org/packages/60/2d/e67ba8031d4cd819e1c3a961da6602390f55111df3dcf1ba5b429d6594e8/pyobjc_framework_networkextension-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd96684be3a942a301eb38b5f46236091c87ec9830ed8d56be434e420af45387", size = 14365, upload-time = "2025-11-14T09:57:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/aa34fc983f001cdb1afbbb4d08b42fd019fc9816caca0bf0b166db1688c1/pyobjc_framework_networkextension-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c3082c29f94ca3a05cd1f3219999ca3af9b6dece1302ccf789f347e612bb9303", size = 14368, upload-time = "2025-11-14T09:57:33.748Z" }, + { url = "https://files.pythonhosted.org/packages/f6/14/4934b10ade5ad0518001bfc25260d926816b9c7d08d85ef45e8a61fdef1b/pyobjc_framework_networkextension-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:adc9baacfc532944d67018e381c7645f66a9fa0064939a5a841476d81422cdcc", size = 14376, upload-time = "2025-11-14T09:57:36.132Z" }, ] [[package]] name = "pyobjc-framework-notificationcenter" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/d0/f0a602e01173531a2b639e283a092cf1f307fd873abd2ed590b9c4122337/pyobjc_framework_notificationcenter-11.0.tar.gz", hash = "sha256:f878b318c693d63d6b8bd1c3e2ad4f8097b22872f18f40142e394d84f1ead9f6", size = 22844, upload-time = "2025-01-14T19:04:52.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/12/ae0fe82fb1e02365c9fe9531c9de46322f7af09e3659882212c6bf24d75e/pyobjc_framework_notificationcenter-12.1.tar.gz", hash = "sha256:2d09f5ab9dc39770bae4fa0c7cfe961e6c440c8fc465191d403633dccc941094", size = 21282, upload-time = "2025-11-14T10:18:24.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/fd/316c6b1f2ce44cd7ae2f1c24e1a16dd6cdca3fc2fb268e29a0ba2a619ab6/pyobjc_framework_NotificationCenter-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7942565c4dd8bc136d40913d7f17b4426db6b73f581b3593d0656553ca425f6a", size = 9685, upload-time = "2025-01-14T18:57:01.752Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f2/22f04062b772e2f47ee2d54eac3f80c5aef727ec468ef5ab9a3272dd2a73/pyobjc_framework_NotificationCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:075853f3e36eb4377182589e552226b2207a575035d7e128055cfde9dcad84b7", size = 9684, upload-time = "2025-01-14T18:57:02.779Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b2/7fead4c935bb0a9b8952ea477950247f39bb9fa42ff4b5d831e413fde505/pyobjc_framework_NotificationCenter-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:09af69a327035cdd9c6e3a93cc5152305bbc7db542bf75b6e97f4a7af5387fff", size = 9677, upload-time = "2025-01-14T18:57:07.667Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/b2a9c66467ccd36137d77240939332308f847ffa7e2c00cade6da3604f9e/pyobjc_framework_notificationcenter-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f227d4b2e197f614b64302faea974f25434827da30f6d46b3a8d73cb3788cf69", size = 9874, upload-time = "2025-11-14T09:57:47.098Z" }, + { url = "https://files.pythonhosted.org/packages/47/aa/03526fc0cc285c0f8cf31c74ce3a7a464011cc8fa82a35a1637d9878c788/pyobjc_framework_notificationcenter-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e254f2a56ff5372793dea938a2b2683dd0bc40c5107fede76f9c2c1f6641a2", size = 9871, upload-time = "2025-11-14T09:57:49.208Z" }, + { url = "https://files.pythonhosted.org/packages/d8/05/3168637dd425257df5693c2ceafecf92d2e6833c0aaa6594d894a528d797/pyobjc_framework_notificationcenter-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82a735bd63f315f0a56abd206373917b7d09a0ae35fd99f1639a0fac4c525c0a", size = 9895, upload-time = "2025-11-14T09:57:51.151Z" }, ] [[package]] name = "pyobjc-framework-opendirectory" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/cf/ba0cf807758acdc6a19e4787fdcda2eb59034aa22c4203d04fd49b276981/pyobjc_framework_opendirectory-11.0.tar.gz", hash = "sha256:0c82594f4f0bcf2318c4641527f9243962d7b03e67d4f3fb111b899a299fc7eb", size = 189165, upload-time = "2025-01-14T19:04:53.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/11/bc2f71d3077b3bd078dccad5c0c5c57ec807fefe3d90c97b97dd0ed3d04b/pyobjc_framework_opendirectory-12.1.tar.gz", hash = "sha256:2c63ce5dd179828ef2d8f9e3961da3bfa971a57db07a6c34eedc296548a928bb", size = 61049, upload-time = "2025-11-14T10:18:29.336Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/0a/e5a03c46a5873db83fb89ea829e4a0c02fb3f56f3639a6053e72854f435b/pyobjc_framework_OpenDirectory-11.0-py2.py3-none-any.whl", hash = "sha256:8a0feeda5a7f34b25b72c71cd1e4dd57b636cc4103248ff91bcb8571d4915eb4", size = 11747, upload-time = "2025-01-14T18:57:17.445Z" }, - { url = "https://files.pythonhosted.org/packages/da/fd/be3815a19978ab2a3abe9563a031195b40647077fcebbee86232af260176/pyobjc_framework_OpenDirectory-11.0-py3-none-any.whl", hash = "sha256:bfac495de433a62e3934619e2f5d2254177f960b7d4e905ed4ef359127e23b24", size = 11816, upload-time = "2025-01-14T18:57:18.486Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e7/3c2dece9c5b28af28a44d72a27b35ea5ffac31fed7cbd8d696ea75dc4a81/pyobjc_framework_opendirectory-12.1-py2.py3-none-any.whl", hash = "sha256:b5b5a5cf3cc2fb25147b16b79f046b90e3982bf3ded1b210a993d8cfdba737c4", size = 11845, upload-time = "2025-11-14T09:58:00.175Z" }, ] [[package]] name = "pyobjc-framework-osakit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/4a/e49680f7f3ab9c0632ed9be76a0a59299e7fd797335690b3da4d117f2d7b/pyobjc_framework_osakit-11.0.tar.gz", hash = "sha256:77ac18e2660133a9eeb01c76ad3df3b4b36fd29005fc36bca00f57cca121aac3", size = 22535, upload-time = "2025-01-14T19:04:54.753Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/b9/bf52c555c75a83aa45782122432fa06066bb76469047f13d06fb31e585c4/pyobjc_framework_osakit-12.1.tar.gz", hash = "sha256:36ea6acf03483dc1e4344a0cce7250a9656f44277d12bc265fa86d4cbde01f23", size = 17102, upload-time = "2025-11-14T10:18:31.354Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/f6/1dcff2f76280946368ee75ab39c92e261a851656c5979a50513563d08cf0/pyobjc_framework_OSAKit-11.0-py2.py3-none-any.whl", hash = "sha256:3183414e345af83a2187b00356130909a7c2a41b2227dc579b662737300c3ba4", size = 4094, upload-time = "2025-01-14T18:57:08.639Z" }, - { url = "https://files.pythonhosted.org/packages/17/75/745985429f0ff4776ffb8ba261199e11f4d6977b1814ad2b39084f83bad5/pyobjc_framework_OSAKit-11.0-py3-none-any.whl", hash = "sha256:79150c47d2aeffc72fb6551060518ce472275edbad3b56aef5923a6086371c28", size = 4162, upload-time = "2025-01-14T18:57:09.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/10/30a15d7b23e6fcfa63d41ca4c7356c39ff81300249de89c3ff28216a9790/pyobjc_framework_osakit-12.1-py2.py3-none-any.whl", hash = "sha256:c49165336856fd75113d2e264a98c6deb235f1bd033eae48f661d4d832d85e6b", size = 4162, upload-time = "2025-11-14T09:58:01.953Z" }, ] [[package]] name = "pyobjc-framework-oslog" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/93/0a72353d0212a815bd5e43aec528ce7b28b71d461d26e5fa3882ff96ffa3/pyobjc_framework_oslog-11.0.tar.gz", hash = "sha256:9d29eb7c89a41d7c702dffb6e2e338a2d5219387c8dae22b67754ddf9e2fcb3f", size = 24151, upload-time = "2025-01-14T19:04:55.587Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/42/805c9b4ac6ad25deb4215989d8fc41533d01e07ffd23f31b65620bade546/pyobjc_framework_oslog-12.1.tar.gz", hash = "sha256:d0ec6f4e3d1689d5e4341bc1130c6f24cb4ad619939f6c14d11a7e80c0ac4553", size = 21193, upload-time = "2025-11-14T10:18:33.645Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/83/9af07334cd69114f0bde80ddb1b27d6f318a668371f155a7be7c736fd3f9/pyobjc_framework_OSLog-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf497a07b492891b3659078c662221b97e555cbcdbb76beb7b553a0d04792492", size = 7701, upload-time = "2025-01-14T18:57:11.04Z" }, - { url = "https://files.pythonhosted.org/packages/9c/54/6b507a18d0adadf8b707be9616bc9bab157963b81fa3c9928a0148d3bfd8/pyobjc_framework_OSLog-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0131851fca9b741f290ffa727dd30328dd8526b87c8cef623b79239bed99187", size = 7694, upload-time = "2025-01-14T18:57:12.713Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b5/312029460138a88f53452f1a6e0a033ba22a45f1541efe217c6c3716013f/pyobjc_framework_OSLog-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5a200af7314900feef5fda242eee8938154b3cb8e2a7f90e1caaba02235d5b0", size = 7683, upload-time = "2025-01-14T18:57:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ed/51e0dd2cfbd29b053d345e87965e5c15ff01d6925f5523a15d1fc9740b42/pyobjc_framework_oslog-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4bdcba214ca33563408b7703282f9a99ca61d04bcc34d5474abc68621fd44c48", size = 7795, upload-time = "2025-11-14T09:58:03.695Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d5/8d37c2e733bd8a9a16546ceca07809d14401a059f8433cdc13579cd6a41a/pyobjc_framework_oslog-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8dd03386331fbb6b39df8941d99071da0bfeda7d10f6434d1daa1c69f0e7bb14", size = 7802, upload-time = "2025-11-14T09:58:05.619Z" }, + { url = "https://files.pythonhosted.org/packages/ee/60/0b742347d484068e9d6867cd95dedd1810c790b6aca45f6ef1d0f089f1f5/pyobjc_framework_oslog-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:072a41d36fcf780a070f13ac2569f8bafbb5ae4792fab4136b1a4d602dd9f5b4", size = 7813, upload-time = "2025-11-14T09:58:07.768Z" }, ] [[package]] name = "pyobjc-framework-passkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/f8/ebb2bc840f87292a4f60080463ee698ca08516cc958364741dfff2858b33/pyobjc_framework_passkit-11.0.tar.gz", hash = "sha256:2044d9d634dd98b7b624ee09487b27e5f26a7729f6689abba23a4a011febe19c", size = 120495, upload-time = "2025-01-14T19:04:57.689Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/d4/2afb59fb0f99eb2f03888850887e536f1ef64b303fd756283679471a5189/pyobjc_framework_passkit-12.1.tar.gz", hash = "sha256:d8c27c352e86a3549bf696504e6b25af5f2134b173d9dd60d66c6d3da53bb078", size = 53835, upload-time = "2025-11-14T10:18:37.906Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/5b/016085cdbe7e452f9cdda03fc87d29e346a0116c46d9f042ffc44878d40c/pyobjc_framework_PassKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eaaed276dd3763057fbbbb150e6e213b1842bb73fdf7c92cce811cfc6c74b5c4", size = 14353, upload-time = "2025-01-14T18:57:23.325Z" }, - { url = "https://files.pythonhosted.org/packages/53/72/d7dae8f5a1c5b12d9cf404a71a82fd5a638bc4de2d1099bf838aee1026f0/pyobjc_framework_PassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:710372134c3adedb9017bfc2fbc592ef0e94ae916145b58e57234239bf903b90", size = 14354, upload-time = "2025-01-14T18:57:24.436Z" }, - { url = "https://files.pythonhosted.org/packages/e8/32/d8da7a9e1564f0ccfde5c52f19a7a0146f0b1a4580827804e3bf08ea63fa/pyobjc_framework_PassKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c241fe97ece86d5d6e148b1f6fd4f427a9564fa6c84706012636db89e289eb7b", size = 14341, upload-time = "2025-01-14T18:57:29.68Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/0af77cf3af6ab475e5ea301afb4085902e4a09cf8c0b64793e8958170f22/pyobjc_framework_passkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8383b36a99abea9f8d9fe05f89abca34e57d604664adc4964b1a8d6b9a0d04a", size = 14084, upload-time = "2025-11-14T09:58:16.73Z" }, + { url = "https://files.pythonhosted.org/packages/25/e6/dabd6b99bdadc50aa0306495d8d0afe4b9b3475c2bafdad182721401a724/pyobjc_framework_passkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb5c8f0fdc46db6b91c51ee1f41a2b81e9a482c96a0c91c096dcb78a012b740a", size = 14087, upload-time = "2025-11-14T09:58:18.991Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dc/9cb27e8b7b00649af5e802815ffa8928bd8a619f2984a1bea7dabd28f741/pyobjc_framework_passkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7e95a484ec529dbf1d44f5f7f1406502a77bda733511e117856e3dca9fa29c5c", size = 14102, upload-time = "2025-11-14T09:58:20.903Z" }, ] [[package]] name = "pyobjc-framework-pencilkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/8d/1e97cd72b776e5e1294cbda84325b364702617dd435d32448dcc0a80bd93/pyobjc_framework_pencilkit-11.0.tar.gz", hash = "sha256:9598c28e83f5b7f091592cc1af2b16f7ae94cf00045d8d14ed2c17cb9e4ffd50", size = 22812, upload-time = "2025-01-14T19:04:58.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/43/859068016bcbe7d80597d5c579de0b84b0da62c5c55cdf9cc940e9f9c0f8/pyobjc_framework_pencilkit-12.1.tar.gz", hash = "sha256:d404982d1f7a474369f3e7fea3fbd6290326143fa4138d64b6753005a6263dc4", size = 17664, upload-time = "2025-11-14T10:18:40.045Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/5b/24fb83a97648eaa0d231df7908532dff7b36d5f516d55c92ed9ae07c4e1b/pyobjc_framework_PencilKit-11.0-py2.py3-none-any.whl", hash = "sha256:22cbb6ed2504be4c8d631c4711b00fae48ef731c10c69861b4de1e4fcdc19279", size = 3970, upload-time = "2025-01-14T18:57:30.597Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/89a005c86b06137837952838d976ce6e39b31082392d78c382d44e03944d/pyobjc_framework_PencilKit-11.0-py3-none-any.whl", hash = "sha256:a4e606c5b69e6adb80ef30fc95fe0095971735d12ab6fc4fe4d982e4c8a3881a", size = 4045, upload-time = "2025-01-14T18:57:31.87Z" }, + { url = "https://files.pythonhosted.org/packages/e8/26/daf47dcfced8f7326218dced5c68ed2f3b522ec113329218ce1305809535/pyobjc_framework_pencilkit-12.1-py2.py3-none-any.whl", hash = "sha256:33b88e5ed15724a12fd8bf27a68614b654ff739d227e81161298bc0d03acca4f", size = 4206, upload-time = "2025-11-14T09:58:30.814Z" }, ] [[package]] name = "pyobjc-framework-phase" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-avfoundation", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/a2/65182dcb44fceb2173f4134d6cd4325dfd0731225b621aa2027d2a03d043/pyobjc_framework_phase-11.0.tar.gz", hash = "sha256:e06a0f8308ae4f3731f88b3e1239b7bdfdda3eef97023e3ce972e2f386451d80", size = 59214, upload-time = "2025-01-14T19:04:59.461Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/51/3b25eaf7ca85f38ceef892fdf066b7faa0fec716f35ea928c6ffec6ae311/pyobjc_framework_phase-12.1.tar.gz", hash = "sha256:3a69005c572f6fd777276a835115eb8359a33673d4a87e754209f99583534475", size = 32730, upload-time = "2025-11-14T10:18:43.102Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/97/efb9d770ba05d285384b0c121e9e911929893356da1944a0bb03ea0df0f2/pyobjc_framework_PHASE-11.0-py2.py3-none-any.whl", hash = "sha256:d3e41c2b2fdf4b2ce39f558a08762c6864449ff87b618e42747777ad3f821323", size = 6777, upload-time = "2025-01-14T18:57:20.135Z" }, - { url = "https://files.pythonhosted.org/packages/38/85/03420927e4243d0ef8e3e8aa1ca511b5638743d7ec319a570a472a50d60f/pyobjc_framework_PHASE-11.0-py3-none-any.whl", hash = "sha256:78c0600477ea294304b51f8284a2fb299be284c33ae2c135e1c7cd26fdf4def4", size = 6846, upload-time = "2025-01-14T18:57:21.193Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9f/1ae45db731e8d6dd3e0b408c3accd0cf3236849e671f95c7c8cf95687240/pyobjc_framework_phase-12.1-py2.py3-none-any.whl", hash = "sha256:99a1c1efc6644f5312cce3693117d4e4482538f65ad08fe59e41e2579b67ab17", size = 6902, upload-time = "2025-11-14T09:58:32.436Z" }, ] [[package]] name = "pyobjc-framework-photos" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/c3/fc755c1f8f411433d7ba2e92f3fe3e7b417e9629675ad6baf94ac8b01e64/pyobjc_framework_photos-11.0.tar.gz", hash = "sha256:cfdfdefb0d560b091425227d5c0e24a40b445b5251ff4d37bd326cd8626b80cd", size = 92122, upload-time = "2025-01-14T19:05:01.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/53/f8a3dc7f711034d2283e289cd966fb7486028ea132a24260290ff32d3525/pyobjc_framework_photos-12.1.tar.gz", hash = "sha256:adb68aaa29e186832d3c36a0b60b0592a834e24c5263e9d78c956b2b77dce563", size = 47034, upload-time = "2025-11-14T10:18:47.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/12/a2d65768f70dad5a7c4e6b6ff134a06941043f162f9ce26e2b26b6764ca8/pyobjc_framework_Photos-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0998ab97ebde4b060d28d57173bb9b9652fddd99999fa7a2f0142f1883a84f81", size = 12085, upload-time = "2025-01-14T18:57:33.445Z" }, - { url = "https://files.pythonhosted.org/packages/80/27/62e5833b9629121b4b6ea8f2b2aa295cf6b719dc6316387f77ec0bd41d77/pyobjc_framework_Photos-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:71bf849888713e4a00eb44074c5000ed081c905ba35b3a55ee84c6367ce60ce8", size = 12085, upload-time = "2025-01-14T18:57:34.615Z" }, - { url = "https://files.pythonhosted.org/packages/44/73/ef5077fc4cf2bb9de75dbd5dc2be14fc7383647bf44c1967f528c1414613/pyobjc_framework_Photos-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:80c905577dc6b26dc4880b6642e7e69c5c25b62c0cc4a32acb5e8bf6d2ce5a50", size = 12071, upload-time = "2025-01-14T18:57:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/7157ab4ed148aea40af5a8c02856672a576fe4ba471c0efa61f94d5ca21f/pyobjc_framework_photos-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed6ca0ace0d12b469f68d35dddbede445350afd13b3c582e3297792fd08ad5f8", size = 12325, upload-time = "2025-11-14T09:58:34.33Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e0/8824f7cb167934a8aa1c088b7e6f1b5a9342b14694e76eda95fc736282b2/pyobjc_framework_photos-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f28db92602daac9d760067449fc9bf940594536e65ad542aec47d52b56f51959", size = 12319, upload-time = "2025-11-14T09:58:36.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/38/e6f25aec46a1a9d0a310795606cc43f9823d41c3e152114b814b597835a8/pyobjc_framework_photos-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eda8a584a851506a1ebbb2ee8de2cb1ed9e3431e6a642ef6a9543e32117d17b9", size = 12358, upload-time = "2025-11-14T09:58:38.131Z" }, ] [[package]] name = "pyobjc-framework-photosui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/2c/70ac99fb2b7ba14d220c78cf6401c0c7a47992269f85f699220a6a2cff09/pyobjc_framework_photosui-11.0.tar.gz", hash = "sha256:3c65342e31f6109d8229992b2712b29cab1021475969b55f4f215dd97e2a99db", size = 47898, upload-time = "2025-01-14T19:05:02.737Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/a5/14c538828ed1a420e047388aedc4a2d7d9292030d81bf6b1ced2ec27b6e9/pyobjc_framework_photosui-12.1.tar.gz", hash = "sha256:9141234bb9d17687f1e8b66303158eccdd45132341fbe5e892174910035f029a", size = 29886, upload-time = "2025-11-14T10:18:50.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/8d/c2d0851af933b76a2e321fb1671dd5bddf00ff0139893a80d01a5a7b62de/pyobjc_framework_PhotosUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:200acef81358c5970f075a133ad026be52e7bc19d359fe1430b1be3a48f23faf", size = 12168, upload-time = "2025-01-14T18:57:43.003Z" }, - { url = "https://files.pythonhosted.org/packages/94/ec/9574692e2852d546b28bac853b2b0584c4d4f093a4befac0e105789ee9f6/pyobjc_framework_PhotosUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b3865d2cc4fad4d34255941fe93ce504b9d2c7a7043bd0f4c715da9f4af1cf1", size = 12165, upload-time = "2025-01-14T18:57:44.048Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a8/e2b978127783d20b1578c9c3de7e0f6d515450906ff2a7001746a24e0d7b/pyobjc_framework_PhotosUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a04d10ae8e3d0ab18b9908e1b01e267a39d86d57d97224533b0ddfc01bb350df", size = 12154, upload-time = "2025-01-14T18:57:50.519Z" }, + { url = "https://files.pythonhosted.org/packages/4e/41/2b2e17bd4a07cd399a9031356a98390d403709b53a1e5f7f16b6b79cac43/pyobjc_framework_photosui-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14a088aeb67232a2e8f8658bd52fa0ccb896a2fe7c4e580299ec2da486c597fa", size = 11692, upload-time = "2025-11-14T09:58:49.911Z" }, + { url = "https://files.pythonhosted.org/packages/64/6c/d678767bbeafa932b91c88bc8bb3a586a1b404b5564b0dc791702eb376c3/pyobjc_framework_photosui-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:02ca941187b2a2dcbbd4964d7b2a05de869653ed8484dc059a51cc70f520cd07", size = 11688, upload-time = "2025-11-14T09:58:51.84Z" }, + { url = "https://files.pythonhosted.org/packages/16/a2/b5afca8039b1a659a2a979bb1bdbdddfdf9b1d2724a2cc4633dca2573d5f/pyobjc_framework_photosui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:713e3bb25feb5ea891e67260c2c0769cab44a7f11b252023bfcf9f8c29dd1206", size = 11714, upload-time = "2025-11-14T09:58:53.674Z" }, ] [[package]] name = "pyobjc-framework-preferencepanes" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/01/81cc46e0a92d15f2b664b2efdcc8fd310acac570c9f63a99d446e0489784/pyobjc_framework_preferencepanes-11.0.tar.gz", hash = "sha256:ee000c351befeb81f4fa678ada85695ca4af07933b6bd9b1947164e16dd0b3e5", size = 26419, upload-time = "2025-01-14T19:05:03.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/bc/e87df041d4f7f6b7721bf7996fa02aa0255939fb0fac0ecb294229765f92/pyobjc_framework_preferencepanes-12.1.tar.gz", hash = "sha256:b2a02f9049f136bdeca7642b3307637b190850e5853b74b5c372bc7d88ef9744", size = 24543, upload-time = "2025-11-14T10:18:53.259Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/f7/5d0d9b94563ef06fe0a9c15ba2b77922b73bcc4b6630c487936edf382e20/pyobjc_framework_PreferencePanes-11.0-py2.py3-none-any.whl", hash = "sha256:2143851549430d6bb951adae44cb65c1986662ac7c8cbe15891ed194cbe283a2", size = 4706, upload-time = "2025-01-14T18:57:51.425Z" }, - { url = "https://files.pythonhosted.org/packages/9b/0e/76d694eea953b39318249ae24c956c3e115d8222343fb01f0186f7ca0043/pyobjc_framework_PreferencePanes-11.0-py3-none-any.whl", hash = "sha256:9f1287716374338fa99445ca13dfcc6c9be5597c8a5ce06680a8ca245b4e0acc", size = 4772, upload-time = "2025-01-14T18:57:52.684Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/8ceec1ab0446224d685e243e2770c5a5c92285bcab0b9324dbe7a893ae5a/pyobjc_framework_preferencepanes-12.1-py2.py3-none-any.whl", hash = "sha256:1b3af9db9e0cfed8db28c260b2cf9a22c15fda5f0ff4c26157b17f99a0e29bbf", size = 4797, upload-time = "2025-11-14T09:59:03.998Z" }, ] [[package]] name = "pyobjc-framework-pushkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/ab/7fe55ce5b32c434142be026ec27b1801a2d4694b159b502f9ecd568eebf2/pyobjc_framework_pushkit-11.0.tar.gz", hash = "sha256:df9854ed4065c50022863b3c11c2a21c4279b36c2b5c8f08b834174aacb44e81", size = 20816, upload-time = "2025-01-14T19:05:05.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/45/de756b62709add6d0615f86e48291ee2bee40223e7dde7bbe68a952593f0/pyobjc_framework_pushkit-12.1.tar.gz", hash = "sha256:829a2fc8f4780e75fc2a41217290ee0ff92d4ade43c42def4d7e5af436d8ae82", size = 19465, upload-time = "2025-11-14T10:18:57.727Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/e9/9828e7c00714a78615e2ef452512aa88decf234d953184ed442ae8c3790f/pyobjc_framework_PushKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a35fe4739d8df2d4c191774acc41b651c49daef5b9486cf212cf3964def41667", size = 8017, upload-time = "2025-01-14T18:57:57.94Z" }, - { url = "https://files.pythonhosted.org/packages/17/5f/de178da22fa628cd88f599fea2a70b7d1d9ebc65576307df0bf29822a347/pyobjc_framework_PushKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0185cebcc5aad73aae50804c7a2412da6275717b8f872b830d71c484efcdea7a", size = 8010, upload-time = "2025-01-14T18:57:59.042Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c4/662fc6621d0c8842a5f68faadb9a9d0da1f36c4f26ef9c98919ab67824d9/pyobjc_framework_PushKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdbddf78e4bb84e044144aa10d06216b49f203ef68e1b6f90102c101b311a0ce", size = 8008, upload-time = "2025-01-14T18:58:05.367Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a8/c46a22c2341724114dc19bb71485998c127c1c801ea449c2dadd7c7db0cc/pyobjc_framework_pushkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1d6cb54971c7ed73ce1d13b683d117d4aa34415563c9ca2437dcffefd489940", size = 8159, upload-time = "2025-11-14T09:59:07.366Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b2/d92045e0d4399feda83ee56a9fd685b5c5c175f7ac8423e2cd9b3d52a9da/pyobjc_framework_pushkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:03f41be8b27d06302ea487a6b250aaf811917a0e7d648cd4043fac759d027210", size = 8158, upload-time = "2025-11-14T09:59:09.593Z" }, + { url = "https://files.pythonhosted.org/packages/b9/01/74cf1dd0764c590de05dc1e87d168031e424f834721940b7bb02c67fe821/pyobjc_framework_pushkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7bdf472a55ac65154e03f54ae0bcad64c4cf45e9b1acba62f15107f2bc994d69", size = 8177, upload-time = "2025-11-14T09:59:11.155Z" }, ] [[package]] name = "pyobjc-framework-quartz" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/ad/f00f3f53387c23bbf4e0bb1410e11978cbf87c82fa6baff0ee86f74c5fb6/pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619", size = 3952463, upload-time = "2025-01-14T19:05:07.931Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/18/cc59f3d4355c9456fc945eae7fe8797003c4da99212dd531ad1b0de8a0c6/pyobjc_framework_quartz-12.1.tar.gz", hash = "sha256:27f782f3513ac88ec9b6c82d9767eef95a5cf4175ce88a1e5a65875fee799608", size = 3159099, upload-time = "2025-11-14T10:21:24.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/b3/75fccb0406aac00eecbd14f278a9b6e6fc0e4483220d57eb3aff68666fb1/pyobjc_framework_Quartz-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da3ab13c9f92361959b41b0ad4cdd41ae872f90a6d8c58a9ed699bc08ab1c45c", size = 212343, upload-time = "2025-01-14T18:58:06.353Z" }, - { url = "https://files.pythonhosted.org/packages/a3/6a/68957c8c5e8f0128d4d419728bac397d48fa7ad7a66e82b70e64d129ffca/pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2", size = 212349, upload-time = "2025-01-14T18:58:08.963Z" }, - { url = "https://files.pythonhosted.org/packages/89/a9/c7efb146a2b9c9a7754fed1dd725f7342959644d903006dec28aa65a637e/pyobjc_framework_Quartz-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1032f63f2a4ee98366764e69c249f1d93813821e17d224cf626cf11fb1801fc4", size = 212182, upload-time = "2025-01-14T18:58:13.976Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/50c42c84796886e4d360407fb629000bb68d843b2502c88318375441676f/pyobjc_framework_quartz-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c6f312ae79ef8b3019dcf4b3374c52035c7c7bc4a09a1748b61b041bb685a0ed", size = 217799, upload-time = "2025-11-14T09:59:32.62Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ef/dcd22b743e38b3c430fce4788176c2c5afa8bfb01085b8143b02d1e75201/pyobjc_framework_quartz-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19f99ac49a0b15dd892e155644fe80242d741411a9ed9c119b18b7466048625a", size = 217795, upload-time = "2025-11-14T09:59:46.922Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9b/780f057e5962f690f23fdff1083a4cfda5a96d5b4d3bb49505cac4f624f2/pyobjc_framework_quartz-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7730cdce46c7e985535b5a42c31381af4aa6556e5642dc55b5e6597595e57a16", size = 218798, upload-time = "2025-11-14T10:00:01.236Z" }, ] [[package]] name = "pyobjc-framework-quicklookthumbnailing" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/a1/35ca40d2d4ab05acbc9766986d482482d466529003711c7b4e52a8df4935/pyobjc_framework_quicklookthumbnailing-11.0.tar.gz", hash = "sha256:40763284bd0f71e6a55803f5234ad9cd8e8dd3aaaf5e1fd204e6c952b3f3530d", size = 16784, upload-time = "2025-01-14T19:05:09.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/1a/b90539500e9a27c2049c388d85a824fc0704009b11e33b05009f52a6dc67/pyobjc_framework_quicklookthumbnailing-12.1.tar.gz", hash = "sha256:4f7e09e873e9bda236dce6e2f238cab571baeb75eca2e0bc0961d5fcd85f3c8f", size = 14790, upload-time = "2025-11-14T10:21:26.442Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/85/1a66fefa99e7a4eb7534b2f56f9a24d33beda450dd2ca45d180307e76c74/pyobjc_framework_QuickLookThumbnailing-11.0-py2.py3-none-any.whl", hash = "sha256:6e567a764942845ce4db7ccfc0f8a9d091216bd029ecca955e618a43d64a5d84", size = 4164, upload-time = "2025-01-14T18:58:16.381Z" }, - { url = "https://files.pythonhosted.org/packages/05/d7/26decb13136b7c95a1ca3ecf202644ad2fd515a57e1117c71bfc86429b20/pyobjc_framework_QuickLookThumbnailing-11.0-py3-none-any.whl", hash = "sha256:e0f7f62b9a1df55e5f717518baf3260dc2cb8a9722cc5e9c6fffc643f69bda27", size = 4229, upload-time = "2025-01-14T18:58:17.404Z" }, + { url = "https://files.pythonhosted.org/packages/1e/22/7bd07b5b44bf8540514a9f24bc46da68812c1fd6c63bb2d3496e5ea44bf0/pyobjc_framework_quicklookthumbnailing-12.1-py2.py3-none-any.whl", hash = "sha256:5efe50b0318188b3a4147681788b47fce64709f6fe0e1b5d020e408ef40ab08e", size = 4234, upload-time = "2025-11-14T10:01:02.209Z" }, ] [[package]] name = "pyobjc-framework-replaykit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/43/c751c517dbb8ee599a31e59832c01080473c7964b6996ca29906f46c0967/pyobjc_framework_replaykit-11.0.tar.gz", hash = "sha256:e5693589423eb9ad99d63a7395169f97b484a58108321877b0fc27c748344593", size = 25589, upload-time = "2025-01-14T19:05:10.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/f8/b92af879734d91c1726227e7a03b9e68ab8d9d2bb1716d1a5c29254087f2/pyobjc_framework_replaykit-12.1.tar.gz", hash = "sha256:95801fd35c329d7302b2541f2754e6574bf36547ab869fbbf41e408dfa07268a", size = 23312, upload-time = "2025-11-14T10:21:29.18Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/e6/b409c7fc42e1749732dca3dc3ad8f2f01ad5e4c1ad6035806c67dc4bb52b/pyobjc_framework_ReplayKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a855949d17cee9eafc06d432d41a5f6ca7b3826e71a9371edf29e7431b82d063", size = 9899, upload-time = "2025-01-14T18:58:18.33Z" }, - { url = "https://files.pythonhosted.org/packages/fe/56/89a8544426a46bf176c9462511c08d4c94ae7e0403abb2d73632af68ee8e/pyobjc_framework_ReplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:262fb834400e8379f4c795e65137763348992f3010284602d876050b8adb9ea4", size = 9904, upload-time = "2025-01-14T18:58:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f1/4bb7a10f90903ee35206be6264f5748ac8f7aa7480a17d53fd3816efa230/pyobjc_framework_ReplayKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72eec25174f92a5eb05114a545a37c993827743e952883255e35a0cb5b52e628", size = 9886, upload-time = "2025-01-14T18:58:24.6Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/e8ebcbd80210e8be3b08d6a8404f6b102cb6ebd0c8434daf717f35442958/pyobjc_framework_replaykit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05c8e4cbda2ff22cd5180bee4a892306a4004127365b15e18335ab39e577faa8", size = 10093, upload-time = "2025-11-14T10:01:04.49Z" }, + { url = "https://files.pythonhosted.org/packages/10/b1/fab264c6a82a78cd050a773c61dec397c5df7e7969eba3c57e17c8964ea3/pyobjc_framework_replaykit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3a2f9da6939d7695fa40de9c560c20948d31b0cc2f892fdd611fc566a6b83606", size = 10090, upload-time = "2025-11-14T10:01:06.321Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fc/c68d2111b2655148d88574959d3d8b21d3a003573013301d4d2a7254c1af/pyobjc_framework_replaykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b0528c2a6188440fdc2017f0924c0a0f15d0a2f6aa295f1d1c2d6b3894c22f1d", size = 10120, upload-time = "2025-11-14T10:01:08.397Z" }, ] [[package]] name = "pyobjc-framework-safariservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/ec/c9a97b1aa713145cc8c522c4146af06b293cfe1a959a03ee91007949533b/pyobjc_framework_safariservices-11.0.tar.gz", hash = "sha256:dba416bd0ed5f4481bc400bf56ce57e982c19feaae94bc4eb75d8bda9af15b7e", size = 34367, upload-time = "2025-01-14T19:05:12.914Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/4b/8f896bafbdbfa180a5ba1e21a6f5dc63150c09cba69d85f68708e02866ae/pyobjc_framework_safariservices-12.1.tar.gz", hash = "sha256:6a56f71c1e692bca1f48fe7c40e4c5a41e148b4e3c6cfb185fd80a4d4a951897", size = 25165, upload-time = "2025-11-14T10:21:32.041Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/94/2c996df05016fc667181dc4f2805cb3ae32fee43c2bc3580f0344f4dc5e1/pyobjc_framework_SafariServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:889889e6d252d6156776b7dd87bde55de04d5e4af342441bfd24ac5f6da7252a", size = 7259, upload-time = "2025-01-14T18:58:27.953Z" }, - { url = "https://files.pythonhosted.org/packages/40/39/d69f8e7dbf6f366cb5fdaa8aa7ceef1dadb93a5e4d9fc63217477bba5e32/pyobjc_framework_SafariServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:55c02a533073e0a2aaf6db544f087fd861bace6b62035c3bb2e6b20f0b921b2b", size = 7262, upload-time = "2025-01-14T18:58:29.754Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b0/ed723d519e05190e22c82a5d297af16cbe3f2b026f3e63bee8d6c719ea7e/pyobjc_framework_SafariServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:696d464ed433c474625d1ecf036f87df7d032e46e25b0776dc7c75d0a025d591", size = 7252, upload-time = "2025-01-14T18:58:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/c4/f3076bf070f41712411afaca16c2ef545588521660c8524c1c278e151dec/pyobjc_framework_safariservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:571c3c65c30dd492e49d9e561f6ba847e0b847352aeb8db0317c5b9ef84f2c88", size = 7284, upload-time = "2025-11-14T10:01:17.193Z" }, + { url = "https://files.pythonhosted.org/packages/f1/bb/da1059bfad021c417e090058c0a155419b735b4891a7eedc03177b376012/pyobjc_framework_safariservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae709cf7a72ac7b95d2f131349f852d5d7a1729a8d760ea3308883f8269a4c37", size = 7281, upload-time = "2025-11-14T10:01:19.294Z" }, + { url = "https://files.pythonhosted.org/packages/67/3a/8c525562fd782c88bc44e8c07fc2c073919f98dead08fffd50f280ef1afa/pyobjc_framework_safariservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b475abc82504fc1c0801096a639562d6a6d37370193e8e4a406de9199a7cea13", size = 7281, upload-time = "2025-11-14T10:01:21.238Z" }, ] [[package]] name = "pyobjc-framework-safetykit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/30/89bfdbdca93e57b19891ddeff1742b20a2019cdeb2e44902027dce2642e1/pyobjc_framework_safetykit-11.0.tar.gz", hash = "sha256:9ec996a6a8eecada4b9fd1138244bcffea96a37722531f0ec16566049dfd4cdb", size = 20745, upload-time = "2025-01-14T19:05:13.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/bf/ad6bf60ceb61614c9c9f5758190971e9b90c45b1c7a244e45db64138b6c2/pyobjc_framework_safetykit-12.1.tar.gz", hash = "sha256:0cd4850659fb9b5632fd8ad21f2de6863e8303ff0d51c5cc9c0034aac5db08d8", size = 20086, upload-time = "2025-11-14T10:21:34.212Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/5c/4eb9ec53d2cdb58bddc63b8b052a3c6dbcf1d1e61a981a4e7f69341a4d94/pyobjc_framework_SafetyKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c7e1ca71d11cbe6118fcaf7d21cd4f6a0cc67ad3cf1c1c01fa42280021b0515", size = 8398, upload-time = "2025-01-14T18:58:34.416Z" }, - { url = "https://files.pythonhosted.org/packages/37/c5/68b79c0f128eb735397aa68a40e5ac48b88c12967f69358f25f753a3fc1c/pyobjc_framework_SafetyKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83a1f313c9c63ba107a7c543a8300ae225fa5ff17d963b1c499859da45ceaf55", size = 8395, upload-time = "2025-01-14T18:58:35.46Z" }, - { url = "https://files.pythonhosted.org/packages/ec/50/c4ad41ef5f652c217216fbdbca73c6f88c5c9d15889361f326d594d0aaff/pyobjc_framework_SafetyKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7475a1e2fcc6ace82c8209d432c089797bed3c8d5440e9188ce51aef8e2f2647", size = 8380, upload-time = "2025-01-14T18:58:39.035Z" }, + { url = "https://files.pythonhosted.org/packages/88/00/6682d8b39b5e65188e3c5b560aa3dbd4322f400d2acbaad020edb6cef55c/pyobjc_framework_safetykit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbb7bcacc88aab1ab4d8dacedc9569be00e26bb7e761b7759dc4d4a2c2656586", size = 8537, upload-time = "2025-11-14T10:01:29.424Z" }, + { url = "https://files.pythonhosted.org/packages/94/68/77f17fba082de7c65176e0d74aacbce5c9c9066d6d6edcde5a537c8c140a/pyobjc_framework_safetykit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c63bcd5d571bba149e28c49c8db06073e54e073b08589e94b850b39a43e52b0", size = 8539, upload-time = "2025-11-14T10:01:31.201Z" }, + { url = "https://files.pythonhosted.org/packages/b7/0c/08a20fb7516405186c0fe7299530edd4aa22c24f73290198312447f26c8c/pyobjc_framework_safetykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e4977f7069a23252053d1a42b1a053aefc19b85c960a5214b05daf3c037a6f16", size = 8550, upload-time = "2025-11-14T10:01:32.885Z" }, ] [[package]] name = "pyobjc-framework-scenekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/3f/a2761585399e752bce8275c9d56990d4b83e57b13d06dd98335891176a89/pyobjc_framework_scenekit-11.0.tar.gz", hash = "sha256:c0f37019f8de2a583f66e6d14dfd4ae23c8d8703e93f61c1c91728a21f62cd26", size = 213647, upload-time = "2025-01-14T19:05:15.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/8c/1f4005cf0cb68f84dd98b93bbc0974ee7851bb33d976791c85e042dc2278/pyobjc_framework_scenekit-12.1.tar.gz", hash = "sha256:1bd5b866f31fd829f26feac52e807ed942254fd248115c7c742cfad41d949426", size = 101212, upload-time = "2025-11-14T10:21:41.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/4c/48e422379ead4aa0f5d89240deef26abbcefdc2118aa264a8011870b069c/pyobjc_framework_SceneKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:016fe80619bacdc5a16d8610f00fded399f3a37ccec65303617e2c1162773b9c", size = 33104, upload-time = "2025-01-14T18:58:40.923Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4c/5ec624ae043fbbe15be2a989e3fc6cb08d992e0a5061450b84b33f96429c/pyobjc_framework_SceneKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86d23456e4c7a7bb7bb49be2b98647678ac7a39955e6bb242e0ac125d8b770e8", size = 33108, upload-time = "2025-01-14T18:58:43.577Z" }, - { url = "https://files.pythonhosted.org/packages/2f/44/1bf237ca2f8c33a47e1e174209005e5d9cf7de2e665460a936b80f3227f0/pyobjc_framework_SceneKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34cb863457ec33ee034b16226ccf64e914076cab5da243375e155c8cb52273d8", size = 33076, upload-time = "2025-01-14T18:58:47.576Z" }, + { url = "https://files.pythonhosted.org/packages/c7/47/2aac42526e55f490855db6bddba25edbf1764e175437d60235860856b92a/pyobjc_framework_scenekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:269760fa2ab44df11be1a7898907d2f01eb05d1d98a8997ae876ed49803be75b", size = 33539, upload-time = "2025-11-14T10:01:44.05Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7f/eda261013dc41cc70f3157d1a750712dc29b64fc05be84232006b5cd57e5/pyobjc_framework_scenekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:01bf1336a7a8bdc96fabde8f3506aa7a7d1905e20a5c46030a57daf0ce2cbd16", size = 33542, upload-time = "2025-11-14T10:01:47.613Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f1/4986bd96e0ba0f60bff482a6b135b9d6db65d56578d535751f18f88190f0/pyobjc_framework_scenekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:40aea10098893f0b06191f1e79d7b25e12e36a9265549d324238bdb25c7e6df0", size = 33597, upload-time = "2025-11-14T10:01:51.297Z" }, ] [[package]] name = "pyobjc-framework-screencapturekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/90/71f10db2f52ea324f82eaccc959442c43d21778cc5b1294c29e1942e635c/pyobjc_framework_screencapturekit-11.0.tar.gz", hash = "sha256:ca2c960e28216e56f33e4ca9b9b1eda12d9c17b719bae727181e8b96f0314c4b", size = 53046, upload-time = "2025-01-14T19:05:16.834Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/7f/73458db1361d2cb408f43821a1e3819318a0f81885f833d78d93bdc698e0/pyobjc_framework_screencapturekit-12.1.tar.gz", hash = "sha256:50992c6128b35ab45d9e336f0993ddd112f58b8c8c8f0892a9cb42d61bd1f4c9", size = 32573, upload-time = "2025-11-14T10:21:44.497Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/87/3de3208bc858536cf3ed6bb1fd5034d303f37ff31d91c0aaf4dff30a2cf3/pyobjc_framework_ScreenCaptureKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:557ccd9e4b108158e2847a4635490428b9ae11840a86de5a5237e49171353667", size = 11107, upload-time = "2025-01-14T18:58:50.287Z" }, - { url = "https://files.pythonhosted.org/packages/af/aa/d6d0818564570065411874cbe3de86dee105dc9906161c0584009a1a63bc/pyobjc_framework_ScreenCaptureKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:38468e833ec1498778bd33ce30578afed2e13ac14c73e8e6290ff06a2e0c50d8", size = 11110, upload-time = "2025-01-14T18:58:51.475Z" }, - { url = "https://files.pythonhosted.org/packages/cf/ec/0d4c66939d04473bb2e307c1fa798b907991e397e3d4eb3fb8498c0d5953/pyobjc_framework_ScreenCaptureKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a34a2569da5b7fddbc7391f6bb0cba010e642462353d8ebf50273639a6891b11", size = 11090, upload-time = "2025-01-14T18:58:56.092Z" }, + { url = "https://files.pythonhosted.org/packages/01/df/5c2eee34ef88989da39830e83074028922a9150d601539217fd7ac6d3c06/pyobjc_framework_screencapturekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf13285180e9acf8a6d0eff494dd7fb63296c648d4838f628c67be72b1af4725", size = 11474, upload-time = "2025-11-14T10:02:07.253Z" }, + { url = "https://files.pythonhosted.org/packages/79/92/fe66408f4bd74f6b6da75977d534a7091efe988301d13da4f009bf54ab71/pyobjc_framework_screencapturekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae412d397eedf189e763defe3497fcb8dffa5e0b54f62390cb33bf9b1cfb864a", size = 11473, upload-time = "2025-11-14T10:02:09.177Z" }, + { url = "https://files.pythonhosted.org/packages/05/a8/533acdbf26e0a908ff640d3a445481f3c948682ca887be6711b5fcf82682/pyobjc_framework_screencapturekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:27df138ce2dfa9d4aae5106d4877e9ed694b5a174643c058f1c48678ffc7001a", size = 11504, upload-time = "2025-11-14T10:02:11.36Z" }, ] [[package]] name = "pyobjc-framework-screensaver" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/b6/71c20259a1bfffcb5103be62564006b1bbc21f80180658101e2370683bcb/pyobjc_framework_screensaver-11.0.tar.gz", hash = "sha256:2e4c643624cc0cffeafc535c43faf5f8de8be030307fa8a5bea257845e8af474", size = 23774, upload-time = "2025-01-14T19:05:19.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/99/7cfbce880cea61253a44eed594dce66c2b2fbf29e37eaedcd40cffa949e9/pyobjc_framework_screensaver-12.1.tar.gz", hash = "sha256:c4ca111317c5a3883b7eace0a9e7dd72bc6ffaa2ca954bdec918c3ab7c65c96f", size = 22229, upload-time = "2025-11-14T10:21:47.299Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/db/e2e4c28c37311c86811a57b3468b50d205ac1bd0f771fde32e034ea73c00/pyobjc_framework_ScreenSaver-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed715115dcebaacee73b7ba140bf4d0b9bf00c01e36cd4d51d51049fd18b6d95", size = 8448, upload-time = "2025-01-14T18:58:57.597Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ab/f17cd36458e6cf6d64c412128641edcfc220b8147283f6b34ef56c7db111/pyobjc_framework_ScreenSaver-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:436357c822d87220df64912da04b421e82a5e1e6464d48f2dbccc69529d19cd3", size = 8445, upload-time = "2025-01-14T18:58:59.299Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/14ec167a64ea39ccc4457a9017e1eac2f9db3c2e18f0e2783c3d429e60f1/pyobjc_framework_ScreenSaver-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c44d98b51d099e2167ce41041527c7e97bc16b825c81ec8c402781f8e96a01e0", size = 8429, upload-time = "2025-01-14T18:59:03.113Z" }, + { url = "https://files.pythonhosted.org/packages/f5/bc/3a0d0d3abda32e2f7dbad781b100e01f6fe2d40afc298d6d076478895bcb/pyobjc_framework_screensaver-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:58625f7d19d73b74521570ddd5b49bf5eeaf32bac6f2c39452594f020dda9b85", size = 8482, upload-time = "2025-11-14T10:02:20.94Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8d/87ca0fa0a9eda3097a0f4f2eef1544bf1d984697939fbef7cda7495fddb9/pyobjc_framework_screensaver-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bd10809005fbe0d68fe651f32a393ce059e90da38e74b6b3cd055ed5b23eaa9", size = 8480, upload-time = "2025-11-14T10:02:22.798Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/2481711f2e9557b90bac74fa8bf821162cf7b65835732ae560fd52e9037e/pyobjc_framework_screensaver-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3c90c2299eac6d01add81427ae2f90d7724f15d676261e838d7a7750f812322", size = 8422, upload-time = "2025-11-14T10:02:24.49Z" }, ] [[package]] name = "pyobjc-framework-screentime" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/a7/ee60ee5b0471a4367eaa1c8a243418874fd48fac5dbdfdd318a653d94aaa/pyobjc_framework_screentime-11.0.tar.gz", hash = "sha256:6dd74dc64be1865346fcff63b8849253697f7ac68d83ee2708019cf3852c1cd7", size = 14398, upload-time = "2025-01-14T19:05:21.547Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/11/ba18f905321895715dac3cae2071c2789745ae13605b283b8114b41e0459/pyobjc_framework_screentime-12.1.tar.gz", hash = "sha256:583de46b365543bbbcf27cd70eedd375d397441d64a2cf43c65286fd9c91af55", size = 13413, upload-time = "2025-11-14T10:21:49.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/7a/8df61f80725e993fd0dc1a111217de6a8efec35b02a4796749de0b7e8c34/pyobjc_framework_ScreenTime-11.0-py2.py3-none-any.whl", hash = "sha256:723938c7d47e3c5c1c0f79010a01139762384bd0c03c51ee7a4736fc3f128fed", size = 3721, upload-time = "2025-01-14T18:59:04.027Z" }, - { url = "https://files.pythonhosted.org/packages/c4/62/2f86cedd4cc439625976848832c1d1571fcb69cc087dd71c9cf09e793db5/pyobjc_framework_ScreenTime-11.0-py3-none-any.whl", hash = "sha256:45db846ec9249cab90e86cbb31cf70e13800305b7c74819ab681a91854c91df2", size = 3790, upload-time = "2025-01-14T18:59:06.363Z" }, + { url = "https://files.pythonhosted.org/packages/27/06/904174de6170e11b53673cc5844e5f13394eeeed486e0bcdf5288c1b0853/pyobjc_framework_screentime-12.1-py2.py3-none-any.whl", hash = "sha256:d34a068ec8ba2704987fcd05c37c9a9392de61d92933e6e71c8e4eaa4dfce029", size = 3963, upload-time = "2025-11-14T10:02:32.577Z" }, ] [[package]] name = "pyobjc-framework-scriptingbridge" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/f0/592af19047935e44c07ddd1eba4f05aa8eb460ee842f7d5d48501231cd69/pyobjc_framework_scriptingbridge-11.0.tar.gz", hash = "sha256:65e5edd0ea608ae7f01808b963dfa25743315f563705d75c493c2fa7032f88cc", size = 22626, upload-time = "2025-01-14T19:05:22.461Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/cb/adc0a09e8c4755c2281bd12803a87f36e0832a8fc853a2d663433dbb72ce/pyobjc_framework_scriptingbridge-12.1.tar.gz", hash = "sha256:0e90f866a7e6a8aeaf723d04c826657dd528c8c1b91e7a605f8bb947c74ad082", size = 20339, upload-time = "2025-11-14T10:21:51.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/5b/91b965358f72a3e12f06e80fcfcdcb5922680d85acf04fff7300c6980fae/pyobjc_framework_ScriptingBridge-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e94becbb7fabaf4e8b3b15c56e297c89300cbb67b4aafccdc5eb497cf51970b9", size = 8214, upload-time = "2025-01-14T18:59:09.544Z" }, - { url = "https://files.pythonhosted.org/packages/7d/2c/2fd33c0318a8fe35f00f0089a44a2c27d4d0fd0b4b5e13628051a4d8c9d3/pyobjc_framework_ScriptingBridge-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c98d080446aa8ba4074e43eb0be1feed96781dbc0718496f172fcd20e84a9158", size = 8209, upload-time = "2025-01-14T18:59:11.107Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ce/be0fc02dddfe828c855fc1447120bb5f4e65ba8108626a4b63703c422b55/pyobjc_framework_ScriptingBridge-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:142601fea52f953e7fde00ad4488be846e51fd808448d5928f11cf2af14ecd0a", size = 8198, upload-time = "2025-01-14T18:59:17.332Z" }, + { url = "https://files.pythonhosted.org/packages/5c/df/18a894d0d720d370bf5351555ba18e48e1ab8153cb756a5d945c1c3d8637/pyobjc_framework_scriptingbridge-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:97acd79168892ba457bc472214851f4e4a2d40a8aae106fb07cc94417e1fc681", size = 8334, upload-time = "2025-11-14T10:02:34.478Z" }, + { url = "https://files.pythonhosted.org/packages/42/de/0943ee8d7f1a7d8467df6e2ea017a6d5041caff2fb0283f37fea4c4ce370/pyobjc_framework_scriptingbridge-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e6e37e69760d6ac9d813decf135d107760d33e1cdf7335016522235607f6f31b", size = 8335, upload-time = "2025-11-14T10:02:36.654Z" }, + { url = "https://files.pythonhosted.org/packages/51/46/e0b07d2b3ff9effb8b1179a6cc681a953d3dfbf0eb8b1d6a0e54cef2e922/pyobjc_framework_scriptingbridge-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8083cd68c559c55a3787b2e74fc983c8665e5078571475aaeabf4f34add36b62", size = 8356, upload-time = "2025-11-14T10:02:38.559Z" }, ] [[package]] name = "pyobjc-framework-searchkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreservices", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/27/9676327cf7d13346d546325b411a5deaa072bd0fbe733c8aae8a9a00c0e0/pyobjc_framework_searchkit-11.0.tar.gz", hash = "sha256:36f3109e74bc5e6fab60c02be804d5ed1c511ad51ea0d597a6c6a9653573ddf5", size = 31182, upload-time = "2025-01-14T19:05:24.667Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/60/a38523198430e14fdef21ebe62a93c43aedd08f1f3a07ea3d96d9997db5d/pyobjc_framework_searchkit-12.1.tar.gz", hash = "sha256:ddd94131dabbbc2d7c3f17db3da87c1a712c431310eef16f07187771e7e85226", size = 30942, upload-time = "2025-11-14T10:21:55.483Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/d4/64fa608b5d91859b11c26ceca83a41d2bf1d0dcbf1d9df847bab5a52ccc8/pyobjc_framework_SearchKit-11.0-py2.py3-none-any.whl", hash = "sha256:332f9d30ec3b223efaac681fbdd923ba660575e241abb4ed5e03207c97799530", size = 3633, upload-time = "2025-01-14T18:59:18.343Z" }, - { url = "https://files.pythonhosted.org/packages/93/e2/83e94c505c5436821982d724cc890f74d717f9473782f7278ce78634685d/pyobjc_framework_SearchKit-11.0-py3-none-any.whl", hash = "sha256:5f4304cb77c327b28ac0f7ec9b99313075afd742091d39368eb64f076bb7d141", size = 3699, upload-time = "2025-01-14T18:59:20.754Z" }, + { url = "https://files.pythonhosted.org/packages/72/46/4f9cd3011f47b43b21b2924ab3770303c3f0a4d16f05550d38c5fcb42e78/pyobjc_framework_searchkit-12.1-py2.py3-none-any.whl", hash = "sha256:844ce62b7296b19da8db7dedd539d07f7b3fb3bb8b029c261f7bcf0e01a97758", size = 3733, upload-time = "2025-11-14T10:02:47.026Z" }, ] [[package]] name = "pyobjc-framework-security" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/75/4b916bff8c650e387077a35916b7a7d331d5ff03bed7275099d96dcc6cd9/pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758", size = 347059, upload-time = "2025-01-14T19:05:26.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/aa/796e09a3e3d5cee32ebeebb7dcf421b48ea86e28c387924608a05e3f668b/pyobjc_framework_security-12.1.tar.gz", hash = "sha256:7fecb982bd2f7c4354513faf90ba4c53c190b7e88167984c2d0da99741de6da9", size = 168044, upload-time = "2025-11-14T10:22:06.334Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/d0/867eca502bd89b237431945904a8fff2d93f3988292194666b15061e2bae/pyobjc_framework_Security-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2db348ba43aff24ae71d239ed585bf061e61f84a50226677049ed220737ffd0", size = 41501, upload-time = "2025-01-14T18:59:21.71Z" }, - { url = "https://files.pythonhosted.org/packages/fa/d8/092940f8c46cf09000a9d026e9854772846d5335e3e8a44d0a81aa1f359e/pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526", size = 41499, upload-time = "2025-01-14T18:59:22.819Z" }, - { url = "https://files.pythonhosted.org/packages/f6/08/3e524b104891bbcfa5557a79cc89d5d79855611047f315033e2ef1f460e8/pyobjc_framework_Security-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d550ea972da4a4a4a50b8dc190a3da90095acfffd1a894012d64fb4729e53974", size = 41482, upload-time = "2025-01-14T18:59:28.567Z" }, + { url = "https://files.pythonhosted.org/packages/2e/67/31928b689b72a932c80e35662430355de09163bec8ee334f0994d16c4036/pyobjc_framework_security-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:787e9d873535247e2caca2036cbcdc956bcc92d0c06044bec7eefe0a456856b0", size = 41288, upload-time = "2025-11-14T10:02:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/5e/3d/8d3a39cd292d7c76ab76233498189bc7170fc80f573b415308464f68c7ee/pyobjc_framework_security-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b2d8819f0fb7b619ec7627a0d8c1cac1a57c5143579ce8ac21548165680684b", size = 41287, upload-time = "2025-11-14T10:02:54.491Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/5160c0f938fc0515fe8d9af146aac1b093f7ef285ce797fedae161b6c0e8/pyobjc_framework_security-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab42e55f5b782332be5442750fcd9637ee33247d57c7b1d5801bc0e24ee13278", size = 41280, upload-time = "2025-11-14T10:02:58.097Z" }, ] [[package]] name = "pyobjc-framework-securityfoundation" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-security", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/d6/0d817edb11d2bdb0f536059e913191e587f1984e39397bb3341209d92c21/pyobjc_framework_securityfoundation-11.0.tar.gz", hash = "sha256:5ae906ded5dd40046c013a7e0c1f59416abafb4b72bc947b6cd259749745e637", size = 13526, upload-time = "2025-01-14T19:05:27.275Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/d5/c2b77e83c1585ba43e5f00c917273ba4bf7ed548c1b691f6766eb0418d52/pyobjc_framework_securityfoundation-12.1.tar.gz", hash = "sha256:1f39f4b3db6e3bd3a420aaf4923228b88e48c90692cf3612b0f6f1573302a75d", size = 12669, upload-time = "2025-11-14T10:22:09.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/41/50da30e87841c8b9ee1f17e9720dc9dbb2c2e59abac84fffe899ed5f9188/pyobjc_framework_SecurityFoundation-11.0-py2.py3-none-any.whl", hash = "sha256:8f8e43b91ae7cb45f3251c14c0c6caf5fdcdb93794176c4b118214a108ee2ef3", size = 3716, upload-time = "2025-01-14T18:59:29.79Z" }, - { url = "https://files.pythonhosted.org/packages/cb/61/e73a61de62e31b33378ee635534228f4801b1554fbd89a47e0b36965908d/pyobjc_framework_SecurityFoundation-11.0-py3-none-any.whl", hash = "sha256:1fa89969fbf7a4fd57214388a43f7ed6b6b1fd0c0ec7aa77752444eb1604143c", size = 3787, upload-time = "2025-01-14T18:59:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/93/1e/349fb71a413b37b1b41e712c7ca180df82144478f8a9a59497d66d0f2ea2/pyobjc_framework_securityfoundation-12.1-py2.py3-none-any.whl", hash = "sha256:579cf23e63434226f78ffe0afb8426e971009588e4ad812c478d47dfd558201c", size = 3792, upload-time = "2025-11-14T10:03:14.459Z" }, ] [[package]] name = "pyobjc-framework-securityinterface" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-security", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/88/d7c4942650707fe5b1d3b45b42684f58f2cab7d2772ec74ca96ecef575eb/pyobjc_framework_securityinterface-11.0.tar.gz", hash = "sha256:8843a27cf30a8e4dd6e2cb7702a6d65ad4222429f0ccc6c062537af4683b1c08", size = 37118, upload-time = "2025-01-14T19:05:28.569Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/64/bf5b5d82655112a2314422ee649f1e1e73d4381afa87e1651ce7e8444694/pyobjc_framework_securityinterface-12.1.tar.gz", hash = "sha256:deef11ad03be8d9ff77db6e7ac40f6b641ee2d72eaafcf91040537942472e88b", size = 25552, upload-time = "2025-11-14T10:22:12.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/49/556520a1577ecabae419828ab59dd0175af62453fdbd8d47b741d0efc4a7/pyobjc_framework_SecurityInterface-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:94901d924e15eb8745e06aa44c1ef98dadff02c6fd398eb57b04a8a88cf91c65", size = 10705, upload-time = "2025-01-14T18:59:31.666Z" }, - { url = "https://files.pythonhosted.org/packages/88/5f/a96da5f43da5a9d0e5d016bc672a4dca09f88d091c96d9ecff5f753ad1d5/pyobjc_framework_SecurityInterface-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2771dae043c8aa278887f96c7d206957164c7a81a562fa391bf0b9316d6755eb", size = 10706, upload-time = "2025-01-14T18:59:32.632Z" }, - { url = "https://files.pythonhosted.org/packages/2e/36/e25cc21e604c142649af54391a53b6dab672c3d94a2cdfb6093983d6db9e/pyobjc_framework_SecurityInterface-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2fd774a5ad376d49d14434bff3ee8bb1b2c06764e90ce594c89d452f79e56077", size = 10695, upload-time = "2025-01-14T18:59:38.674Z" }, + { url = "https://files.pythonhosted.org/packages/0f/29/72ead8aecbccd06e4043754ba31d379eae70a6c39b3503a6e01cbb5ce6c3/pyobjc_framework_securityinterface-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:048950875a968032bc133c64e594d4810d5bf5ef359012830cf193610d9c04ac", size = 10723, upload-time = "2025-11-14T10:03:16.224Z" }, + { url = "https://files.pythonhosted.org/packages/37/1c/a01fd56765792d1614eb5e8dc0a7d5467564be6a2056b417c9ec7efc648f/pyobjc_framework_securityinterface-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed599be750122376392e95c2407d57bd94644e8320ddef1d67660e16e96b0d06", size = 10719, upload-time = "2025-11-14T10:03:18.353Z" }, + { url = "https://files.pythonhosted.org/packages/59/3e/17889a6de03dc813606bb97887dc2c4c2d4e7c8f266bc439548bae756e90/pyobjc_framework_securityinterface-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5cb5e79a73ea17663ebd29e350401162d93e42343da7d96c77efb38ae64ff01f", size = 10783, upload-time = "2025-11-14T10:03:20.202Z" }, +] + +[[package]] +name = "pyobjc-framework-securityui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/3f/d870305f5dec58cd02966ca06ac29b69fb045d8b46dfb64e2da31f295345/pyobjc_framework_securityui-12.1.tar.gz", hash = "sha256:f1435fed85edc57533c334a4efc8032170424b759da184cb7a7a950ceea0e0b6", size = 12184, upload-time = "2025-11-14T10:22:14.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/7f/eff9ffdd34511cc95a60e5bd62f1cfbcbcec1a5012ef1168161506628c87/pyobjc_framework_securityui-12.1-py2.py3-none-any.whl", hash = "sha256:3e988b83c9a2bb0393207eaa030fc023a8708a975ac5b8ea0508cdafc2b60705", size = 3594, upload-time = "2025-11-14T10:03:29.628Z" }, ] [[package]] name = "pyobjc-framework-sensitivecontentanalysis" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/e4/f1e0f150ae6c6ad7dde9b248f34f324f4f8b1c42260dbf62420f80d79ba9/pyobjc_framework_sensitivecontentanalysis-11.0.tar.gz", hash = "sha256:0f09034688f894c0f4409c16adaf857d78714d55472de4aa2ac40fbd7ba233d6", size = 13060, upload-time = "2025-01-14T19:05:29.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/17bf31753e14cb4d64fffaaba2377453c4977c2c5d3cf2ff0a3db30026c7/pyobjc_framework_sensitivecontentanalysis-12.1.tar.gz", hash = "sha256:2c615ac10e93eb547b32b214cd45092056bee0e79696426fd09978dc3e670f25", size = 13745, upload-time = "2025-11-14T10:22:16.447Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/eb/e0d60b3e233860a237fdddd44ab961c9115c33e947058d73c222dafc50af/pyobjc_framework_SensitiveContentAnalysis-11.0-py2.py3-none-any.whl", hash = "sha256:e19d2edc807f98aef31fa4db5472a509cf90523436c971d1095a000b0e357058", size = 3791, upload-time = "2025-01-14T18:59:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/c4/1c/fb2138cf08cd0215ea4f78032871a1d89e7e41d9fad18b55e937f0577c03/pyobjc_framework_SensitiveContentAnalysis-11.0-py3-none-any.whl", hash = "sha256:027bd0be0785f7aea3bfd56ff7c3496e5d383211122393c599c28ea392675589", size = 3863, upload-time = "2025-01-14T18:59:40.548Z" }, + { url = "https://files.pythonhosted.org/packages/95/23/c99568a0d4e38bd8337d52e4ae25a0b0bd540577f2e06f3430c951d73209/pyobjc_framework_sensitivecontentanalysis-12.1-py2.py3-none-any.whl", hash = "sha256:faf19d32d4599ac2b18fb1ccdc3e33b2b242bdf34c02e69978bd62d3643ad068", size = 4230, upload-time = "2025-11-14T10:03:31.26Z" }, ] [[package]] name = "pyobjc-framework-servicemanagement" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/59/8d38b5cdbcfb57ab842e080436dbd04d5a5d2080e99a2ea1e286cfad12a8/pyobjc_framework_servicemanagement-11.0.tar.gz", hash = "sha256:10b1bbcee3de5bb2b9fc3d6763eb682b7a1d9ddd4bd2c882fece62783cb17885", size = 16882, upload-time = "2025-01-14T19:05:30.537Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/d0/b26c83ae96ab55013df5fedf89337d4d62311b56ce3f520fc7597d223d82/pyobjc_framework_servicemanagement-12.1.tar.gz", hash = "sha256:08120981749a698033a1d7a6ab99dbbe412c5c0d40f2b4154014b52113511c1d", size = 14585, upload-time = "2025-11-14T10:22:18.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/35/cbac7db272d0e5e71b300be1517b0a1dc7cf035944675eaed7066d41e883/pyobjc_framework_ServiceManagement-11.0-py2.py3-none-any.whl", hash = "sha256:35cfd7a369a120fa55e64b719a2dda00295b2cc6ddab16ffa8939f4326d1b37d", size = 5254, upload-time = "2025-01-14T18:59:41.438Z" }, - { url = "https://files.pythonhosted.org/packages/b3/40/26c5d63d131e3e415815bfbb4bd035ba10d45f0d87733646221966871b6b/pyobjc_framework_ServiceManagement-11.0-py3-none-any.whl", hash = "sha256:7ec19c9632f67d589ad37815d001e8e443d92e75001c370486a1070a4359e166", size = 5322, upload-time = "2025-01-14T18:59:42.585Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5d/1009c32189f9cb26da0124b4a60640ed26dd8ad453810594f0cbfab0ff70/pyobjc_framework_servicemanagement-12.1-py2.py3-none-any.whl", hash = "sha256:9a2941f16eeb71e55e1cd94f50197f91520778c7f48ad896761f5e78725cc08f", size = 5357, upload-time = "2025-11-14T10:03:32.928Z" }, ] [[package]] name = "pyobjc-framework-sharedwithyou" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-sharedwithyoucore", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-sharedwithyoucore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/84/db667061f815537717a6cac891df01a45b65e6feaa2dfa0c9d2e3803a1ef/pyobjc_framework_sharedwithyou-11.0.tar.gz", hash = "sha256:a3a03daac77ad7364ed22109ca90c6cd2dcb7611a96cbdf37d30543ef1579399", size = 33696, upload-time = "2025-01-14T19:05:31.396Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/8b/8ab209a143c11575a857e2111acc5427fb4986b84708b21324cbcbf5591b/pyobjc_framework_sharedwithyou-12.1.tar.gz", hash = "sha256:167d84794a48f408ee51f885210c616fda1ec4bff3dd8617a4b5547f61b05caf", size = 24791, upload-time = "2025-11-14T10:22:21.248Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/0c/8d626ab99aabb037b787bba00eae02ae6039e0f770d590565a97cdba48ed/pyobjc_framework_SharedWithYou-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7da997b4a2ae8401591ff293f0feaf9e05389d9c46608e70b7f5728001096105", size = 8604, upload-time = "2025-01-14T18:59:43.553Z" }, - { url = "https://files.pythonhosted.org/packages/3c/ab/391ef0de3021997ec9a12d8044c0b7e884780a9bead7f847254e06d0f075/pyobjc_framework_SharedWithYou-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dac74375d3dc18d67cae46f3f16a45cef699b1976a4012827c0f15256da55df", size = 8606, upload-time = "2025-01-14T18:59:44.537Z" }, - { url = "https://files.pythonhosted.org/packages/38/6b/4746d778d20eb176a80edbe4997c1b51ff9954f515c0245ecd4f09eaddab/pyobjc_framework_SharedWithYou-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b472fe9a8d92d9f6ff2c2392a5aacfcb73a651bdcea452e24d7143e2a18ca33f", size = 8586, upload-time = "2025-01-14T18:59:52.22Z" }, + { url = "https://files.pythonhosted.org/packages/39/8f/05eb8862ee9163dd41d38c0a1a3e8d3cbd2a1fb9397f792c19af84241556/pyobjc_framework_sharedwithyou-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b5e05940bd0b9107340437ecef4502a2d2326072b0fa0b458f41c02a173d1047", size = 8748, upload-time = "2025-11-14T10:03:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/3ad9b344808c5619adc253b665f8677829dfb978888227e07233d120cfab/pyobjc_framework_sharedwithyou-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:359c03096a6988371ea89921806bb81483ea509c9aa7114f9cd20efd511b3576", size = 8739, upload-time = "2025-11-14T10:03:36.48Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ee/e5113ce985a480d13a0fa3d41a242c8068dc09b3c13210557cf5cc6a544a/pyobjc_framework_sharedwithyou-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a99a6ebc6b6de7bc8663b1f07332fab9560b984a57ce344dc5703f25258f258d", size = 8763, upload-time = "2025-11-14T10:03:38.467Z" }, ] [[package]] name = "pyobjc-framework-sharedwithyoucore" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/2a/86904cd9cc3bf5cdb9101481e17e67358f39f81ffa0f36768097287e34b3/pyobjc_framework_sharedwithyoucore-11.0.tar.gz", hash = "sha256:3932452677df5d67ea27845ab26ccaaa1d1779196bf16b62c5655f13d822c82d", size = 28877, upload-time = "2025-01-14T19:05:32.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/ef/84059c5774fd5435551ab7ab40b51271cfb9997b0d21f491c6b429fe57a8/pyobjc_framework_sharedwithyoucore-12.1.tar.gz", hash = "sha256:0813149eeb755d718b146ec9365eb4ca3262b6af9ff9ba7db2f7b6f4fd104518", size = 22350, upload-time = "2025-11-14T10:22:23.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/e3/02193531461720e8cedc6b5528b4ca8725e288310e8179c2696f86233895/pyobjc_framework_SharedWithYouCore-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5d57def17c6cb14743fee0ad0d447bd9bfa8e5e54027a3f284707a871421fbe", size = 8366, upload-time = "2025-01-14T18:59:53.175Z" }, - { url = "https://files.pythonhosted.org/packages/21/40/69ae712e223991cd975c1f8ba2b00a5aa4c129ac0e76838b4d936740e4c7/pyobjc_framework_SharedWithYouCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:46cd00a97c5fec747ef057000daa88495699ea5d5d6fe1f302bfb89b2d431645", size = 8366, upload-time = "2025-01-14T18:59:55.641Z" }, - { url = "https://files.pythonhosted.org/packages/69/c3/3c7a9025999d978bc873a708cc1b55f62661173e73f430999b623228b3b0/pyobjc_framework_SharedWithYouCore-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:984db8206353b7c5200bf7e4a23664ffc4603c8288c5c35bb37baa16e8367aa2", size = 8352, upload-time = "2025-01-14T19:00:00.581Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d5/73669bcc8bde10f6a11d4c1d38f7c38c286289a59f0a3cf76c6ed121dd0b/pyobjc_framework_sharedwithyoucore-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a7dd3048ea898b8fa401088d9fae73dbda361fb7c2dd1dc1057102e503b12771", size = 8512, upload-time = "2025-11-14T10:03:47.027Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a1/83e58eca8827a1a9975a9c5de7f8c0bdc73b5f53ee79768d1fdbec6747de/pyobjc_framework_sharedwithyoucore-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f4f9f7fed0768ebbbc2d24248365da2cf5f014b8822b2a1fbbce5fa920f410f1", size = 8512, upload-time = "2025-11-14T10:03:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/dd/0e/0c2b0591ebc72d437dccca7a1e7164c5f11dde2189d4f4c707a132bab740/pyobjc_framework_sharedwithyoucore-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed928266ae9d577ff73de72a03bebc66a751918eb59ca660a9eca157392f17be", size = 8530, upload-time = "2025-11-14T10:03:50.839Z" }, ] [[package]] name = "pyobjc-framework-shazamkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/2a/1f4ad92260860e500cb61119e8e7fe604b0788c32f5b00446b5a56705a2b/pyobjc_framework_shazamkit-11.0.tar.gz", hash = "sha256:cea736cefe90b6bb989d0a8abdc21ef4b3b431b27657abb09d6deb0b2c1bd37a", size = 25172, upload-time = "2025-01-14T19:05:34.497Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/2c/8d82c5066cc376de68ad8c1454b7c722c7a62215e5c2f9dac5b33a6c3d42/pyobjc_framework_shazamkit-12.1.tar.gz", hash = "sha256:71db2addd016874639a224ed32b2000b858802b0370c595a283cce27f76883fe", size = 22518, upload-time = "2025-11-14T10:22:25.996Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8c/edb53e71257c92e481e2bedb094de25e1b4588ab57bf8aa9995c44b3bbd5/pyobjc_framework_ShazamKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ebf7704e50ed9c6c1ca6b48b9350d8d0c59ed0204dd454b32c8a770e58579b44", size = 8410, upload-time = "2025-01-14T19:00:01.568Z" }, - { url = "https://files.pythonhosted.org/packages/05/81/edfcd4be626aae356dd1b991f521eaeffa1798e91ddae9e7d9ae8ed371d1/pyobjc_framework_ShazamKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ecdc2392d7e8d6e2540c7ad3073a229d08b0818c5dd044a26c93b765ce9868aa", size = 8411, upload-time = "2025-01-14T19:00:02.908Z" }, - { url = "https://files.pythonhosted.org/packages/1a/99/c9f6e210c0e16a8a594876493bdec158e1004d6ede33ac230b17670811c0/pyobjc_framework_ShazamKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85d0098f57ed9372caf78302e39c55393db8d63453a4b02a2cfcb7bc158c595c", size = 8394, upload-time = "2025-01-14T19:00:07.943Z" }, + { url = "https://files.pythonhosted.org/packages/c0/68/669b073beec0013a3bd3b99c99312fbf1018cfa702819962f5da8c121143/pyobjc_framework_shazamkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18ff0a83a6d2517d30669cf5337e688310e424d1cdc1fa90acf3753a73cc1bd4", size = 8558, upload-time = "2025-11-14T10:04:00.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/12/09d83a8ac51dc11a574449dea48ffa99b3a7c9baf74afeedb487394d110d/pyobjc_framework_shazamkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0c10ba22de524fbedf06270a71bb0a3dbd4a3853b7002ddf54394589c3be6939", size = 8555, upload-time = "2025-11-14T10:04:02.552Z" }, + { url = "https://files.pythonhosted.org/packages/04/5e/7d60d8e7b036b20d0e94cd7c4563e7414653344482e85fbc7facffabc95f/pyobjc_framework_shazamkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e184dd0f61a604b1cfcf44418eb95b943e7b8f536058a29e4b81acadd27a9420", size = 8577, upload-time = "2025-11-14T10:04:04.182Z" }, ] [[package]] name = "pyobjc-framework-social" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/56/ed483f85105ef929241ab1a6ed3dbfd0be558bb900e36b274f997db9c869/pyobjc_framework_social-11.0.tar.gz", hash = "sha256:ccedd6eddb6744049467bce19b4ec4f0667ec60552731c02dcbfa8938a3ac798", size = 14806, upload-time = "2025-01-14T19:05:35.394Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/21/afc6f37dfdd2cafcba0227e15240b5b0f1f4ad57621aeefda2985ac9560e/pyobjc_framework_social-12.1.tar.gz", hash = "sha256:1963db6939e92ae40dd9d68852e8f88111cbfd37a83a9fdbc9a0c08993ca7e60", size = 13184, upload-time = "2025-11-14T10:22:28.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/1d/2cc0f753ac8b1f5c15cfa9201d8584ff4de6dc940fc954cd9c52d1a615f9/pyobjc_framework_Social-11.0-py2.py3-none-any.whl", hash = "sha256:aa379009738afb0d6abc0347e8189f7f316109e9dfcb904f7f14e6b7c3d5bad8", size = 4362, upload-time = "2025-01-14T19:00:10.058Z" }, - { url = "https://files.pythonhosted.org/packages/a8/25/b762b1f9429f8ea0df754e7d58bafd48d73e5527b0423e67570661a7907e/pyobjc_framework_Social-11.0-py3-none-any.whl", hash = "sha256:94db183e8b3ad21272a1ba24e9cda763d603c6021fd80a96d00ce78b6b94e1c2", size = 4428, upload-time = "2025-01-14T19:00:11.242Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fb/090867e332d49a1e492e4b8972ac6034d1c7d17cf39f546077f35be58c46/pyobjc_framework_social-12.1-py2.py3-none-any.whl", hash = "sha256:2f3b36ba5769503b1bc945f85fd7b255d42d7f6e417d78567507816502ff2b44", size = 4462, upload-time = "2025-11-14T10:04:14.578Z" }, ] [[package]] name = "pyobjc-framework-soundanalysis" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/14/697ca1b76228a96bb459f3cf43234798b05fdf11691202449d98d9d887af/pyobjc_framework_soundanalysis-11.0.tar.gz", hash = "sha256:f541fcd04ec5d7528dd2ae2d873a92a3092e87fb70b8df229c79defb4d807d1a", size = 16789, upload-time = "2025-01-14T19:05:36.576Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/d6/5039b61edc310083425f87ce2363304d3a87617e941c1d07968c63b5638d/pyobjc_framework_soundanalysis-12.1.tar.gz", hash = "sha256:e2deead8b9a1c4513dbdcf703b21650dcb234b60a32d08afcec4895582b040b1", size = 14804, upload-time = "2025-11-14T10:22:29.998Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/d4/91afb41c514d1e236567b971a981f96c1d20f16eb0658256369c53a4bf45/pyobjc_framework_SoundAnalysis-11.0-py2.py3-none-any.whl", hash = "sha256:5969096cadb07f9ba9855cedf6f53674ddb030a324b4981091834d1b31c8c27e", size = 4111, upload-time = "2025-01-14T19:00:13.327Z" }, - { url = "https://files.pythonhosted.org/packages/af/7a/f960ad1e727f6d917e6c84b7383f3eacbb2948bc60396be3bce40cbd8128/pyobjc_framework_SoundAnalysis-11.0-py3-none-any.whl", hash = "sha256:70f70923756e118203cde4ac25083a34ead69a6034baed9c694a36f5fe2325f3", size = 4182, upload-time = "2025-01-14T19:00:15.68Z" }, + { url = "https://files.pythonhosted.org/packages/53/d3/8df5183d52d20d459225d3f5d24f55e01b8cd9fe587ed972e3f20dd18709/pyobjc_framework_soundanalysis-12.1-py2.py3-none-any.whl", hash = "sha256:8b2029ab48c1a9772f247f0aea995e8c3ff4706909002a9c1551722769343a52", size = 4188, upload-time = "2025-11-14T10:04:16.12Z" }, ] [[package]] name = "pyobjc-framework-speech" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/39/e9f0a73243c38d85f8da6a1a2afda73503e2fcc31a72f5479770bceae0c1/pyobjc_framework_speech-11.0.tar.gz", hash = "sha256:92a191c3ecfe7032eea2140ab5dda826a59c7bb84b13a2edb0ebc471a76e6d7b", size = 40620, upload-time = "2025-01-14T19:05:38.391Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/3d/194cf19fe7a56c2be5dfc28f42b3b597a62ebb1e1f52a7dd9c55b917ac6c/pyobjc_framework_speech-12.1.tar.gz", hash = "sha256:2a2a546ba6c52d5dd35ddcfee3fd9226a428043d1719597e8701851a6566afdd", size = 25218, upload-time = "2025-11-14T10:22:32.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/9b/3e1345e6cf7b6f8dbc636fd74e2f8de1d21a51b856d36d535f20d5576604/pyobjc_framework_Speech-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c934ab46a6c934f1543689b3efd31f088be6ae2ca14f72d6d6fccb991f0e897d", size = 9017, upload-time = "2025-01-14T19:00:16.54Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e989076ff0cd40c7cfb3ed7d621703de11bfd8286f1729aca759db1f42a3/pyobjc_framework_Speech-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:353179210683e38bfbd675df6a35eec46b30ce30b7291bcb07a5cadaf11a3bd7", size = 9016, upload-time = "2025-01-14T19:00:17.661Z" }, - { url = "https://files.pythonhosted.org/packages/22/1f/2d2cddf1b87cea8bee6f66273a70af0dd964abfa3145cf96bd76d47c7530/pyobjc_framework_Speech-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:63248523169d7a4b6a5fa5fa0ce66c845fc3c6d3695f8334f2e000aaae599041", size = 9001, upload-time = "2025-01-14T19:00:24.795Z" }, + { url = "https://files.pythonhosted.org/packages/bc/ce/d63b45886df45ea678d066ad943990eb3fbe7d9b5f9e3d4e9375f0e6134d/pyobjc_framework_speech-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be5c005595918557f17e991b2575159b8ea943e7fb08fd00b1dabccde35f8b1b", size = 9244, upload-time = "2025-11-14T10:04:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/03/54/77e12e4c23a98fc49d874f9703c9f8fd0257d64bb0c6ae329b91fc7a99e3/pyobjc_framework_speech-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0301bfae5d0d09b6e69bd4dbabc5631209e291cc40bda223c69ed0c618f8f2dc", size = 9248, upload-time = "2025-11-14T10:04:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1b/224cb98c9c32a6d5e68072f89d26444095be54c6f461efe4fefe9d1330a5/pyobjc_framework_speech-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cae4b88ef9563157a6c9e66b37778fc4022ee44dd1a2a53081c2adbb69698945", size = 9254, upload-time = "2025-11-14T10:04:21.361Z" }, ] [[package]] name = "pyobjc-framework-spritekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/6e/642e64f5b62a7777c784931c7f018788b5620e307907d416c837fd0c4315/pyobjc_framework_spritekit-11.0.tar.gz", hash = "sha256:aa43927e325d4ac253b7c0ec4df95393b0354bd278ebe9871803419d12d1ef80", size = 129851, upload-time = "2025-01-14T19:05:39.709Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/78/d683ebe0afb49f46d2d21d38c870646e7cb3c2e83251f264e79d357b1b74/pyobjc_framework_spritekit-12.1.tar.gz", hash = "sha256:a851f4ef5aa65cc9e08008644a528e83cb31021a1c0f17ebfce4de343764d403", size = 64470, upload-time = "2025-11-14T10:22:37.569Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/66/db417b84720afe1b985361a0fd32daec041f559e8f5a7484b81553cbcdb9/pyobjc_framework_SpriteKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eac7779dd5fb3ef8dacea764f06ac29e1891982a9840dd1b0b74411aa626f22c", size = 18074, upload-time = "2025-01-14T19:00:25.73Z" }, - { url = "https://files.pythonhosted.org/packages/e1/80/319f156ac6f6cab0dbc85881d81a74d4a7f17913256338683ae8d9ed56c4/pyobjc_framework_SpriteKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d0971a7a85786edc521ab897bdb0c78696278e6417bf389abdfe2151358e854", size = 18077, upload-time = "2025-01-14T19:00:26.815Z" }, - { url = "https://files.pythonhosted.org/packages/f1/0a/e0149b4cce26a376e91d6ad4e6f4b0adcef1ff6e44bdfddf0b83927230d8/pyobjc_framework_SpriteKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:518412f19f219561dc13b17c68cace7b4f7fdf3bfd29dce28d5b9ef44b507bde", size = 18060, upload-time = "2025-01-14T19:00:30.787Z" }, + { url = "https://files.pythonhosted.org/packages/90/b5/6624e7a28d244beb6bc0ca26f16c137b40933250624babadc924a43bc719/pyobjc_framework_spritekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9324955df38e24ab799d5bc7f66cce20aa0c9a93aef3139e54dee99f9d7848cc", size = 17738, upload-time = "2025-11-14T10:04:30.851Z" }, + { url = "https://files.pythonhosted.org/packages/60/6a/e8e44fc690d898394093f3a1c5fe90110d1fbcc6e3f486764437c022b0f8/pyobjc_framework_spritekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26fd12944684713ae1e3cdd229348609c1142e60802624161ca0c3540eec3ffa", size = 17736, upload-time = "2025-11-14T10:04:33.202Z" }, + { url = "https://files.pythonhosted.org/packages/3b/38/97c3b6c3437e3e9267fb4e1cd86e0da4eff07e0abe7cd6923644d2dfc878/pyobjc_framework_spritekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1649e57c25145795d04bb6a1ec44c20ef7cf0af7c60a9f6f5bc7998dd269db1e", size = 17802, upload-time = "2025-11-14T10:04:35.346Z" }, ] [[package]] name = "pyobjc-framework-storekit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/ca/f4e5a1ff8c98bbbf208639b2bef7bf3b88936bccda1d8ed34aa7d052f589/pyobjc_framework_storekit-11.0.tar.gz", hash = "sha256:ef7e75b28f1fa8b0b6413e64b9d5d78b8ca358fc2477483d2783f688ff8d75e0", size = 75855, upload-time = "2025-01-14T19:05:41.605Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/87/8a66a145feb026819775d44975c71c1c64df4e5e9ea20338f01456a61208/pyobjc_framework_storekit-12.1.tar.gz", hash = "sha256:818452e67e937a10b5c8451758274faa44ad5d4329df0fa85735115fb0608da9", size = 34574, upload-time = "2025-11-14T10:22:40.73Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/65/e149065d5e5a29f3da85c8688d36ffeed3a6e60c724979c6780d68568d6d/pyobjc_framework_StoreKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7fcbf84469a7d3d2a2f60e00d8a55d521f91e759e73fffb1c61bbedd323a5084", size = 11653, upload-time = "2025-01-14T19:00:31.86Z" }, - { url = "https://files.pythonhosted.org/packages/ab/40/af53ad7781515866003c2c71056a053d2f033cf2aa31920a8a1fdb829d7a/pyobjc_framework_StoreKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1d51a05a5e0277c542978b1f5a6aa33331359de7c0a2cf0ad922760b36e5066a", size = 11655, upload-time = "2025-01-14T19:00:32.894Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a7/5db9843978f370a7b69aa7332ca95971af19b5e7781ff3cc50f88ee64261/pyobjc_framework_StoreKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e38fa0b837bdc3fdb5cd0ed8fa94f0c53f768104a720a1b7a3126079535ac51b", size = 11640, upload-time = "2025-01-14T19:00:40.087Z" }, + { url = "https://files.pythonhosted.org/packages/d3/93/39946f690a07bb28f14c73738b133094fb79c34e9fa69553cd683b3e118b/pyobjc_framework_storekit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e67341cb14adfdecbd230393f3b02d4b19fbb3ada427b06d4f82a703ae90431f", size = 12807, upload-time = "2025-11-14T10:04:46.643Z" }, + { url = "https://files.pythonhosted.org/packages/d9/41/af2afc4d27bde026cfd3b725ee1b082b2838dcaa9880ab719226957bc7cd/pyobjc_framework_storekit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a29f45bcba9dee4cf73dae05ab0f94d06a32fb052e31414d0c23791c1ec7931c", size = 12810, upload-time = "2025-11-14T10:04:48.693Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9f/938985e506de0cc3a543e44e1f9990e9e2fb8980b8f3bcfc8f7921d09061/pyobjc_framework_storekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9fe2d65a2b644bb6b4fdd3002292cba153560917de3dd6cf969431fa32d21dd0", size = 12819, upload-time = "2025-11-14T10:04:50.945Z" }, ] [[package]] name = "pyobjc-framework-symbols" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/92/a20a3d7af3c99e0ea086e43715675160a04b86c1d069bdaeb3acdb015d92/pyobjc_framework_symbols-11.0.tar.gz", hash = "sha256:e3de7736dfb8107f515cfd23f03e874dd9468e88ab076d01d922a73fefb620fa", size = 13682, upload-time = "2025-01-14T19:05:45.727Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/ce/a48819eb8524fa2dc11fb3dd40bb9c4dcad0596fe538f5004923396c2c6c/pyobjc_framework_symbols-12.1.tar.gz", hash = "sha256:7d8e999b8a59c97d38d1d343b6253b1b7d04bf50b665700957d89c8ac43b9110", size = 12782, upload-time = "2025-11-14T10:22:42.609Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/ff/341d44f5347d48491682bece366444f3e230e33109266dcc6a17e6a7fc3d/pyobjc_framework_Symbols-11.0-py2.py3-none-any.whl", hash = "sha256:f1490823f40a8a540ac10628190695f27a717343914fe5db5fafa500f7c7bf44", size = 3263, upload-time = "2025-01-14T19:00:41.055Z" }, - { url = "https://files.pythonhosted.org/packages/94/a4/c21353872a2fc643206a44ac55b92b5b7533cdb2cb26c44a9048debc295a/pyobjc_framework_Symbols-11.0-py3-none-any.whl", hash = "sha256:0919e85fcf6f420f61d8d9a67cafa2ab4678666441ef4f001b31f5457900b314", size = 3335, upload-time = "2025-01-14T19:00:43.294Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ea/6e9af9c750d68109ac54fbffb5463e33a7b54ffe8b9901a5b6b603b7884b/pyobjc_framework_symbols-12.1-py2.py3-none-any.whl", hash = "sha256:c72eecbc25f6bfcd39c733067276270057c5aca684be20fdc56def645f2b6446", size = 3331, upload-time = "2025-11-14T10:05:01.333Z" }, ] [[package]] name = "pyobjc-framework-syncservices" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coredata", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/22/642186906f672461bab1d7773b35ef74e432b9789ca2248186b766e9fd3b/pyobjc_framework_syncservices-11.0.tar.gz", hash = "sha256:7867c23895a8289da8d56e962c144c36ed16bd101dc07d05281c55930b142471", size = 57453, upload-time = "2025-01-14T19:05:46.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/91/6d03a988831ddb0fb001b13573560e9a5bcccde575b99350f98fe56a2dd4/pyobjc_framework_syncservices-12.1.tar.gz", hash = "sha256:6a213e93d9ce15128810987e4c5de8c73cfab1564ac8d273e6b437a49965e976", size = 31032, upload-time = "2025-11-14T10:22:45.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/e1/3e835c6ba29ee72a02cf18735cb902fb97fa9495c8ee0df01c1e2585fcf1/pyobjc_framework_SyncServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5876a0ef8ade01809bc25c99ebf9044745ff84ecd915615cf1dbc4cd9c01c931", size = 13990, upload-time = "2025-01-14T19:00:44.153Z" }, - { url = "https://files.pythonhosted.org/packages/15/9b/484db4eed6b1e29e0d69275bd459ab21a6b3f98e8b2ce61beeb9971303ca/pyobjc_framework_SyncServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89a398df6518cff1c63b7cccf3025e388f3ef299645734112c5aa1ac5f7ca30a", size = 13989, upload-time = "2025-01-14T19:00:45.216Z" }, - { url = "https://files.pythonhosted.org/packages/01/77/16ade5c5185461386d00825dfd8554ea53b097fccafbf953b7395333dab4/pyobjc_framework_SyncServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb74fd05a37895bfb5a02aabb88a0eb17a8b063cc6cd69316d25e2495b6bb633", size = 13976, upload-time = "2025-01-14T19:00:49.022Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/ad93a4c5840da78ee9792756ad6f3dd2abc768d063c1444a8dc2dd990d6e/pyobjc_framework_syncservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:21dcb61da6816d2c55afb24d5bbf30741f806c0db8bb7a842fd27177550a3c9c", size = 13380, upload-time = "2025-11-14T10:05:03.318Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9b/25c117f8ffe15aa6cc447da7f5c179627ebafb2b5ec30dfb5e70fede2549/pyobjc_framework_syncservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e81a38c2eb7617cb0ecfc4406c1ae2a97c60e95af42e863b2b0f1f6facd9b0da", size = 13380, upload-time = "2025-11-14T10:05:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/54/ac/a83cdd120e279ee905e9085afda90992159ed30c6a728b2c56fa2d36b6ea/pyobjc_framework_syncservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0cd629bea95692aad2d26196657cde2fbadedae252c7846964228661a600b900", size = 13411, upload-time = "2025-11-14T10:05:07.741Z" }, ] [[package]] name = "pyobjc-framework-systemconfiguration" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/70/ebebf311523f436df2407f35d7ce62482c01e530b77aceb3ca6356dcef43/pyobjc_framework_systemconfiguration-11.0.tar.gz", hash = "sha256:06487f0fdd43c6447b5fd3d7f3f59826178d32bcf74f848c5b3ea597191d471d", size = 142949, upload-time = "2025-01-14T19:05:47.466Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/7d/50848df8e1c6b5e13967dee9fb91d3391fe1f2399d2d0797d2fc5edb32ba/pyobjc_framework_systemconfiguration-12.1.tar.gz", hash = "sha256:90fe04aa059876a21626931c71eaff742a27c79798a46347fd053d7008ec496e", size = 59158, upload-time = "2025-11-14T10:22:53.056Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/df/67c6b38aa0b8c329cc1c5e69825f6ef48dcb68dd927814ce979692b58551/pyobjc_framework_SystemConfiguration-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2efdc31d50d24cd3d095200f2844bceab96b84f502cbf11af5bc09ec8ab237b3", size = 21838, upload-time = "2025-01-14T19:00:49.927Z" }, - { url = "https://files.pythonhosted.org/packages/28/8f/1b5f7e8e848d2c84204da08d5c63e42feff86b26cd508da7a4f95960b842/pyobjc_framework_SystemConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89d3c54abedcedbc2ce52c31ff4878251ca54a8535407ed6bd6584ce099c148b", size = 21836, upload-time = "2025-01-14T19:00:51.698Z" }, - { url = "https://files.pythonhosted.org/packages/42/93/1b0bd1f75bbb6c9b129ea6e13d60f4378b1d46143b8210698157868348c7/pyobjc_framework_SystemConfiguration-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fbaa3497b66bbfa4877a33cc2bad68ebe1a75129548552642eaa98ffe21b5829", size = 21828, upload-time = "2025-01-14T19:00:55.647Z" }, + { url = "https://files.pythonhosted.org/packages/45/20/8092f80482d90d7cf9962c53988599ae1df3241a633c5c40bc153bb658fe/pyobjc_framework_systemconfiguration-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db640a31120e8cd4e47516f5e32a222488809478d6cf4402db506496defd3e18", size = 21667, upload-time = "2025-11-14T10:05:18.484Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7b/9126a7af1b798998837027390a20b981e0298e51c4c55eed6435967145cb/pyobjc_framework_systemconfiguration-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:796390a80500cc7fde86adc71b11cdc41d09507dd69103d3443fbb60e94fb438", size = 21663, upload-time = "2025-11-14T10:05:21.259Z" }, + { url = "https://files.pythonhosted.org/packages/d3/d3/bb935c3d4bae9e6ce4a52638e30eea7039c480dd96bc4f0777c9fabda21b/pyobjc_framework_systemconfiguration-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e5bb9103d39483964431db7125195c59001b7bff2961869cfe157b4c861e52d", size = 21578, upload-time = "2025-11-14T10:05:25.572Z" }, ] [[package]] name = "pyobjc-framework-systemextensions" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/4b/904d818debf6216b7be009d492d998c819bf2f2791bfb75870a952e32cf9/pyobjc_framework_systemextensions-11.0.tar.gz", hash = "sha256:da293c99b428fb7f18a7a1d311b17177f73a20c7ffa94de3f72d760df924255e", size = 22531, upload-time = "2025-01-14T19:05:48.463Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/01/8a706cd3f7dfcb9a5017831f2e6f9e5538298e90052db3bb8163230cbc4f/pyobjc_framework_systemextensions-12.1.tar.gz", hash = "sha256:243e043e2daee4b5c46cd90af5fff46b34596aac25011bab8ba8a37099685eeb", size = 20701, upload-time = "2025-11-14T10:22:58.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/7c/125e73ffa96b212a1fcf4f74affb8e2f786ff34354d13d8b4714053bbc42/pyobjc_framework_SystemExtensions-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5c92a957b04180d3183f8168c1c20fe825b926a41ed355b266aaa59e83005d71", size = 8975, upload-time = "2025-01-14T19:00:56.59Z" }, - { url = "https://files.pythonhosted.org/packages/15/3c/8f91b89554ef3127e037d90b3ef83c77a994bb889b7884a995756cd06b63/pyobjc_framework_SystemExtensions-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7a2ec417fa0d383cc066bc292541aa78fd2aec9cca83a98d41b7982f185d1f7", size = 8975, upload-time = "2025-01-14T19:00:57.822Z" }, - { url = "https://files.pythonhosted.org/packages/d3/7e/086122ff33e6db1feaf570fb1700a1b87a287d4467978baa9b0119770803/pyobjc_framework_SystemExtensions-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4369acaca23170cc5aee4e36c7cfb6cbccfcfe78b63f7d7fef0c77550e2b71a2", size = 8957, upload-time = "2025-01-14T19:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/31/df/70194c9aab9052797947967f218ebab56207223cb55eab5ebd89e6e3555c/pyobjc_framework_systemextensions-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:820f2d0364340395efafdfa85630b2e4a3ffc3f40b469b2880bab2c03f1e2907", size = 9157, upload-time = "2025-11-14T10:05:37.902Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a1/f8df6d59e06bc4b5989a76724e8551935e5b99aff6a21d3592e5ced91f1c/pyobjc_framework_systemextensions-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a4e82160e43c0b1aa17e6d4435e840a655737fbe534e00e37fc1961fbf3bebd", size = 9156, upload-time = "2025-11-14T10:05:39.744Z" }, + { url = "https://files.pythonhosted.org/packages/0a/cc/a42883d6ad0ae257a7fa62660b4dd13be15f8fa657922f9a5b6697f26e28/pyobjc_framework_systemextensions-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:01fac4f8d88c0956d9fc714d24811cd070e67200ba811904317d91e849e38233", size = 9166, upload-time = "2025-11-14T10:05:41.479Z" }, ] [[package]] name = "pyobjc-framework-threadnetwork" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/17/fc8fde4eeb6697e0a5ba1a306cd62d3a95b53f3334744cd22b87037d8a14/pyobjc_framework_threadnetwork-11.0.tar.gz", hash = "sha256:f5713579380f6fb89c877796de86cb4e98428d7a9cbfebe566fb827ba23b2d8e", size = 13820, upload-time = "2025-01-14T19:05:49.307Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/7e/f1816c3461e4121186f2f7750c58af083d1826bbd73f72728da3edcf4915/pyobjc_framework_threadnetwork-12.1.tar.gz", hash = "sha256:e071eedb41bfc1b205111deb54783ec5a035ccd6929e6e0076336107fdd046ee", size = 12788, upload-time = "2025-11-14T10:23:00.329Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/a9/908184da457e33a110de7d2d262efa69beaba6db243342df5654da03566b/pyobjc_framework_ThreadNetwork-11.0-py2.py3-none-any.whl", hash = "sha256:950d46a009cb992b12dbd8169a0450d8cc101fc982e03e6543078c6d7790e353", size = 3700, upload-time = "2025-01-14T19:01:03.254Z" }, - { url = "https://files.pythonhosted.org/packages/59/d4/4694fc7a627d2b6b37c51433ba7f02a39a283a445dc77349b82fe24534f1/pyobjc_framework_ThreadNetwork-11.0-py3-none-any.whl", hash = "sha256:1218649e4f488ca411af13b74f1dee1e7a178169e0f5963342ba8a7c46037ea7", size = 3770, upload-time = "2025-01-14T19:01:05.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b8/94b37dd353302c051a76f1a698cf55b5ad50ca061db7f0f332aa9e195766/pyobjc_framework_threadnetwork-12.1-py2.py3-none-any.whl", hash = "sha256:07d937748fc54199f5ec04d5a408e8691a870481c11b641785c2adc279dd8e4b", size = 3771, upload-time = "2025-11-14T10:05:49.899Z" }, ] [[package]] name = "pyobjc-framework-uniformtypeidentifiers" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/4f/fd571c1f87d5ee3d86c4d2008806e9623d2662bbc788d9001b3fff35275f/pyobjc_framework_uniformtypeidentifiers-11.0.tar.gz", hash = "sha256:6ae6927a3ed1f0197a8c472226f11f46ccd5ed398b4449613e1d10346d9ed15d", size = 20860, upload-time = "2025-01-14T19:05:50.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/b8/dd9d2a94509a6c16d965a7b0155e78edf520056313a80f0cd352413f0d0b/pyobjc_framework_uniformtypeidentifiers-12.1.tar.gz", hash = "sha256:64510a6df78336579e9c39b873cfcd03371c4b4be2cec8af75a8a3d07dff607d", size = 17030, upload-time = "2025-11-14T10:23:02.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/f2/094888af07fb7f0443996e5d91915e74b87e8705b599b68b516a0e94a63d/pyobjc_framework_UniformTypeIdentifiers-11.0-py2.py3-none-any.whl", hash = "sha256:acffb86e8b03b66c49274236b3df3a254cacd32b9f25bd7a5bd59baaaf738624", size = 4841, upload-time = "2025-01-14T19:01:06.404Z" }, - { url = "https://files.pythonhosted.org/packages/88/9c/4cc0522cc546e6a3bf8a921e3a9f0ed078e3cf907d616760d9f3d7754919/pyobjc_framework_UniformTypeIdentifiers-11.0-py3-none-any.whl", hash = "sha256:a3097f186c7e231b19218a3ceecb3b70a8f2b2e9e642ef409dc7a195a30c869e", size = 4910, upload-time = "2025-01-14T19:01:07.393Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5f/1f10f5275b06d213c9897850f1fca9c881c741c1f9190cea6db982b71824/pyobjc_framework_uniformtypeidentifiers-12.1-py2.py3-none-any.whl", hash = "sha256:ec5411e39152304d2a7e0e426c3058fa37a00860af64e164794e0bcffee813f2", size = 4901, upload-time = "2025-11-14T10:05:51.532Z" }, ] [[package]] name = "pyobjc-framework-usernotifications" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/f5/ca3e6a7d940b3aca4323e4f5409b14b5d2eb45432158430c584e3800ce4d/pyobjc_framework_usernotifications-11.0.tar.gz", hash = "sha256:7950a1c6a8297f006c26c3d286705ffc2a07061d6e844f1106290572097b872c", size = 54857, upload-time = "2025-01-14T19:05:52.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/cd/e0253072f221fa89a42fe53f1a2650cc9bf415eb94ae455235bd010ee12e/pyobjc_framework_usernotifications-12.1.tar.gz", hash = "sha256:019ccdf2d400f9a428769df7dba4ea97c02453372bc5f8b75ce7ae54dfe130f9", size = 29749, upload-time = "2025-11-14T10:23:05.364Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/53/85b77fb28886762165f641b5c33e07aa7899264eb40180485915824b6562/pyobjc_framework_UserNotifications-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:00a19caf247378cef0a6d369667f731251ca463d0bfdae0394b314a6656301f6", size = 9486, upload-time = "2025-01-14T19:01:08.269Z" }, - { url = "https://files.pythonhosted.org/packages/1f/bf/5545d5c9d0d10a603ad406a5ce727de6a47daace9c38d4484818611599f3/pyobjc_framework_UserNotifications-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bf78fa37f574f5b43db9b83ca02e82ab45803589f970042afdcd1cb8c01396d", size = 9483, upload-time = "2025-01-14T19:01:09.256Z" }, - { url = "https://files.pythonhosted.org/packages/56/db/af48bb8cb726177508556b441ec3a3866fa8d89d31fbdf5cca0f1bc0a385/pyobjc_framework_UserNotifications-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f2fcc2a06f139261635ee281fc685451141ecaf1030aa41e58241bf50ee3904b", size = 9472, upload-time = "2025-01-14T19:01:13.21Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/ef8695e10c5d350d86723830b003acca419a9395928c53beebf7ace4a9a0/pyobjc_framework_usernotifications-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95796a075e3a92257d69596ec16d9e03cb504f1324294ed41052f5b3bf90ce9f", size = 9628, upload-time = "2025-11-14T10:05:53.319Z" }, + { url = "https://files.pythonhosted.org/packages/d1/96/aa25bb0727e661a352d1c52e7288e25c12fe77047f988bb45557c17cf2d7/pyobjc_framework_usernotifications-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c62e8d7153d72c4379071e34258aa8b7263fa59212cfffd2f137013667e50381", size = 9632, upload-time = "2025-11-14T10:05:55.166Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/c95053a475246464cba686e16269b0973821601910d1947d088b855a8dac/pyobjc_framework_usernotifications-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:412afb2bf5fe0049f9c4e732e81a8a35d5ebf97c30a5a6abd276259d020c82ac", size = 9644, upload-time = "2025-11-14T10:05:56.801Z" }, ] [[package]] name = "pyobjc-framework-usernotificationsui" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-usernotifications", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-usernotifications" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e8/f0d50cdc678260a628b92e55b5752155f941c2f72b96fe3f2412a28c5d79/pyobjc_framework_usernotificationsui-11.0.tar.gz", hash = "sha256:d0ec597d189b4d228b0b836474aef318652c1c287b33442a1403c49dc59fdb7f", size = 14369, upload-time = "2025-01-14T19:05:54.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/03/73e29fd5e5973cb3800c9d56107c1062547ef7524cbcc757c3cbbd5465c6/pyobjc_framework_usernotificationsui-12.1.tar.gz", hash = "sha256:51381c97c7344099377870e49ed0871fea85ba50efe50ab05ccffc06b43ec02e", size = 13125, upload-time = "2025-11-14T10:23:07.259Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/f7/64c95c6f82e92bb1cbcb8d5c3658c79c954668627eef28f11e76025a3ed1/pyobjc_framework_UserNotificationsUI-11.0-py2.py3-none-any.whl", hash = "sha256:6185d9c9513b6a823cd72dcf40d2fb33bbf0f2c9a98528e0e112580b47ac3632", size = 3856, upload-time = "2025-01-14T19:01:15.43Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c3/e1d64c9e523b5192e0179b6723ee465e74d6c282104a49a67347d527a65d/pyobjc_framework_UserNotificationsUI-11.0-py3-none-any.whl", hash = "sha256:e4439e549265929ddad1feca7b062d00c2d3732470f349cb0d594705e0257919", size = 3932, upload-time = "2025-01-14T19:01:16.486Z" }, + { url = "https://files.pythonhosted.org/packages/23/c8/52ac8a879079c1fbf25de8335ff506f7db87ff61e64838b20426f817f5d5/pyobjc_framework_usernotificationsui-12.1-py2.py3-none-any.whl", hash = "sha256:11af59dc5abfcb72c08769ab4d7ca32a628527a8ba341786431a0d2dacf31605", size = 3933, upload-time = "2025-11-14T10:06:05.478Z" }, ] [[package]] name = "pyobjc-framework-videosubscriberaccount" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/2e/6a7debd84911a9384b4e7a9cc3f308e3461a00a9d74f33b153bdd872f15f/pyobjc_framework_videosubscriberaccount-11.0.tar.gz", hash = "sha256:163b32f361f48b9d20f317461464abd4427b3242693ae011633fc443c7d5449c", size = 29100, upload-time = "2025-01-14T19:05:55.319Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/f8/27927a9c125c622656ee5aada4596ccb8e5679da0260742360f193df6dcf/pyobjc_framework_videosubscriberaccount-12.1.tar.gz", hash = "sha256:750459fa88220ab83416f769f2d5d210a1f77b8938fa4d119aad0002fc32846b", size = 18793, upload-time = "2025-11-14T10:23:09.33Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/82/94650fe5cc68c0c32fe56fe22cd7eb2874b28f987a9e259fac12cbea7705/pyobjc_framework_VideoSubscriberAccount-11.0-py2.py3-none-any.whl", hash = "sha256:1deec8d5a0138ae51b5ca7bfb7f6fe1b0dc3cbb52db3111059708efa5f8a8d04", size = 4637, upload-time = "2025-01-14T19:01:17.365Z" }, - { url = "https://files.pythonhosted.org/packages/61/54/1765507adad1b0c9bc6be10f09b249d425212bc0d9fef1efdfd872ee9807/pyobjc_framework_VideoSubscriberAccount-11.0-py3-none-any.whl", hash = "sha256:0095eddb5fc942f9e049bc4c683cf28c77ea60c60942552c3c48bf74c8fdca9b", size = 4709, upload-time = "2025-01-14T19:01:18.349Z" }, + { url = "https://files.pythonhosted.org/packages/41/ca/e2f982916267508c1594f1e50d27bf223a24f55a5e175ab7d7822a00997c/pyobjc_framework_videosubscriberaccount-12.1-py2.py3-none-any.whl", hash = "sha256:381a5e8a3016676e52b88e38b706559fa09391d33474d8a8a52f20a883104a7b", size = 4825, upload-time = "2025-11-14T10:06:07.027Z" }, ] [[package]] name = "pyobjc-framework-videotoolbox" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/2d/c031a132b142fcd20846cc1ac3ba92abaa58ec04164fd36ca978d9374f1c/pyobjc_framework_videotoolbox-11.0.tar.gz", hash = "sha256:a54ed8f8bcbdd2bdea2a296dc02a8a7d42f81e2b6ccbf4d1f10cec5e7a09bec0", size = 81157, upload-time = "2025-01-14T19:05:56.135Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/5f/6995ee40dc0d1a3460ee183f696e5254c0ad14a25b5bc5fd9bd7266c077b/pyobjc_framework_videotoolbox-12.1.tar.gz", hash = "sha256:7adc8670f3b94b086aed6e86c3199b388892edab4f02933c2e2d9b1657561bef", size = 57825, upload-time = "2025-11-14T10:23:13.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/1a/2d1abd2091b403863033cdb13d5e32a419fac334798a1d03e1ed828dfb03/pyobjc_framework_VideoToolbox-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b9d29d56fad1737f6b9be9143dfec9889bee48db56d6fd0fcbccc5c625ad1cc", size = 13443, upload-time = "2025-01-14T19:01:19.438Z" }, - { url = "https://files.pythonhosted.org/packages/44/ae/ff697840bdcf3530e8fba84e2a606813eda1ee90be074f12e2857460cebf/pyobjc_framework_VideoToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:12af56190e65c3b60c6ca14fe69045e5ffb5908ea1363580506eb32603b80855", size = 13446, upload-time = "2025-01-14T19:01:21.066Z" }, - { url = "https://files.pythonhosted.org/packages/7f/09/a617adc2b7e1948ddcb7d7481fa266fe48dec3f58da493518742f9004602/pyobjc_framework_VideoToolbox-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:42577645c77333305bdbcf52285e70ae4b7ce73e721ad2e8a24885b0324775ff", size = 13426, upload-time = "2025-01-14T19:01:25.609Z" }, + { url = "https://files.pythonhosted.org/packages/a3/56/11fb89e9d10c31101c7ec69978e4637a3400e2154851c0f7c7180ff94f07/pyobjc_framework_videotoolbox-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5cb63e0e69aac148fa45d577f049e1e4846d65d046fcb0f7744fb90ac85da936", size = 18782, upload-time = "2025-11-14T10:06:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/1e/42/53d57b09fd4879988084ec0d9b74c645c9fdd322be594c9601f6cf265dd0/pyobjc_framework_videotoolbox-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a1eb1eb41c0ffdd8dcc6a9b68ab2b5bc50824a85820c8a7802a94a22dfbb4f91", size = 18781, upload-time = "2025-11-14T10:06:11.89Z" }, + { url = "https://files.pythonhosted.org/packages/94/a5/91c6c95416f41c412c2079950527cb746c0712ec319c51a6c728c8d6b231/pyobjc_framework_videotoolbox-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eb6ce6837344ee319122066c16ada4beb913e7bfd62188a8d14b1ecbb5a89234", size = 18908, upload-time = "2025-11-14T10:06:14.087Z" }, ] [[package]] name = "pyobjc-framework-virtualization" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/8d/e57e1f2c5ac950dc3da6c977effde4a55b8b70424b1bdb97b5530559f5bc/pyobjc_framework_virtualization-11.0.tar.gz", hash = "sha256:03e1c1fa20950aa7c275e5f11f1257108b6d1c6a7403afb86f4e9d5fae87b73c", size = 78144, upload-time = "2025-01-14T19:05:57.086Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/6a/9d110b5521d9b898fad10928818c9f55d66a4af9ac097426c65a9878b095/pyobjc_framework_virtualization-12.1.tar.gz", hash = "sha256:e96afd8e801e92c6863da0921e40a3b68f724804f888bce43791330658abdb0f", size = 40682, upload-time = "2025-11-14T10:23:17.456Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/1a/9df39f7f0f54426fe69572e971fc334f747cd29666dc5c6f5148ca35187b/pyobjc_framework_Virtualization-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec094a1798838434cf6a054b87fd8cece9a36e54b720fedbade9246420ae0ba9", size = 13410, upload-time = "2025-01-14T19:01:26.518Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c9/b2f8322d7ced14822270481be5b44f1846aa7c09b4b3cb52517dc1054f4b/pyobjc_framework_Virtualization-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334712792136ffcf3c63a63cea01ce33d60309a82721c95e25f0cc26b95f72cc", size = 13417, upload-time = "2025-01-14T19:01:28.821Z" }, - { url = "https://files.pythonhosted.org/packages/6a/25/ca207169d793aeb57ee8631e3e9103d12f7bd60384b3232f69028ee7de4e/pyobjc_framework_Virtualization-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:79c625d8e8414b80f06bcbff9d6c28101f9502f671329af7b418f2005db1bccd", size = 13403, upload-time = "2025-01-14T19:01:32.377Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/dfb1ba93ecbbde95e9cd8fe06842d2114f3af7506eff47d97a547d4a181a/pyobjc_framework_virtualization-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a5f565411330c5776b60eb5eb94ab1591f76f0969e85b23a046d2de915fc84e", size = 13101, upload-time = "2025-11-14T10:06:24.973Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ee/e18d0d9014c42758d7169144acb2d37eb5ff19bf959db74b20eac706bd8c/pyobjc_framework_virtualization-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a88a307dc96885afc227ceda4067f1af787f024063f4ccf453d59e7afd47cda8", size = 13099, upload-time = "2025-11-14T10:06:27.403Z" }, + { url = "https://files.pythonhosted.org/packages/c6/f2/0da47e91f3f8eeda9a8b4bb0d3a0c54a18925009e99b66a8226b9e06ce1e/pyobjc_framework_virtualization-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7d5724b38e64b39ab5ec3b45993afa29fc88b307d99ee2c7a1c0fd770e9b4b21", size = 13131, upload-time = "2025-11-14T10:06:29.337Z" }, ] [[package]] name = "pyobjc-framework-vision" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-coreml", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreml" }, + { name = "pyobjc-framework-quartz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/53/dc2e0562a177af9306efceb84bc21f5cf7470acaa8f28f64e62bf828b7e1/pyobjc_framework_vision-11.0.tar.gz", hash = "sha256:45342e5253c306dbcd056a68bff04ffbfa00e9ac300a02aabf2e81053b771e39", size = 133175, upload-time = "2025-01-14T19:05:58.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/5a/08bb3e278f870443d226c141af14205ff41c0274da1e053b72b11dfc9fb2/pyobjc_framework_vision-12.1.tar.gz", hash = "sha256:a30959100e85dcede3a786c544e621ad6eb65ff6abf85721f805822b8c5fe9b0", size = 59538, upload-time = "2025-11-14T10:23:21.979Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/89/c69a1480402974b81377fe287927be13703462a4447e62b3734726b60854/pyobjc_framework_Vision-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a6707adc9df3510686c18d4f2a6d8df234c347329edb12793459867163a61c42", size = 21761, upload-time = "2025-01-14T19:01:33.342Z" }, - { url = "https://files.pythonhosted.org/packages/7f/84/d23a745d46858409a1dca3e7f5cb3089c148ebb8d42e7a6289e1972ad650/pyobjc_framework_Vision-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ca7cc48332d804a02b5b17f31bed52dd4b7c323f9e4ff4b4e7ecd35d39cc0759", size = 21754, upload-time = "2025-01-14T19:01:35.504Z" }, - { url = "https://files.pythonhosted.org/packages/63/93/8aab4942361075b8686fc85c45608b59ba5f82f6d78a64a97f5cf44cda38/pyobjc_framework_Vision-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b33f365741b92d840820c3fb0ef463a8a384dcc73a85cd6033a8d5bfd158655", size = 21744, upload-time = "2025-01-14T19:01:41.677Z" }, + { url = "https://files.pythonhosted.org/packages/e3/48/b23e639a66e5d3d944710bb2eaeb7257c18b0834dffc7ea2ddadadf8620e/pyobjc_framework_vision-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a30c3fff926348baecc3ce1f6da8ed327d0cbd55ca1c376d018e31023b79c0ab", size = 21432, upload-time = "2025-11-14T10:06:39.709Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/e30cf4eef2b4c7e20ccadc1249117c77305fbc38b2e5904eb42e3753f63c/pyobjc_framework_vision-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1edbf2fc18ce3b31108f845901a88f2236783ae6bf0bc68438d7ece572dc2a29", size = 21432, upload-time = "2025-11-14T10:06:42.373Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5a/23502935b3fc877d7573e743fc3e6c28748f33a45c43851d503bde52cde7/pyobjc_framework_vision-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6b3211d84f3a12aad0cde752cfd43a80d0218960ac9e6b46b141c730e7d655bd", size = 16625, upload-time = "2025-11-14T10:06:44.422Z" }, ] [[package]] name = "pyobjc-framework-webkit" -version = "11.0" +version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/4f/02a6270acf225c2a34339677e796002c77506238475059ae6e855358a40c/pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644", size = 767210, upload-time = "2025-01-14T19:05:59.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/10/110a50e8e6670765d25190ca7f7bfeecc47ec4a8c018cb928f4f82c56e04/pyobjc_framework_webkit-12.1.tar.gz", hash = "sha256:97a54dd05ab5266bd4f614e41add517ae62cdd5a30328eabb06792474b37d82a", size = 284531, upload-time = "2025-11-14T10:23:40.287Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/49/6d3f87bff3fe4faa7ede13dcf61e8e9d309339047cd8872565daa8a0ef22/pyobjc_framework_WebKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1881d7443f916e49199fd9d4b109c19e3e063ab3a60e6d4d76299a3b9143ef6", size = 44940, upload-time = "2025-01-14T19:01:43.295Z" }, - { url = "https://files.pythonhosted.org/packages/47/63/6f04faa75c4c39c54007b256a8e13838c1de213d487f561937d342ec2eac/pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed", size = 44940, upload-time = "2025-01-14T19:01:44.396Z" }, - { url = "https://files.pythonhosted.org/packages/62/43/121a8230308dc71100a4ecb20a899e64aea53fcc61b773da9b1adc3e95e3/pyobjc_framework_WebKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7b56baf21d4b4b8fba42e5d62b08bb018be2f00595c3c7e0265b925ba81e505", size = 44910, upload-time = "2025-01-14T19:01:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/4a/79/b5582113b28cae64cec4aca63d36620421c21ca52f3897388b865a0dbb86/pyobjc_framework_webkit-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:231048d250e97323b25e5f1690d09e2415b691c0d57bc13241e442d486ef94c8", size = 49971, upload-time = "2025-11-14T10:06:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/e5/37/5082a0bbe12e48d4ffa53b0c0f09c77a4a6ffcfa119e26fa8dd77c08dc1c/pyobjc_framework_webkit-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3db734877025614eaef4504fadc0fbbe1279f68686a6f106f2e614e89e0d1a9d", size = 49970, upload-time = "2025-11-14T10:07:01.413Z" }, + { url = "https://files.pythonhosted.org/packages/db/67/64920c8d201a7fc27962f467c636c4e763b43845baba2e091a50a97a5d52/pyobjc_framework_webkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:af2c7197447638b92aafbe4847c063b6dd5e1ed83b44d3ce7e71e4c9b042ab5a", size = 50084, upload-time = "2025-11-14T10:07:05.868Z" }, ] [[package]] @@ -4805,11 +4502,11 @@ wheels = [ [[package]] name = "pyparsing" -version = "3.2.3" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -4817,7 +4514,7 @@ name = "pypiwin32" version = "223" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "pywin32" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/e8/4f38eb30c4dae36634a53c5b2cd73b517ea3607e10d00f61f2494449cec0/pypiwin32-223.tar.gz", hash = "sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a", size = 622, upload-time = "2018-02-26T00:43:23.994Z" } wheels = [ @@ -4826,53 +4523,54 @@ wheels = [ [[package]] name = "pyqt6" -version = "6.9.0" +version = "6.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyqt6-qt6" }, { name = "pyqt6-sip" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/de/102e8e66149085acf38bbf01df572a2cd53259bcd99b7d8ecef0d6b36172/pyqt6-6.9.0.tar.gz", hash = "sha256:6a8ff8e3cd18311bb7d937f7d741e787040ae7ff47ce751c28a94c5cddc1b4e6", size = 1066831, upload-time = "2025-04-08T09:00:46.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/03/e756f52e8b0d7bb5527baf8c46d59af0746391943bdb8655acba22ee4168/pyqt6-6.10.2.tar.gz", hash = "sha256:6c0db5d8cbb9a3e7e2b5b51d0ff3f283121fa27b864db6d2f35b663c9be5cc83", size = 1085573, upload-time = "2026-01-08T16:40:00.244Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/e5/f9e2b5326d6103bce4894a969be54ce3be4b0a7a6ff848228e6a61a9993f/PyQt6-6.9.0-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:5344240747e81bde1a4e0e98d4e6e2d96ad56a985d8f36b69cd529c1ca9ff760", size = 12257215, upload-time = "2025-04-08T09:00:37.177Z" }, - { url = "https://files.pythonhosted.org/packages/ed/3a/bcc7687c5a11079bbd1606a015514562f2ac8cb01c5e3e4a3b30fcbdad36/PyQt6-6.9.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e344868228c71fc89a0edeb325497df4ff731a89cfa5fe57a9a4e9baecc9512b", size = 8259731, upload-time = "2025-04-08T09:00:40.082Z" }, - { url = "https://files.pythonhosted.org/packages/e1/47/13ab0b916b5bad07ab04767b412043f5c1ca206bf38a906b1d8d5c520a98/PyQt6-6.9.0-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:1cbc5a282454cf19691be09eadbde019783f1ae0523e269b211b0173b67373f6", size = 8207593, upload-time = "2025-04-08T09:00:42.167Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/955cfd880f2725a218ee7b272c005658e857e9224823d49c32c93517f6d9/PyQt6-6.9.0-cp39-abi3-win_amd64.whl", hash = "sha256:d36482000f0cd7ce84a35863766f88a5e671233d5f1024656b600cd8915b3752", size = 6748279, upload-time = "2025-04-08T09:00:43.762Z" }, - { url = "https://files.pythonhosted.org/packages/9f/38/586ce139b1673a27607f7b85c594878e1bba215abdca3de67732b463f7b2/PyQt6-6.9.0-cp39-abi3-win_arm64.whl", hash = "sha256:0c8b7251608e05b479cfe731f95857e853067459f7cbbcfe90f89de1bcf04280", size = 5478122, upload-time = "2025-04-08T09:00:45.296Z" }, + { url = "https://files.pythonhosted.org/packages/fb/3f/f073a980969aa485ef288eb2e3b94c223ba9c7ac9941543f19b51659b98d/pyqt6-6.10.2-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:37ae7c1183fe4dd0c6aefd2006a35731245de1cb6f817bb9e414a3e4848dfd6d", size = 60244482, upload-time = "2026-01-08T16:38:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/ec/3e/9a015651ec71cea2e2f960c37edeb21623ba96a74956c0827def837f7c6b/pyqt6-6.10.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:78e1b3d5763e4cbc84485aef600e0aba5e1932fd263b716f92cd1a40dfa5e924", size = 37899440, upload-time = "2026-01-08T16:39:09.027Z" }, + { url = "https://files.pythonhosted.org/packages/51/74/a88fec2b99700270ca5d7dc7d650236a4990ed6fc88e055ca0fc8a339ee3/pyqt6-6.10.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:bbc3af541bbecd27301bfe69fe445aa1611a9b490bd3de77306b12df632f7ec6", size = 40748467, upload-time = "2026-01-08T16:39:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/75/34/be7a55529607b21db00a49ca53cb07c3092d2a5a95ea19bb95cfa0346904/pyqt6-6.10.2-cp39-abi3-win_amd64.whl", hash = "sha256:bd328cb70bc382c48861cd5f0a11b2b8ae6f5692d5a2d6679ba52785dced327b", size = 26015391, upload-time = "2026-01-08T16:39:42.946Z" }, + { url = "https://files.pythonhosted.org/packages/af/de/d9c88f976602b7884fec4ad54a4575d48e23e4f390e5357ea83917358846/pyqt6-6.10.2-cp39-abi3-win_arm64.whl", hash = "sha256:7901ba1df024b7ee9fdacfb2b7661aeb3749ae8b0bef65428077de3e0450eabb", size = 26208415, upload-time = "2026-01-08T16:39:57.751Z" }, ] [[package]] name = "pyqt6-qt6" -version = "6.9.0" +version = "6.10.2" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/11/8c450442bf4702ed810689a045f9c5d9236d709163886f09374fd8d84143/PyQt6_Qt6-6.9.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:b1c4e4a78f0f22fbf88556e3d07c99e5ce93032feae5c1e575958d914612e0f9", size = 66804297, upload-time = "2025-04-08T08:51:42.258Z" }, - { url = "https://files.pythonhosted.org/packages/6e/be/191ba4402c24646f6b98c326ff0ee22e820096c69e67ba5860a687057616/PyQt6_Qt6-6.9.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d3875119dec6bf5f799facea362aa0ad39bb23aa9654112faa92477abccb5ff", size = 60943708, upload-time = "2025-04-08T08:51:48.156Z" }, - { url = "https://files.pythonhosted.org/packages/0f/70/ec018b6e979b3914c984e5ab7e130918930d5423735ac96c70c328227b9b/PyQt6_Qt6-6.9.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:9c0e603c934e4f130c110190fbf2c482ff1221a58317266570678bc02db6b152", size = 81846956, upload-time = "2025-04-08T08:51:54.582Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ed/2d78cd08be415a21dac2e7277967b90b0c05afc4782100f0a037447bb1c6/PyQt6_Qt6-6.9.0-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:cf840e8ae20a0704e0343810cf0e485552db28bf09ea976e58ec0e9b7bb27fcd", size = 80295982, upload-time = "2025-04-08T08:52:00.741Z" }, - { url = "https://files.pythonhosted.org/packages/6e/24/6b6168a75c7b6a55b9f6b5c897e6164ec15e94594af11a6f358c49845442/PyQt6_Qt6-6.9.0-py3-none-win_amd64.whl", hash = "sha256:c825a6f5a9875ef04ef6681eda16aa3a9e9ad71847aa78dfafcf388c8007aa0a", size = 73652485, upload-time = "2025-04-08T08:52:07.306Z" }, - { url = "https://files.pythonhosted.org/packages/44/fd/1238931df039e46e128d53974c0cfc9d34da3d54c5662bd589fe7b0a67c2/PyQt6_Qt6-6.9.0-py3-none-win_arm64.whl", hash = "sha256:1188f118d1c570d27fba39707e3d8a48525f979816e73de0da55b9e6fa9ad0a1", size = 49568913, upload-time = "2025-04-08T08:52:12.587Z" }, + { url = "https://files.pythonhosted.org/packages/9a/eb/f04d547d8ed9f20c7b246db4ef5d93b49cab4692009a10652ed0a8b9d2aa/pyqt6_qt6-6.10.2-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:5761cfccc721da2311c3f1213577f0ff1df07bbbbe3fa3a209a256b82cf057e3", size = 68688870, upload-time = "2026-01-29T12:26:48.619Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c8/d99e65ab01c2402fb6bc4f77abef7244f7d5fb2f2e6d5b0abdf71bb2e4fc/pyqt6_qt6-6.10.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6dda853a8db1b8d1a2ddbbe76cc6c3aa86614cad14056bd3c0435d8feea73b2d", size = 62512013, upload-time = "2026-01-29T12:27:24.642Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fe/01fd9b9d2ca139ef61582f2e2da249fa169229144294c1bb27db59ad8420/pyqt6_qt6-6.10.2-py3-none-manylinux_2_34_x86_64.whl", hash = "sha256:19c10b5f0806e9f9bac2c9759bd5d7d19a78967f330fd60a2db409177fa76e49", size = 84028760, upload-time = "2026-01-29T12:28:03.267Z" }, + { url = "https://files.pythonhosted.org/packages/f4/20/a0d027ebb267d3afaf319d94efe1ff4d667004ee83b96701329a4d11fb95/pyqt6_qt6-6.10.2-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:2e60d616861ca4565cd295418d605975aa2dc407ba4b94c1586a70c92e9cb052", size = 83063975, upload-time = "2026-01-29T12:28:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/06/8e/595f215876d507417cc8565e05519916d3b0b76baedea6a1e4e5105633fc/pyqt6_qt6-6.10.2-py3-none-win_amd64.whl", hash = "sha256:c4b7f7d66cc58bddf1bc1ca28dfcf7a45f58cfcb11d81d13a0510409dd4957ac", size = 78433821, upload-time = "2026-01-29T12:29:35.493Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/2196e2b536217b87cb3d2ce13ef8f7607d08b02f1990a4bd84a88d293a3c/pyqt6_qt6-6.10.2-py3-none-win_arm64.whl", hash = "sha256:7164a6f0c1335358a3026df9865c8f75395b01f60f0dcd2f66c029ec16fc83d2", size = 58354426, upload-time = "2026-01-29T12:30:02.95Z" }, ] [[package]] name = "pyqt6-sip" -version = "13.10.0" +version = "13.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/18/0405c54acba0c8e276dd6f0601890e6e735198218d031a6646104870fe22/pyqt6_sip-13.10.0.tar.gz", hash = "sha256:d6daa95a0bd315d9ec523b549e0ce97455f61ded65d5eafecd83ed2aa4ae5350", size = 92464, upload-time = "2025-02-02T17:14:05.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/7d/d2916048e2e3960f68cb4e93907639844f7b8ff95897dcc98553776ccdfc/pyqt6_sip-13.11.0.tar.gz", hash = "sha256:d463af37738bda1856c9ef513e5620a37b7a005e9d589c986c3304db4a8a14d3", size = 92509, upload-time = "2026-01-13T16:01:32.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/a3/5162706f1d5112ca9b0c79e474f050dd37a09a3630b1daa4f0ab92f89efa/PyQt6_sip-13.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7b1258963717cfae1d30e262bb784db808072a8a674d98f57c2076caaa50499", size = 110799, upload-time = "2025-02-02T17:13:26.221Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ca/1ae57bbd4e91ee3167a95f0f749d5539fa4156c75e5b8104a1ec668f4f47/PyQt6_sip-13.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d27a3fed2a461f179d3cde6a74530fbad629ccaa66ed739b9544fda1932887af", size = 305460, upload-time = "2025-02-02T17:13:27.801Z" }, - { url = "https://files.pythonhosted.org/packages/d0/4c/f4de37d8908a8c0ac6855b7a30ec3bfeca2b43ed8b15f7ad54167b9d6511/PyQt6_sip-13.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0422781c77b85eefd7a26f104c5998ede178a16b0fd35212664250215b6e5e4c", size = 283691, upload-time = "2025-02-02T17:13:29.073Z" }, - { url = "https://files.pythonhosted.org/packages/65/1f/7ddeacf32e60ce556b27311f274e5d8f6299352ea3d1641a878a66426dcd/PyQt6_sip-13.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f64183dde2af36515dab515f4301a5a8d9b3658b231769fa48fe6287dc52f375", size = 53437, upload-time = "2025-02-02T17:13:30.284Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c4/97446339ff086ad6530af0970b6905a6930d8868214c182a0ca0e0e9638e/PyQt6_sip-13.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e78fb8036b18f6258a1af0956c5a3cec1dd3d8dd5196ecd89a31b529bf40e82", size = 110770, upload-time = "2025-02-02T17:13:31.339Z" }, - { url = "https://files.pythonhosted.org/packages/2b/4b/d41d9d1a5496948426b1a30b778df1d87625245d4ba5b7aa55810f2899c5/PyQt6_sip-13.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e19d5887fa3003a635419644dfed3158cb15eb566fc27b1ed56913a5767a71dc", size = 316994, upload-time = "2025-02-02T17:13:33.26Z" }, - { url = "https://files.pythonhosted.org/packages/ff/81/62e36cddb4641c7ce6e2779e0783635555a3ecfdb50f46f9200f61af24be/PyQt6_sip-13.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079bb946edc3960f08d92b3a8eebff55d3abb51bc2a0583b6683dfd9f77a616a", size = 293804, upload-time = "2025-02-02T17:13:35.719Z" }, - { url = "https://files.pythonhosted.org/packages/2f/4d/23e9e23a331d5a608217349c931b1d9b5cf9419640033e73ae9895e7f5bd/PyQt6_sip-13.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:90974f5dbba1f5d1d2ca9b1cfdfd5258e5e3cfacead03f0df674d54c69973ea7", size = 53444, upload-time = "2025-02-02T17:13:37.672Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0c/2caff1607ddf7dcb8d53f1657160d3b334a8e9d9a9bf700e79971677ab89/PyQt6_sip-13.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:bbefd5539eeda4dec37e8b6dfc362ba240ec31279060336bcceaff572807dac8", size = 45057, upload-time = "2025-02-02T17:13:39.512Z" }, - { url = "https://files.pythonhosted.org/packages/b5/43/e80c8b41c5fdb67233666b36c5e3e61bb2e699c321e8c33962214e694e26/PyQt6_sip-13.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f026a1278f9c2a745542d4a05350f2392d4cf339275fb8efccb47b0f213d120", size = 110785, upload-time = "2025-02-02T17:13:58.375Z" }, - { url = "https://files.pythonhosted.org/packages/66/a4/8c3ee9503d3b321c2f1ddac693bb72555e356dc4369b13bbac7f90c48c80/PyQt6_sip-13.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548c70bc40d993be0eb011e1bbc41ba7c95f6af375613b58217f39ad8d703345", size = 302726, upload-time = "2025-02-02T17:13:59.676Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1b/97ba52732b3bb45607e283d3bccd2776907d28b028509bee8d3727e8f675/PyQt6_sip-13.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21417ffd2c489afef114cb09683bbc0fb24d78df848a21fc0d09e70ecbb0a4a4", size = 281281, upload-time = "2025-02-02T17:14:01.752Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d5/c95c0da87151fd17f412af39b8381d6369b74c6e21326f6a0694020eaf9e/PyQt6_sip-13.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:6e1b1f7a29290afc83bcd9970e0cffa2d0da87d81796b6eab7b6f583e4f49652", size = 53661, upload-time = "2025-02-02T17:14:03.784Z" }, + { url = "https://files.pythonhosted.org/packages/1c/43/5f0165d15e40a1dd0b954bb64c5832255b28008ffdad6d0084e01f3cda9d/pyqt6_sip-13.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:90b597feae3c374eb1af7bfc515836aa39829ff3a1dffa5fe92ba139d273946a", size = 110755, upload-time = "2026-01-13T16:00:56.424Z" }, + { url = "https://files.pythonhosted.org/packages/87/ff/4df67b44e2b45e6f1c235b46eb6276afff2dd5b0bdb0fee8b240b61d0b9c/pyqt6_sip-13.11.0-cp310-cp310-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:261f8f7063c862863f05629219be08be9bddd01d1a83181f8439d19852ae1571", size = 282224, upload-time = "2026-01-13T16:00:59.714Z" }, + { url = "https://files.pythonhosted.org/packages/72/b9/036467387f7b025c0a3a7d3fb7f4a014cc7d69c08f3221cb758ffc98de0e/pyqt6_sip-13.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8532a5612762a5c1859e4b38359f847e07596ec210942221e22b10df5327fcc", size = 306070, upload-time = "2026-01-13T16:00:58.007Z" }, + { url = "https://files.pythonhosted.org/packages/de/dc/7aa44c77790f53f74de94da5c02acd6c919f17a44cc92096f7e6ab3a3724/pyqt6_sip-13.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:87edd15791c7d20fa3ffc68e6f4825f989a6510c11019eb5a11c1622b8802f8d", size = 54107, upload-time = "2026-01-13T16:01:01.334Z" }, + { url = "https://files.pythonhosted.org/packages/4a/41/1c2097aad646f7ef6be9cfd2fd4814ad6bbdba7d53a622ad56e00f88dc72/pyqt6_sip-13.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e329ccc3a6502e2b774ef62ab843ac8b3f32191324e8230e6dde78c1c0df5a8", size = 110804, upload-time = "2026-01-13T16:01:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d3/51143a254a7c9e9650c3eedfc35b967cdcd180a289c6fa2a937c57fe405a/pyqt6_sip-13.11.0-cp311-cp311-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:364424dacdee9e0a2a723646b5608139629ad9bde318dd755d86f5e0ba123c79", size = 291442, upload-time = "2026-01-13T16:01:05.424Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/d62e0ded4fdd5abf6a3085a65aa229c863b334758555af1f7b79af9bc003/pyqt6_sip-13.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:132ee69d935c14bb4ced2a811ef333200c7aa50324bd7caadefd7d5874495225", size = 317793, upload-time = "2026-01-13T16:01:04.183Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d4/34f3fb522323a5336e31a51ab7ae3103ebc0c8e741bff9630f29480cdca2/pyqt6_sip-13.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:341e52e702d41872515794dea6265ee56b8625c9d3c74ea0468124f0bd675f8b", size = 54101, upload-time = "2026-01-13T16:01:06.504Z" }, + { url = "https://files.pythonhosted.org/packages/a9/a1/37109ec33ead4b9cc62294b48a1ba2b4899cb0d009eb1763d61e3a89ab21/pyqt6_sip-13.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:489fdd0910f8c1d5d40255b4cd7b45f4a4549f9a599512bc6b2cc8d384e28852", size = 48359, upload-time = "2026-01-13T16:01:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/53/a6/0e4d8fa7d6deb750bd0fdf89024e39c71fb127efb5eeedfab6830ad6679a/pyqt6_sip-13.11.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6b3267cd93b7f4da6fdf9a6a26f3baed8faae06e5cdd76235f2acc2116c40a54", size = 112367, upload-time = "2026-01-13T16:01:09.08Z" }, + { url = "https://files.pythonhosted.org/packages/66/e6/25dc20a03c46000e8b93aaf79347227926b67959283e5aab797daa7f64d8/pyqt6_sip-13.11.0-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c30248d9bbe54c46a78e5d549da50295ecd6584b965597f751e272f000fb8527", size = 301150, upload-time = "2026-01-13T16:01:12.385Z" }, + { url = "https://files.pythonhosted.org/packages/11/9f/e850cd350aade789660cafba38c00777e686040c06b8cd0b45339b80fcba/pyqt6_sip-13.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c367b53a91e575ef66c1375f899713bdaf0a8b2c64b95ac226e9644854a4984", size = 323303, upload-time = "2026-01-13T16:01:10.736Z" }, + { url = "https://files.pythonhosted.org/packages/77/26/5261d62108f7579407230f8c1d4dda43c18b5600ce70bf3becb2f997d5cc/pyqt6_sip-13.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:077958105c2ea2f62be2f1a7611ff8bd44cb52fb5ea8fc8c59ea949144acb7b5", size = 53461, upload-time = "2026-01-13T16:01:13.875Z" }, + { url = "https://files.pythonhosted.org/packages/46/80/6c88b97eda309d6babb7292200bf51165dc06d0204d891b7bf1fb17a8ed0/pyqt6_sip-13.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:52812471619d3d3750b940d7d124cd0954107656924921ac177e098ba36362fb", size = 48650, upload-time = "2026-01-13T16:01:14.897Z" }, ] [[package]] @@ -4886,7 +4584,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.5" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -4894,24 +4592,26 @@ dependencies = [ { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, + { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] name = "pytest-asyncio" -version = "0.26.0" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, { name = "pytest" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload-time = "2025-03-25T06:22:28.883Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload-time = "2025-03-25T06:22:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, ] [[package]] @@ -4931,89 +4631,78 @@ wheels = [ [[package]] name = "pytest-cov" -version = "6.1.1" +version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload-time = "2025-04-05T14:07:51.592Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload-time = "2025-04-05T14:07:49.641Z" }, + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, ] [[package]] name = "python-bidi" -version = "0.6.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/de/1822200711beaadb2f334fa25f59ad9c2627de423c103dde7e81aedbc8e2/python_bidi-0.6.6.tar.gz", hash = "sha256:07db4c7da502593bd6e39c07b3a38733704070de0cbf92a7b7277b7be8867dd9", size = 45102, upload-time = "2025-02-18T21:43:05.598Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/e0/fdb20f2e421e1d2fc4b519e1c2cd24361cbeb92c75750683790ef0301207/python_bidi-0.6.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09d4da6b5851d0df01d7313a11d22f308fdfb0e12461f7262e0f55c521ccc0f1", size = 269449, upload-time = "2025-02-18T21:42:02.074Z" }, - { url = "https://files.pythonhosted.org/packages/f9/2a/7371ab49b3f64f969ca01ee143614268868220a8d5cb742459103b2bf259/python_bidi-0.6.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:493a844891e23264411b01df58ba77d5dbb0045da3787f4195f50a56bfb847d9", size = 264036, upload-time = "2025-02-18T21:41:49.05Z" }, - { url = "https://files.pythonhosted.org/packages/aa/98/f1eada157c94cdebc3dde997ab9f3b4e3e5f43155eaf69954c899231e23b/python_bidi-0.6.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4f4c664b2594d2d6be6a31c9254e784d6d5c1b17edfdccb5f0fac317a1cd5e", size = 291174, upload-time = "2025-02-18T21:40:32.185Z" }, - { url = "https://files.pythonhosted.org/packages/62/ee/f37710b6947e67279e08619b6c10dcffaca1da9f045137ce5e69e046f63e/python_bidi-0.6.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b53b8b061b67908b5b436abede8c450c8d2fa965cb713d541688f552b4cfa3d3", size = 298418, upload-time = "2025-02-18T21:40:45.782Z" }, - { url = "https://files.pythonhosted.org/packages/f6/73/4b584fe00869c14784fd2417f14cf9f7fcb83c68164a125aa8c11446d048/python_bidi-0.6.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b144a1b8766fa6a536cc0feb6fdd29d91af7a82a0c09d89db5fc0b79d5678d7d", size = 351783, upload-time = "2025-02-18T21:40:59.76Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7e/cb6310ce12030e1c31b1bb743bda64945d1ec047051f1ed9f008f24ffc92/python_bidi-0.6.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41fde9b4bb45c0e1b3283599e7539c82624ef8a8d3115da76b06160d923aab09", size = 331616, upload-time = "2025-02-18T21:41:12.822Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d3/b577d4457f678dd2d61b6e80011e20ee4b1bf0be5233340deaacd358c878/python_bidi-0.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de020488c334c31916ee7526c1a867bf632516c1c2a0420d14d10b79f00761c7", size = 293050, upload-time = "2025-02-18T21:41:37.308Z" }, - { url = "https://files.pythonhosted.org/packages/98/f2/1dfc79bbdcac958826c77e787a03668bd52a165d132defc3c71b21783219/python_bidi-0.6.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:27cf629a0ef983a25cfd62c6238ee1e742e35552409d5c1b43f6d22945adc4c2", size = 307793, upload-time = "2025-02-18T21:41:26.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e3/5f7c96c156e50b3318cbd6b77bc95de096f170f88e8efbd90b00a5489671/python_bidi-0.6.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9a9de76229ac22cb6bd40b56a8f7f0c42cbdff985dbd14b65bac955acf070594", size = 465721, upload-time = "2025-02-18T21:42:14.846Z" }, - { url = "https://files.pythonhosted.org/packages/2d/1a/9a17f900770bb1124d7619b9587c12a36a71992a6a3b6e61d0119bf210f1/python_bidi-0.6.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:2150ac84f7b15f00f8cd9e29fee7edb4639b7ed2cd9e3d23e2dfd83098f719b7", size = 557260, upload-time = "2025-02-18T21:42:27.003Z" }, - { url = "https://files.pythonhosted.org/packages/f9/63/448671801beb65c1bcdb1c2b1a4cea752037ce3534ef9f491794646cc5d4/python_bidi-0.6.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dc8b0566cef5277f127a80e7546b52393050e5a572f08a352ca220e3f94807cf", size = 485449, upload-time = "2025-02-18T21:42:40.079Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e8/5c93fd22a87913fbbfd35c1d54142601e2877f5672546b885e739c19b070/python_bidi-0.6.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3564e574db1a0b3826ed6e646dc7206602189c31194d8da412007477ce653174", size = 459763, upload-time = "2025-02-18T21:42:52.11Z" }, - { url = "https://files.pythonhosted.org/packages/e4/07/e80d714a2a9b089a1bc621f06c29da5adf01149b21d8cb2e10a942126650/python_bidi-0.6.6-cp310-cp310-win32.whl", hash = "sha256:92eb89f9d8aa0c877cb49fc6356c7f5566e819ea29306992e26be59a5ce468d7", size = 155585, upload-time = "2025-02-18T21:43:14.497Z" }, - { url = "https://files.pythonhosted.org/packages/23/ef/92757e766ae753a264a5c0d2213f19a073d0b0389210b2eef86c65bb02d0/python_bidi-0.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:1d627f8cfeba70fe4e0ec27b35615c938a483cbef2d9eb7e1e42400d2196019e", size = 160555, upload-time = "2025-02-18T21:43:06.639Z" }, - { url = "https://files.pythonhosted.org/packages/bb/03/b10c5c320fa5f3bc3d7736b2268179cc7f4dca4d054cdf2c932532d6b11a/python_bidi-0.6.6-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:da4949496e563b51f53ff34aad5a9f4c3aaf06f4180cf3bcb42bec649486c8f1", size = 269512, upload-time = "2025-02-18T21:42:03.267Z" }, - { url = "https://files.pythonhosted.org/packages/91/d8/8f6bd8f4662e8340e1aabb3b9a01fb1de24e8d1ce4f38b160f5cac2524f4/python_bidi-0.6.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c48a755ca8ba3f2b242d6795d4a60e83ca580cc4fa270a3aaa8af05d93b7ba7f", size = 264042, upload-time = "2025-02-18T21:41:50.298Z" }, - { url = "https://files.pythonhosted.org/packages/51/9f/2c831510ab8afb03b5ec4b15271dc547a2e8643563a7bcc712cd43b29d26/python_bidi-0.6.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76a1cd320993ba3e91a567e97f057a03f2c6b493096b3fff8b5630f51a38e7eb", size = 290963, upload-time = "2025-02-18T21:40:35.243Z" }, - { url = "https://files.pythonhosted.org/packages/95/45/17a76e7052d4d4bc1549ac2061f1fdebbaa9b7448ce81e774b7f77dc70b2/python_bidi-0.6.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8bf3e396f9ebe8f4f81e92fa4c98c50160d60c58964b89c8ff4ee0c482befaa", size = 298639, upload-time = "2025-02-18T21:40:49.357Z" }, - { url = "https://files.pythonhosted.org/packages/00/11/fb5857168dcc50a2ebb2a5d8771a64b7fc66c19c9586b6f2a4d8a76db2e8/python_bidi-0.6.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2a49b506ed21f762ebf332de6de689bc4912e24dcc3b85f120b34e5f01e541a", size = 351898, upload-time = "2025-02-18T21:41:00.939Z" }, - { url = "https://files.pythonhosted.org/packages/18/e7/d25b3e767e204b9e236e7cb042bf709fd5a985cfede8c990da3bbca862a3/python_bidi-0.6.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3428331e7ce0d58c15b5a57e18a43a12e28f8733086066e6fd75b0ded80e1cae", size = 331117, upload-time = "2025-02-18T21:41:14.819Z" }, - { url = "https://files.pythonhosted.org/packages/75/50/248decd41096b4954c3887fc7fae864b8e1e90d28d1b4ce5a28c087c3d8d/python_bidi-0.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35adfb9fed3e72b9043a5c00b6ab69e4b33d53d2d8f8b9f60d4df700f77bc2c0", size = 292950, upload-time = "2025-02-18T21:41:38.53Z" }, - { url = "https://files.pythonhosted.org/packages/0b/d8/6ae7827fbba1403882930d4da8cbab28ab6b86b61a381c991074fb5003d1/python_bidi-0.6.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:589c5b24a8c4b5e07a1e97654020734bf16ed01a4353911ab663a37aaf1c281d", size = 307909, upload-time = "2025-02-18T21:41:28.221Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a3/5b369c5da7b08b36907dcce7a78c730370ad6899459282f5e703ec1964c6/python_bidi-0.6.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:994534e47260d712c3b3291a6ab55b46cdbfd78a879ef95d14b27bceebfd4049", size = 465552, upload-time = "2025-02-18T21:42:16.157Z" }, - { url = "https://files.pythonhosted.org/packages/82/07/7779668967c0f17a107a916ec7891507b7bcdc9c7ee4d2c4b6a80ba1ac5e/python_bidi-0.6.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:00622f54a80826a918b22a2d6d5481bb3f669147e17bac85c81136b6ffbe7c06", size = 557371, upload-time = "2025-02-18T21:42:28.392Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e5/3154ac009a167bf0811195f12cf5e896c77a29243522b4b0697985881bc4/python_bidi-0.6.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:965e6f2182e7b9352f2d79221f6c49502a307a9778d7d87d82dc36bb1ffecbab", size = 485458, upload-time = "2025-02-18T21:42:41.465Z" }, - { url = "https://files.pythonhosted.org/packages/fd/db/88af6f0048d8ec7281b44b5599a3d2afa18fac5dd22eb72526f28f4ea647/python_bidi-0.6.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:53d7d3a550d176df99dd0bb0cc2da16b40634f11c8b9f5715777441d679c0a62", size = 459588, upload-time = "2025-02-18T21:42:53.483Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d2/77b649c8b32c2b88e2facf5a42fb51dfdcc9e13db411c8bc84831ad64893/python_bidi-0.6.6-cp311-cp311-win32.whl", hash = "sha256:b271cd05cb40f47eb4600de79a8e47f8579d81ce35f5650b39b7860d018c3ece", size = 155683, upload-time = "2025-02-18T21:43:15.74Z" }, - { url = "https://files.pythonhosted.org/packages/95/41/d4dbc72b96e2eea3aeb9292707459372c8682ef039cd19fcac7e09d513ef/python_bidi-0.6.6-cp311-cp311-win_amd64.whl", hash = "sha256:4ff1eba0ff87e04bd35d7e164203ad6e5ce19f0bac0bdf673134c0b78d919608", size = 160587, upload-time = "2025-02-18T21:43:07.872Z" }, - { url = "https://files.pythonhosted.org/packages/5e/81/4619e45ea0ed20f10a8b4bc96b1100abd4066936f612eb7158ccf746ff05/python_bidi-0.6.6-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5351efb4e86281eb26c420066fade935cd670c0c0960edc323b80d0b94a0bc19", size = 269203, upload-time = "2025-02-18T21:42:10.099Z" }, - { url = "https://files.pythonhosted.org/packages/f3/04/3eef6432d029d3d624f3d1b0ef91dc44f2e9089179645117837490d4fcec/python_bidi-0.6.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8a83f28c104ef3b86ad60219d885b31728eb40c644f414f505068a6ecba3575", size = 263985, upload-time = "2025-02-18T21:41:57.582Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ee/3776d9604496216ebbe92eb0480d724839126eb95400d5c59653453e48e6/python_bidi-0.6.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825d15e547a9a2da5501966db672d6c8a5a063c041b2741ba32cc9775694b0ff", size = 291228, upload-time = "2025-02-18T21:40:40.529Z" }, - { url = "https://files.pythonhosted.org/packages/62/b6/6364a4242ec32d26dff79b14b104968143629cb5b58de88635039d456afd/python_bidi-0.6.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82c7f6bb3dfc4f61aecb2290f1ea24bb2450a5cbc94ee8abe5d6278b67859e0b", size = 298090, upload-time = "2025-02-18T21:40:55.579Z" }, - { url = "https://files.pythonhosted.org/packages/4e/4c/575f0dd3d9469d326cb62db0afe3e8e7d8173531c675560d06ae9614d137/python_bidi-0.6.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7edb0d1baf45c70384e700e10d723a13aabe116e14453cbf099eea4dd763e28", size = 351642, upload-time = "2025-02-18T21:41:09.033Z" }, - { url = "https://files.pythonhosted.org/packages/04/8a/657c8e9c03d46c9685d0462b5d929d0f3bc2d1361830d2b607b336a35b22/python_bidi-0.6.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ecfd1d0f6d2927eb2114b55a63b298766b85fc9f0c9aaacb4e8df3e0468538a", size = 331708, upload-time = "2025-02-18T21:41:20.381Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ec/3088a751cf30eb1bb5a10fd0117d1c12182fd074fd05f503f17ebd423a38/python_bidi-0.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:534bc7c84159b6e4b777f5fb9122902d6e19223c4242f5b94417de1afcfe2fd9", size = 292845, upload-time = "2025-02-18T21:41:44.695Z" }, - { url = "https://files.pythonhosted.org/packages/58/4d/ebb967047a4487dd6311d74b07530fb3e2d4919bef8dbaa8dd125b8f1441/python_bidi-0.6.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:490f8fe09ed423bfe00531f215e3b87e6000b8170408a0ead6ea5626f644b1d1", size = 307560, upload-time = "2025-02-18T21:41:32.992Z" }, - { url = "https://files.pythonhosted.org/packages/49/d0/8d79f0d8a7c94504f96ec011cddcf42ce892bebb7a6b9263392592aad40b/python_bidi-0.6.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7906229befa0cea2fe0278a934a27f657b68ce07a2606b1244f814a38b4ab42a", size = 465700, upload-time = "2025-02-18T21:42:21.853Z" }, - { url = "https://files.pythonhosted.org/packages/3f/04/dedc2138107746dd3f95a08a975bf7797067f7c5aed9b7ba40218716d9a3/python_bidi-0.6.6-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:2d139bab64962731b5288edb1b6db76060c5a5183187efa590499951cd230b02", size = 557121, upload-time = "2025-02-18T21:42:35.159Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d2/dcaa0f8db4e1822f4d5c6d54718b26ce0911cff9d283f32b5b3d39b84086/python_bidi-0.6.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4eb3f28ca5e2f7238eaf67126c7634ec35603cbfbbe9b9b340ffee4a3314455f", size = 485381, upload-time = "2025-02-18T21:42:47.747Z" }, - { url = "https://files.pythonhosted.org/packages/54/40/967cc37d15d0d5f1684743cff39d8ae1e397680a73e8eaa27b88a18ab182/python_bidi-0.6.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:af828457e46b31542569b4391014e6645023f6144de1dabf9fce7e9683235c25", size = 460323, upload-time = "2025-02-18T21:43:00.6Z" }, - { url = "https://files.pythonhosted.org/packages/a3/44/637336105fe7e2a997973ac73963e47b20522b21816f30456daeeabb96cb/python_bidi-0.6.6-cp39-cp39-win32.whl", hash = "sha256:691822fac1d6f3caf12e667dd8b41956485c78b211032747c5f97822ba208726", size = 155286, upload-time = "2025-02-18T21:43:22.119Z" }, - { url = "https://files.pythonhosted.org/packages/0e/89/37e7a629bef2813aee8e8cd9b3ddbdc44e2653062e21550c12a410961b7b/python_bidi-0.6.6-cp39-cp39-win_amd64.whl", hash = "sha256:edae3dd8e595a40d3cdd6ff8b6d9f3860cd17f674792ea05bba5bf5f1b36e5ab", size = 160575, upload-time = "2025-02-18T21:43:13.025Z" }, - { url = "https://files.pythonhosted.org/packages/11/51/5f20d5e4db6230ba5a45ad5f900b97a0e692fbf78afce01ee9ffcd7282c3/python_bidi-0.6.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fd9bf9736269ad5cb0d215308fd44e1e02fe591cb9fbb7927d83492358c7ed5f", size = 271242, upload-time = "2025-02-18T21:42:11.928Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4e/5128c25b5a056007eb7597951cc747dfe9712ccfcfdf7e2247fa2715f338/python_bidi-0.6.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d941a6a8a7159982d904982cfe0feb0a794913c5592d8137ccae0d518b2575e4", size = 265519, upload-time = "2025-02-18T21:41:58.858Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/caf6cb04639c1e026bf23f4370fc93cef7e70c4864c4fd38ba5f3000668f/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0e715b500b09cefccaddb7087978dcd755443b9620aa1cc7b441824253cf2b8", size = 292721, upload-time = "2025-02-18T21:40:42.462Z" }, - { url = "https://files.pythonhosted.org/packages/42/0b/1185d08bb3744619afb72c2ec83bded6bcfb6e4dcfbeda1cb523c3a48534/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4142467ec0caa063aca894ca8f1e8a4d9ca6834093c06b0ad5e7aa98dc801079", size = 299840, upload-time = "2025-02-18T21:40:56.741Z" }, - { url = "https://files.pythonhosted.org/packages/30/7e/f537fac0dec5d2e994f3fe17053183f8afba36f8e5793fdcee7d0e9996bb/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f227ee564e0241e57269043bdfa13025d08d0919b349f5c686e8cfc0540dbf", size = 352467, upload-time = "2025-02-18T21:41:10.277Z" }, - { url = "https://files.pythonhosted.org/packages/06/cc/2f5347a5bf7f218d4db8a35901b9dce3efe2eb146e5173f768396724dfd6/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00081439e969c9d9d2ede8eccef4e91397f601931c4f02864edccb760c8f1db5", size = 333942, upload-time = "2025-02-18T21:41:23.879Z" }, - { url = "https://files.pythonhosted.org/packages/a0/01/d404c3efc450eff2322a47b5f37685bfff812c42e99228d994ba05767f7a/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:804c74d070f4e85c6976e55cdbb3f4ead5ec5d7ea0cfad8f18f5464be5174ec9", size = 294379, upload-time = "2025-02-18T21:41:46.652Z" }, - { url = "https://files.pythonhosted.org/packages/6e/91/ff576c53d2f13bf8a84ef46bdad8b7cc0843db303a02818ffdb0861ecd8b/python_bidi-0.6.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0781c3c63b4bc3b37273de2076cb9b875436ae19be0ff04752914d02a4375790", size = 309616, upload-time = "2025-02-18T21:41:34.96Z" }, - { url = "https://files.pythonhosted.org/packages/41/8f/f58e2b990fcb5c8f75aab646e4a16925f119110bbb3907bb70de2c1afd07/python_bidi-0.6.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:39eed023add8c53684f1de96cb72b4309cc4d412745f59b5d0dab48e6b88317b", size = 466775, upload-time = "2025-02-18T21:42:23.179Z" }, - { url = "https://files.pythonhosted.org/packages/3b/db/ef34eb7bb88d6ab5c7085a89b975e19af821713395be0d3a7423df3db60b/python_bidi-0.6.6-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:91a8cb8feac5d0042e2897042fe7bbbeab5dea1ab785f4b7d0c0bbbf6bc7aefd", size = 558457, upload-time = "2025-02-18T21:42:37.442Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c5/b7829e222f721339f0578f102d467101633970d1443c65b565654944c114/python_bidi-0.6.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a6ac2a3ec5ccc3736e29bb201f27bd33707bfde774d3d222826aa181552590b2", size = 486442, upload-time = "2025-02-18T21:42:49.1Z" }, - { url = "https://files.pythonhosted.org/packages/11/40/46a72df7d1b703023749b73b68dec5d99d36d2740582337d572b9d1f92c4/python_bidi-0.6.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6dfa55611022f95058bb7deb2ac20755ae8abbe1104f87515f561e4a56944ba1", size = 461310, upload-time = "2025-02-18T21:43:01.898Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/a762d2d75ae62bdc30de7deda9f97d752ebf20d6d092524921c225153722/python_bidi-0.6.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a138a7607b459414431a5cdcf5834624d6f87911a8863b51dd363a1e2e5744ab", size = 271281, upload-time = "2025-02-18T21:42:13.442Z" }, - { url = "https://files.pythonhosted.org/packages/56/c0/f1f73f7f4b8df6a23d7a214b51e8b5d75c674eaac14ad554c1cdf0b44fe1/python_bidi-0.6.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3e17441d31a8665a44f5f42dba7646bbcd3c51ae6657dd019f6a7bb12618b12f", size = 265534, upload-time = "2025-02-18T21:42:00.913Z" }, - { url = "https://files.pythonhosted.org/packages/84/d9/4346c804619f81ffe4af30ce086807eac2f5250ceb981cca8f44338e7d39/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d395e537a34d59e776fcdf50a50786d1a82084849d55cf644f4969ef8156643", size = 293006, upload-time = "2025-02-18T21:40:43.713Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1a/4f5e75997606eebad3aea14d805b6267d2035394adf24ae59fe4532c68e8/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:471c1a5fcdbb3de47377d74a7f1017216d9464e5428ca4e66f863e49dca73393", size = 299933, upload-time = "2025-02-18T21:40:57.901Z" }, - { url = "https://files.pythonhosted.org/packages/97/e9/faf9f5b75d82d05651ee5a2e186b27399fc7e9292d44f56c1f15683eb1f8/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cc626d2f77cac470b3167a28d4975744f3d99f5eaf8f5c2048ac9c0b9cba9dc", size = 353332, upload-time = "2025-02-18T21:41:11.489Z" }, - { url = "https://files.pythonhosted.org/packages/7f/58/04d878c71c9d2cddb1993c2e72d98a7f4eb389559f2b859077a6513fc150/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87a5489189b0a852da0129df77f0cc8e874b7b1ab1f968a209d340477906f076", size = 333948, upload-time = "2025-02-18T21:41:25.642Z" }, - { url = "https://files.pythonhosted.org/packages/2f/f7/c7dfb7150af1ae50655e38f09f93fab94b61631aa68bc498210abd4d69a9/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eb12b724cc99853e0e0425b54c1c2219492486afaca106c827204b4189504db", size = 294529, upload-time = "2025-02-18T21:41:47.882Z" }, - { url = "https://files.pythonhosted.org/packages/63/f4/6881eee008329903e222bf9e961ca26d14a3f3fabfa694ae2149ec1809b1/python_bidi-0.6.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82e0befbc1078a964c6b6f2f7a616ae8015b52fdcd2f03979abf0fb1f2f18b48", size = 309433, upload-time = "2025-02-18T21:41:36.174Z" }, - { url = "https://files.pythonhosted.org/packages/ab/e1/c2041fbc433f9db8788eecbe30dcfc32b487f16aa7a9aa9956ae8265900f/python_bidi-0.6.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:6255ad385bb90aa39f8340967eef35657e52f8ed011773d37113cafa0ed5eefd", size = 466673, upload-time = "2025-02-18T21:42:24.83Z" }, - { url = "https://files.pythonhosted.org/packages/50/56/fd599b934410b989542a076ebd254d080daab3056917f3542b705335904b/python_bidi-0.6.6-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:c07e4d6d8c8f574aa135436207a37bba522443a8490b0ba720b54d343dfde1a7", size = 558376, upload-time = "2025-02-18T21:42:38.8Z" }, - { url = "https://files.pythonhosted.org/packages/8f/cc/641ee9d3c8bcc58891105c9746100cabc2450cb1d6a4835f4464969014fd/python_bidi-0.6.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bbbcb28474b71e3ad05d8bd483348efe41fb7dfef6bd3046f3072baa0954d746", size = 486355, upload-time = "2025-02-18T21:42:50.449Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a0a6d4483b15939540a07af89e40650fc792c11c48de912a3375144f1121/python_bidi-0.6.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:b65b4105998436405a3e6bca60cbf9714f6a08099b16c0cf4752a4a3a70eb45b", size = 461465, upload-time = "2025-02-18T21:43:04.155Z" }, +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/e3/c0c8bf6fca79ac946a28d57f116e3b9e5b10a4469b6f70bf73f3744c49bf/python_bidi-0.6.7.tar.gz", hash = "sha256:c10065081c0e137975de5d9ba2ff2306286dbf5e0c586d4d5aec87c856239b41", size = 45503, upload-time = "2025-10-22T09:52:49.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/c3/cdbece686fab47d4d04f2c15d372b3d3f3308da2e535657bf4bbd5afef50/python_bidi-0.6.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:94dbfd6a6ec0ae64b5262290bf014d6063f9ac8688bda9ec668dc175378d2c80", size = 274857, upload-time = "2025-10-22T09:51:57.298Z" }, + { url = "https://files.pythonhosted.org/packages/aa/19/1cd52f04345717613eafe8b23dd1ce8799116f7cc54b23aaefa27db298d6/python_bidi-0.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8274ff02d447cca026ba00f56070ba15f95e184b2d028ee0e4b6c9813d2aaf9", size = 264682, upload-time = "2025-10-22T09:51:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/c7/39/f46dae8bd298ffecaf169ea8871c1e63c6116e1b0178ca4eab2cb99d1c13/python_bidi-0.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24afff65c581a5d6f658a9ec027d6719d19a1d8a4401000fdb22d2eeb677b8e3", size = 293680, upload-time = "2025-10-22T09:50:57.091Z" }, + { url = "https://files.pythonhosted.org/packages/96/ed/c4e2c684bf8f226de4d0070780073fc7f3f97def3ad06f11b4c021bfa965/python_bidi-0.6.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8678c2272e7bd60a75f781409e900c9ddb9f01f55c625d83ae0d49dfc6a2674f", size = 302625, upload-time = "2025-10-22T09:51:05.378Z" }, + { url = "https://files.pythonhosted.org/packages/83/fa/3b5be9187515a4c28ad358c2f2785f968d4de090389f08a11c826ae1c17f/python_bidi-0.6.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cd82e65b5aeb31bd73534e61ece1cab625f4bcbdc13bc4ddc5f8cbfb37c24a", size = 441183, upload-time = "2025-10-22T09:51:14.014Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/023028ca45e674b67abee29a049fb3b7aac74873181940a1d34ad27e23cd/python_bidi-0.6.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dde1c3f3edb1f0095dcbf79cf8a0bb768f9539e809d0ad010d78200eea97d42a", size = 326788, upload-time = "2025-10-22T09:51:22.58Z" }, + { url = "https://files.pythonhosted.org/packages/d3/30/0753601fdad405e806c89cfa9603ff75241f8c7196cfe2cb37c43e34cdbd/python_bidi-0.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c463ae15e94b1c6a8a50bd671d6166b0b0d779fd1e56cbf46d8a4a84c9aa2d0", size = 302036, upload-time = "2025-10-22T09:51:40.341Z" }, + { url = "https://files.pythonhosted.org/packages/c6/38/e83901206c7161e4fa14f52d1244eb54bad2b9a959be62af7b472cded20a/python_bidi-0.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f9fa1257e075eeeed67d21f95e411036b7ca2b5c78f757d4ac66485c191720a", size = 315484, upload-time = "2025-10-22T09:51:32.285Z" }, + { url = "https://files.pythonhosted.org/packages/98/89/cd73185ad92990261b050a30753a693ad22a72ad5dc61b4e3845c58eff75/python_bidi-0.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adeec7cab0f2c2c291bd7faf9fa3fa233365fd0bf1c1c27a6ddd6cc563d4b32", size = 474003, upload-time = "2025-10-22T09:52:06.535Z" }, + { url = "https://files.pythonhosted.org/packages/9f/38/03fd74c68cae08d08a32a4bc2031300a882a7ceab39b7e7fc5a5e37f5b7c/python_bidi-0.6.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3b96744e4709f4445788a3645cea7ef8d7520ccd4fa8bbbfb3b650702e12c1e6", size = 567114, upload-time = "2025-10-22T09:52:17.534Z" }, + { url = "https://files.pythonhosted.org/packages/98/44/e196002ba8317d48ebab4750092a61287574195a3f685232059aa776edf4/python_bidi-0.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8860d67dc04dc530b8b4f588f38b7341a76f2ec44a45685a2d54e9dcffa5d15a", size = 493810, upload-time = "2025-10-22T09:52:28.683Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e2/1d495515d3fea0ecdd8bbb50e573282826ba074bceb2c0430206f94cde68/python_bidi-0.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4319f478ab1b90bbbe9921606ecb7baa0ebf0b332e821d41c3abdf1a30f0c35", size = 465208, upload-time = "2025-10-22T09:52:39.411Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/fc5b25d017677793435c415c7884f9c60ce7705bd35565280cca3be69fa9/python_bidi-0.6.7-cp310-cp310-win32.whl", hash = "sha256:8d4e621caadfdbc73d36eabdb2f392da850d28c58b020738411d09dda6208509", size = 157426, upload-time = "2025-10-22T09:52:58.114Z" }, + { url = "https://files.pythonhosted.org/packages/85/be/bd323950b98d40ab45f97630c3bfb5ed3a7416b2f71c250bcc1ed1267eb0/python_bidi-0.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:fd87d112eda1f0528074e1f7c0312881816cb75854133021124269a27c6c48dc", size = 161038, upload-time = "2025-10-22T09:52:50.44Z" }, + { url = "https://files.pythonhosted.org/packages/ec/de/c30a13ad95239507af472a5fc2cadd2e5e172055068f12ac39b37922c7f8/python_bidi-0.6.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a8892a7da0f617135fe9c92dc7070d13a0f96ab3081f9db7ff5b172a3905bd78", size = 274420, upload-time = "2025-10-22T09:51:58.262Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9f/be5efef7eea5f1e2a6415c4052a988f594dcf5a11a15103f2718d324a35b/python_bidi-0.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:06650a164e63e94dc8a291cc9d415b4027cb1cce125bc9b02dac0f34d535ed47", size = 264586, upload-time = "2025-10-22T09:51:49.255Z" }, + { url = "https://files.pythonhosted.org/packages/87/ec/2c374b6de35870817ffb3512c0666ea8c3794ef923b5586c69451e0e5395/python_bidi-0.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6df7be07af867ec1d121c92ea827efad4d77b25457c06eeab477b601e82b2340", size = 293672, upload-time = "2025-10-22T09:50:58.504Z" }, + { url = "https://files.pythonhosted.org/packages/29/1a/722d7d7128bdc9a530351a0d2fdf2ff5f4af66a865a6bca925f99832e2cc/python_bidi-0.6.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73a88dc333efc42281bd800d5182c8625c6e11d109fc183fe3d7a11d48ab1150", size = 302643, upload-time = "2025-10-22T09:51:06.419Z" }, + { url = "https://files.pythonhosted.org/packages/24/d7/5b9b593dd58fc745233d8476e9f4e0edd437547c78c58340619868470349/python_bidi-0.6.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f24189dc3aea3a0a94391a047076e1014306b39ba17d7a38ebab510553cd1a97", size = 441692, upload-time = "2025-10-22T09:51:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/08/b9/16e7a1db5f022da6654e89875d231ec2e044d42ef7b635feeff61cee564c/python_bidi-0.6.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a507fe6928a27a308e04ebf2065719b7850d1bf9ff1924f4e601ef77758812bd", size = 326933, upload-time = "2025-10-22T09:51:23.631Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a6/45aaec301292c6a07a9cc3168f5d1a92c8adc2ef36a3cd1f227b9caa980c/python_bidi-0.6.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbbffb948a32f9783d1a28bc0c53616f0a76736ed1e7c1d62e3e99a8dfaab869", size = 302034, upload-time = "2025-10-22T09:51:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/71/a3/7e42cce6e153c21b4e5cc96d429a5910909823f6fedd174b64ff67bc76a7/python_bidi-0.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7e507e1e798ebca77ddc9774fd405107833315ad802cfdaa1ab07b6d9154fc8", size = 315738, upload-time = "2025-10-22T09:51:33.409Z" }, + { url = "https://files.pythonhosted.org/packages/43/7c/a5e4c0acc8e6ca61953b4add0576f0483f63b809b5389154e5da13927b0b/python_bidi-0.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:849a57d39feaf897955d0b19bbf4796bea53d1bcdf83b82e0a7b059167eb2049", size = 473968, upload-time = "2025-10-22T09:52:07.624Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/a18bc3cbab7a0e598cbe7b89f2c0913aedcc66dcafce9a4c357465c87859/python_bidi-0.6.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5ebc19f24e65a1f5c472e26d88e78b9d316e293bc6f205f32de4c4e99276336e", size = 567038, upload-time = "2025-10-22T09:52:18.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/fc6c54a8b5bfbee50e650f885ddef4f8c4f92880467ea0bc2bf133747048/python_bidi-0.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:24388c77cb00b8aa0f9c84beb7e3e523a3dac4f786ece64a1d8175a07b24da72", size = 493970, upload-time = "2025-10-22T09:52:29.815Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/2c15f5b938b2e087e4e950cc14dcead5bedbaabfc6c576dac15739bc0c91/python_bidi-0.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:19737d217088ef27014f98eac1827c5913e6fb1dea96332ed84ede61791070d9", size = 465161, upload-time = "2025-10-22T09:52:40.517Z" }, + { url = "https://files.pythonhosted.org/packages/56/d7/73a70a1fb819152485521b8dfe627e14ba9d3d5a65213244ab099adf3600/python_bidi-0.6.7-cp311-cp311-win32.whl", hash = "sha256:95c9de7ebc55ffb777548f2ecaf4b96b0fa0c92f42bf4d897b9f4cd164ec7394", size = 157033, upload-time = "2025-10-22T09:52:59.228Z" }, + { url = "https://files.pythonhosted.org/packages/68/84/06999dc54ea047fe33209af7150df4202ab7ad52deeb66b2c2040ac07884/python_bidi-0.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:898db0ea3e4aaa95b7fecba02a7560dfbf368f9d85053f2875f6d610c4d4ec2c", size = 161282, upload-time = "2025-10-22T09:52:51.467Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/5b2f3e73501d0f41ebc2b075b49473047c6cdfc3465cf890263fc69e3915/python_bidi-0.6.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:11c51579e01f768446a7e13a0059fea1530936a707abcbeaad9467a55cb16073", size = 272536, upload-time = "2025-10-22T09:51:59.721Z" }, + { url = "https://files.pythonhosted.org/packages/31/77/c6048e938a73e5a7c6fa3d5e3627a5961109daa728c2e7d050567cecdc26/python_bidi-0.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47deaada8949af3a790f2cd73b613f9bfa153b4c9450f91c44a60c3109a81f73", size = 263258, upload-time = "2025-10-22T09:51:50.328Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/ed4dc501cab7de70ce35cd435c86278e4eb1caf238c80bc72297767c9219/python_bidi-0.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b38ddfab41d10e780edb431edc30aec89bee4ce43d718e3896e99f33dae5c1d3", size = 292700, upload-time = "2025-10-22T09:50:59.628Z" }, + { url = "https://files.pythonhosted.org/packages/77/6a/1bf06d7544c940ffddd97cd0e02c55348a92163c5495fa18e34217dfbebe/python_bidi-0.6.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a93b0394cc684d64356b0475858c116f1e335ffbaba388db93bf47307deadfa", size = 300881, upload-time = "2025-10-22T09:51:07.507Z" }, + { url = "https://files.pythonhosted.org/packages/22/1d/ce7577a8f50291c06e94f651ac5de0d1678fc2642af26a5dad9901a0244f/python_bidi-0.6.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec1694134961b71ac05241ac989b49ccf08e232b5834d5fc46f8a7c3bb1c13a9", size = 439125, upload-time = "2025-10-22T09:51:16.559Z" }, + { url = "https://files.pythonhosted.org/packages/a3/87/4cf6dcd58e22f0fd904e7a161c6b73a5f9d17d4d49073fcb089ba62f1469/python_bidi-0.6.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8047c33b85f7790474a1f488bef95689f049976a4e1c6f213a8d075d180a93e4", size = 325816, upload-time = "2025-10-22T09:51:25.12Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0a/4028a088e29ce8f1673e85ec9f64204fc368355c3207e6a71619c2b4579a/python_bidi-0.6.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9de35eb5987da27dd81e371c52142dd8e924bd61c1006003071ea05a735587", size = 300550, upload-time = "2025-10-22T09:51:42.739Z" }, + { url = "https://files.pythonhosted.org/packages/1f/05/cac15eba462d5a2407ac4ef1c792c45a948652b00c6bd81eaab3834a62d2/python_bidi-0.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a99d898ad1a399d9c8cab5561b3667fd24f4385820ac90c3340aa637aa5adfc9", size = 313017, upload-time = "2025-10-22T09:51:34.905Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b1/3ba91b9ea60fa54a9aa730a5fe432bd73095d55be371244584fc6818eae1/python_bidi-0.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5debaab33562fdfc79ffdbd8d9c51cf07b8529de0e889d8cd145d78137aab21e", size = 472798, upload-time = "2025-10-22T09:52:09.079Z" }, + { url = "https://files.pythonhosted.org/packages/50/40/4bf5fb7255e35c218174f322a4d4c80b63b2604d73adc6e32f843e700824/python_bidi-0.6.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c11c62a3cdb9d1426b1536de9e3446cb09c7d025bd4df125275cae221f214899", size = 565234, upload-time = "2025-10-22T09:52:19.703Z" }, + { url = "https://files.pythonhosted.org/packages/bd/81/ad23fb85bff69d0a25729cd3834254b87c3c7caa93d657c8f8edcbed08f6/python_bidi-0.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6c051f2d28ca542092d01da8b5fe110fb6191ff58d298a54a93dc183bece63bf", size = 491844, upload-time = "2025-10-22T09:52:31.216Z" }, + { url = "https://files.pythonhosted.org/packages/65/85/103baaf142b2838f583b71904a2454fa31bd2a912ff505c25874f45d6c3e/python_bidi-0.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95867a07c5dee0ea2340fe1d0e4f6d9f5c5687d473193b6ee6f86fa44aac45d1", size = 463753, upload-time = "2025-10-22T09:52:41.943Z" }, + { url = "https://files.pythonhosted.org/packages/54/c3/6a5c3b9f42a6b188430c83a7e70a76bc7c0db3354302fce7c8ed94a0c062/python_bidi-0.6.7-cp312-cp312-win32.whl", hash = "sha256:4c73cd980d45bb967799c7f0fc98ea93ae3d65b21ef2ba6abef6a057720bf483", size = 155820, upload-time = "2025-10-22T09:53:00.254Z" }, + { url = "https://files.pythonhosted.org/packages/45/c4/683216398ee3abf6b9bb0f26ae15c696fabbe36468ba26d5271f0c11b343/python_bidi-0.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:d524a4ba765bae9b950706472a77a887a525ed21144fe4b41f6190f6e57caa2c", size = 159966, upload-time = "2025-10-22T09:52:52.547Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/6135798d84b62eea70c0f9435301c2a4ba854e87be93a3fcd1d935266d24/python_bidi-0.6.7-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c9a679b24f5c6f366a0dec75745e1abeae2f597f033d0d54c74cbe62e7e6ae28", size = 276275, upload-time = "2025-10-22T09:52:05.078Z" }, + { url = "https://files.pythonhosted.org/packages/74/83/2123596d43e552af9e2806e361646fa579f34a1d1e9e2c1707a0ab6a02dd/python_bidi-0.6.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:05fe5971110013610f0db40505d0b204edc756e92eafac1372a464f8b9162b11", size = 266951, upload-time = "2025-10-22T09:51:56.216Z" }, + { url = "https://files.pythonhosted.org/packages/5c/8c/8d1e1501717227a6d52fc7b9c47a3de61486b024fbdd4821bfad724c0699/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17572944e6d8fb616d111fc702c759da2bf7cedab85a3e4fa2af0c9eb95ed438", size = 295745, upload-time = "2025-10-22T09:51:04.438Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/ef04e7f9067c2c5d862b9f8d9a192486c500c8aa295f0fb756c25ab47fc8/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3b63d19f3f56ff7f99bce5ca9ef8c811dbf0f509d8e84c1bc06105ed26a49528", size = 304123, upload-time = "2025-10-22T09:51:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/be/72/b973895e257a7d4cc8365ab094612f6ee885df863a4964d8865b9f534b67/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1350033431d75be749273236dcfc808e54404cd6ece6204cdb1bc4ccc163455", size = 442484, upload-time = "2025-10-22T09:51:21.575Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/68ca9d10bc309828e8cdb2d57a30dd7e5753ac8520c8d7a0322daeb9eef7/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c5fb99f774748de283fadf915106f130b74be1bade934b7f73a7a8488b95da1", size = 329149, upload-time = "2025-10-22T09:51:31.232Z" }, + { url = "https://files.pythonhosted.org/packages/03/40/ab450c06167a7de596d99b1ba5cee2c605b3ff184baccf08210ede706b1b/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d28e2bdcadf5b6161bb4ee9313ce41eac746ba57e744168bf723a415a11af05", size = 303529, upload-time = "2025-10-22T09:51:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c5/585b5c413e3b77a32500fb877ea30aa23c45a6064dbd7fe77d87b72cd90b/python_bidi-0.6.7-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3777ae3e088e94df854fbcbd8d59f9239b74aac036cb6bbd19f8035c8e42478", size = 317753, upload-time = "2025-10-22T09:51:39.272Z" }, + { url = "https://files.pythonhosted.org/packages/f9/05/b7b4b447890d614ccb40633f4d65f334bcf9fe3ad13be33aaa54dcbc34f3/python_bidi-0.6.7-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:77bb4cbadf4121db395189065c58c9dd5d1950257cc1983004e6df4a3e2f97ad", size = 476054, upload-time = "2025-10-22T09:52:15.856Z" }, + { url = "https://files.pythonhosted.org/packages/ca/94/64f6d2c09c4426918345b54ca8902f94b663eadd744c9dd89070f546c9bc/python_bidi-0.6.7-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:f1fe71c203f66bc169a393964d5702f9251cfd4d70279cb6453fdd42bd2e675f", size = 568365, upload-time = "2025-10-22T09:52:27.556Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d2/c39a6b82aa0fcedac7cbe6078b78bb9089b43d903f8e00859e42b504bb8e/python_bidi-0.6.7-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:d87ed09e5c9b6d2648e8856a4e556147b9d3cd4d63905fa664dd6706bc414256", size = 495292, upload-time = "2025-10-22T09:52:38.306Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8d/a80f37ab92118e305d7b574306553599f81534c50b4eb23ef34ebe09c09c/python_bidi-0.6.7-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:766d5f5a686eb99b53168a7bdfb338035931a609bdbbcb537cef9e050a86f359", size = 467159, upload-time = "2025-10-22T09:52:48.603Z" }, ] [[package]] @@ -5028,62 +4717,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] -[[package]] -name = "python-dotenv" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, -] - [[package]] name = "python-xlib" version = "0.33" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six", marker = "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (sys_platform != 'darwin' and sys_platform != 'win32')" }, + { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/86/f5/8c0653e5bb54e0cbdfe27bf32d41f27bc4e12faa8742778c17f2a71be2c0/python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32", size = 269068, upload-time = "2022-12-25T18:53:00.824Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fc/b8/ff33610932e0ee81ae7f1269c890f697d56ff74b9f5b2ee5d9b7fa2c5355/python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398", size = 182185, upload-time = "2022-12-25T18:52:58.662Z" }, ] -[[package]] -name = "pytools" -version = "2024.1.14" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs", marker = "python_full_version < '3.10'" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/36/03/a77353d9763877fa8984de29a32aaf26ca98227cc405157d46c8a6e1cf6a/pytools-2024.1.14.tar.gz", hash = "sha256:39e5bbaf81fa432e688b82dd0980212d18f97b23e51a8c7afe7592249fe40ab1", size = 83715, upload-time = "2024-09-05T14:30:00.147Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/19/87514026ff33ae67681e7e721872db8d34fd0fc25ec28906fb7b1e5c57d0/pytools-2024.1.14-py3-none-any.whl", hash = "sha256:f70c549cdab36e4d31a48a88ce8d969af24816482d73b10012dcac42ce9425e8", size = 89876, upload-time = "2024-09-05T14:29:58.592Z" }, -] - [[package]] name = "pytz" -version = "2025.2" +version = "2026.1.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088, upload-time = "2026-03-03T07:47:50.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] [[package]] name = "pywin32" -version = "310" +version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240, upload-time = "2025-03-17T00:55:46.783Z" }, - { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854, upload-time = "2025-03-17T00:55:48.783Z" }, - { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963, upload-time = "2025-03-17T00:55:50.969Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" }, - { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" }, - { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/a2/cd/d09d434630edb6a0c44ad5079611279a67530296cfe0451e003de7f449ff/pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a", size = 8848099, upload-time = "2025-03-17T00:55:42.415Z" }, - { url = "https://files.pythonhosted.org/packages/93/ff/2a8c10315ffbdee7b3883ac0d1667e267ca8b3f6f640d81d43b87a82c0c7/pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475", size = 9602031, upload-time = "2025-03-17T00:55:44.512Z" }, + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, ] [[package]] @@ -5091,13 +4759,12 @@ name = "pywinhook" version = "1.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "pywin32" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/d1/6dcf4a17f425a5e3e2c011bac622dacae3128e96fd038b3e6f56c0e7a032/pyWinhook-1.6.2.zip", hash = "sha256:18fe2f63245d8a2f9d83f8d9c385e3695a6363badd50d492eb3e7f6f06a01c0c", size = 15791, upload-time = "2020-01-17T22:00:09.328Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8b/b0/9295fc63473b17eb89346005139fb87eb0c7f2db6b88a069a8126fad8dc6/pyWinhook-1.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:ee2862dce5af02e54879fa9117e78cb736f8cc31e07a18ae6399ee33f4537b53", size = 29979, upload-time = "2023-04-16T17:54:11.501Z" }, { url = "https://files.pythonhosted.org/packages/65/0f/03ebec3eb79a06b130b6ec165ba263e72c2e15aa406c2ed49fe4d07a37e5/pyWinhook-1.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:c478bf3142ab63cc0fac83250228269113f25b06f2a9142e5772fbb9429d67b8", size = 29950, upload-time = "2023-04-16T17:54:12.673Z" }, - { url = "https://files.pythonhosted.org/packages/29/d0/0a5e6bb1e603a7729a4c2d44881cccdd7526371a99020422270c4ec4740e/pyWinhook-1.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:26e9408ccabe393244f7a164fa82b3cab0c7fc6bf96957a9f35732ec59fedf1c", size = 29981, upload-time = "2023-04-16T17:54:14.273Z" }, ] [[package]] @@ -5114,96 +4781,89 @@ wheels = [ [[package]] name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, - { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload-time = "2024-08-06T20:33:25.896Z" }, - { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload-time = "2024-08-06T20:33:27.212Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload-time = "2024-08-06T20:33:28.974Z" }, - { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload-time = "2024-08-06T20:33:34.157Z" }, - { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload-time = "2024-08-06T20:33:35.84Z" }, - { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload-time = "2024-08-06T20:33:37.501Z" }, - { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload-time = "2024-08-06T20:33:39.389Z" }, - { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload-time = "2024-08-06T20:33:46.63Z" }, - { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload-time = "2024-08-06T20:33:49.073Z" }, +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, ] [[package]] name = "pyzmq" -version = "26.4.0" +version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293, upload-time = "2025-04-04T12:05:44.049Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/b8/af1d814ffc3ff9730f9a970cbf216b6f078e5d251a25ef5201d7bc32a37c/pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918", size = 1339238, upload-time = "2025-04-04T12:03:07.022Z" }, - { url = "https://files.pythonhosted.org/packages/ee/e4/5aafed4886c264f2ea6064601ad39c5fc4e9b6539c6ebe598a859832eeee/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315", size = 672848, upload-time = "2025-04-04T12:03:08.591Z" }, - { url = "https://files.pythonhosted.org/packages/79/39/026bf49c721cb42f1ef3ae0ee3d348212a7621d2adb739ba97599b6e4d50/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b", size = 911299, upload-time = "2025-04-04T12:03:10Z" }, - { url = "https://files.pythonhosted.org/packages/03/23/b41f936a9403b8f92325c823c0f264c6102a0687a99c820f1aaeb99c1def/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4", size = 867920, upload-time = "2025-04-04T12:03:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/c1/3e/2de5928cdadc2105e7c8f890cc5f404136b41ce5b6eae5902167f1d5641c/pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f", size = 862514, upload-time = "2025-04-04T12:03:13.013Z" }, - { url = "https://files.pythonhosted.org/packages/ce/57/109569514dd32e05a61d4382bc88980c95bfd2f02e58fea47ec0ccd96de1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5", size = 1204494, upload-time = "2025-04-04T12:03:14.795Z" }, - { url = "https://files.pythonhosted.org/packages/aa/02/dc51068ff2ca70350d1151833643a598625feac7b632372d229ceb4de3e1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a", size = 1514525, upload-time = "2025-04-04T12:03:16.246Z" }, - { url = "https://files.pythonhosted.org/packages/48/2a/a7d81873fff0645eb60afaec2b7c78a85a377af8f1d911aff045d8955bc7/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b", size = 1414659, upload-time = "2025-04-04T12:03:17.652Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ea/813af9c42ae21845c1ccfe495bd29c067622a621e85d7cda6bc437de8101/pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980", size = 580348, upload-time = "2025-04-04T12:03:19.384Z" }, - { url = "https://files.pythonhosted.org/packages/20/68/318666a89a565252c81d3fed7f3b4c54bd80fd55c6095988dfa2cd04a62b/pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b", size = 643838, upload-time = "2025-04-04T12:03:20.795Z" }, - { url = "https://files.pythonhosted.org/packages/91/f8/fb1a15b5f4ecd3e588bfde40c17d32ed84b735195b5c7d1d7ce88301a16f/pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5", size = 559565, upload-time = "2025-04-04T12:03:22.676Z" }, - { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723, upload-time = "2025-04-04T12:03:24.358Z" }, - { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645, upload-time = "2025-04-04T12:03:25.693Z" }, - { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133, upload-time = "2025-04-04T12:03:27.625Z" }, - { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428, upload-time = "2025-04-04T12:03:29.004Z" }, - { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409, upload-time = "2025-04-04T12:03:31.032Z" }, - { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007, upload-time = "2025-04-04T12:03:32.687Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599, upload-time = "2025-04-04T12:03:34.084Z" }, - { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546, upload-time = "2025-04-04T12:03:35.478Z" }, - { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247, upload-time = "2025-04-04T12:03:36.846Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727, upload-time = "2025-04-04T12:03:38.578Z" }, - { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942, upload-time = "2025-04-04T12:03:40.143Z" }, - { url = "https://files.pythonhosted.org/packages/06/91/21d3af57bc77e86e9d1e5384f256fd25cdb4c8eed4c45c8119da8120915f/pyzmq-26.4.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a88643de8abd000ce99ca72056a1a2ae15881ee365ecb24dd1d9111e43d57842", size = 1340634, upload-time = "2025-04-04T12:04:47.661Z" }, - { url = "https://files.pythonhosted.org/packages/54/e6/58cd825023e998a0e49db7322b3211e6cf93f0796710b77d1496304c10d1/pyzmq-26.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a744ce209ecb557406fb928f3c8c55ce79b16c3eeb682da38ef5059a9af0848", size = 907880, upload-time = "2025-04-04T12:04:49.294Z" }, - { url = "https://files.pythonhosted.org/packages/72/83/619e44a766ef738cb7e8ed8e5a54565627801bdb027ca6dfb70762385617/pyzmq-26.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9434540f333332224ecb02ee6278b6c6f11ea1266b48526e73c903119b2f420f", size = 863003, upload-time = "2025-04-04T12:04:51Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6a/a59af31320598bdc63d2c5a3181d14a89673c2c794540678285482e8a342/pyzmq-26.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c6f0a23e55cd38d27d4c89add963294ea091ebcb104d7fdab0f093bc5abb1c", size = 673432, upload-time = "2025-04-04T12:04:52.611Z" }, - { url = "https://files.pythonhosted.org/packages/29/ae/64dd6c18b08ce2cb009c60f11cf01c87f323acd80344d8b059c0304a7370/pyzmq-26.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6145df55dc2309f6ef72d70576dcd5aabb0fd373311613fe85a5e547c722b780", size = 1205221, upload-time = "2025-04-04T12:04:54.31Z" }, - { url = "https://files.pythonhosted.org/packages/d0/0b/c583ab750957b025244a66948831bc9ca486d11c820da4626caf6480ee1a/pyzmq-26.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2ea81823840ef8c56e5d2f9918e4d571236294fea4d1842b302aebffb9e40997", size = 1515299, upload-time = "2025-04-04T12:04:56.063Z" }, - { url = "https://files.pythonhosted.org/packages/22/ba/95ba76292c49dd9c6dff1f127b4867033020b708d101cba6e4fc5a3d166d/pyzmq-26.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc2abc385dc37835445abe206524fbc0c9e3fce87631dfaa90918a1ba8f425eb", size = 1415366, upload-time = "2025-04-04T12:04:58.241Z" }, - { url = "https://files.pythonhosted.org/packages/6e/65/51abe36169effda26ac7400ffac96f463e09dff40d344cdc2629d9a59162/pyzmq-26.4.0-cp39-cp39-win32.whl", hash = "sha256:41a2508fe7bed4c76b4cf55aacfb8733926f59d440d9ae2b81ee8220633b4d12", size = 580773, upload-time = "2025-04-04T12:04:59.786Z" }, - { url = "https://files.pythonhosted.org/packages/89/68/d9ac94086c63a0ed8d73e9e8aec54b39f481696698a5a939a7207629fb30/pyzmq-26.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4000e8255d6cbce38982e5622ebb90823f3409b7ffe8aeae4337ef7d6d2612a", size = 644340, upload-time = "2025-04-04T12:05:01.389Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8f/66c261d657c1b0791ee5b372c90b1646b453adb581fcdc1dc5c94e5b03e3/pyzmq-26.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f6919d9c120488246bdc2a2f96662fa80d67b35bd6d66218f457e722b3ff64", size = 560075, upload-time = "2025-04-04T12:05:02.975Z" }, - { url = "https://files.pythonhosted.org/packages/47/03/96004704a84095f493be8d2b476641f5c967b269390173f85488a53c1c13/pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba", size = 834408, upload-time = "2025-04-04T12:05:04.569Z" }, - { url = "https://files.pythonhosted.org/packages/e4/7f/68d8f3034a20505db7551cb2260248be28ca66d537a1ac9a257913d778e4/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b", size = 569580, upload-time = "2025-04-04T12:05:06.283Z" }, - { url = "https://files.pythonhosted.org/packages/9b/a6/2b0d6801ec33f2b2a19dd8d02e0a1e8701000fec72926e6787363567d30c/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94", size = 798250, upload-time = "2025-04-04T12:05:07.88Z" }, - { url = "https://files.pythonhosted.org/packages/96/2a/0322b3437de977dcac8a755d6d7ce6ec5238de78e2e2d9353730b297cf12/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a", size = 756758, upload-time = "2025-04-04T12:05:09.483Z" }, - { url = "https://files.pythonhosted.org/packages/c2/33/43704f066369416d65549ccee366cc19153911bec0154da7c6b41fca7e78/pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb", size = 555371, upload-time = "2025-04-04T12:05:11.062Z" }, - { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405, upload-time = "2025-04-04T12:05:13.3Z" }, - { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578, upload-time = "2025-04-04T12:05:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248, upload-time = "2025-04-04T12:05:17.376Z" }, - { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757, upload-time = "2025-04-04T12:05:19.19Z" }, - { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371, upload-time = "2025-04-04T12:05:20.702Z" }, - { url = "https://files.pythonhosted.org/packages/af/b2/71a644b629e1a93ccae9e22a45aec9d23065dfcc24c399cb837f81cd08c2/pyzmq-26.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:552b0d2e39987733e1e9e948a0ced6ff75e0ea39ab1a1db2fc36eb60fd8760db", size = 834397, upload-time = "2025-04-04T12:05:31.217Z" }, - { url = "https://files.pythonhosted.org/packages/a9/dd/052a25651eaaff8f5fd652fb40a3abb400e71207db2d605cf6faf0eac598/pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd670a8aa843f2ee637039bbd412e0d7294a5e588e1ecc9ad98b0cdc050259a4", size = 569571, upload-time = "2025-04-04T12:05:32.877Z" }, - { url = "https://files.pythonhosted.org/packages/a5/5d/201ca10b5d12ab187a418352c06d70c3e2087310af038b11056aba1359be/pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d367b7b775a0e1e54a59a2ba3ed4d5e0a31566af97cc9154e34262777dab95ed", size = 798243, upload-time = "2025-04-04T12:05:34.91Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d4/2c64e54749536ad1633400f28d71e71e19375d00ce1fe9bb1123364dc927/pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112af16c406e4a93df2caef49f884f4c2bb2b558b0b5577ef0b2465d15c1abc", size = 756751, upload-time = "2025-04-04T12:05:37.12Z" }, - { url = "https://files.pythonhosted.org/packages/08/e6/34d119af43d06a8dcd88bf7a62dac69597eaba52b49ecce76ff06b40f1fd/pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76c298683f82669cab0b6da59071f55238c039738297c69f187a542c6d40099", size = 745400, upload-time = "2025-04-04T12:05:40.694Z" }, - { url = "https://files.pythonhosted.org/packages/f8/49/b5e471d74a63318e51f30d329b17d2550bdededaab55baed2e2499de7ce4/pyzmq-26.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:49b6ca2e625b46f499fb081aaf7819a177f41eeb555acb05758aa97f4f95d147", size = 555367, upload-time = "2025-04-04T12:05:42.356Z" }, +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]] @@ -5212,11 +4872,12 @@ version = "2023.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "json-tricks" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "scipy" }, - { name = "xarray", version = "2024.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "xarray", version = "2025.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "xarray", version = "2025.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "xarray", version = "2026.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/2c/5b2a389da04f444d9ee503dfeae0f38b2a5ab4ae764d7f94ab5ae6882d75/questplus-2023.1.tar.gz", hash = "sha256:89337d613834fa365dc4a1b25496ccf17debb0d6d5a56c6b12a647da8195ca8e", size = 56886, upload-time = "2023-04-05T06:21:22.085Z" } wheels = [ @@ -5225,7 +4886,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.3" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -5233,57 +4894,104 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, ] [[package]] -name = "roman-numerals-py" -version = "3.1.0" +name = "roman-numerals" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, ] [[package]] name = "scipy" -version = "1.13.1" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" } }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720, upload-time = "2024-05-23T03:29:26.079Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076, upload-time = "2024-05-23T03:19:01.687Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232, upload-time = "2024-05-23T03:19:09.089Z" }, - { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202, upload-time = "2024-05-23T03:19:15.138Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335, upload-time = "2024-05-23T03:19:21.984Z" }, - { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728, upload-time = "2024-05-23T03:19:28.225Z" }, - { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588, upload-time = "2024-05-23T03:19:35.661Z" }, - { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805, upload-time = "2024-05-23T03:19:43.081Z" }, - { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687, upload-time = "2024-05-23T03:19:48.799Z" }, - { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638, upload-time = "2024-05-23T03:19:55.104Z" }, - { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931, upload-time = "2024-05-23T03:20:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145, upload-time = "2024-05-23T03:20:09.173Z" }, - { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227, upload-time = "2024-05-23T03:20:16.433Z" }, - { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927, upload-time = "2024-05-23T03:21:01.95Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538, upload-time = "2024-05-23T03:21:07.634Z" }, - { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190, upload-time = "2024-05-23T03:21:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244, upload-time = "2024-05-23T03:21:21.827Z" }, - { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637, upload-time = "2024-05-23T03:21:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440, upload-time = "2024-05-23T03:21:35.888Z" }, + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, ] [[package]] name = "setuptools" -version = "70.3.0" +version = "82.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/d8/10a70e86f6c28ae59f101a9de6d77bf70f147180fbf40c3af0f64080adc3/setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", size = 2333112, upload-time = "2024-07-09T16:08:06.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/f3/748f4d6f65d1756b9ae577f329c951cda23fb900e4de9f70900ced962085/setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb", size = 1144893, upload-time = "2026-02-08T15:08:40.206Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/15/88e46eb9387e905704b69849618e699dc2f54407d8953cc4ec4b8b46528d/setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc", size = 931070, upload-time = "2024-07-09T16:07:58.829Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0", size = 1003468, upload-time = "2026-02-08T15:08:38.723Z" }, ] [[package]] @@ -5306,17 +5014,18 @@ wheels = [ [[package]] name = "sounddevice" -version = "0.5.2" +version = "0.5.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/a6/91e9f08ed37c7c9f56b5227c6aea7f2ae63ba2d59520eefb24e82cbdd589/sounddevice-0.5.2.tar.gz", hash = "sha256:c634d51bd4e922d6f0fa5e1a975cc897c947f61d31da9f79ba7ea34dff448b49", size = 53150, upload-time = "2025-05-16T18:12:27.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/f9/2592608737553638fca98e21e54bfec40bf577bb98a61b2770c912aab25e/sounddevice-0.5.5.tar.gz", hash = "sha256:22487b65198cb5bf2208755105b524f78ad173e5ab6b445bdab1c989f6698df3", size = 143191, upload-time = "2026-01-23T18:36:43.529Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/2d/582738fc01352a5bc20acac9221e58538365cecb3bb264838f66419df219/sounddevice-0.5.2-py3-none-any.whl", hash = "sha256:82375859fac2e73295a4ab3fc60bd4782743157adc339561c1f1142af472f505", size = 32450, upload-time = "2025-05-16T18:12:21.919Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6f/e3dd751face4fcb5be25e8abba22f25d8e6457ebd7e9ed79068b768dc0e5/sounddevice-0.5.2-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:943f27e66037d41435bdd0293454072cdf657b594c9cde63cd01ee3daaac7ab3", size = 108088, upload-time = "2025-05-16T18:12:23.146Z" }, - { url = "https://files.pythonhosted.org/packages/45/0b/bfad79af0b380aa7c0bfe73e4b03e0af45354a48ad62549489bd7696c5b0/sounddevice-0.5.2-py3-none-win32.whl", hash = "sha256:3a113ce614a2c557f14737cb20123ae6298c91fc9301eb014ada0cba6d248c5f", size = 312665, upload-time = "2025-05-16T18:12:24.726Z" }, - { url = "https://files.pythonhosted.org/packages/e1/3e/61d88e6b0a7383127cdc779195cb9d83ebcf11d39bc961de5777e457075e/sounddevice-0.5.2-py3-none-win_amd64.whl", hash = "sha256:e18944b767d2dac3771a7771bdd7ff7d3acd7d334e72c4bedab17d1aed5dbc22", size = 363808, upload-time = "2025-05-16T18:12:26Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0a/478e441fd049002cf308520c0d62dd8333e7c6cc8d997f0dda07b9fbcc46/sounddevice-0.5.5-py3-none-any.whl", hash = "sha256:30ff99f6c107f49d25ad16a45cacd8d91c25a1bcdd3e81a206b921a3a6405b1f", size = 32807, upload-time = "2026-01-23T18:36:35.649Z" }, + { url = "https://files.pythonhosted.org/packages/56/f9/c037c35f6d0b6bc3bc7bfb314f1d6f1f9a341328ef47cd63fc4f850a7b27/sounddevice-0.5.5-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:05eb9fd6c54c38d67741441c19164c0dae8ce80453af2d8c4ad2e7823d15b722", size = 108557, upload-time = "2026-01-23T18:36:37.41Z" }, + { url = "https://files.pythonhosted.org/packages/88/a1/d19dd9889cd4bce2e233c4fac007cd8daaf5b9fe6e6a5d432cf17be0b807/sounddevice-0.5.5-py3-none-win32.whl", hash = "sha256:1234cc9b4c9df97b6cbe748146ae0ec64dd7d6e44739e8e42eaa5b595313a103", size = 317765, upload-time = "2026-01-23T18:36:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0e/002ed7c4c1c2ab69031f78989d3b789fee3a7fba9e586eb2b81688bf4961/sounddevice-0.5.5-py3-none-win_amd64.whl", hash = "sha256:cfc6b2c49fb7f555591c78cb8ecf48d6a637fd5b6e1db5fec6ed9365d64b3519", size = 365324, upload-time = "2026-01-23T18:36:40.496Z" }, + { url = "https://files.pythonhosted.org/packages/4e/39/a61d4b83a7746b70d23d9173be688c0c6bfc7173772344b7442c2c155497/sounddevice-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3861901ddd8230d2e0e8ae62ac320cdd4c688d81df89da036dcb812f757bb3e6", size = 317115, upload-time = "2026-01-23T18:36:42.235Z" }, ] [[package]] @@ -5325,8 +5034,8 @@ version = "0.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156, upload-time = "2025-01-25T09:17:04.831Z" } wheels = [ @@ -5350,67 +5059,30 @@ wheels = [ [[package]] name = "sphinx" -version = "7.4.7" +version = "8.1.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "babel", marker = "python_full_version < '3.10'" }, - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version < '3.10'" }, - { name = "imagesize", marker = "python_full_version < '3.10'" }, - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, - { name = "jinja2", marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pygments", marker = "python_full_version < '3.10'" }, - { name = "requests", marker = "python_full_version < '3.10'" }, - { name = "snowballstemmer", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.10'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.10'" }, - { name = "tomli", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, -] - -[[package]] -name = "sphinx" -version = "8.1.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -dependencies = [ - { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "babel", marker = "python_full_version == '3.10.*'" }, - { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version == '3.10.*'" }, - { name = "imagesize", marker = "python_full_version == '3.10.*'" }, - { name = "jinja2", marker = "python_full_version == '3.10.*'" }, - { name = "packaging", marker = "python_full_version == '3.10.*'" }, - { name = "pygments", marker = "python_full_version == '3.10.*'" }, - { name = "requests", marker = "python_full_version == '3.10.*'" }, - { name = "snowballstemmer", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.10.*'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.10.*'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ @@ -5419,36 +5091,34 @@ wheels = [ [[package]] name = "sphinx" -version = "8.2.3" +version = "9.0.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", + "python_full_version >= '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "babel", marker = "python_full_version >= '3.11'" }, - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version >= '3.11'" }, - { name = "imagesize", marker = "python_full_version >= '3.11'" }, - { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "requests", marker = "python_full_version >= '3.11'" }, - { name = "roman-numerals-py", marker = "python_full_version >= '3.11'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] [[package]] @@ -5456,9 +5126,8 @@ name = "sphinx-copybutton" version = "0.5.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } wheels = [ @@ -5469,16 +5138,34 @@ wheels = [ name = "sphinx-design" version = "0.6.1" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] dependencies = [ - { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, ] +[[package]] +name = "sphinx-design" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'win32'", + "python_full_version >= '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/7b/804f311da4663a4aecc6cf7abd83443f3d4ded970826d0c958edc77d4527/sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a", size = 2203582, upload-time = "2026-01-19T13:12:53.297Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl", hash = "sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282", size = 2220350, upload-time = "2026-01-19T13:12:51.077Z" }, +] + [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" @@ -5535,49 +5222,15 @@ wheels = [ [[package]] name = "sphinxcontrib-svg2pdfconverter" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/7a/21930ae148f94c458ca2f8f554d4e737e17c1db8b152238f530fc0c89e32/sphinxcontrib_svg2pdfconverter-2.0.0.tar.gz", hash = "sha256:ab9c8f1080391e231812d20abf2657a69ee35574563b1014414f953964a95fa3", size = 6411, upload-time = "2025-12-01T20:44:21.386Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/c9/f443a3559d605cb37516e32638c45d5ab19f74d58709a9603aebefec01dd/sphinxcontrib_svg2pdfconverter-2.0.0-py3-none-any.whl", hash = "sha256:b23bfda91aecd24287bfcf1b30dd728086a205decc5a46cf2f4b2aa4a0d1f447", size = 8302, upload-time = "2025-12-01T20:44:20.216Z" }, -] - -[[package]] -name = "tables" -version = "3.9.1" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] dependencies = [ - { name = "blosc2", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numexpr", marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "py-cpuinfo", marker = "python_full_version < '3.10'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/69/eb8a7666086352a9840a834a526326e42abc5dd984e0c0d6961e782f5cda/tables-3.9.1.tar.gz", hash = "sha256:48331503cd509c9f1f95cf2f5c64a57c48c0aa5141423f0eca352965c4f9bf81", size = 4682299, upload-time = "2023-10-06T15:53:05.044Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/05/11b12853b6a0398bd19d5464b68cb97dde21c354265ff2c1929f92ae03a9/sphinxcontrib_svg2pdfconverter-2.1.0.tar.gz", hash = "sha256:9756e82d5f3bf11629ffcbafb1f8a1092d3bb4789e33494032cdce9a9c8459d3", size = 6805, upload-time = "2026-03-05T18:23:44.74Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/a8/cbb483b6a30b72434744755384ad71693e020c06ff3eafa6f1e414246147/tables-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:784c1ffe7f972e69a9c97c0f164064e43617727668df4333802a7f23cfb06ee3", size = 7299704, upload-time = "2023-10-06T15:51:23.165Z" }, - { url = "https://files.pythonhosted.org/packages/51/74/6f3af030f6e6e83aed59075233c8ddfc4ce182b185e867f0202297d929d7/tables-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af92f1e63b9fcadea621ab544540b7312553ea4f9456cf3d2728b48346fa557c", size = 7102959, upload-time = "2023-10-06T15:51:36.525Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/e91da20c4de8498d859bd779e333d8a84cc82a67332c22fdf4ac34722d54/tables-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f725f69d49f414736de24616b4ffa400127b86417bd14a11854aacd2a505b4d", size = 7458741, upload-time = "2023-10-06T15:51:47.513Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1f/54dfcdd9831442ec8a192032a8a1324dad317cabcd0429307d890f5a7bdb/tables-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:e346249116b2eb95dd9277336c12f0d10d5328a5a3e8e16c74faa3c815817dc3", size = 4389248, upload-time = "2023-10-06T15:51:53.502Z" }, - { url = "https://files.pythonhosted.org/packages/be/56/799476185eaf7c78a4781d8a8944ed962ba67e01894fe15d6db5f4f103e4/tables-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f49e899247b541ed69d12fef10b5505b97243317a91b93927328c19a15d38671", size = 7265881, upload-time = "2023-10-06T15:52:01.235Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6c/9bdf9aea0955cd38025225ac23585cc2283555aac5d4e084420b9e6c8c6b/tables-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d1f2c947d63019db20728c6ecec39a1c900be00a65cae8025ac770148b641e8", size = 7101132, upload-time = "2023-10-06T15:52:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/b7/a5/638d516f5ab1dd4bbbdd109549dbca28a2e22452ddbbbce797a42919c4dd/tables-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb89fab4a3c3cd98bd781913234e1f67464ff6e17662180cf718e67645a09271", size = 7455040, upload-time = "2023-10-06T15:52:20.922Z" }, - { url = "https://files.pythonhosted.org/packages/d4/27/5445d581c52e16bad464e00c0df4ba0031788f448da54b871561a97cc846/tables-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:aa176e1c72b0f935b0e607218ea8302378a39ed4fef5a544ebbd8d0523b56b86", size = 4389577, upload-time = "2023-10-06T15:52:27.621Z" }, - { url = "https://files.pythonhosted.org/packages/ee/06/f174de58aade3bbb91a7a2009f86f6b5aa4300c10d0a6ce2f929ec7b5418/tables-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50140091af9d60eb3f806d3ee43f542beae569888c37ae96d6a1c887c389d8c8", size = 7264543, upload-time = "2023-10-06T15:50:38.3Z" }, - { url = "https://files.pythonhosted.org/packages/09/a9/ebcdb3e548e7273a37e6273140afcba0dfcfb9f2bd727cff69a7b9b7b7e6/tables-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:282a0747b3ce4e3108bcd443361e031c9817bf7e84358317723a51b9c02c5655", size = 7105961, upload-time = "2023-10-06T15:50:48.957Z" }, - { url = "https://files.pythonhosted.org/packages/54/b5/89b4922b920b508c3fff7a11d8a0e0bdde1634e0f1d058f09929aeb759c4/tables-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0295123272bb49efbebdc9b1e2b72baa99c5761b78fccacedbf44c52a5fa51ac", size = 7461037, upload-time = "2023-10-06T15:51:01.207Z" }, - { url = "https://files.pythonhosted.org/packages/94/65/d5ce8fbf3fa1abaab5acd153f0eddcd3a2efc53ef9823b1588d538af8ec2/tables-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:22084019437c504917ba8c0b2af75419e3d5c8ffc6d2ef4cd44031f06939518c", size = 4392240, upload-time = "2023-10-06T15:51:09.088Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7d/9b6b1ef6fe13bac6455d002ca4a626fac325cf94b4183f31cafe9b1ed17c/sphinxcontrib_svg2pdfconverter-2.1.0-py3-none-any.whl", hash = "sha256:805635ac274583e1606b0ec7fb21f16b69ca8ff223dd7e237d91127015628b0c", size = 9259, upload-time = "2026-03-05T18:23:43.662Z" }, ] [[package]] @@ -5585,18 +5238,16 @@ name = "tables" version = "3.10.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "blosc2", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numexpr", marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "packaging", marker = "python_full_version == '3.10.*'" }, - { name = "py-cpuinfo", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, + { name = "blosc2" }, + { name = "numexpr" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "py-cpuinfo" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0d/5d/96708a84e9fcd29d1f684d56d4c38a23d29b1c934599a072a49f27ccfa71/tables-3.10.1.tar.gz", hash = "sha256:4aa07ac734b9c037baeaf44aec64ec902ad247f57811b59f30c4e31d31f126cf", size = 4762413, upload-time = "2024-08-17T09:57:47.127Z" } wheels = [ @@ -5610,258 +5261,240 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/8f/897324e1ad543ca439b2c91f04c406f3eeda6e7ff2f43b4cd939f05043e4/tables-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01ca51624bca1a87e703d6d6b796368bc3460ff007ea8b1341be03bedd863833", size = 7166960, upload-time = "2024-08-17T09:57:17.463Z" }, { url = "https://files.pythonhosted.org/packages/4e/5c/3f21d1135bf60af99ac79a17bbffd333d69763df2197ba04f47dd30bbd4e/tables-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9372516c76be3a05a573df63a69ce38315d03b5816d2a1e89c48129ec8b161b0", size = 7568724, upload-time = "2024-08-17T09:57:23.02Z" }, { url = "https://files.pythonhosted.org/packages/1f/e3/3ee6b66263902eccadc4e0e23bca7fb480fd190904b7ce0bea4777b5b799/tables-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:09190fb504888aeacafb7739c13d5c5a3e87af3d261f4d2f832b1f8407be133a", size = 6312200, upload-time = "2024-08-17T09:57:26.322Z" }, + { url = "https://files.pythonhosted.org/packages/95/ec/ea6c476e33602c172c797fe8f8ab96d007d964137068276d142b142a28e5/tables-3.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7090af37909e3bf229d5599fa442633e5a93b6082960b01038dc0106e07a8da", size = 6791597, upload-time = "2024-08-17T09:57:29.598Z" }, + { url = "https://files.pythonhosted.org/packages/74/02/a967a506e9204e3328a8c03f67e6f3c919defc8df11aba83ae5b2abf7b0f/tables-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:203ed50c0c5f30f007df7633089b2a567b99856cd25d68f19d91624a8db2e7ad", size = 5474779, upload-time = "2024-08-17T09:57:32.43Z" }, + { url = "https://files.pythonhosted.org/packages/c3/26/925793f753664ec698b2c6315c818269313db143da38150897cf260405c2/tables-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e36ce9f10471c69c1f0b06c6966de762558a35d62592c55df7994a8019adaf0c", size = 7130683, upload-time = "2024-08-17T09:57:36.181Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/2b34f22284459e940a84e71dba19b2a34c7cc0ce3cdf685923c50d5b9611/tables-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f233e78cc9fa4157ec4c3ef2abf01a731fe7969bc6ed73539e5f4cd3b94c98b2", size = 7531367, upload-time = "2024-08-17T09:57:39.864Z" }, + { url = "https://files.pythonhosted.org/packages/3d/27/5a23830f611e26dd7ee104096c6bb82e481b16f3f17ccaed3075f8d48312/tables-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:34357d2f2f75843a44e6fe54d1f11fc2e35a8fd3cb134df3d3362cff78010adb", size = 6295046, upload-time = "2024-08-17T09:57:43.561Z" }, ] [[package]] name = "tables" -version = "3.10.2" +version = "3.11.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", + "python_full_version >= '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "blosc2", version = "3.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numexpr", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "py-cpuinfo", marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, + { name = "blosc2" }, + { name = "numexpr" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "py-cpuinfo" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/50/23ead25f60bb1babe7f2f061d8a2f8c2f6804c1a20b3058677beb9085b56/tables-3.10.2.tar.gz", hash = "sha256:2544812a7186fadba831d6dd34eb49ccd788d6a83f4e4c2b431b835b6796c910", size = 4779722, upload-time = "2025-01-04T20:44:13.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/a3/d213ebe7376d48055bd55a29cd9f99061afa0dcece608f94a5025d797b0a/tables-3.11.1.tar.gz", hash = "sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb", size = 4790533, upload-time = "2026-03-01T11:43:36.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/f6/ef0c376c1fa01b916d5db0c2681be063f6289ee99faf7bb6610e0b55b773/tables-3.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63f8adec3c4421a011c5c6a245c0c1fccf16dba7aaa67d9915d2821cf365ed4a", size = 6767194, upload-time = "2025-01-04T20:42:53.5Z" }, - { url = "https://files.pythonhosted.org/packages/d9/d0/accd41382fa9da45bf816c56f85bda64223a3b8d0006d3496b67e0781a6e/tables-3.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34c120bff666d33d3bdfb9e33173a4869d5f34e6c87824f2c7ec6a72c8dfab82", size = 5482665, upload-time = "2025-01-04T20:42:58.589Z" }, - { url = "https://files.pythonhosted.org/packages/59/2f/c95e94423c463177b8a7d55a1dbbd524840fe6a684844ff728f238e71f68/tables-3.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e71f63ac67c583ac42943c99c2d33bcc9e361e94d1ab1a763dc0698bdd9ff815", size = 7117696, upload-time = "2025-01-04T20:43:04.014Z" }, - { url = "https://files.pythonhosted.org/packages/88/d5/71665919aa2a5a3d2a20eeef3c71dc7c2ebbd9f26d114a7808514aba24d6/tables-3.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154773f97763ccc91a29bcead6ab7b5ef164c2ed8c409cd79a2115aa9b4184c9", size = 7520921, upload-time = "2025-01-04T20:43:10.002Z" }, - { url = "https://files.pythonhosted.org/packages/46/96/b5023c1f7b9d560cac3e2c0daceebaeb88dd24c70c75db2d291abfa563e5/tables-3.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:96b5e945d275415e79ddb0578657ecc6ac77030dcc0632ab2c39f89390bb239d", size = 6407137, upload-time = "2025-01-04T20:43:15.838Z" }, -] - -[[package]] -name = "tobii-research" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/5f/250eeac67f510e0a30dc3d881094da9e2cf03c1e4c11639ee7d89ef3c7cd/tobii_research-2.1.0-cp310-cp310-macosx_14_0_universal2.whl", hash = "sha256:a6f7f4ec4996afd0b13ce256f35908b5259efbf1a6163ac1a75dbae59fa546d4", size = 429000, upload-time = "2024-11-27T13:53:02.082Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c2/b0f52063dca55918e87d929ba8e78e1ac6dad464b4377c3fbd6a56c583a1/tobii_research-2.1.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:bf83653f92794e85cc7b17518f9115e96595cc47193695755c1ce98bc854e5b1", size = 318372, upload-time = "2024-11-27T13:53:03.858Z" }, - { url = "https://files.pythonhosted.org/packages/98/13/b78b1985cbcedfdced1a37b3c24afbe58ae2bfa51f793c58b057a4132fce/tobii_research-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b6a09cde04225a3fd63a0c6264810f65fa20192f98c6f318577ae5848a46bc3", size = 387307, upload-time = "2024-11-27T13:53:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/fa/bb/4a9cde6628563388db26fa86c64adb0f2475a757e72af0ec185fd520b72f/tables-3.11.1-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217", size = 7045977, upload-time = "2026-03-01T11:42:48.605Z" }, + { url = "https://files.pythonhosted.org/packages/78/74/6568c8d3aabf9982ab89fe3e378afbd7aad4894bde4570991a3246169ef4/tables-3.11.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc", size = 6264947, upload-time = "2026-03-01T11:42:53.192Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a3/ec228901fca4c996306b17f5c60a4105144df0bbd07b3a4a816f91f37b4a/tables-3.11.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e", size = 6903733, upload-time = "2026-03-01T11:42:58.349Z" }, + { url = "https://files.pythonhosted.org/packages/99/29/c2dc674ea70fa9a4819417289a9c0d3e4780835beeed573eb66964cfb763/tables-3.11.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67", size = 7241357, upload-time = "2026-03-01T11:43:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/60/b5/a59b62af4127790c618eb11c06c106706e07509a3fb9e346b2a3ffa74419/tables-3.11.1-cp311-abi3-win_amd64.whl", hash = "sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89", size = 6526565, upload-time = "2026-03-01T11:43:08.58Z" }, ] [[package]] name = "tomli" -version = "2.2.1" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { 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 = "typing-extensions" -version = "4.13.2" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] name = "ujson" -version = "5.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885, upload-time = "2024-05-14T02:02:34.233Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/91/91678e49a9194f527e60115db84368c237ac7824992224fac47dcb23a5c6/ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd", size = 55354, upload-time = "2024-05-14T02:00:27.054Z" }, - { url = "https://files.pythonhosted.org/packages/de/2f/1ed8c9b782fa4f44c26c1c4ec686d728a4865479da5712955daeef0b2e7b/ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf", size = 51808, upload-time = "2024-05-14T02:00:29.461Z" }, - { url = "https://files.pythonhosted.org/packages/51/bf/a3a38b2912288143e8e613c6c4c3f798b5e4e98c542deabf94c60237235f/ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6", size = 51995, upload-time = "2024-05-14T02:00:30.93Z" }, - { url = "https://files.pythonhosted.org/packages/b4/6d/0df8f7a6f1944ba619d93025ce468c9252aa10799d7140e07014dfc1a16c/ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569", size = 53566, upload-time = "2024-05-14T02:00:33.091Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ec/370741e5e30d5f7dc7f31a478d5bec7537ce6bfb7f85e72acefbe09aa2b2/ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770", size = 58499, upload-time = "2024-05-14T02:00:34.742Z" }, - { url = "https://files.pythonhosted.org/packages/fe/29/72b33a88f7fae3c398f9ba3e74dc2e5875989b25f1c1f75489c048a2cf4e/ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1", size = 997881, upload-time = "2024-05-14T02:00:36.492Z" }, - { url = "https://files.pythonhosted.org/packages/70/5c/808fbf21470e7045d56a282cf5e85a0450eacdb347d871d4eb404270ee17/ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5", size = 1140631, upload-time = "2024-05-14T02:00:38.995Z" }, - { url = "https://files.pythonhosted.org/packages/8f/6a/e1e8281408e6270d6ecf2375af14d9e2f41c402ab6b161ecfa87a9727777/ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51", size = 1043511, upload-time = "2024-05-14T02:00:41.352Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ca/e319acbe4863919ec62498bc1325309f5c14a3280318dca10fe1db3cb393/ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518", size = 38626, upload-time = "2024-05-14T02:00:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/78/ec/dc96ca379de33f73b758d72e821ee4f129ccc32221f4eb3f089ff78d8370/ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f", size = 42076, upload-time = "2024-05-14T02:00:46.56Z" }, - { url = "https://files.pythonhosted.org/packages/23/ec/3c551ecfe048bcb3948725251fb0214b5844a12aa60bee08d78315bb1c39/ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", size = 55353, upload-time = "2024-05-14T02:00:48.04Z" }, - { url = "https://files.pythonhosted.org/packages/8d/9f/4731ef0671a0653e9f5ba18db7c4596d8ecbf80c7922dd5fe4150f1aea76/ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", size = 51813, upload-time = "2024-05-14T02:00:49.28Z" }, - { url = "https://files.pythonhosted.org/packages/1f/2b/44d6b9c1688330bf011f9abfdb08911a9dc74f76926dde74e718d87600da/ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", size = 51988, upload-time = "2024-05-14T02:00:50.484Z" }, - { url = "https://files.pythonhosted.org/packages/29/45/f5f5667427c1ec3383478092a414063ddd0dfbebbcc533538fe37068a0a3/ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", size = 53561, upload-time = "2024-05-14T02:00:52.146Z" }, - { url = "https://files.pythonhosted.org/packages/26/21/a0c265cda4dd225ec1be595f844661732c13560ad06378760036fc622587/ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", size = 58497, upload-time = "2024-05-14T02:00:53.366Z" }, - { url = "https://files.pythonhosted.org/packages/28/36/8fde862094fd2342ccc427a6a8584fed294055fdee341661c78660f7aef3/ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", size = 997877, upload-time = "2024-05-14T02:00:55.095Z" }, - { url = "https://files.pythonhosted.org/packages/90/37/9208e40d53baa6da9b6a1c719e0670c3f474c8fc7cc2f1e939ec21c1bc93/ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", size = 1140632, upload-time = "2024-05-14T02:00:57.099Z" }, - { url = "https://files.pythonhosted.org/packages/89/d5/2626c87c59802863d44d19e35ad16b7e658e4ac190b0dead17ff25460b4c/ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", size = 1043513, upload-time = "2024-05-14T02:00:58.488Z" }, - { url = "https://files.pythonhosted.org/packages/2f/ee/03662ce9b3f16855770f0d70f10f0978ba6210805aa310c4eebe66d36476/ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", size = 38616, upload-time = "2024-05-14T02:01:00.463Z" }, - { url = "https://files.pythonhosted.org/packages/3e/20/952dbed5895835ea0b82e81a7be4ebb83f93b079d4d1ead93fcddb3075af/ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", size = 42071, upload-time = "2024-05-14T02:01:02.211Z" }, - { url = "https://files.pythonhosted.org/packages/97/94/50ff2f1b61d668907f20216873640ab19e0eaa77b51e64ee893f6adfb266/ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b", size = 55421, upload-time = "2024-05-14T02:01:49.765Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b3/3d2ca621d8dbeaf6c5afd0725e1b4bbd465077acc69eff1e9302735d1432/ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27", size = 51816, upload-time = "2024-05-14T02:01:51.047Z" }, - { url = "https://files.pythonhosted.org/packages/8d/af/5dc103cb4d08f051f82d162a738adb9da488d1e3fafb9fd9290ea3eabf8e/ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76", size = 52023, upload-time = "2024-05-14T02:01:53.072Z" }, - { url = "https://files.pythonhosted.org/packages/5d/dd/b9a6027ba782b0072bf24a70929e15a58686668c32a37aebfcfaa9e00bdd/ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5", size = 53622, upload-time = "2024-05-14T02:01:54.738Z" }, - { url = "https://files.pythonhosted.org/packages/1f/28/bcf6df25c1a9f1989dc2ddc4ac8a80e246857e089f91a9079fd8a0a01459/ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0", size = 58563, upload-time = "2024-05-14T02:01:55.991Z" }, - { url = "https://files.pythonhosted.org/packages/9e/82/89404453a102d06d0937f6807c0a7ef2eec68b200b4ce4386127f3c28156/ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1", size = 998050, upload-time = "2024-05-14T02:01:57.8Z" }, - { url = "https://files.pythonhosted.org/packages/63/eb/2a4ea07165cad217bc842bb684b053bafa8ffdb818c47911c621e97a33fc/ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1", size = 1140672, upload-time = "2024-05-14T02:01:59.875Z" }, - { url = "https://files.pythonhosted.org/packages/72/53/d7bdf6afabeba3ed899f89d993c7f202481fa291d8c5be031c98a181eda4/ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996", size = 1043577, upload-time = "2024-05-14T02:02:02.138Z" }, - { url = "https://files.pythonhosted.org/packages/19/b1/75f5f0d18501fd34487e46829de3070724c7b350f1983ba7f07e0986720b/ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9", size = 38654, upload-time = "2024-05-14T02:02:03.71Z" }, - { url = "https://files.pythonhosted.org/packages/77/0d/50d2f9238f6d6683ead5ecd32d83d53f093a3c0047ae4c720b6d586cb80d/ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a", size = 42134, upload-time = "2024-05-14T02:02:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/95/53/e5f5e733fc3525e65f36f533b0dbece5e5e2730b760e9beacf7e3d9d8b26/ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64", size = 51846, upload-time = "2024-05-14T02:02:06.347Z" }, - { url = "https://files.pythonhosted.org/packages/59/1f/f7bc02a54ea7b47f3dc2d125a106408f18b0f47b14fc737f0913483ae82b/ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3", size = 48103, upload-time = "2024-05-14T02:02:07.777Z" }, - { url = "https://files.pythonhosted.org/packages/1a/3a/d3921b6f29bc744d8d6c56db5f8bbcbe55115fd0f2b79c3c43ff292cc7c9/ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a", size = 47257, upload-time = "2024-05-14T02:02:09.46Z" }, - { url = "https://files.pythonhosted.org/packages/f1/04/f4e3883204b786717038064afd537389ba7d31a72b437c1372297cb651ea/ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746", size = 48468, upload-time = "2024-05-14T02:02:10.768Z" }, - { url = "https://files.pythonhosted.org/packages/17/cd/9c6547169eb01a22b04cbb638804ccaeb3c2ec2afc12303464e0f9b2ee5a/ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88", size = 54266, upload-time = "2024-05-14T02:02:12.109Z" }, - { url = "https://files.pythonhosted.org/packages/70/bf/ecd14d3cf6127f8a990b01f0ad20e257f5619a555f47d707c57d39934894/ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b", size = 42224, upload-time = "2024-05-14T02:02:13.843Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/a3a2356ca5a4b67fe32a0c31e49226114d5154ba2464bb1220a93eb383e8/ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4", size = 51855, upload-time = "2024-05-14T02:02:22.164Z" }, - { url = "https://files.pythonhosted.org/packages/73/3d/41e78e7500e75eb6b5a7ab06907a6df35603b92ac6f939b86f40e9fe2c06/ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8", size = 48059, upload-time = "2024-05-14T02:02:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/be/14/e435cbe5b5189483adbba5fe328e88418ccd54b2b1f74baa4172384bb5cd/ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b", size = 47238, upload-time = "2024-05-14T02:02:24.873Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d9/b6f4d1e6bec20a3b582b48f64eaa25209fd70dc2892b21656b273bc23434/ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804", size = 48457, upload-time = "2024-05-14T02:02:26.186Z" }, - { url = "https://files.pythonhosted.org/packages/23/1c/cfefabb5996e21a1a4348852df7eb7cfc69299143739e86e5b1071c78735/ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e", size = 54238, upload-time = "2024-05-14T02:02:28.468Z" }, - { url = "https://files.pythonhosted.org/packages/af/c4/fa70e77e1c27bbaf682d790bd09ef40e86807ada704c528ef3ea3418d439/ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7", size = 42230, upload-time = "2024-05-14T02:02:29.678Z" }, +version = "5.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/78/937198ea8708182dd1edbf0237bf255a96feab3f511691ad08b84da98e5d/ujson-5.12.1.tar.gz", hash = "sha256:5b7e96406c301a1366534479a7352ec40ec68bb327c0c119091635acd5925e35", size = 7164538, upload-time = "2026-05-05T22:05:01.354Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/f5/a73194f217159dc64e17fdb0b2d2a0f881e622fd78178ef4c11f07df227c/ujson-5.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:71bdb5d10c6d7e710cfa78e743d9fb79a37c7c66fa916cd287bffbaa520f5abe", size = 57737, upload-time = "2026-05-05T22:02:58.917Z" }, + { url = "https://files.pythonhosted.org/packages/e2/10/eb60fb536a5a26a3a5aedb2fff826b32b6c8fd3129ef244f481d2c77e629/ujson-5.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:558673c6c3a2309775683ca96d5f1e4cd99889f71b1ba5cb6be8aa37ae67f9e0", size = 55488, upload-time = "2026-05-05T22:03:00.415Z" }, + { url = "https://files.pythonhosted.org/packages/e5/19/2fcac61b5841873ecba7be67efc03d6b03c201c2738e841791221784dcc7/ujson-5.12.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4b0c9f6a56aa94bb98b403e1f57a866f0b43abaa89757b24d4a4b3cd8643ced", size = 59474, upload-time = "2026-05-05T22:03:01.951Z" }, + { url = "https://files.pythonhosted.org/packages/36/80/271ba72ad2268a8156411df14e44272b0f322938f7aa1831e40eecba8c35/ujson-5.12.1-cp310-cp310-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7bba5ab7965619db7d6f5503133b8e2d8bfce9bb6754224ca64d19261cc52f7c", size = 61573, upload-time = "2026-05-05T22:03:03.193Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8d/182298e537ea433e7669ac1223b8de538a549e82978c7b61efae4b852717/ujson-5.12.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:191d2077fd53441599a2efd3dcc205b9cc5f3a4d685a76e9f73f4b6c19aee0c9", size = 59075, upload-time = "2026-05-05T22:03:04.804Z" }, + { url = "https://files.pythonhosted.org/packages/0e/96/3a56766612e22e700be08a0d09d90d244a38dbe55a47e477132c6d9ff4db/ujson-5.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d90d27953716ef206c42f166932b3dbb264dc638bbf32acae81b216ae35f566d", size = 1038960, upload-time = "2026-05-05T22:03:06.718Z" }, + { url = "https://files.pythonhosted.org/packages/f7/cd/4baa856d862be92fc7424f52c59b18e092bb91105fb5e32f90f1cac52afc/ujson-5.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b6afa86c117b66034004ee83c5149c6dccf7cb88941f9d3a1640c7076577f2d4", size = 1198323, upload-time = "2026-05-05T22:03:08.263Z" }, + { url = "https://files.pythonhosted.org/packages/d1/15/cdb84a2dbb0d9d1ec1ec0c77358c5dc3da3c2fb1a1d992112927476807dd/ujson-5.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9523d67d45334f9a1d62e423bd72be62b58d2289a50420ffffa9363763eab73f", size = 1091338, upload-time = "2026-05-05T22:03:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/d5/cb/387830f8f5337689bad699551775b885319ed085201447c1dd6815ab7e51/ujson-5.12.1-cp310-cp310-win32.whl", hash = "sha256:757f2026bef09d231d63a2250a2c7ad21ea1c9cb1ded6480659d202c4e2ef09e", size = 40930, upload-time = "2026-05-05T22:03:11.913Z" }, + { url = "https://files.pythonhosted.org/packages/44/27/425109462ed4f4a4d33d51481e793a3588303e62788de0b10e5890f473f6/ujson-5.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:7e31afad20cd6837a5ac6965d95b44b0ff06e42a82b01a8d3dc606a07f0b7a2a", size = 45165, upload-time = "2026-05-05T22:03:13.216Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8b/910e2e56376622de6e72f27816b76beff1692794ce119dacc2e95aba1240/ujson-5.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:80f58ae2be100da0f525330ee274accd8892d1c125fea75076f60539d9a5f9cd", size = 39938, upload-time = "2026-05-05T22:03:14.771Z" }, + { url = "https://files.pythonhosted.org/packages/15/bd/78c4537392d4e2a5502447f942fcd665f69c282c604d4e23dc649cf98aa1/ujson-5.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:26dcb43869057373048cbd2678293c5b0f962d5774cc76fc9488564a209bcbf2", size = 57728, upload-time = "2026-05-05T22:03:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/40/c8/347a29f9f9dc7e3e30fcabc2dc0fec4c553a6c37dd77afdf7c88d1d40ec0/ujson-5.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bca3f04b2f590a8211acdc3ca06649b65a7ed1e999437dccf095310be9d3ba4e", size = 55488, upload-time = "2026-05-05T22:03:17.278Z" }, + { url = "https://files.pythonhosted.org/packages/93/b2/b309a5812643149c2e920907c0b1948c5ae4158888feee26df58d8fb7915/ujson-5.12.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29d1d64ed2c3c17666f4f0e15462800f3477255dc53667ad5d099277866c5666", size = 59495, upload-time = "2026-05-05T22:03:18.736Z" }, + { url = "https://files.pythonhosted.org/packages/d7/83/606272e7fa7179c5acdb0113e1f86726746e6d54264d20561b0d2925bdf1/ujson-5.12.1-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:2cfbd6b0c677d5d053964b8f98d8bb1af10c591c8c24454bcd40006ac8ba18db", size = 61555, upload-time = "2026-05-05T22:03:19.966Z" }, + { url = "https://files.pythonhosted.org/packages/f1/19/0634cf9a5f03c70388fbc3890b84ee0d38d51df3a524c515e3930cc75c9d/ujson-5.12.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f75caed5b6d1fc271bb720a780c4199914267f7b865f9bf17826c4feccea582c", size = 59079, upload-time = "2026-05-05T22:03:21.291Z" }, + { url = "https://files.pythonhosted.org/packages/0b/03/c2f9ca9cd08c362f1a400d8c6f8284ba8303d75b2d721b2b6aa361875e42/ujson-5.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b21b4c680594c8686bcd4cdda0fd3ea2567b9d42bcf1d1e3d92d39bcdb02e8f1", size = 1038990, upload-time = "2026-05-05T22:03:22.809Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bd/5fd45dcc5ea24134cc41ebd548b03233d3e76e3bd2f429576e81fb7be7a7/ujson-5.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50d07e79ec70d32b4fbe18ab706ed0b172be08710d5901b9d067d7951bfaa164", size = 1198285, upload-time = "2026-05-05T22:03:24.549Z" }, + { url = "https://files.pythonhosted.org/packages/52/ed/b1eabac89d349d92991badb61becdef5a2fd077c0f54007f7241a52c0f87/ujson-5.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:080bc65ac7c0a6314d45d55b6171d3a48b1aeaf89895654d625b291cfe46309f", size = 1091324, upload-time = "2026-05-05T22:03:26.422Z" }, + { url = "https://files.pythonhosted.org/packages/33/c8/e2488780945045cb7c61479fbc2379aa28ff502fba5ab8f42c0908e127fe/ujson-5.12.1-cp311-cp311-win32.whl", hash = "sha256:251ba8229e19b4b0b3efb5e7e3ddfa67c5c466aa492707bc3f6568bf714604dc", size = 40928, upload-time = "2026-05-05T22:03:27.994Z" }, + { url = "https://files.pythonhosted.org/packages/10/df/4efd312d74077085798ce1bae9b1678a7d84360725820918096eb89cd8e8/ujson-5.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:46315b82505c99101dcab3bd979f15fecfde85c02df7efbb4e428fa357665290", size = 45164, upload-time = "2026-05-05T22:03:29.175Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cc/1b034c46913162cac12027f7b67731e8ede4554b0e6fd60d265301156f11/ujson-5.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:12e99e49c62322ed0394c914aff15403ba7ede0b74f05a0faa4ec12c7d17a139", size = 39931, upload-time = "2026-05-05T22:03:30.408Z" }, + { url = "https://files.pythonhosted.org/packages/d7/40/dbb8e2fe6ee33769602fba203dacaa3963b6599f0d0aefdf2b8811af5f70/ujson-5.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:10f44bd08ae52ee23ca6e8b472692e5da1768af2d53ff1bad6f40b532e0bc7ee", size = 57951, upload-time = "2026-05-05T22:03:31.606Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/627472e6b4ac34148ea52e6d3d15f6f366fc21c72fe7d6c7d3729d4b3ac5/ujson-5.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cc6ea753b7303fa5629fa9ac9257ea4b001c4d72583b2bb36ff1855a07db49f", size = 55562, upload-time = "2026-05-05T22:03:32.853Z" }, + { url = "https://files.pythonhosted.org/packages/be/59/1248c966da197ae7d2673542444a2d9a1ff7c46e3ec2a302c3caf902b922/ujson-5.12.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:289f13095764d03734adfa10107da9b530ceb64dc1b02a5f507588d978d5b7df", size = 59448, upload-time = "2026-05-05T22:03:34.143Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d7/60c1ca71a09c0654c3edca1192a18fc55e6cc06107be86d7d3f2b39fb29b/ujson-5.12.1-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:427893168d074e59214b0ee058337c57f5bb80175cdd5b4799a9c931aae22022", size = 61608, upload-time = "2026-05-05T22:03:35.386Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0a/c619525576219bfc50084100117481b1a732a16716a3878355570995de4e/ujson-5.12.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7a81724d5d90a2da7155d15d8b156ce57eaed7cdd622df813f36a8e612fd4c8", size = 59113, upload-time = "2026-05-05T22:03:37.555Z" }, + { url = "https://files.pythonhosted.org/packages/18/4d/79c1674036085e8dfdb77f8d87c1fd2896e97e6affd117c5e8ecc40f0ae4/ujson-5.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3a6efff7dc6515416366819de4a1bc449b77107c5b48508b101fd40f7f8bec08", size = 1038914, upload-time = "2026-05-05T22:03:38.954Z" }, + { url = "https://files.pythonhosted.org/packages/94/b1/9409bba17189ee282b6314cdf0ecdcc72e3d38cd565c870c0227d0494569/ujson-5.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77a71fe53427a0cf49d56eafd801d9f7e203b784b7f99cc717783fd6f6f7b732", size = 1198408, upload-time = "2026-05-05T22:03:40.943Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ad/fafbce7ac59f1a10a83892d0a34add23cc06492308e1330493aab707dc20/ujson-5.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ea3bed53d2ea8e5642e814a9e41f3e29420a8067874ba03ace8c0462e160490c", size = 1091451, upload-time = "2026-05-05T22:03:42.739Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1f/76fc9d5b1dcb9eb73ed45fd56e5114391bd30808eb1cea7f8bc5c9a64324/ujson-5.12.1-cp312-cp312-win32.whl", hash = "sha256:758e5c8fbe4e6d483041e03b307b01fb5d2f2dd4452d4d4b927ab902e188939e", size = 41049, upload-time = "2026-05-05T22:03:44.341Z" }, + { url = "https://files.pythonhosted.org/packages/35/2a/7ce3b6fda10d05b79a245db03405734b521ba3da6c377f173b018dce6d4e/ujson-5.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:f6074d3d3267ba1914c624b6e1fa3d8152648ff36b0ab77ddf83b92db488c30d", size = 45330, upload-time = "2026-05-05T22:03:45.828Z" }, + { url = "https://files.pythonhosted.org/packages/d7/66/5a37bba7a2e2ab36ae467521c4511e6593ad74c869f62ec4ba6330f3f71e/ujson-5.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:7642a41520ac1b2bc25ea282b66b8da522cc43424442e6fb5e039be4d4f96530", size = 39828, upload-time = "2026-05-05T22:03:47.123Z" }, + { url = "https://files.pythonhosted.org/packages/6d/26/c9d0479236b3f5690d6a8bb45f708aabc2c91ca80d275eba24b1e9e464ab/ujson-5.12.1-graalpy312-graalpy250_312_native-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c419bf42ae40963fc27f70c59e24e9a97f5cf168dbce2c572f3c0ce3595912", size = 56153, upload-time = "2026-05-05T22:04:40.326Z" }, + { url = "https://files.pythonhosted.org/packages/ee/c8/785f4e132500aff2f1fd2bd4a4b86fe396a5519f830a098358c90ebb92ee/ujson-5.12.1-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0be2b4f2f547b9f0f3d902640e410e5a2fc851576cbe033c88445a23e3e7aef1", size = 57352, upload-time = "2026-05-05T22:04:42.005Z" }, + { url = "https://files.pythonhosted.org/packages/8f/13/b688a905653871b10b4ff0403c2ff562c17a0bd50be0d44324f3c85ca48f/ujson-5.12.1-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:4ea0c490c702c20495e97345acfcf0c2f3153e658ef537ff111929c48b89e10a", size = 45988, upload-time = "2026-05-05T22:04:43.36Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f4/676811a968793722fbc3827111c7301cbe2473285eac9e7a75eb7a7f2495/ujson-5.12.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3e30fa6bc7156ed709e13f8b52e917db08fbfd611ba61346b62630974ec0ba8e", size = 53669, upload-time = "2026-05-05T22:04:44.575Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/9d7fa873af84e687ec321d6761d61b0765fe6e46cc2599d6340521ef8b34/ujson-5.12.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f67c5f0d64eba0fbbd6d2d6a79b0c43c5bc06f27564378fd5d716e0d40360068", size = 51151, upload-time = "2026-05-05T22:04:46.899Z" }, + { url = "https://files.pythonhosted.org/packages/29/40/4069d94ce5c546721fdb503fa074fc4d2dbdf8a95911ae26d89c13771136/ujson-5.12.1-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8416bb724db9accfa97bdb77245952494b1800c23e42defd46afb5c661c9af19", size = 52338, upload-time = "2026-05-05T22:04:48.228Z" }, + { url = "https://files.pythonhosted.org/packages/90/20/257531b3c11977da7aa1d2f8d75c1914c739810ca25f59cca2e7939a87d8/ujson-5.12.1-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:66005b49c753a1b9f2f8853919dc58e1e6bd66846ea341a33afa76c6d7602485", size = 58526, upload-time = "2026-05-05T22:04:49.508Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a3/adb2553d1e965b07b1b10d2f526b7233358b8385d65fd8a40155c5261b14/ujson-5.12.1-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdc6b277dcd27663f7fb76b6a5088424c66e0407c23e9884f80cd733f7d71b19", size = 53621, upload-time = "2026-05-05T22:04:51.088Z" }, + { url = "https://files.pythonhosted.org/packages/a6/64/49347c16508543e84b00884fc8625c4a90b070205fe18bd147c7fe0aef65/ujson-5.12.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7957b64583793042521f7f7c71c01626b3d32a17528eaab980eb8cdc3d4eec68", size = 45372, upload-time = "2026-05-05T22:04:52.62Z" }, ] [[package]] name = "urllib3" -version = "2.4.0" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/da/6462a9f510c0c49837bbc9345aca92d767a56c1fb2939e1579df1e1cdcf7/websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", size = 175423, upload-time = "2025-03-05T20:01:35.363Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9f/9d11c1a4eb046a9e106483b9ff69bce7ac880443f00e5ce64261b47b07e7/websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", size = 173080, upload-time = "2025-03-05T20:01:37.304Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4f/b462242432d93ea45f297b6179c7333dd0402b855a912a04e7fc61c0d71f/websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", size = 173329, upload-time = "2025-03-05T20:01:39.668Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0c/6afa1f4644d7ed50284ac59cc70ef8abd44ccf7d45850d989ea7310538d0/websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", size = 182312, upload-time = "2025-03-05T20:01:41.815Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d4/ffc8bd1350b229ca7a4db2a3e1c482cf87cea1baccd0ef3e72bc720caeec/websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", size = 181319, upload-time = "2025-03-05T20:01:43.967Z" }, - { url = "https://files.pythonhosted.org/packages/97/3a/5323a6bb94917af13bbb34009fac01e55c51dfde354f63692bf2533ffbc2/websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", size = 181631, upload-time = "2025-03-05T20:01:46.104Z" }, - { url = "https://files.pythonhosted.org/packages/a6/cc/1aeb0f7cee59ef065724041bb7ed667b6ab1eeffe5141696cccec2687b66/websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", size = 182016, upload-time = "2025-03-05T20:01:47.603Z" }, - { url = "https://files.pythonhosted.org/packages/79/f9/c86f8f7af208e4161a7f7e02774e9d0a81c632ae76db2ff22549e1718a51/websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", size = 181426, upload-time = "2025-03-05T20:01:48.949Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b9/828b0bc6753db905b91df6ae477c0b14a141090df64fb17f8a9d7e3516cf/websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", size = 181360, upload-time = "2025-03-05T20:01:50.938Z" }, - { url = "https://files.pythonhosted.org/packages/89/fb/250f5533ec468ba6327055b7d98b9df056fb1ce623b8b6aaafb30b55d02e/websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", size = 176388, upload-time = "2025-03-05T20:01:52.213Z" }, - { url = "https://files.pythonhosted.org/packages/1c/46/aca7082012768bb98e5608f01658ff3ac8437e563eca41cf068bd5849a5e/websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", size = 176830, upload-time = "2025-03-05T20:01:53.922Z" }, - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, - { url = "https://files.pythonhosted.org/packages/36/db/3fff0bcbe339a6fa6a3b9e3fbc2bfb321ec2f4cd233692272c5a8d6cf801/websockets-15.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5", size = 175424, upload-time = "2025-03-05T20:02:56.505Z" }, - { url = "https://files.pythonhosted.org/packages/46/e6/519054c2f477def4165b0ec060ad664ed174e140b0d1cbb9fafa4a54f6db/websockets-15.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a", size = 173077, upload-time = "2025-03-05T20:02:58.37Z" }, - { url = "https://files.pythonhosted.org/packages/1a/21/c0712e382df64c93a0d16449ecbf87b647163485ca1cc3f6cbadb36d2b03/websockets-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b", size = 173324, upload-time = "2025-03-05T20:02:59.773Z" }, - { url = "https://files.pythonhosted.org/packages/1c/cb/51ba82e59b3a664df54beed8ad95517c1b4dc1a913730e7a7db778f21291/websockets-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770", size = 182094, upload-time = "2025-03-05T20:03:01.827Z" }, - { url = "https://files.pythonhosted.org/packages/fb/0f/bf3788c03fec679bcdaef787518dbe60d12fe5615a544a6d4cf82f045193/websockets-15.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb", size = 181094, upload-time = "2025-03-05T20:03:03.123Z" }, - { url = "https://files.pythonhosted.org/packages/5e/da/9fb8c21edbc719b66763a571afbaf206cb6d3736d28255a46fc2fe20f902/websockets-15.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054", size = 181397, upload-time = "2025-03-05T20:03:04.443Z" }, - { url = "https://files.pythonhosted.org/packages/2e/65/65f379525a2719e91d9d90c38fe8b8bc62bd3c702ac651b7278609b696c4/websockets-15.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee", size = 181794, upload-time = "2025-03-05T20:03:06.708Z" }, - { url = "https://files.pythonhosted.org/packages/d9/26/31ac2d08f8e9304d81a1a7ed2851c0300f636019a57cbaa91342015c72cc/websockets-15.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed", size = 181194, upload-time = "2025-03-05T20:03:08.844Z" }, - { url = "https://files.pythonhosted.org/packages/98/72/1090de20d6c91994cd4b357c3f75a4f25ee231b63e03adea89671cc12a3f/websockets-15.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880", size = 181164, upload-time = "2025-03-05T20:03:10.242Z" }, - { url = "https://files.pythonhosted.org/packages/2d/37/098f2e1c103ae8ed79b0e77f08d83b0ec0b241cf4b7f2f10edd0126472e1/websockets-15.0.1-cp39-cp39-win32.whl", hash = "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411", size = 176381, upload-time = "2025-03-05T20:03:12.77Z" }, - { url = "https://files.pythonhosted.org/packages/75/8b/a32978a3ab42cebb2ebdd5b05df0696a09f4d436ce69def11893afa301f0/websockets-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4", size = 176841, upload-time = "2025-03-05T20:03:14.367Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/d40f779fa16f74d3468357197af8d6ad07e7c5a27ea1ca74ceb38986f77a/websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", size = 173109, upload-time = "2025-03-05T20:03:17.769Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/5b887b8585a593073fd92f7c23ecd3985cd2c3175025a91b0d69b0551372/websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", size = 173343, upload-time = "2025-03-05T20:03:19.094Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ae/d34f7556890341e900a95acf4886833646306269f899d58ad62f588bf410/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", size = 174599, upload-time = "2025-03-05T20:03:21.1Z" }, - { url = "https://files.pythonhosted.org/packages/71/e6/5fd43993a87db364ec60fc1d608273a1a465c0caba69176dd160e197ce42/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", size = 174207, upload-time = "2025-03-05T20:03:23.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/fb/c492d6daa5ec067c2988ac80c61359ace5c4c674c532985ac5a123436cec/websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", size = 174155, upload-time = "2025-03-05T20:03:25.321Z" }, - { url = "https://files.pythonhosted.org/packages/68/a1/dcb68430b1d00b698ae7a7e0194433bce4f07ded185f0ee5fb21e2a2e91e/websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", size = 176884, upload-time = "2025-03-05T20:03:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/b7/48/4b67623bac4d79beb3a6bb27b803ba75c1bdedc06bd827e465803690a4b2/websockets-15.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940", size = 173106, upload-time = "2025-03-05T20:03:29.404Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f0/adb07514a49fe5728192764e04295be78859e4a537ab8fcc518a3dbb3281/websockets-15.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e", size = 173339, upload-time = "2025-03-05T20:03:30.755Z" }, - { url = "https://files.pythonhosted.org/packages/87/28/bd23c6344b18fb43df40d0700f6d3fffcd7cef14a6995b4f976978b52e62/websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9", size = 174597, upload-time = "2025-03-05T20:03:32.247Z" }, - { url = "https://files.pythonhosted.org/packages/6d/79/ca288495863d0f23a60f546f0905ae8f3ed467ad87f8b6aceb65f4c013e4/websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b", size = 174205, upload-time = "2025-03-05T20:03:33.731Z" }, - { url = "https://files.pythonhosted.org/packages/04/e4/120ff3180b0872b1fe6637f6f995bcb009fb5c87d597c1fc21456f50c848/websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f", size = 174150, upload-time = "2025-03-05T20:03:35.757Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c3/30e2f9c539b8da8b1d76f64012f3b19253271a63413b2d3adb94b143407f/websockets-15.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123", size = 176877, upload-time = "2025-03-05T20:03:37.199Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", size = 177343, upload-time = "2026-01-10T09:22:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", size = 175021, upload-time = "2026-01-10T09:22:22.696Z" }, + { url = "https://files.pythonhosted.org/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", size = 175320, upload-time = "2026-01-10T09:22:23.94Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2f/4b3ca7e106bc608744b1cdae041e005e446124bebb037b18799c2d356864/websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72", size = 183815, upload-time = "2026-01-10T09:22:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", size = 185054, upload-time = "2026-01-10T09:22:27.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", size = 184565, upload-time = "2026-01-10T09:22:28.293Z" }, + { url = "https://files.pythonhosted.org/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", size = 183848, upload-time = "2026-01-10T09:22:30.394Z" }, + { url = "https://files.pythonhosted.org/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", size = 178249, upload-time = "2026-01-10T09:22:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", size = 178685, upload-time = "2026-01-10T09:22:33.345Z" }, + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, ] [[package]] name = "wheel" -version = "0.45.1" +version = "0.46.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/24/a2eb353a6edac9a0303977c4cb048134959dd2a51b48a269dfc9dde00c8a/wheel-0.46.3.tar.gz", hash = "sha256:e3e79874b07d776c40bd6033f8ddf76a7dad46a7b8aa1b2787a83083519a1803", size = 60605, upload-time = "2026-01-22T12:39:49.136Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl", hash = "sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d", size = 30557, upload-time = "2026-01-22T12:39:48.099Z" }, ] [[package]] name = "xarray" -version = "2024.7.0" +version = "2025.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and sys_platform == 'win32'", - "python_full_version < '3.10' and platform_machine == 'arm64' and sys_platform == 'darwin'", - "python_full_version < '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version < '3.10' and platform_machine != 'arm64' and sys_platform == 'darwin') or (python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pandas", marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" } }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/e8/8ee12706df0d34ad04b3737621a73432458d47bc8abfbd6f049e51ca89c3/xarray-2024.7.0.tar.gz", hash = "sha256:4cae512d121a8522d41e66d942fb06c526bc1fd32c2c181d5fe62fe65b671638", size = 3728663, upload-time = "2024-07-30T08:31:45.48Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ec/e50d833518f10b0c24feb184b209bb6856f25b919ba8c1f89678b930b1cd/xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0", size = 3003185, upload-time = "2025-06-12T03:04:09.099Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/95/233e1f9c939f5ba314297315df709e6a5e823bf3cade7211991b15aa65d2/xarray-2024.7.0-py3-none-any.whl", hash = "sha256:1b0fd51ec408474aa1f4a355d75c00cc1c02bd425d97b2c2e551fd21810e7f64", size = 1176466, upload-time = "2024-07-30T08:31:43.077Z" }, + { url = "https://files.pythonhosted.org/packages/82/8a/6b50c1dd2260d407c1a499d47cf829f59f07007e0dcebafdabb24d1d26a5/xarray-2025.6.1-py3-none-any.whl", hash = "sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b", size = 1314739, upload-time = "2025-06-12T03:04:06.708Z" }, ] [[package]] name = "xarray" -version = "2025.4.0" +version = "2026.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'win32'", - "python_full_version == '3.10.*' and sys_platform == 'win32'", - "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' and sys_platform != 'win32')", - "python_full_version == '3.10.*' and sys_platform == 'darwin'", - "python_full_version == '3.10.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version == '3.10.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version >= '3.11' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pandas", marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" } }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/29/37761364e137db13898cf5a790574dd7883f7355d5dfb42b66ee7a9a6318/xarray-2025.4.0.tar.gz", hash = "sha256:2a89cd6a1dfd589aa90ac45f4e483246f31fc641836db45dd2790bb78bd333dc", size = 2974151, upload-time = "2025-04-29T23:27:59.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/03/e3353b72e518574b32993989d8f696277bf878e9d508c7dd22e86c0dab5b/xarray-2026.2.0.tar.gz", hash = "sha256:978b6acb018770554f8fd964af4eb02f9bcc165d4085dbb7326190d92aa74bcf", size = 3111388, upload-time = "2026-02-13T22:20:50.18Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl", hash = "sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8", size = 1290171, upload-time = "2025-04-29T23:27:57.059Z" }, + { url = "https://files.pythonhosted.org/packages/99/92/545eb2ca17fc0e05456728d7e4378bfee48d66433ae3b7e71948e46826fb/xarray-2026.2.0-py3-none-any.whl", hash = "sha256:e927d7d716ea71dea78a13417970850a640447d8dd2ceeb65c5687f6373837c9", size = 1405358, upload-time = "2026-02-13T22:20:47.847Z" }, ] [[package]] @@ -5875,46 +5508,31 @@ wheels = [ [[package]] name = "xmlschema" -version = "4.0.1" +version = "4.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "elementpath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/11/ac67a468665b72c77ae01e3cd3f3f478ffcc4c3bc4aa61675179e99a80be/xmlschema-4.0.1.tar.gz", hash = "sha256:9a8598daa2e2859c499f6f08242f7547804ae0c2d037971c44bcb9aae154ff22", size = 625283, upload-time = "2025-04-13T20:41:25.622Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/c4/ef78a231be72349fd6677b989ff80e276ef62e28054c36c4fea3b4db9611/xmlschema-4.3.1.tar.gz", hash = "sha256:853effdfaf127849d4724368c17bd669e7f1486e15a0376404ad7954ec31a338", size = 646611, upload-time = "2026-01-17T23:01:04.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/28/ce7a7b48f8020291c53e425ad1ad581ea8152b0df4a5e6d289c24ef82bbe/xmlschema-4.0.1-py3-none-any.whl", hash = "sha256:cf94d3380c5005fc027532ec4760b4bec414d6b4ead425285fa5bf8eb6c515c6", size = 452804, upload-time = "2025-04-13T20:41:21.521Z" }, + { url = "https://files.pythonhosted.org/packages/dd/7b/3471405875d0b5fac642e9a879b2c7db63642370799b2e9eea8297ffbad0/xmlschema-4.3.1-py3-none-any.whl", hash = "sha256:9560314d70ae87be0aecb8712cfebed636f867707ccf9758d4b0645d607f64b9", size = 469891, upload-time = "2026-01-17T23:01:00.39Z" }, ] [[package]] name = "zeroconf" -version = "0.147.0" +version = "0.148.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ifaddr", marker = "(python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.10' and sys_platform != 'linux' and sys_platform != 'win32') or sys_platform == 'darwin'" }, + { name = "ifaddr" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/78/f681afade2a4e7a9ade696cf3d3dcd9905e28720d74c16cafb83b5dd5c0a/zeroconf-0.147.0.tar.gz", hash = "sha256:f517375de6bf2041df826130da41dc7a3e8772176d3076a5da58854c7d2e8d7a", size = 163958, upload-time = "2025-05-03T16:24:54.207Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/a2/eca16ae55b22e76c819950917ce523a87e4fb77e9e915bb0188fd3e47b3f/zeroconf-0.147.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:de0e1439c90df08fbb59d07445904aa9cb0ed3c548bb2f89a8a7bb3fa50071cd", size = 1837544, upload-time = "2025-05-03T16:58:09.796Z" }, - { url = "https://files.pythonhosted.org/packages/83/d6/080c8059b1b624c6654ef6373b620118c41fae935d76ac7b10582a2b41e2/zeroconf-0.147.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2b8776e5e3ba7f19578a6baffa231f148390156a231eb17924c30e192ec9b00", size = 1697541, upload-time = "2025-05-03T16:58:11.344Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d8/15819dc7c1f9fdd02d72ebf5fec5e8575abae7de9c3887d37adc25de9b38/zeroconf-0.147.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f36096616f89f3aec678613316014e3a35e293c3c2e26466695d91688c49a34", size = 1841597, upload-time = "2025-05-03T16:58:31.018Z" }, - { url = "https://files.pythonhosted.org/packages/19/78/d7033a7eb2b0e7b875e5578d22de52b4553d5ce49deca1b1a316f97c8ee1/zeroconf-0.147.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:abb3f45ce14fdbcf70d2cb711714553e20e704cc2d86988125936d853f01c132", size = 1699441, upload-time = "2025-05-03T16:58:32.566Z" }, - { url = "https://files.pythonhosted.org/packages/d8/9d/f641ad9a06a099cac9ad3b04e6c0f9a2f3a5569ce59b2a541f5d0d710b21/zeroconf-0.147.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a5b570c0697144876bf54ff9d87dc46f5f7c8b2709702b7182b99b363e37e301", size = 1846540, upload-time = "2025-05-03T16:59:42.486Z" }, - { url = "https://files.pythonhosted.org/packages/61/9c/7f7316aae0e6748019f38cb9c29b07b4fce44e47fe24436c29295fc8c4d2/zeroconf-0.147.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12a24145231b26d1e6d7ded60984f8f32e2b17fe4f9a824be26b7622b875bc12", size = 1705432, upload-time = "2025-05-03T16:59:44.366Z" }, - { url = "https://files.pythonhosted.org/packages/5c/eb/3980391d7b9ddaabd4cbc8bc1f0139420b2f62d7aa7ad510369fbafcf487/zeroconf-0.147.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8a2ceada07a6e89d7000e19826598a2fe013192e7a752637c1232cbc6041f434", size = 1642469, upload-time = "2025-05-03T17:00:07.602Z" }, - { url = "https://files.pythonhosted.org/packages/50/21/21b8287721e149cce3c8eb771f22d07841a63aa36274bc32634128ba37f7/zeroconf-0.147.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:60b548b8b58f4f7435f96e4a8bed0ffedc6023ebd9e30872d3e71e3f5d8bd8e3", size = 1542184, upload-time = "2025-05-03T17:00:09.717Z" }, - { url = "https://files.pythonhosted.org/packages/1a/90/a11ada56c3ae0b8c9377b2309c8cb24a5027aa87b45da654ec057f1ade38/zeroconf-0.147.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b89c62ea0220235da8b353958ea8340d62ed820dca34be0ff08146674a93168b", size = 1645736, upload-time = "2025-05-03T17:00:22.533Z" }, - { url = "https://files.pythonhosted.org/packages/08/2a/be74419b6b42a8782c45a68c2516c1757dd71266d04f035843f89e135d27/zeroconf-0.147.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4fd6848de32756ec34531ea9b3cf1988c9115b7d8363687d3ffaa2cdba244d4", size = 1543083, upload-time = "2025-05-03T17:00:25.113Z" }, - { url = "https://files.pythonhosted.org/packages/36/11/1fdd779a700a35bedf18d795d05a902313600aa4ea39a1d87d2ac5cdd30b/zeroconf-0.147.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6883f1b39ef1fea628e1ad027c4e5ed5058582d1453ea0f8dee5f7afd421b228", size = 1639350, upload-time = "2025-05-03T17:00:36.227Z" }, - { url = "https://files.pythonhosted.org/packages/0e/bd/74c5d4a7d947461205b7b155df4f500de1af5d8410c22169c4d6ccb8afb5/zeroconf-0.147.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0c1157a7500145224b2606ca1efe393afa9879133acf40b1b428dfa5503581a", size = 1539401, upload-time = "2025-05-03T17:00:38.864Z" }, -] - -[[package]] -name = "zipp" -version = "3.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545, upload-time = "2024-11-10T15:05:20.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/46/10db987799629d01930176ae523f70879b63577060d63e05ebf9214aba4b/zeroconf-0.148.0.tar.gz", hash = "sha256:03fcca123df3652e23d945112d683d2f605f313637611b7d4adf31056f681702", size = 164447, upload-time = "2025-10-05T00:21:19.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630, upload-time = "2024-11-10T15:05:19.275Z" }, + { url = "https://files.pythonhosted.org/packages/88/47/a2ff13f3a0a7b9bd4cc1a904e7ddfd4f327043387915607db1117e1c1417/zeroconf-0.148.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9146731bb82bc7b42f009aa69619b17a4b6ddecc75eee9a59249c12c804d0637", size = 1708548, upload-time = "2025-10-05T01:07:30.722Z" }, + { url = "https://files.pythonhosted.org/packages/54/11/7c871eba676458e5f3943e45281db91c3b01743b8e7f5401640855ca863e/zeroconf-0.148.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db24dc2e5367dc61bacbf302b7c85cc10ee1a9de8f1710380027992afd1ddcb4", size = 1682018, upload-time = "2025-10-05T01:07:33.879Z" }, + { url = "https://files.pythonhosted.org/packages/00/1f/dcaed909fabbdf760739b3081cbea3f7cd564e61a708dca00a55960da11c/zeroconf-0.148.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b923e26369e302863aa5370eff4d4d72a0b90ba85d3b9f608c62cbab78f14dc2", size = 1723036, upload-time = "2025-10-05T01:07:51.26Z" }, + { url = "https://files.pythonhosted.org/packages/05/37/849d419ccd60e37e02ca7364ac9451e500e517cebf884bee88e6811c442b/zeroconf-0.148.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cbffd751877b74cd64c529061e5a524ebfa59af16930330548033e307701fee", size = 1696983, upload-time = "2025-10-05T01:07:52.818Z" }, + { url = "https://files.pythonhosted.org/packages/00/b3/6c08ccbda1e78c8f538d8add49fac2fe49ef85ee34b62877df4154715583/zeroconf-0.148.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aef8699ea47cd47c9219e3f110a35ad50c13c34c7c6db992f3c9f75feec6ef8f", size = 1735431, upload-time = "2025-10-05T01:08:09.375Z" }, + { url = "https://files.pythonhosted.org/packages/cb/37/6b91c4a4258863e485602e6b1eb098fe406142a653112e8719c49b69afc4/zeroconf-0.148.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9097e7010b9f9a64e5f2084493e9973d446bd85c7a7cbef5032b2b0a2ecc5a12", size = 1701594, upload-time = "2025-10-05T01:08:11.448Z" }, ] [[package]] @@ -5950,10 +5568,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/65/94/5aa4461c10718062c8f8711161faf3249d6d3679c24a0b81dd6fc8ba1dd3/zope.interface-7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c", size = 255038, upload-time = "2024-11-28T08:48:26.381Z" }, { url = "https://files.pythonhosted.org/packages/9f/aa/1a28c02815fe1ca282b54f6705b9ddba20328fabdc37b8cf73fc06b172f0/zope.interface-7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a", size = 259806, upload-time = "2024-11-28T08:48:30.78Z" }, { url = "https://files.pythonhosted.org/packages/a7/2c/82028f121d27c7e68632347fe04f4a6e0466e77bb36e104c8b074f3d7d7b/zope.interface-7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1", size = 212305, upload-time = "2024-11-28T08:49:14.525Z" }, - { url = "https://files.pythonhosted.org/packages/8c/2c/1f49dc8b4843c4f0848d8e43191aed312bad946a1563d1bf9e46cf2816ee/zope.interface-7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bd449c306ba006c65799ea7912adbbfed071089461a19091a228998b82b1fdb", size = 208349, upload-time = "2024-11-28T08:49:28.872Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7d/83ddbfc8424c69579a90fc8edc2b797223da2a8083a94d8dfa0e374c5ed4/zope.interface-7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a19a6cc9c6ce4b1e7e3d319a473cf0ee989cbbe2b39201d7c19e214d2dfb80c7", size = 208799, upload-time = "2024-11-28T08:49:30.616Z" }, - { url = "https://files.pythonhosted.org/packages/36/22/b1abd91854c1be03f5542fe092e6a745096d2eca7704d69432e119100583/zope.interface-7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cd1790b48c16db85d51fbbd12d20949d7339ad84fd971427cf00d990c1f137", size = 254267, upload-time = "2024-11-28T09:18:21.059Z" }, - { url = "https://files.pythonhosted.org/packages/2a/dd/fcd313ee216ad0739ae00e6126bc22a0af62a74f76a9ca668d16cd276222/zope.interface-7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e446f9955195440e787596dccd1411f543743c359eeb26e9b2c02b077b0519", size = 248614, upload-time = "2024-11-28T08:48:41.953Z" }, - { url = "https://files.pythonhosted.org/packages/88/d4/4ba1569b856870527cec4bf22b91fe704b81a3c1a451b2ccf234e9e0666f/zope.interface-7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad9913fd858274db8dd867012ebe544ef18d218f6f7d1e3c3e6d98000f14b75", size = 253800, upload-time = "2024-11-28T08:48:46.637Z" }, - { url = "https://files.pythonhosted.org/packages/69/da/c9cfb384c18bd3a26d9fc6a9b5f32ccea49ae09444f097eaa5ca9814aff9/zope.interface-7.2-cp39-cp39-win_amd64.whl", hash = "sha256:1090c60116b3da3bfdd0c03406e2f14a1ff53e5771aebe33fec1edc0a350175d", size = 211980, upload-time = "2024-11-28T08:50:35.681Z" }, + { url = "https://files.pythonhosted.org/packages/68/0b/c7516bc3bad144c2496f355e35bd699443b82e9437aa02d9867653203b4a/zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7", size = 208959, upload-time = "2024-11-28T08:47:47.788Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e9/1463036df1f78ff8c45a02642a7bf6931ae4a38a4acd6a8e07c128e387a7/zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465", size = 209357, upload-time = "2024-11-28T08:47:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/07/a8/106ca4c2add440728e382f1b16c7d886563602487bdd90004788d45eb310/zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89", size = 264235, upload-time = "2024-11-28T09:18:15.56Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ca/57286866285f4b8a4634c12ca1957c24bdac06eae28fd4a3a578e30cf906/zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54", size = 259253, upload-time = "2024-11-28T08:48:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/96/08/2103587ebc989b455cf05e858e7fbdfeedfc3373358320e9c513428290b1/zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d", size = 264702, upload-time = "2024-11-28T08:48:37.363Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c7/3c67562e03b3752ba4ab6b23355f15a58ac2d023a6ef763caaca430f91f2/zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5", size = 212466, upload-time = "2024-11-28T08:49:14.397Z" }, ]