pyjess 0.7.0__cp38-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyjess might be problematic. Click here for more details.

@@ -0,0 +1,282 @@
1
+ Metadata-Version: 2.2
2
+ Name: pyjess
3
+ Version: 0.7.0
4
+ Summary: Cython bindings and Python interface to JESS, a 3D template matching software.
5
+ Keywords: bioinformatics,structure,template,matching
6
+ Author-Email: Martin Larralde <martin.larralde@embl.de>
7
+ License: MIT License
8
+
9
+ Copyright (c) 2024-2025 Martin Larralde <martin.larralde@embl.de>
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+ Classifier: Development Status :: 4 - Beta
30
+ Classifier: Intended Audience :: Developers
31
+ Classifier: Intended Audience :: Science/Research
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Operating System :: OS Independent
34
+ Classifier: Programming Language :: C
35
+ Classifier: Programming Language :: Cython
36
+ Classifier: Programming Language :: Python :: 3.7
37
+ Classifier: Programming Language :: Python :: 3.8
38
+ Classifier: Programming Language :: Python :: 3.9
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Programming Language :: Python :: Implementation :: CPython
44
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
45
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
46
+ Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
47
+ Classifier: Typing :: Typed
48
+ Project-URL: Homepage, https://github.com/althonos/pyjess/
49
+ Project-URL: Documentation, https://pyjess.readthedocs.io/en/stable/
50
+ Project-URL: Bug Tracker, https://github.com/althonos/pyjess/issues
51
+ Project-URL: Changelog, https://github.com/althonos/pyjess/blob/master/CHANGELOG.md
52
+ Project-URL: Coverage, https://codecov.io/gh/althonos/pyjess/
53
+ Project-URL: Builds, https://github.com/althonos/pyjess/actions
54
+ Project-URL: PyPI, https://pypi.org/project/pyjess
55
+ Project-URL: PiWheels, https://piwheels.org/project/pyjess/
56
+ Requires-Python: >=3.7
57
+ Provides-Extra: test
58
+ Requires-Dist: importlib-resources; python_version < "3.9" and extra == "test"
59
+ Provides-Extra: cif
60
+ Requires-Dist: gemmi~=0.7.0; extra == "cif"
61
+ Description-Content-Type: text/markdown
62
+
63
+ # 🐍🔍 PyJess [![Stars](https://img.shields.io/github/stars/althonos/pyjess.svg?style=social&maxAge=3600&label=Star)](https://github.com/althonos/pyjess/stargazers)
64
+
65
+ *[Cython](https://cython.org/) bindings and Python interface to [Jess](https://github.com/iriziotis/jess), a 3D template matching software.*
66
+
67
+ [![Actions](https://img.shields.io/github/actions/workflow/status/althonos/pyjess/test.yml?branch=main&logo=github&style=flat-square&maxAge=300)](https://github.com/althonos/pyjess/actions)
68
+ [![Coverage](https://img.shields.io/codecov/c/gh/althonos/pyjess?style=flat-square&maxAge=3600&logo=codecov)](https://codecov.io/gh/althonos/pyjess/)
69
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square&maxAge=2678400)](https://choosealicense.com/licenses/mit/)
70
+ [![PyPI](https://img.shields.io/pypi/v/pyjess.svg?style=flat-square&maxAge=3600&logo=PyPI)](https://pypi.org/project/pyjess)
71
+ [![Bioconda](https://img.shields.io/conda/vn/bioconda/pyjess?style=flat-square&maxAge=3600&logo=anaconda)](https://anaconda.org/bioconda/pyjess)
72
+ [![AUR](https://img.shields.io/aur/version/python-pyjess?logo=archlinux&style=flat-square&maxAge=3600)](https://aur.archlinux.org/packages/python-pyjess)
73
+ [![Wheel](https://img.shields.io/pypi/wheel/pyjess.svg?style=flat-square&maxAge=3600)](https://pypi.org/project/pyjess/#files)
74
+ [![Python Versions](https://img.shields.io/pypi/pyversions/pyjess.svg?style=flat-square&maxAge=600&logo=python)](https://pypi.org/project/pyjess/#files)
75
+ [![Python Implementations](https://img.shields.io/pypi/implementation/pyjess.svg?style=flat-square&maxAge=600&label=impl)](https://pypi.org/project/pyjess/#files)
76
+ [![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pyjess/)
77
+ [![Mirror](https://img.shields.io/badge/mirror-LUMC-003EAA.svg?maxAge=2678400&style=flat-square)](https://git.lumc.nl/mflarralde/pyjess/)
78
+ [![Issues](https://img.shields.io/github/issues/althonos/pyjess.svg?style=flat-square&maxAge=600)](https://github.com/althonos/pyjess/issues)
79
+ [![Docs](https://img.shields.io/readthedocs/pyjess/latest?style=flat-square&maxAge=600)](https://pyjess.readthedocs.io)
80
+ [![Changelog](https://img.shields.io/badge/keep%20a-changelog-8A0707.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pyjess/blob/main/CHANGELOG.md)
81
+ [![Downloads](https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fpepy.tech%2Fprojects%2Fpyjess&search=%5B0-9%5D%2B.%5B0-9%5D%2B(k%7CM)&style=flat-square&label=downloads&color=303f9f&cacheSeconds=86400)](https://pepy.tech/project/pyjess)
82
+
83
+
84
+ ## 🗺️ Overview
85
+
86
+ Jess is an algorithm for constraint-based structural template matching
87
+ proposed by Jonathan Barker *et al.*[\[1\]](#ref1). It can be used to identify
88
+ catalytic residues from a known template inside a protein structure. Jess
89
+ is an evolution of TESS, a geometric hashing algorithm developed by
90
+ Andrew Wallace *et al.*[\[2\]](#ref2), removing some pre-computation and
91
+ structural requirements from the original algorithm. Jess was further
92
+ updated and maintained by [Ioannis Riziotis](https://github.com/iriziotis)
93
+ during his PhD in the [Thornton group](https://www.ebi.ac.uk/research/thornton/).
94
+
95
+ PyJess is a Python module that provides bindings to Jess using
96
+ [Cython](https://cython.org/). It allows creating templates, querying them
97
+ with protein structures, and retrieving the hits using a Python API without
98
+ performing any external I/O. It's also more than 10x faster than Jess thanks to
99
+ [algorithmic optimizations](https://pyjess.readthedocs.io/en/latest/guide/optimizations.html)
100
+ added to improve the original Jess code while producing consistent results.
101
+
102
+
103
+ ## 🔧 Installing
104
+
105
+ PyJess is available for all modern Python versions (3.7+).
106
+
107
+ It can be installed directly from [PyPI](https://pypi.org/project/pyjess/),
108
+ which hosts some pre-built x86-64 wheels for Linux, MacOS, and Windows,
109
+ as well as the code required to compile from source with Cython:
110
+ ```console
111
+ $ pip install pyjess
112
+ ```
113
+
114
+ Otherwise, PyJess is also available as a [Bioconda](https://bioconda.github.io/)
115
+ package:
116
+ ```console
117
+ $ conda install -c bioconda pyjess
118
+ ```
119
+
120
+ Check the [*install* page](https://pyjess.readthedocs.io/en/stable/guide/install.html)
121
+ of the documentation for other ways to install PyJess on your machine.
122
+
123
+
124
+ ## 🔖 Citation
125
+
126
+ PyJess is scientific software, and builds on top of Jess. Please cite
127
+ Jess if you are using it in an academic work, for instance as:
128
+
129
+ > PyJess, a Python library binding to Jess (Barker *et al.*, 2003).
130
+
131
+
132
+ ## 💡 Example
133
+
134
+ #### Prepare templates
135
+
136
+ Load [`Template`](https://pyjess.readthedocs.io/en/latest/api/template.html#pyjess.Template)
137
+ objects to be used as references from different template files:
138
+
139
+ ```python
140
+ import pathlib
141
+ import pyjess
142
+
143
+ templates = []
144
+ for path in sorted(pathlib.Path("vendor/jess/examples").glob("template_*.qry")):
145
+ templates.append(pyjess.Template.load(path, id=path.stem))
146
+ ```
147
+
148
+ #### Prepare query structures
149
+
150
+ Load a [`Molecule`](https://pyjess.readthedocs.io/en/latest/api/molecule.html#pyjess.Molecule)
151
+ (a PDB structure) from a PDB file, create one with the Python API, or
152
+ convert it from a [`Bio.Model`](https://biopython.org/docs/1.76/api/Bio.PDB.Model.html),
153
+ [`gemmi.Model`](https://gemmi.readthedocs.io/en/latest/mol.html#model),
154
+ or [`biotite.structure.AtomArray`](https://www.biotite-python.org/latest/apidoc/biotite.structure.AtomArray.html)
155
+ object:
156
+
157
+ ```python
158
+ # load from PDB file or mmCIF file
159
+ mol = pyjess.Molecule.load("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
160
+
161
+ # load with BioPython
162
+ parser = Bio.PDB.PDBParser()
163
+ structure = parser.get_structure('pdb1a0p', "vendor/jess/examples/test_pdbs/pdb1a0p.ent")
164
+ mol = Molecule.from_biopython(structure, id="1a0p")
165
+
166
+ # load with Gemmi
167
+ structure = gemmi.read_pdb_string("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
168
+ mol = Molecule.from_gemmi(structure[0], id="1a0p")
169
+
170
+ # load with Biotite
171
+ pdb_file = biotite.structure.io.pdb.PDBFile.read(f)
172
+ structure = pdb_file.get_structure(altloc="all", extra_fields=["atom_id", "b_factor", "occupancy", "charge"])
173
+ mol = Molecule.from_biotite(structure[0])
174
+ ```
175
+
176
+ ### Match templates
177
+
178
+ Create a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
179
+ instance and use it to query a against the stored templates:
180
+
181
+ ```python
182
+ jess = pyjess.Jess(templates)
183
+ query = jess.query(mol, rmsd_threshold=2.0, distance_cutoff=3.0, max_dynamic_distance=3.0)
184
+ ```
185
+
186
+ ### Process hits
187
+
188
+ The hits are computed iteratively, and the different output statistics are
189
+ computed on-the-fly when requested:
190
+
191
+ ```python
192
+ for hit in query:
193
+ print(hit.molecule.id, hit.template.id, hit.rmsd, hit.log_evalue)
194
+ for atom in hit.atoms():
195
+ print(atom.name, atom.x, atom.y, atom.z)
196
+ ```
197
+
198
+ Hits can also be rendered in PDB format like in the original Jess output,
199
+ either by writing to a file directly, or to a Python string:
200
+ ```python
201
+ for hit in query:
202
+ hit.dump(sys.stdout, format="pdb")
203
+ ```
204
+
205
+ ## 🧶 Thread-safety
206
+
207
+ Once a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
208
+ instance has been created, the templates cannot be edited anymore,
209
+ making the [`Jess.query`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess.query) method re-entrant and thread-safe. This allows querying
210
+ several molecules against the same templates in parallel using e.g a
211
+ [`ThreadPool`](https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.ThreadPool):
212
+
213
+ ```python
214
+ molecules = []
215
+ for path in glob.glob("vendor/jess/examples/test_pdbs/*.ent"):
216
+ molecules.append(Molecule.load(path))
217
+
218
+ with multiprocessing.ThreadPool() as pool:
219
+ hits = pool.map(jess.query, molecules)
220
+ ```
221
+
222
+ *⚠️ Prior to PyJess `v0.2.1`, the Jess code was running some thread-unsafe operations which have now been patched.
223
+ If running Jess in parallel, make sure to use `v0.2.1` or later to use the code patched with re-entrant functions*.
224
+
225
+ ## ⏱️ Benchmarks
226
+
227
+ The following table reports the runtime of PyJess to match N=132 protein
228
+ structures to the M=7607 templates of
229
+ [EnzyMM](https://github.com/RayHackett/enzymm), using J=12 threads to parallelize.
230
+
231
+ | Version | Runtime (s) | Match Speed (N * M / s * J) | Speedup |
232
+ | ----------- | ----------- | --------------------------- | ----------- |
233
+ | ``v0.4.2`` | 618.1 | 135.4 | N/A |
234
+ | ``v0.5.0`` | 586.3 | 142.7 | x1.05 |
235
+ | ``v0.5.1`` | 365.6 | 228.9 | x1.69 |
236
+ | ``v0.5.2`` | 327.2 | 255.7 | x1.88 |
237
+ | ``v0.6.0`` | 54.5 | 1535.4 | x11.34 |
238
+ | ``v0.7.0`` | 52.4 | 1597.5 | **x11.80** |
239
+
240
+ *Benchmarks were run on a quiet [i7-1255U](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html)
241
+ CPU running @4.70GHz with 10 physical cores / 12 logical cores.*
242
+
243
+ ## 💭 Feedback
244
+
245
+ ### ⚠️ Issue Tracker
246
+
247
+ Found a bug ? Have an enhancement request ? Head over to the [GitHub issue tracker](https://github.com/althonos/pyjess/issues)
248
+ if you need to report or ask something. If you are filing in on a bug,
249
+ please include as much information as you can about the issue, and try to
250
+ recreate the same bug in a simple, easily reproducible situation.
251
+
252
+
253
+ ### 🏗️ Contributing
254
+
255
+ Contributions are more than welcome! See
256
+ [`CONTRIBUTING.md`](https://github.com/althonos/pyjess/blob/main/CONTRIBUTING.md)
257
+ for more details.
258
+
259
+
260
+ ## 📋 Changelog
261
+
262
+ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html)
263
+ and provides a [changelog](https://github.com/althonos/pyjess/blob/main/CHANGELOG.md)
264
+ in the [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format.
265
+
266
+
267
+ ## ⚖️ License
268
+
269
+ This library is provided under the [MIT License](https://choosealicense.com/licenses/mit/).
270
+ The JESS code is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) as well.
271
+
272
+ *This project is in no way not affiliated, sponsored, or otherwise endorsed
273
+ by the JESS authors. It was developed
274
+ by [Martin Larralde](https://github.com/althonos/) during his PhD project
275
+ at the [Leiden University Medical Center](https://www.lumc.nl/en/) in
276
+ the [Zeller team](https://github.com/zellerlab).*
277
+
278
+
279
+ ## 📚 References
280
+
281
+ - <a id="ref1">\[1\]</a> Barker, J. A., & Thornton, J. M. (2003). An algorithm for constraint-based structural template matching: application to 3D templates with statistical analysis. Bioinformatics (Oxford, England), 19(13), 1644–1649. [doi:10.1093/bioinformatics/btg226](https://doi.org/10.1093/bioinformatics/btg226).
282
+ - <a id="ref2">\[2\]</a> Wallace, A. C., Borkakoti, N., & Thornton, J. M. (1997). TESS: a geometric hashing algorithm for deriving 3D coordinate templates for searching structural databases. Application to enzyme active sites. Protein science : a publication of the Protein Society, 6(11), 2308–2323. [doi:10.1002/pro.5560061104](https://doi.org/10.1002/pro.5560061104).
@@ -0,0 +1,34 @@
1
+ pyjess-0.7.0.dist-info/RECORD,,
2
+ pyjess-0.7.0.dist-info/WHEEL,sha256=iJgvI4fpUME_8VPeIyb5QG5s2iayqhcBTOkPL7ke--A,112
3
+ pyjess-0.7.0.dist-info/entry_points.txt,sha256=5dgYfglg8P5hPTIyrKAnOBmYqs2GRR0kb6x0BncaHbA,44
4
+ pyjess-0.7.0.dist-info/METADATA,sha256=5dzLVyfgSMsKIpC5os1TXVIGZIAw7yAKGLurBegAC3M,14276
5
+ pyjess-0.7.0.dist-info/licenses/COPYING,sha256=gLCfHtBLTrghVX7GkpmZqoozWMNN46502m_OUiYy01Y,1103
6
+ pyjess/_jess.pyi,sha256=_yTjIk2kXMNxzdPOoq4mM94Haj__ZrUO-Bpf3alr3yI,8320
7
+ pyjess/CMakeLists.txt,sha256=Oa0pniEQx9jXyFCJGyrswn9ahWSSVuW1madyeP6StoI,35
8
+ pyjess/_jess.abi3.so,sha256=fAfh2_yqo9UP1GxhTEf15pUppaX_2mBmftd1jLiefc8,367712
9
+ pyjess/__init__.py,sha256=h4XXLdS4FnyVa-MBs_k3eZMG1jWxeiOJnwfBaJA9gyQ,745
10
+ pyjess/cli.py,sha256=rKu5Aou8RV-VPn1ZCg-3cTnwnJmJljr860e9IaUTFBM,8931
11
+ pyjess/.gitignore,sha256=uQBOufp4v50qn0aZKv6zbSo00cjfB-v9KySog7rlmIU,19
12
+ pyjess/_jess.pyx,sha256=6L3ZLEiZ-TeBSeTAjgIyJW0EiL4uAWya1phXi-wHeEg,80573
13
+ pyjess/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ pyjess/__main__.py,sha256=ta7kfEb_2NW90moR7hNco1SYcPy4Hm-QWziP3IBERFU,50
15
+ pyjess/tests/__init__.py,sha256=wn5ZgE-uCW1iOnhyd6TaLZiAuvCWLli-u2XbSPZAvno,678
16
+ pyjess/tests/test_molecule.py,sha256=r4cdPMjb-sCxP9HHGO3Zf9V3haW5KJqQ9ce0pEAb1iM,12547
17
+ pyjess/tests/utils.py,sha256=dsaphex7qomJCvSHWnVy79iYDPGiL59xqGAtRoVAeWc,196
18
+ pyjess/tests/test_doctest.py,sha256=S8TZnbCFTBqArwjuNwLiIPKY0zVsHIl_5i8elR0MXCY,2554
19
+ pyjess/tests/test_hit.py,sha256=ZAhyQlVczao3sDYdFIBR0Mulczz0NsykJt9pR9QM-AI,2412
20
+ pyjess/tests/test_atom.py,sha256=omNznNbRXMDt2j1plAUlfWPGCfmtkYpj2jysEX1zQuY,4631
21
+ pyjess/tests/test_jess.py,sha256=czpu8k9rtR_cJCjnk2c5S69eB4_bCgCW8WZkH0pU0Ow,17296
22
+ pyjess/tests/test_template.py,sha256=SRCjvxDamqG55oS95lHBxiEsmHlzh_qTFt9LvVsCVsw,4900
23
+ pyjess/tests/test_template_atom.py,sha256=s9tJ_SAgvKeGwbVjaTWY-EtsUeQp3eu4NF5ja3oO_84,3405
24
+ pyjess/tests/data/pdb1lnb.pdb,sha256=E9Jjy4qQ75O1UKIXcVyVJHE1XDNx1Rb7ENPVrehW6N8,270054
25
+ pyjess/tests/data/1AMY.pdb,sha256=t2CaGLdOyPrhyeMpe1TbwZ8u7QmfxCIG1Pit8-vzvgo,319221
26
+ pyjess/tests/data/1AMY.cif,sha256=cWRy1GqqWzC_07j5fh8dgw-th7KHKTp2EESEyjr16Z8,393628
27
+ pyjess/tests/data/4.1.2.tpl,sha256=6-N137e64dNXbJe1qveh8OzaOd4W0k1FXrzyM0aXLgk,1054
28
+ pyjess/tests/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ pyjess/tests/data/template_01.qry,sha256=y3jTNf-WH2wL7OizKGJEPvLIlF3qHDAyR3LdKqWjy60,605
30
+ pyjess/tests/data/template_02.qry,sha256=IAI6eiDA-Qji7cFYW9S8e0XYNTlHb8XtJibP3PVGuHw,607
31
+ pyjess/tests/data/1.3.3.tpl,sha256=mg3STlRiNESM0chuOQ8CodW3Ohnxbt1_nx4PId63iOI,988
32
+ pyjess/tests/data/5ayx.EF.pdb,sha256=iLOz_7YE4luwTv99sQi7-ZY4qVazwIgyAWux6oBjPT4,5159
33
+ pyjess/tests/data/1AMY+1.3.3.txt,sha256=41R3aa6jozzSSfzboxhyK5xfX8e47aiq2U4W7aCzRm8,103584
34
+ pyjess/tests/data/1sur.qry,sha256=Rj8zM_K-gNZdSYhxDwB0ib0TjOuZ8cSJQ_FFhBzLGfs,1158
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: scikit-build-core 0.11.6
3
+ Root-Is-Purelib: false
4
+ Tag: cp38-abi3-macosx_11_0_arm64
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ pyjess = pyjess.cli:main
3
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2025 Martin Larralde <martin.larralde@embl.de>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.