dl1wjd2 commited on
Commit
1a53198
·
verified ·
1 Parent(s): fc6c5da

Upload folder using huggingface_hub (part 9)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +6 -0
  2. hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/INSTALLER +1 -0
  3. hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/LICENSE +1253 -0
  4. hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/METADATA +1366 -0
  5. hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/RECORD +891 -0
  6. hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/WHEEL +6 -0
  7. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patches.cpython-312.pyc +0 -0
  8. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_path.cpython-312.pyc +0 -0
  9. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc +0 -0
  10. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc +0 -0
  11. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_png.cpython-312.pyc +0 -0
  12. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_polar.cpython-312.pyc +0 -0
  13. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc +0 -0
  14. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc +0 -0
  15. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc +0 -0
  16. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc +0 -0
  17. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc +0 -0
  18. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_scale.cpython-312.pyc +0 -0
  19. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc +0 -0
  20. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_skew.cpython-312.pyc +0 -0
  21. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc +0 -0
  22. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_spines.cpython-312.pyc +0 -0
  23. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc +0 -0
  24. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_style.cpython-312.pyc +0 -0
  25. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc +0 -0
  26. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_table.cpython-312.pyc +0 -0
  27. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_testing.cpython-312.pyc +0 -0
  28. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc +0 -0
  29. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_text.cpython-312.pyc +0 -0
  30. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc +0 -0
  31. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc +3 -0
  32. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc +0 -0
  33. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc +0 -0
  34. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc +0 -0
  35. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc +0 -0
  36. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_units.cpython-312.pyc +0 -0
  37. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc +0 -0
  38. hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc +0 -0
  39. hug/lib/python3.12/site-packages/matplotlib/tests/conftest.py +3 -0
  40. hug/lib/python3.12/site-packages/matplotlib/tests/test_afm.py +148 -0
  41. hug/lib/python3.12/site-packages/matplotlib/tests/test_agg.py +396 -0
  42. hug/lib/python3.12/site-packages/matplotlib/tests/test_agg_filter.py +30 -0
  43. hug/lib/python3.12/site-packages/matplotlib/tests/test_animation.py +573 -0
  44. hug/lib/python3.12/site-packages/matplotlib/tests/test_api.py +178 -0
  45. hug/lib/python3.12/site-packages/matplotlib/tests/test_arrow_patches.py +221 -0
  46. hug/lib/python3.12/site-packages/matplotlib/tests/test_artist.py +625 -0
  47. hug/lib/python3.12/site-packages/matplotlib/tests/test_axes.py +0 -0
  48. hug/lib/python3.12/site-packages/matplotlib/tests/test_axis.py +130 -0
  49. hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_bases.py +589 -0
  50. hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_cairo.py +53 -0
.gitattributes CHANGED
@@ -144,3 +144,9 @@ hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_colors.cpytho
144
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_figure.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
145
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_image.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
146
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_legend.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
144
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_figure.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
145
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_image.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
146
  hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_legend.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
147
+ hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
148
+ hug/lib/python3.12/site-packages/mpl_toolkits/mplot3d/__pycache__/axes3d.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
149
+ hug/lib/python3.12/site-packages/mpl_toolkits/mplot3d/tests/__pycache__/test_axes3d.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
150
+ hug/lib/python3.12/site-packages/mpmath/__pycache__/function_docs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
151
+ hug/lib/python3.12/site-packages/mpmath/tests/__pycache__/test_fp.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
152
+ hug/lib/python3.12/site-packages/mpmath/tests/__pycache__/test_functions2.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/LICENSE ADDED
@@ -0,0 +1,1253 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ License agreement for matplotlib versions 1.3.0 and later
2
+ =========================================================
3
+
4
+ 1. This LICENSE AGREEMENT is between the Matplotlib Development Team
5
+ ("MDT"), and the Individual or Organization ("Licensee") accessing and
6
+ otherwise using matplotlib software in source or binary form and its
7
+ associated documentation.
8
+
9
+ 2. Subject to the terms and conditions of this License Agreement, MDT
10
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
11
+ to reproduce, analyze, test, perform and/or display publicly, prepare
12
+ derivative works, distribute, and otherwise use matplotlib
13
+ alone or in any derivative version, provided, however, that MDT's
14
+ License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
15
+ 2012- Matplotlib Development Team; All Rights Reserved" are retained in
16
+ matplotlib alone or in any derivative version prepared by
17
+ Licensee.
18
+
19
+ 3. In the event Licensee prepares a derivative work that is based on or
20
+ incorporates matplotlib or any part thereof, and wants to
21
+ make the derivative work available to others as provided herein, then
22
+ Licensee hereby agrees to include in any such work a brief summary of
23
+ the changes made to matplotlib .
24
+
25
+ 4. MDT is making matplotlib available to Licensee on an "AS
26
+ IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
27
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
28
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
29
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
30
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
31
+
32
+ 5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
33
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
34
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
35
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
36
+ THE POSSIBILITY THEREOF.
37
+
38
+ 6. This License Agreement will automatically terminate upon a material
39
+ breach of its terms and conditions.
40
+
41
+ 7. Nothing in this License Agreement shall be deemed to create any
42
+ relationship of agency, partnership, or joint venture between MDT and
43
+ Licensee. This License Agreement does not grant permission to use MDT
44
+ trademarks or trade name in a trademark sense to endorse or promote
45
+ products or services of Licensee, or any third party.
46
+
47
+ 8. By copying, installing or otherwise using matplotlib ,
48
+ Licensee agrees to be bound by the terms and conditions of this License
49
+ Agreement.
50
+
51
+ License agreement for matplotlib versions prior to 1.3.0
52
+ ========================================================
53
+
54
+ 1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
55
+ Individual or Organization ("Licensee") accessing and otherwise using
56
+ matplotlib software in source or binary form and its associated
57
+ documentation.
58
+
59
+ 2. Subject to the terms and conditions of this License Agreement, JDH
60
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
61
+ to reproduce, analyze, test, perform and/or display publicly, prepare
62
+ derivative works, distribute, and otherwise use matplotlib
63
+ alone or in any derivative version, provided, however, that JDH's
64
+ License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
65
+ 2002-2011 John D. Hunter; All Rights Reserved" are retained in
66
+ matplotlib alone or in any derivative version prepared by
67
+ Licensee.
68
+
69
+ 3. In the event Licensee prepares a derivative work that is based on or
70
+ incorporates matplotlib or any part thereof, and wants to
71
+ make the derivative work available to others as provided herein, then
72
+ Licensee hereby agrees to include in any such work a brief summary of
73
+ the changes made to matplotlib.
74
+
75
+ 4. JDH is making matplotlib available to Licensee on an "AS
76
+ IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
77
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
78
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
79
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
80
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
81
+
82
+ 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
83
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
84
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
85
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
86
+ THE POSSIBILITY THEREOF.
87
+
88
+ 6. This License Agreement will automatically terminate upon a material
89
+ breach of its terms and conditions.
90
+
91
+ 7. Nothing in this License Agreement shall be deemed to create any
92
+ relationship of agency, partnership, or joint venture between JDH and
93
+ Licensee. This License Agreement does not grant permission to use JDH
94
+ trademarks or trade name in a trademark sense to endorse or promote
95
+ products or services of Licensee, or any third party.
96
+
97
+ 8. By copying, installing or otherwise using matplotlib,
98
+ Licensee agrees to be bound by the terms and conditions of this License
99
+ Agreement.
100
+ ----
101
+
102
+ This binary distrubution of Matplotlib can also bundle the following software
103
+ (depending on the build):
104
+
105
+ Name: AMS Fonts
106
+ Files: matplotlib/tests/cmr10.pfb
107
+ Description: Type-1 version of one of Knuth's Computer Modern fonts
108
+ License: OFL-1.1
109
+ The cmr10.pfb file is a Type-1 version of one of Knuth's Computer Modern fonts.
110
+ It is included here as test data only, but the following license applies.
111
+
112
+ Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org).
113
+ All Rights Reserved.
114
+
115
+ "cmb10" is a Reserved Font Name for this Font Software.
116
+ "cmbsy10" is a Reserved Font Name for this Font Software.
117
+ "cmbsy5" is a Reserved Font Name for this Font Software.
118
+ "cmbsy6" is a Reserved Font Name for this Font Software.
119
+ "cmbsy7" is a Reserved Font Name for this Font Software.
120
+ "cmbsy8" is a Reserved Font Name for this Font Software.
121
+ "cmbsy9" is a Reserved Font Name for this Font Software.
122
+ "cmbx10" is a Reserved Font Name for this Font Software.
123
+ "cmbx12" is a Reserved Font Name for this Font Software.
124
+ "cmbx5" is a Reserved Font Name for this Font Software.
125
+ "cmbx6" is a Reserved Font Name for this Font Software.
126
+ "cmbx7" is a Reserved Font Name for this Font Software.
127
+ "cmbx8" is a Reserved Font Name for this Font Software.
128
+ "cmbx9" is a Reserved Font Name for this Font Software.
129
+ "cmbxsl10" is a Reserved Font Name for this Font Software.
130
+ "cmbxti10" is a Reserved Font Name for this Font Software.
131
+ "cmcsc10" is a Reserved Font Name for this Font Software.
132
+ "cmcsc8" is a Reserved Font Name for this Font Software.
133
+ "cmcsc9" is a Reserved Font Name for this Font Software.
134
+ "cmdunh10" is a Reserved Font Name for this Font Software.
135
+ "cmex10" is a Reserved Font Name for this Font Software.
136
+ "cmex7" is a Reserved Font Name for this Font Software.
137
+ "cmex8" is a Reserved Font Name for this Font Software.
138
+ "cmex9" is a Reserved Font Name for this Font Software.
139
+ "cmff10" is a Reserved Font Name for this Font Software.
140
+ "cmfi10" is a Reserved Font Name for this Font Software.
141
+ "cmfib8" is a Reserved Font Name for this Font Software.
142
+ "cminch" is a Reserved Font Name for this Font Software.
143
+ "cmitt10" is a Reserved Font Name for this Font Software.
144
+ "cmmi10" is a Reserved Font Name for this Font Software.
145
+ "cmmi12" is a Reserved Font Name for this Font Software.
146
+ "cmmi5" is a Reserved Font Name for this Font Software.
147
+ "cmmi6" is a Reserved Font Name for this Font Software.
148
+ "cmmi7" is a Reserved Font Name for this Font Software.
149
+ "cmmi8" is a Reserved Font Name for this Font Software.
150
+ "cmmi9" is a Reserved Font Name for this Font Software.
151
+ "cmmib10" is a Reserved Font Name for this Font Software.
152
+ "cmmib5" is a Reserved Font Name for this Font Software.
153
+ "cmmib6" is a Reserved Font Name for this Font Software.
154
+ "cmmib7" is a Reserved Font Name for this Font Software.
155
+ "cmmib8" is a Reserved Font Name for this Font Software.
156
+ "cmmib9" is a Reserved Font Name for this Font Software.
157
+ "cmr10" is a Reserved Font Name for this Font Software.
158
+ "cmr12" is a Reserved Font Name for this Font Software.
159
+ "cmr17" is a Reserved Font Name for this Font Software.
160
+ "cmr5" is a Reserved Font Name for this Font Software.
161
+ "cmr6" is a Reserved Font Name for this Font Software.
162
+ "cmr7" is a Reserved Font Name for this Font Software.
163
+ "cmr8" is a Reserved Font Name for this Font Software.
164
+ "cmr9" is a Reserved Font Name for this Font Software.
165
+ "cmsl10" is a Reserved Font Name for this Font Software.
166
+ "cmsl12" is a Reserved Font Name for this Font Software.
167
+ "cmsl8" is a Reserved Font Name for this Font Software.
168
+ "cmsl9" is a Reserved Font Name for this Font Software.
169
+ "cmsltt10" is a Reserved Font Name for this Font Software.
170
+ "cmss10" is a Reserved Font Name for this Font Software.
171
+ "cmss12" is a Reserved Font Name for this Font Software.
172
+ "cmss17" is a Reserved Font Name for this Font Software.
173
+ "cmss8" is a Reserved Font Name for this Font Software.
174
+ "cmss9" is a Reserved Font Name for this Font Software.
175
+ "cmssbx10" is a Reserved Font Name for this Font Software.
176
+ "cmssdc10" is a Reserved Font Name for this Font Software.
177
+ "cmssi10" is a Reserved Font Name for this Font Software.
178
+ "cmssi12" is a Reserved Font Name for this Font Software.
179
+ "cmssi17" is a Reserved Font Name for this Font Software.
180
+ "cmssi8" is a Reserved Font Name for this Font Software.
181
+ "cmssi9" is a Reserved Font Name for this Font Software.
182
+ "cmssq8" is a Reserved Font Name for this Font Software.
183
+ "cmssqi8" is a Reserved Font Name for this Font Software.
184
+ "cmsy10" is a Reserved Font Name for this Font Software.
185
+ "cmsy5" is a Reserved Font Name for this Font Software.
186
+ "cmsy6" is a Reserved Font Name for this Font Software.
187
+ "cmsy7" is a Reserved Font Name for this Font Software.
188
+ "cmsy8" is a Reserved Font Name for this Font Software.
189
+ "cmsy9" is a Reserved Font Name for this Font Software.
190
+ "cmtcsc10" is a Reserved Font Name for this Font Software.
191
+ "cmtex10" is a Reserved Font Name for this Font Software.
192
+ "cmtex8" is a Reserved Font Name for this Font Software.
193
+ "cmtex9" is a Reserved Font Name for this Font Software.
194
+ "cmti10" is a Reserved Font Name for this Font Software.
195
+ "cmti12" is a Reserved Font Name for this Font Software.
196
+ "cmti7" is a Reserved Font Name for this Font Software.
197
+ "cmti8" is a Reserved Font Name for this Font Software.
198
+ "cmti9" is a Reserved Font Name for this Font Software.
199
+ "cmtt10" is a Reserved Font Name for this Font Software.
200
+ "cmtt12" is a Reserved Font Name for this Font Software.
201
+ "cmtt8" is a Reserved Font Name for this Font Software.
202
+ "cmtt9" is a Reserved Font Name for this Font Software.
203
+ "cmu10" is a Reserved Font Name for this Font Software.
204
+ "cmvtt10" is a Reserved Font Name for this Font Software.
205
+ "euex10" is a Reserved Font Name for this Font Software.
206
+ "euex7" is a Reserved Font Name for this Font Software.
207
+ "euex8" is a Reserved Font Name for this Font Software.
208
+ "euex9" is a Reserved Font Name for this Font Software.
209
+ "eufb10" is a Reserved Font Name for this Font Software.
210
+ "eufb5" is a Reserved Font Name for this Font Software.
211
+ "eufb7" is a Reserved Font Name for this Font Software.
212
+ "eufm10" is a Reserved Font Name for this Font Software.
213
+ "eufm5" is a Reserved Font Name for this Font Software.
214
+ "eufm7" is a Reserved Font Name for this Font Software.
215
+ "eurb10" is a Reserved Font Name for this Font Software.
216
+ "eurb5" is a Reserved Font Name for this Font Software.
217
+ "eurb7" is a Reserved Font Name for this Font Software.
218
+ "eurm10" is a Reserved Font Name for this Font Software.
219
+ "eurm5" is a Reserved Font Name for this Font Software.
220
+ "eurm7" is a Reserved Font Name for this Font Software.
221
+ "eusb10" is a Reserved Font Name for this Font Software.
222
+ "eusb5" is a Reserved Font Name for this Font Software.
223
+ "eusb7" is a Reserved Font Name for this Font Software.
224
+ "eusm10" is a Reserved Font Name for this Font Software.
225
+ "eusm5" is a Reserved Font Name for this Font Software.
226
+ "eusm7" is a Reserved Font Name for this Font Software.
227
+ "lasy10" is a Reserved Font Name for this Font Software.
228
+ "lasy5" is a Reserved Font Name for this Font Software.
229
+ "lasy6" is a Reserved Font Name for this Font Software.
230
+ "lasy7" is a Reserved Font Name for this Font Software.
231
+ "lasy8" is a Reserved Font Name for this Font Software.
232
+ "lasy9" is a Reserved Font Name for this Font Software.
233
+ "lasyb10" is a Reserved Font Name for this Font Software.
234
+ "lcircle1" is a Reserved Font Name for this Font Software.
235
+ "lcirclew" is a Reserved Font Name for this Font Software.
236
+ "lcmss8" is a Reserved Font Name for this Font Software.
237
+ "lcmssb8" is a Reserved Font Name for this Font Software.
238
+ "lcmssi8" is a Reserved Font Name for this Font Software.
239
+ "line10" is a Reserved Font Name for this Font Software.
240
+ "linew10" is a Reserved Font Name for this Font Software.
241
+ "msam10" is a Reserved Font Name for this Font Software.
242
+ "msam5" is a Reserved Font Name for this Font Software.
243
+ "msam6" is a Reserved Font Name for this Font Software.
244
+ "msam7" is a Reserved Font Name for this Font Software.
245
+ "msam8" is a Reserved Font Name for this Font Software.
246
+ "msam9" is a Reserved Font Name for this Font Software.
247
+ "msbm10" is a Reserved Font Name for this Font Software.
248
+ "msbm5" is a Reserved Font Name for this Font Software.
249
+ "msbm6" is a Reserved Font Name for this Font Software.
250
+ "msbm7" is a Reserved Font Name for this Font Software.
251
+ "msbm8" is a Reserved Font Name for this Font Software.
252
+ "msbm9" is a Reserved Font Name for this Font Software.
253
+ "wncyb10" is a Reserved Font Name for this Font Software.
254
+ "wncyi10" is a Reserved Font Name for this Font Software.
255
+ "wncyr10" is a Reserved Font Name for this Font Software.
256
+ "wncysc10" is a Reserved Font Name for this Font Software.
257
+ "wncyss10" is a Reserved Font Name for this Font Software.
258
+
259
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
260
+ This license is copied below, and is also available with a FAQ at:
261
+ http://scripts.sil.org/OFL
262
+
263
+ -----------------------------------------------------------
264
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
265
+ -----------------------------------------------------------
266
+
267
+ PREAMBLE
268
+ The goals of the Open Font License (OFL) are to stimulate worldwide
269
+ development of collaborative font projects, to support the font creation
270
+ efforts of academic and linguistic communities, and to provide a free and
271
+ open framework in which fonts may be shared and improved in partnership
272
+ with others.
273
+
274
+ The OFL allows the licensed fonts to be used, studied, modified and
275
+ redistributed freely as long as they are not sold by themselves. The
276
+ fonts, including any derivative works, can be bundled, embedded,
277
+ redistributed and/or sold with any software provided that any reserved
278
+ names are not used by derivative works. The fonts and derivatives,
279
+ however, cannot be released under any other type of license. The
280
+ requirement for fonts to remain under this license does not apply
281
+ to any document created using the fonts or their derivatives.
282
+
283
+ DEFINITIONS
284
+ "Font Software" refers to the set of files released by the Copyright
285
+ Holder(s) under this license and clearly marked as such. This may
286
+ include source files, build scripts and documentation.
287
+
288
+ "Reserved Font Name" refers to any names specified as such after the
289
+ copyright statement(s).
290
+
291
+ "Original Version" refers to the collection of Font Software components as
292
+ distributed by the Copyright Holder(s).
293
+
294
+ "Modified Version" refers to any derivative made by adding to, deleting,
295
+ or substituting -- in part or in whole -- any of the components of the
296
+ Original Version, by changing formats or by porting the Font Software to a
297
+ new environment.
298
+
299
+ "Author" refers to any designer, engineer, programmer, technical
300
+ writer or other person who contributed to the Font Software.
301
+
302
+ PERMISSION & CONDITIONS
303
+ Permission is hereby granted, free of charge, to any person obtaining
304
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
305
+ redistribute, and sell modified and unmodified copies of the Font
306
+ Software, subject to the following conditions:
307
+
308
+ 1) Neither the Font Software nor any of its individual components,
309
+ in Original or Modified Versions, may be sold by itself.
310
+
311
+ 2) Original or Modified Versions of the Font Software may be bundled,
312
+ redistributed and/or sold with any software, provided that each copy
313
+ contains the above copyright notice and this license. These can be
314
+ included either as stand-alone text files, human-readable headers or
315
+ in the appropriate machine-readable metadata fields within text or
316
+ binary files as long as those fields can be easily viewed by the user.
317
+
318
+ 3) No Modified Version of the Font Software may use the Reserved Font
319
+ Name(s) unless explicit written permission is granted by the corresponding
320
+ Copyright Holder. This restriction only applies to the primary font name as
321
+ presented to the users.
322
+
323
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
324
+ Software shall not be used to promote, endorse or advertise any
325
+ Modified Version, except to acknowledge the contribution(s) of the
326
+ Copyright Holder(s) and the Author(s) or with their explicit written
327
+ permission.
328
+
329
+ 5) The Font Software, modified or unmodified, in part or in whole,
330
+ must be distributed entirely under this license, and must not be
331
+ distributed under any other license. The requirement for fonts to
332
+ remain under this license does not apply to any document created
333
+ using the Font Software.
334
+
335
+ TERMINATION
336
+ This license becomes null and void if any of the above conditions are
337
+ not met.
338
+
339
+ DISCLAIMER
340
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
341
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
342
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
343
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
344
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
345
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
346
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
347
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
348
+ OTHER DEALINGS IN THE FONT SOFTWARE.
349
+
350
+
351
+
352
+ Name: BaKoMa Fonts
353
+ Files: matplotlib/mpl-data/fonts/ttf/cm*.ttf matplotlib/mpl-data/fonts/afm/cm*.afm
354
+ Description: Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
355
+ License: BaKoMa Fonts Licence
356
+ BaKoMa Fonts Licence
357
+ --------------------
358
+
359
+ This licence covers two font packs (known as BaKoMa Fonts Collection,
360
+ which is available at `CTAN:fonts/cm/ps-type1/bakoma/'):
361
+
362
+ 1) BaKoMa-CM (1.1/12-Nov-94)
363
+ Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
364
+
365
+ 2) BaKoMa-AMS (1.2/19-Jan-95)
366
+ AMS TeX fonts in PostScript Type 1 and TrueType font formats.
367
+
368
+ Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved.
369
+
370
+ Permission to copy and distribute these fonts for any purpose is
371
+ hereby granted without fee, provided that the above copyright notice,
372
+ author statement and this permission notice appear in all copies of
373
+ these fonts and related documentation.
374
+
375
+ Permission to modify and distribute modified fonts for any purpose is
376
+ hereby granted without fee, provided that the copyright notice,
377
+ author statement, this permission notice and location of original
378
+ fonts (http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma)
379
+ appear in all copies of modified fonts and related documentation.
380
+
381
+ Permission to use these fonts (embedding into PostScript, PDF, SVG
382
+ and printing by using any software) is hereby granted without fee.
383
+ It is not required to provide any notices about using these fonts.
384
+
385
+ Basil K. Malyshev
386
+ INSTITUTE FOR HIGH ENERGY PHYSICS
387
+ IHEP, OMVT
388
+ Moscow Region
389
+ 142281 PROTVINO
390
+ RUSSIA
391
+
392
+ E-Mail: bakoma@mail.ru
393
+ or malyshev@mail.ihep.ru
394
+
395
+
396
+
397
+
398
+ Name: ColorBrewer Color Schemes
399
+ Files: lib/matplotlib/_cm.py
400
+ Description: Color schemes from ColorBrewer
401
+ License: Apache-2.0
402
+ Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes
403
+
404
+ Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University.
405
+
406
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
407
+ You may obtain a copy of the License at
408
+
409
+ http://www.apache.org/licenses/LICENSE-2.0
410
+
411
+ Unless required by applicable law or agreed to in writing, software distributed
412
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
413
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
414
+ specific language governing permissions and limitations under the License.
415
+
416
+
417
+ Name: Courier 10
418
+ Files: matplotlib/tests/Courier10PitchBT-Bold.pfb
419
+ Description: Courier 10 font, used in tests.
420
+ License: Bitstream-Charter
421
+ The Courier10PitchBT-Bold.pfb file is a Type-1 version of
422
+ Courier 10 Pitch BT Bold by Bitstream, obtained from
423
+ <https://ctan.org/tex-archive/fonts/courierten>. It is included
424
+ here as test data only, but the following license applies.
425
+
426
+
427
+ (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
428
+
429
+ You are hereby granted permission under all Bitstream propriety rights
430
+ to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
431
+ Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
432
+ for any purpose and without restriction; provided, that this notice is
433
+ left intact on all copies of such fonts and that Bitstream's trademark
434
+ is acknowledged as shown below on all unmodified copies of the 4 Charter
435
+ Type 1 fonts.
436
+
437
+ BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
438
+
439
+
440
+ Name: FreeType
441
+ Files: matplotlib/ft2font.*.so
442
+ Description: Font rendering library
443
+ License: FTL OR GPL-2.0-or-later
444
+ The FreeType 2 font engine is copyrighted work and cannot be used
445
+ legally without a software license. In order to make this project
446
+ usable to a vast majority of developers, we distribute it under two
447
+ mutually exclusive open-source licenses.
448
+
449
+ This means that *you* must choose *one* of the two licenses described
450
+ below, then obey all its terms and conditions when using FreeType 2 in
451
+ any of your projects or products.
452
+
453
+ - The FreeType License, found in the file `docs/FTL.TXT`, which is
454
+ similar to the original BSD license *with* an advertising clause
455
+ that forces you to explicitly cite the FreeType project in your
456
+ product's documentation. All details are in the license file.
457
+ This license is suited to products which don't use the GNU General
458
+ Public License.
459
+
460
+ Note that this license is compatible to the GNU General Public
461
+ License version 3, but not version 2.
462
+
463
+ - The GNU General Public License version 2, found in
464
+ `docs/GPLv2.TXT` (any later version can be used also), for
465
+ programs which already use the GPL. Note that the FTL is
466
+ incompatible with GPLv2 due to its advertisement clause.
467
+
468
+ The contributed BDF and PCF drivers come with a license similar to
469
+ that of the X Window System. It is compatible to the above two
470
+ licenses (see files `src/bdf/README` and `src/pcf/README`). The same
471
+ holds for the source code files `src/base/fthash.c` and
472
+ `include/freetype/internal/fthash.h`; they were part of the BDF driver
473
+ in earlier FreeType versions.
474
+
475
+ The gzip module uses the zlib license (see `src/gzip/zlib.h`) which
476
+ too is compatible to the above two licenses.
477
+
478
+ The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code
479
+ taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses
480
+ the 'Old MIT' license, compatible to the above two licenses.
481
+
482
+ The MD5 checksum support (only used for debugging in development
483
+ builds) is in the public domain.
484
+
485
+
486
+ Name: HarfBuzz
487
+ Files: matplotlib/ft2font.*.so
488
+ Description: Text shaping library
489
+ License: MIT-Modern-Variant
490
+ HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
491
+ For parts of HarfBuzz that are licensed under different licenses see individual
492
+ files names COPYING in subdirectories where applicable.
493
+
494
+ Copyright © 2010-2022 Google, Inc.
495
+ Copyright © 2015-2020 Ebrahim Byagowi
496
+ Copyright © 2019,2020 Facebook, Inc.
497
+ Copyright © 2012,2015 Mozilla Foundation
498
+ Copyright © 2011 Codethink Limited
499
+ Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
500
+ Copyright © 2009 Keith Stribley
501
+ Copyright © 2011 Martin Hosken and SIL International
502
+ Copyright © 2007 Chris Wilson
503
+ Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod
504
+ Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc.
505
+ Copyright © 1998-2005 David Turner and Werner Lemberg
506
+ Copyright © 2016 Igalia S.L.
507
+ Copyright © 2022 Matthias Clasen
508
+ Copyright © 2018,2021 Khaled Hosny
509
+ Copyright © 2018,2019,2020 Adobe, Inc
510
+ Copyright © 2013-2015 Alexei Podtelezhnikov
511
+
512
+ For full copyright notices consult the individual files in the package.
513
+
514
+
515
+ Permission is hereby granted, without written agreement and without
516
+ license or royalty fees, to use, copy, modify, and distribute this
517
+ software and its documentation for any purpose, provided that the
518
+ above copyright notice and the following two paragraphs appear in
519
+ all copies of this software.
520
+
521
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
522
+ DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
523
+ ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
524
+ IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
525
+ DAMAGE.
526
+
527
+ THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
528
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
529
+ FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
530
+ ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
531
+ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
532
+
533
+
534
+ Name: JSXTools resize observer
535
+ Files: lib/matplotlib/backends/web_backend/js/mpl.js
536
+ Description: Minimal polyfill for the ResizeObserver API
537
+ License: CC0-1.0
538
+ # CC0 1.0 Universal
539
+
540
+ ## Statement of Purpose
541
+
542
+ The laws of most jurisdictions throughout the world automatically confer
543
+ exclusive Copyright and Related Rights (defined below) upon the creator and
544
+ subsequent owner(s) (each and all, an “owner”) of an original work of
545
+ authorship and/or a database (each, a “Work”).
546
+
547
+ Certain owners wish to permanently relinquish those rights to a Work for the
548
+ purpose of contributing to a commons of creative, cultural and scientific works
549
+ (“Commons”) that the public can reliably and without fear of later claims of
550
+ infringement build upon, modify, incorporate in other works, reuse and
551
+ redistribute as freely as possible in any form whatsoever and for any purposes,
552
+ including without limitation commercial purposes. These owners may contribute
553
+ to the Commons to promote the ideal of a free culture and the further
554
+ production of creative, cultural and scientific works, or to gain reputation or
555
+ greater distribution for their Work in part through the use and efforts of
556
+ others.
557
+
558
+ For these and/or other purposes and motivations, and without any expectation of
559
+ additional consideration or compensation, the person associating CC0 with a
560
+ Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
561
+ and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
562
+ publicly distribute the Work under its terms, with knowledge of his or her
563
+ Copyright and Related Rights in the Work and the meaning and intended legal
564
+ effect of CC0 on those rights.
565
+
566
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
567
+ protected by copyright and related or neighboring rights (“Copyright and
568
+ Related Rights”). Copyright and Related Rights include, but are not limited
569
+ to, the following:
570
+ 1. the right to reproduce, adapt, distribute, perform, display, communicate,
571
+ and translate a Work;
572
+ 2. moral rights retained by the original author(s) and/or performer(s);
573
+ 3. publicity and privacy rights pertaining to a person’s image or likeness
574
+ depicted in a Work;
575
+ 4. rights protecting against unfair competition in regards to a Work,
576
+ subject to the limitations in paragraph 4(i), below;
577
+ 5. rights protecting the extraction, dissemination, use and reuse of data in
578
+ a Work;
579
+ 6. database rights (such as those arising under Directive 96/9/EC of the
580
+ European Parliament and of the Council of 11 March 1996 on the legal
581
+ protection of databases, and under any national implementation thereof,
582
+ including any amended or successor version of such directive); and
583
+ 7. other similar, equivalent or corresponding rights throughout the world
584
+ based on applicable law or treaty, and any national implementations
585
+ thereof.
586
+
587
+ 2. Waiver. To the greatest extent permitted by, but not in contravention of,
588
+ applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
589
+ unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
590
+ and Related Rights and associated claims and causes of action, whether now
591
+ known or unknown (including existing as well as future claims and causes of
592
+ action), in the Work (i) in all territories worldwide, (ii) for the maximum
593
+ duration provided by applicable law or treaty (including future time
594
+ extensions), (iii) in any current or future medium and for any number of
595
+ copies, and (iv) for any purpose whatsoever, including without limitation
596
+ commercial, advertising or promotional purposes (the “Waiver”). Affirmer
597
+ makes the Waiver for the benefit of each member of the public at large and
598
+ to the detriment of Affirmer’s heirs and successors, fully intending that
599
+ such Waiver shall not be subject to revocation, rescission, cancellation,
600
+ termination, or any other legal or equitable action to disrupt the quiet
601
+ enjoyment of the Work by the public as contemplated by Affirmer’s express
602
+ Statement of Purpose.
603
+
604
+ 3. Public License Fallback. Should any part of the Waiver for any reason be
605
+ judged legally invalid or ineffective under applicable law, then the Waiver
606
+ shall be preserved to the maximum extent permitted taking into account
607
+ Affirmer’s express Statement of Purpose. In addition, to the extent the
608
+ Waiver is so judged Affirmer hereby grants to each affected person a
609
+ royalty-free, non transferable, non sublicensable, non exclusive,
610
+ irrevocable and unconditional license to exercise Affirmer’s Copyright and
611
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
612
+ maximum duration provided by applicable law or treaty (including future time
613
+ extensions), (iii) in any current or future medium and for any number of
614
+ copies, and (iv) for any purpose whatsoever, including without limitation
615
+ commercial, advertising or promotional purposes (the “License”). The License
616
+ shall be deemed effective as of the date CC0 was applied by Affirmer to the
617
+ Work. Should any part of the License for any reason be judged legally
618
+ invalid or ineffective under applicable law, such partial invalidity or
619
+ ineffectiveness shall not invalidate the remainder of the License, and in
620
+ such case Affirmer hereby affirms that he or she will not (i) exercise any
621
+ of his or her remaining Copyright and Related Rights in the Work or (ii)
622
+ assert any associated claims and causes of action with respect to the Work,
623
+ in either case contrary to Affirmer’s express Statement of Purpose.
624
+
625
+ 4. Limitations and Disclaimers.
626
+ 1. No trademark or patent rights held by Affirmer are waived, abandoned,
627
+ surrendered, licensed or otherwise affected by this document.
628
+ 2. Affirmer offers the Work as-is and makes no representations or warranties
629
+ of any kind concerning the Work, express, implied, statutory or
630
+ otherwise, including without limitation warranties of title,
631
+ merchantability, fitness for a particular purpose, non infringement, or
632
+ the absence of latent or other defects, accuracy, or the present or
633
+ absence of errors, whether or not discoverable, all to the greatest
634
+ extent permissible under applicable law.
635
+ 3. Affirmer disclaims responsibility for clearing rights of other persons
636
+ that may apply to the Work or any use thereof, including without
637
+ limitation any person’s Copyright and Related Rights in the Work.
638
+ Further, Affirmer disclaims responsibility for obtaining any necessary
639
+ consents, permissions or other rights required for any use of the Work.
640
+ 4. Affirmer understands and acknowledges that Creative Commons is not a
641
+ party to this document and has no duty or obligation with respect to this
642
+ CC0 or use of the Work.
643
+
644
+ For more information, please see
645
+ http://creativecommons.org/publicdomain/zero/1.0/.
646
+
647
+
648
+ Name: Last Resort fonts
649
+ Files: matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf
650
+ Description: Last Resort High-Efficiency Font
651
+ License: OFL-1.1
652
+ This Font Software is licensed under the SIL Open Font License,
653
+ Version 1.1.
654
+
655
+ This license is copied below, and is also available with a FAQ at:
656
+ http://scripts.sil.org/OFL
657
+
658
+ -----------------------------------------------------------
659
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
660
+ -----------------------------------------------------------
661
+
662
+ PREAMBLE
663
+ The goals of the Open Font License (OFL) are to stimulate worldwide
664
+ development of collaborative font projects, to support the font
665
+ creation efforts of academic and linguistic communities, and to
666
+ provide a free and open framework in which fonts may be shared and
667
+ improved in partnership with others.
668
+
669
+ The OFL allows the licensed fonts to be used, studied, modified and
670
+ redistributed freely as long as they are not sold by themselves. The
671
+ fonts, including any derivative works, can be bundled, embedded,
672
+ redistributed and/or sold with any software provided that any reserved
673
+ names are not used by derivative works. The fonts and derivatives,
674
+ however, cannot be released under any other type of license. The
675
+ requirement for fonts to remain under this license does not apply to
676
+ any document created using the fonts or their derivatives.
677
+
678
+ DEFINITIONS
679
+ "Font Software" refers to the set of files released by the Copyright
680
+ Holder(s) under this license and clearly marked as such. This may
681
+ include source files, build scripts and documentation.
682
+
683
+ "Reserved Font Name" refers to any names specified as such after the
684
+ copyright statement(s).
685
+
686
+ "Original Version" refers to the collection of Font Software
687
+ components as distributed by the Copyright Holder(s).
688
+
689
+ "Modified Version" refers to any derivative made by adding to,
690
+ deleting, or substituting -- in part or in whole -- any of the
691
+ components of the Original Version, by changing formats or by porting
692
+ the Font Software to a new environment.
693
+
694
+ "Author" refers to any designer, engineer, programmer, technical
695
+ writer or other person who contributed to the Font Software.
696
+
697
+ PERMISSION & CONDITIONS
698
+ Permission is hereby granted, free of charge, to any person obtaining
699
+ a copy of the Font Software, to use, study, copy, merge, embed,
700
+ modify, redistribute, and sell modified and unmodified copies of the
701
+ Font Software, subject to the following conditions:
702
+
703
+ 1) Neither the Font Software nor any of its individual components, in
704
+ Original or Modified Versions, may be sold by itself.
705
+
706
+ 2) Original or Modified Versions of the Font Software may be bundled,
707
+ redistributed and/or sold with any software, provided that each copy
708
+ contains the above copyright notice and this license. These can be
709
+ included either as stand-alone text files, human-readable headers or
710
+ in the appropriate machine-readable metadata fields within text or
711
+ binary files as long as those fields can be easily viewed by the user.
712
+
713
+ 3) No Modified Version of the Font Software may use the Reserved Font
714
+ Name(s) unless explicit written permission is granted by the
715
+ corresponding Copyright Holder. This restriction only applies to the
716
+ primary font name as presented to the users.
717
+
718
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
719
+ Software shall not be used to promote, endorse or advertise any
720
+ Modified Version, except to acknowledge the contribution(s) of the
721
+ Copyright Holder(s) and the Author(s) or with their explicit written
722
+ permission.
723
+
724
+ 5) The Font Software, modified or unmodified, in part or in whole,
725
+ must be distributed entirely under this license, and must not be
726
+ distributed under any other license. The requirement for fonts to
727
+ remain under this license does not apply to any document created using
728
+ the Font Software.
729
+
730
+ TERMINATION
731
+ This license becomes null and void if any of the above conditions are
732
+ not met.
733
+
734
+ DISCLAIMER
735
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
736
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
737
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
738
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
739
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
740
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
741
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
742
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
743
+ OTHER DEALINGS IN THE FONT SOFTWARE.
744
+
745
+ SPDX-License-Identifier: OFL-1.1
746
+
747
+
748
+ Name: libraqm
749
+ Files: matplotlib/ft2font.*.so
750
+ Description: Complex text layout library
751
+ License: MIT
752
+ The MIT License (MIT)
753
+
754
+ Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
755
+ Copyright © 2016-2023 Khaled Hosny <khaled@aliftype.com>
756
+
757
+ Permission is hereby granted, free of charge, to any person obtaining a copy
758
+ of this software and associated documentation files (the "Software"), to deal
759
+ in the Software without restriction, including without limitation the rights
760
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
761
+ copies of the Software, and to permit persons to whom the Software is
762
+ furnished to do so, subject to the following conditions:
763
+
764
+ The above copyright notice and this permission notice shall be included in all
765
+ copies or substantial portions of the Software.
766
+
767
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
768
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
769
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
770
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
771
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
772
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
773
+ SOFTWARE.
774
+
775
+
776
+ Name: QHull
777
+ Files: matplotlib/_qhull.*.so
778
+ Description: Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection
779
+ License: Qhull
780
+ Qhull, Copyright (c) 1993-2020
781
+
782
+ C.B. Barber
783
+ Arlington, MA
784
+
785
+ and
786
+
787
+ The National Science and Technology Research Center for
788
+ Computation and Visualization of Geometric Structures
789
+ (The Geometry Center)
790
+ University of Minnesota
791
+
792
+ email: qhull@qhull.org
793
+
794
+ This software includes Qhull from C.B. Barber and The Geometry Center.
795
+ Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The
796
+ remaining files are copyrighted by C.B. Barber. Qhull is free software
797
+ and may be obtained via http from www.qhull.org. It may be freely copied,
798
+ modified, and redistributed under the following conditions:
799
+
800
+ 1. All copyright notices must remain intact in all files.
801
+
802
+ 2. A copy of this text file must be distributed along with any copies
803
+ of Qhull that you redistribute; this includes copies that you have
804
+ modified, or copies of programs or other software products that
805
+ include Qhull.
806
+
807
+ 3. If you modify Qhull, you must include a notice giving the
808
+ name of the person performing the modification, the date of
809
+ modification, and the reason for such modification.
810
+
811
+ 4. When distributing modified versions of Qhull, or other software
812
+ products that include Qhull, you must provide notice that the original
813
+ source code may be obtained as noted above.
814
+
815
+ 5. There is no warranty or other guarantee of fitness for Qhull, it is
816
+ provided solely "as is". Bug reports or fixes may be sent to
817
+ qhull_bug@qhull.org; the authors may or may not act on them as
818
+ they desire.
819
+
820
+
821
+ Name: Qt4 Editor
822
+ Files: matplotlib/backends/qt_editor
823
+ Description: Module creating PyQt4 form dialogs/layouts to edit various type of parameters
824
+ License: MIT
825
+ Module creating PyQt4 form dialogs/layouts to edit various type of parameters
826
+
827
+
828
+ formlayout License Agreement (MIT License)
829
+ ------------------------------------------
830
+
831
+ Copyright (c) 2009 Pierre Raybaut
832
+
833
+ Permission is hereby granted, free of charge, to any person
834
+ obtaining a copy of this software and associated documentation
835
+ files (the "Software"), to deal in the Software without
836
+ restriction, including without limitation the rights to use,
837
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
838
+ copies of the Software, and to permit persons to whom the
839
+ Software is furnished to do so, subject to the following
840
+ conditions:
841
+
842
+ The above copyright notice and this permission notice shall be
843
+ included in all copies or substantial portions of the Software.
844
+
845
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
846
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
847
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
848
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
849
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
850
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
851
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
852
+ OTHER DEALINGS IN THE SOFTWARE.
853
+
854
+
855
+ Name: SheenBidi
856
+ Files: matplotlib/ft2font.*.so
857
+ Description: Unicode Bidirectional Algorithm implementation
858
+ License: Apache-2.0
859
+ Apache License
860
+ Version 2.0, January 2004
861
+ http://www.apache.org/licenses/
862
+
863
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
864
+
865
+ 1. Definitions.
866
+
867
+ "License" shall mean the terms and conditions for use, reproduction,
868
+ and distribution as defined by Sections 1 through 9 of this document.
869
+
870
+ "Licensor" shall mean the copyright owner or entity authorized by
871
+ the copyright owner that is granting the License.
872
+
873
+ "Legal Entity" shall mean the union of the acting entity and all
874
+ other entities that control, are controlled by, or are under common
875
+ control with that entity. For the purposes of this definition,
876
+ "control" means (i) the power, direct or indirect, to cause the
877
+ direction or management of such entity, whether by contract or
878
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
879
+ outstanding shares, or (iii) beneficial ownership of such entity.
880
+
881
+ "You" (or "Your") shall mean an individual or Legal Entity
882
+ exercising permissions granted by this License.
883
+
884
+ "Source" form shall mean the preferred form for making modifications,
885
+ including but not limited to software source code, documentation
886
+ source, and configuration files.
887
+
888
+ "Object" form shall mean any form resulting from mechanical
889
+ transformation or translation of a Source form, including but
890
+ not limited to compiled object code, generated documentation,
891
+ and conversions to other media types.
892
+
893
+ "Work" shall mean the work of authorship, whether in Source or
894
+ Object form, made available under the License, as indicated by a
895
+ copyright notice that is included in or attached to the work
896
+ (an example is provided in the Appendix below).
897
+
898
+ "Derivative Works" shall mean any work, whether in Source or Object
899
+ form, that is based on (or derived from) the Work and for which the
900
+ editorial revisions, annotations, elaborations, or other modifications
901
+ represent, as a whole, an original work of authorship. For the purposes
902
+ of this License, Derivative Works shall not include works that remain
903
+ separable from, or merely link (or bind by name) to the interfaces of,
904
+ the Work and Derivative Works thereof.
905
+
906
+ "Contribution" shall mean any work of authorship, including
907
+ the original version of the Work and any modifications or additions
908
+ to that Work or Derivative Works thereof, that is intentionally
909
+ submitted to Licensor for inclusion in the Work by the copyright owner
910
+ or by an individual or Legal Entity authorized to submit on behalf of
911
+ the copyright owner. For the purposes of this definition, "submitted"
912
+ means any form of electronic, verbal, or written communication sent
913
+ to the Licensor or its representatives, including but not limited to
914
+ communication on electronic mailing lists, source code control systems,
915
+ and issue tracking systems that are managed by, or on behalf of, the
916
+ Licensor for the purpose of discussing and improving the Work, but
917
+ excluding communication that is conspicuously marked or otherwise
918
+ designated in writing by the copyright owner as "Not a Contribution."
919
+
920
+ "Contributor" shall mean Licensor and any individual or Legal Entity
921
+ on behalf of whom a Contribution has been received by Licensor and
922
+ subsequently incorporated within the Work.
923
+
924
+ 2. Grant of Copyright License. Subject to the terms and conditions of
925
+ this License, each Contributor hereby grants to You a perpetual,
926
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
927
+ copyright license to reproduce, prepare Derivative Works of,
928
+ publicly display, publicly perform, sublicense, and distribute the
929
+ Work and such Derivative Works in Source or Object form.
930
+
931
+ 3. Grant of Patent License. Subject to the terms and conditions of
932
+ this License, each Contributor hereby grants to You a perpetual,
933
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
934
+ (except as stated in this section) patent license to make, have made,
935
+ use, offer to sell, sell, import, and otherwise transfer the Work,
936
+ where such license applies only to those patent claims licensable
937
+ by such Contributor that are necessarily infringed by their
938
+ Contribution(s) alone or by combination of their Contribution(s)
939
+ with the Work to which such Contribution(s) was submitted. If You
940
+ institute patent litigation against any entity (including a
941
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
942
+ or a Contribution incorporated within the Work constitutes direct
943
+ or contributory patent infringement, then any patent licenses
944
+ granted to You under this License for that Work shall terminate
945
+ as of the date such litigation is filed.
946
+
947
+ 4. Redistribution. You may reproduce and distribute copies of the
948
+ Work or Derivative Works thereof in any medium, with or without
949
+ modifications, and in Source or Object form, provided that You
950
+ meet the following conditions:
951
+
952
+ (a) You must give any other recipients of the Work or
953
+ Derivative Works a copy of this License; and
954
+
955
+ (b) You must cause any modified files to carry prominent notices
956
+ stating that You changed the files; and
957
+
958
+ (c) You must retain, in the Source form of any Derivative Works
959
+ that You distribute, all copyright, patent, trademark, and
960
+ attribution notices from the Source form of the Work,
961
+ excluding those notices that do not pertain to any part of
962
+ the Derivative Works; and
963
+
964
+ (d) If the Work includes a "NOTICE" text file as part of its
965
+ distribution, then any Derivative Works that You distribute must
966
+ include a readable copy of the attribution notices contained
967
+ within such NOTICE file, excluding those notices that do not
968
+ pertain to any part of the Derivative Works, in at least one
969
+ of the following places: within a NOTICE text file distributed
970
+ as part of the Derivative Works; within the Source form or
971
+ documentation, if provided along with the Derivative Works; or,
972
+ within a display generated by the Derivative Works, if and
973
+ wherever such third-party notices normally appear. The contents
974
+ of the NOTICE file are for informational purposes only and
975
+ do not modify the License. You may add Your own attribution
976
+ notices within Derivative Works that You distribute, alongside
977
+ or as an addendum to the NOTICE text from the Work, provided
978
+ that such additional attribution notices cannot be construed
979
+ as modifying the License.
980
+
981
+ You may add Your own copyright statement to Your modifications and
982
+ may provide additional or different license terms and conditions
983
+ for use, reproduction, or distribution of Your modifications, or
984
+ for any such Derivative Works as a whole, provided Your use,
985
+ reproduction, and distribution of the Work otherwise complies with
986
+ the conditions stated in this License.
987
+
988
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
989
+ any Contribution intentionally submitted for inclusion in the Work
990
+ by You to the Licensor shall be under the terms and conditions of
991
+ this License, without any additional terms or conditions.
992
+ Notwithstanding the above, nothing herein shall supersede or modify
993
+ the terms of any separate license agreement you may have executed
994
+ with Licensor regarding such Contributions.
995
+
996
+ 6. Trademarks. This License does not grant permission to use the trade
997
+ names, trademarks, service marks, or product names of the Licensor,
998
+ except as required for reasonable and customary use in describing the
999
+ origin of the Work and reproducing the content of the NOTICE file.
1000
+
1001
+ 7. Disclaimer of Warranty. Unless required by applicable law or
1002
+ agreed to in writing, Licensor provides the Work (and each
1003
+ Contributor provides its Contributions) on an "AS IS" BASIS,
1004
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1005
+ implied, including, without limitation, any warranties or conditions
1006
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
1007
+ PARTICULAR PURPOSE. You are solely responsible for determining the
1008
+ appropriateness of using or redistributing the Work and assume any
1009
+ risks associated with Your exercise of permissions under this License.
1010
+
1011
+ 8. Limitation of Liability. In no event and under no legal theory,
1012
+ whether in tort (including negligence), contract, or otherwise,
1013
+ unless required by applicable law (such as deliberate and grossly
1014
+ negligent acts) or agreed to in writing, shall any Contributor be
1015
+ liable to You for damages, including any direct, indirect, special,
1016
+ incidental, or consequential damages of any character arising as a
1017
+ result of this License or out of the use or inability to use the
1018
+ Work (including but not limited to damages for loss of goodwill,
1019
+ work stoppage, computer failure or malfunction, or any and all
1020
+ other commercial damages or losses), even if such Contributor
1021
+ has been advised of the possibility of such damages.
1022
+
1023
+ 9. Accepting Warranty or Additional Liability. While redistributing
1024
+ the Work or Derivative Works thereof, You may choose to offer,
1025
+ and charge a fee for, acceptance of support, warranty, indemnity,
1026
+ or other liability obligations and/or rights consistent with this
1027
+ License. However, in accepting such obligations, You may act only
1028
+ on Your own behalf and on Your sole responsibility, not on behalf
1029
+ of any other Contributor, and only if You agree to indemnify,
1030
+ defend, and hold each Contributor harmless for any liability
1031
+ incurred by, or claims asserted against, such Contributor by reason
1032
+ of your accepting any such warranty or additional liability.
1033
+
1034
+ END OF TERMS AND CONDITIONS
1035
+
1036
+ APPENDIX: How to apply the Apache License to your work.
1037
+
1038
+ To apply the Apache License to your work, attach the following
1039
+ boilerplate notice, with the fields enclosed by brackets "[]"
1040
+ replaced with your own identifying information. (Don't include
1041
+ the brackets!) The text should be enclosed in the appropriate
1042
+ comment syntax for the file format. We also recommend that a
1043
+ file or class name and description of purpose be included on the
1044
+ same "printed page" as the copyright notice for easier
1045
+ identification within third-party archives.
1046
+
1047
+ Copyright [yyyy] [name of copyright owner]
1048
+
1049
+ Licensed under the Apache License, Version 2.0 (the "License");
1050
+ you may not use this file except in compliance with the License.
1051
+ You may obtain a copy of the License at
1052
+
1053
+ http://www.apache.org/licenses/LICENSE-2.0
1054
+
1055
+ Unless required by applicable law or agreed to in writing, software
1056
+ distributed under the License is distributed on an "AS IS" BASIS,
1057
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1058
+ See the License for the specific language governing permissions and
1059
+ limitations under the License.
1060
+
1061
+
1062
+ Name: Solarized
1063
+ Files: matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle
1064
+ Description: Solarized color scheme/style
1065
+ License: MIT
1066
+ https://github.com/altercation/solarized/blob/master/LICENSE
1067
+ Copyright (c) 2011 Ethan Schoonover
1068
+
1069
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1070
+ of this software and associated documentation files (the "Software"), to deal
1071
+ in the Software without restriction, including without limitation the rights
1072
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1073
+ copies of the Software, and to permit persons to whom the Software is
1074
+ furnished to do so, subject to the following conditions:
1075
+
1076
+ The above copyright notice and this permission notice shall be included in
1077
+ all copies or substantial portions of the Software.
1078
+
1079
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1080
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1081
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1082
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1083
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1084
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1085
+ THE SOFTWARE.
1086
+
1087
+
1088
+ Name: Stix fonts
1089
+ Files: matplotlib/mpl-data/fonts/ttf/STIX*.ttf
1090
+ Description: STIX fonts
1091
+ License: OFL-1.1
1092
+ STIX Font License
1093
+
1094
+ 24 May 2010
1095
+
1096
+ Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American
1097
+ Institute of Physics, the American Chemical Society, the American Mathematical
1098
+ Society, the American Physical Society, Elsevier, Inc., and The Institute of
1099
+ Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved
1100
+ Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of
1101
+ Electrical and Electronics Engineers, Inc.
1102
+
1103
+ Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com),
1104
+ with Reserved Font Name TM Math. To obtain additional mathematical fonts, please
1105
+ contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA,
1106
+ Phone: (718) 575-1816.
1107
+
1108
+ Portions copyright (c) 1990 by Elsevier, Inc.
1109
+
1110
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
1111
+ This license is copied below, and is also available with a FAQ at:
1112
+ https://scripts.sil.org/OFL
1113
+
1114
+ -----------------------------------------------------------
1115
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
1116
+ -----------------------------------------------------------
1117
+
1118
+ PREAMBLE
1119
+ The goals of the Open Font License (OFL) are to stimulate worldwide
1120
+ development of collaborative font projects, to support the font creation
1121
+ efforts of academic and linguistic communities, and to provide a free and
1122
+ open framework in which fonts may be shared and improved in partnership
1123
+ with others.
1124
+
1125
+ The OFL allows the licensed fonts to be used, studied, modified and
1126
+ redistributed freely as long as they are not sold by themselves. The
1127
+ fonts, including any derivative works, can be bundled, embedded,
1128
+ redistributed and/or sold with any software provided that any reserved
1129
+ names are not used by derivative works. The fonts and derivatives,
1130
+ however, cannot be released under any other type of license. The
1131
+ requirement for fonts to remain under this license does not apply
1132
+ to any document created using the fonts or their derivatives.
1133
+
1134
+ DEFINITIONS
1135
+ "Font Software" refers to the set of files released by the Copyright
1136
+ Holder(s) under this license and clearly marked as such. This may
1137
+ include source files, build scripts and documentation.
1138
+
1139
+ "Reserved Font Name" refers to any names specified as such after the
1140
+ copyright statement(s).
1141
+
1142
+ "Original Version" refers to the collection of Font Software components as
1143
+ distributed by the Copyright Holder(s).
1144
+
1145
+ "Modified Version" refers to any derivative made by adding to, deleting,
1146
+ or substituting -- in part or in whole -- any of the components of the
1147
+ Original Version, by changing formats or by porting the Font Software to a
1148
+ new environment.
1149
+
1150
+ "Author" refers to any designer, engineer, programmer, technical
1151
+ writer or other person who contributed to the Font Software.
1152
+
1153
+ PERMISSION & CONDITIONS
1154
+ Permission is hereby granted, free of charge, to any person obtaining
1155
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
1156
+ redistribute, and sell modified and unmodified copies of the Font
1157
+ Software, subject to the following conditions:
1158
+
1159
+ 1) Neither the Font Software nor any of its individual components,
1160
+ in Original or Modified Versions, may be sold by itself.
1161
+
1162
+ 2) Original or Modified Versions of the Font Software may be bundled,
1163
+ redistributed and/or sold with any software, provided that each copy
1164
+ contains the above copyright notice and this license. These can be
1165
+ included either as stand-alone text files, human-readable headers or
1166
+ in the appropriate machine-readable metadata fields within text or
1167
+ binary files as long as those fields can be easily viewed by the user.
1168
+
1169
+ 3) No Modified Version of the Font Software may use the Reserved Font
1170
+ Name(s) unless explicit written permission is granted by the corresponding
1171
+ Copyright Holder. This restriction only applies to the primary font name as
1172
+ presented to the users.
1173
+
1174
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
1175
+ Software shall not be used to promote, endorse or advertise any
1176
+ Modified Version, except to acknowledge the contribution(s) of the
1177
+ Copyright Holder(s) and the Author(s) or with their explicit written
1178
+ permission.
1179
+
1180
+ 5) The Font Software, modified or unmodified, in part or in whole,
1181
+ must be distributed entirely under this license, and must not be
1182
+ distributed under any other license. The requirement for fonts to
1183
+ remain under this license does not apply to any document created
1184
+ using the Font Software.
1185
+
1186
+ TERMINATION
1187
+ This license becomes null and void if any of the above conditions are
1188
+ not met.
1189
+
1190
+ DISCLAIMER
1191
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1192
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
1193
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
1194
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
1195
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1196
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
1197
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1198
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
1199
+ OTHER DEALINGS IN THE FONT SOFTWARE.
1200
+
1201
+ Name: Yorick Colormaps
1202
+ Files: lib/matplotlib/_cm.py
1203
+ Description: Gist/Yorick colormaps
1204
+ License:
1205
+ BSD-style license for gist/yorick colormaps.
1206
+
1207
+ Copyright:
1208
+
1209
+ Copyright (c) 1996. The Regents of the University of California.
1210
+ All rights reserved.
1211
+
1212
+ Permission to use, copy, modify, and distribute this software for any
1213
+ purpose without fee is hereby granted, provided that this entire
1214
+ notice is included in all copies of any software which is or includes
1215
+ a copy or modification of this software and in all copies of the
1216
+ supporting documentation for such software.
1217
+
1218
+ This work was produced at the University of California, Lawrence
1219
+ Livermore National Laboratory under contract no. W-7405-ENG-48 between
1220
+ the U.S. Department of Energy and The Regents of the University of
1221
+ California for the operation of UC LLNL.
1222
+
1223
+
1224
+ DISCLAIMER
1225
+
1226
+ This software was prepared as an account of work sponsored by an
1227
+ agency of the United States Government. Neither the United States
1228
+ Government nor the University of California nor any of their
1229
+ employees, makes any warranty, express or implied, or assumes any
1230
+ liability or responsibility for the accuracy, completeness, or
1231
+ usefulness of any information, apparatus, product, or process
1232
+ disclosed, or represents that its use would not infringe
1233
+ privately-owned rights. Reference herein to any specific commercial
1234
+ products, process, or service by trade name, trademark, manufacturer,
1235
+ or otherwise, does not necessarily constitute or imply its
1236
+ endorsement, recommendation, or favoring by the United States
1237
+ Government or the University of California. The views and opinions of
1238
+ authors expressed herein do not necessarily state or reflect those of
1239
+ the United States Government or the University of California, and
1240
+ shall not be used for advertising or product endorsement purposes.
1241
+
1242
+
1243
+ AUTHOR
1244
+
1245
+ David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated
1246
+ the Yorick parser. The routines in Math are from LAPACK and FFTPACK;
1247
+ MathC contains C translations by David H. Munro. The algorithms for
1248
+ Yorick's random number generator and several special functions in
1249
+ Yorick/include were taken from Numerical Recipes by Press, et. al.,
1250
+ although the Yorick implementations are unrelated to those in
1251
+ Numerical Recipes. A small amount of code in Gist was adapted from
1252
+ the X11R4 release, copyright M.I.T. -- the complete copyright notice
1253
+ may be found in the (unused) file Gist/host.c.
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/METADATA ADDED
@@ -0,0 +1,1366 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: matplotlib
3
+ Version: 3.11.2
4
+ Summary: Python plotting package
5
+ Author: John D. Hunter, Michael Droettboom
6
+ Author-Email: Unknown <matplotlib-users@python.org>
7
+ License: License agreement for matplotlib versions 1.3.0 and later
8
+ =========================================================
9
+
10
+ 1. This LICENSE AGREEMENT is between the Matplotlib Development Team
11
+ ("MDT"), and the Individual or Organization ("Licensee") accessing and
12
+ otherwise using matplotlib software in source or binary form and its
13
+ associated documentation.
14
+
15
+ 2. Subject to the terms and conditions of this License Agreement, MDT
16
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
17
+ to reproduce, analyze, test, perform and/or display publicly, prepare
18
+ derivative works, distribute, and otherwise use matplotlib
19
+ alone or in any derivative version, provided, however, that MDT's
20
+ License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
21
+ 2012- Matplotlib Development Team; All Rights Reserved" are retained in
22
+ matplotlib alone or in any derivative version prepared by
23
+ Licensee.
24
+
25
+ 3. In the event Licensee prepares a derivative work that is based on or
26
+ incorporates matplotlib or any part thereof, and wants to
27
+ make the derivative work available to others as provided herein, then
28
+ Licensee hereby agrees to include in any such work a brief summary of
29
+ the changes made to matplotlib .
30
+
31
+ 4. MDT is making matplotlib available to Licensee on an "AS
32
+ IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
33
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
34
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
35
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
36
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
37
+
38
+ 5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
39
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
40
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
41
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
42
+ THE POSSIBILITY THEREOF.
43
+
44
+ 6. This License Agreement will automatically terminate upon a material
45
+ breach of its terms and conditions.
46
+
47
+ 7. Nothing in this License Agreement shall be deemed to create any
48
+ relationship of agency, partnership, or joint venture between MDT and
49
+ Licensee. This License Agreement does not grant permission to use MDT
50
+ trademarks or trade name in a trademark sense to endorse or promote
51
+ products or services of Licensee, or any third party.
52
+
53
+ 8. By copying, installing or otherwise using matplotlib ,
54
+ Licensee agrees to be bound by the terms and conditions of this License
55
+ Agreement.
56
+
57
+ License agreement for matplotlib versions prior to 1.3.0
58
+ ========================================================
59
+
60
+ 1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the
61
+ Individual or Organization ("Licensee") accessing and otherwise using
62
+ matplotlib software in source or binary form and its associated
63
+ documentation.
64
+
65
+ 2. Subject to the terms and conditions of this License Agreement, JDH
66
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license
67
+ to reproduce, analyze, test, perform and/or display publicly, prepare
68
+ derivative works, distribute, and otherwise use matplotlib
69
+ alone or in any derivative version, provided, however, that JDH's
70
+ License Agreement and JDH's notice of copyright, i.e., "Copyright (c)
71
+ 2002-2011 John D. Hunter; All Rights Reserved" are retained in
72
+ matplotlib alone or in any derivative version prepared by
73
+ Licensee.
74
+
75
+ 3. In the event Licensee prepares a derivative work that is based on or
76
+ incorporates matplotlib or any part thereof, and wants to
77
+ make the derivative work available to others as provided herein, then
78
+ Licensee hereby agrees to include in any such work a brief summary of
79
+ the changes made to matplotlib.
80
+
81
+ 4. JDH is making matplotlib available to Licensee on an "AS
82
+ IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
83
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND
84
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
85
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
86
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
87
+
88
+ 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
89
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
90
+ LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
91
+ MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
92
+ THE POSSIBILITY THEREOF.
93
+
94
+ 6. This License Agreement will automatically terminate upon a material
95
+ breach of its terms and conditions.
96
+
97
+ 7. Nothing in this License Agreement shall be deemed to create any
98
+ relationship of agency, partnership, or joint venture between JDH and
99
+ Licensee. This License Agreement does not grant permission to use JDH
100
+ trademarks or trade name in a trademark sense to endorse or promote
101
+ products or services of Licensee, or any third party.
102
+
103
+ 8. By copying, installing or otherwise using matplotlib,
104
+ Licensee agrees to be bound by the terms and conditions of this License
105
+ Agreement.
106
+ ----
107
+
108
+ This binary distrubution of Matplotlib can also bundle the following software
109
+ (depending on the build):
110
+
111
+ Name: AMS Fonts
112
+ Files: matplotlib/tests/cmr10.pfb
113
+ Description: Type-1 version of one of Knuth's Computer Modern fonts
114
+ License: OFL-1.1
115
+ The cmr10.pfb file is a Type-1 version of one of Knuth's Computer Modern fonts.
116
+ It is included here as test data only, but the following license applies.
117
+
118
+ Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org).
119
+ All Rights Reserved.
120
+
121
+ "cmb10" is a Reserved Font Name for this Font Software.
122
+ "cmbsy10" is a Reserved Font Name for this Font Software.
123
+ "cmbsy5" is a Reserved Font Name for this Font Software.
124
+ "cmbsy6" is a Reserved Font Name for this Font Software.
125
+ "cmbsy7" is a Reserved Font Name for this Font Software.
126
+ "cmbsy8" is a Reserved Font Name for this Font Software.
127
+ "cmbsy9" is a Reserved Font Name for this Font Software.
128
+ "cmbx10" is a Reserved Font Name for this Font Software.
129
+ "cmbx12" is a Reserved Font Name for this Font Software.
130
+ "cmbx5" is a Reserved Font Name for this Font Software.
131
+ "cmbx6" is a Reserved Font Name for this Font Software.
132
+ "cmbx7" is a Reserved Font Name for this Font Software.
133
+ "cmbx8" is a Reserved Font Name for this Font Software.
134
+ "cmbx9" is a Reserved Font Name for this Font Software.
135
+ "cmbxsl10" is a Reserved Font Name for this Font Software.
136
+ "cmbxti10" is a Reserved Font Name for this Font Software.
137
+ "cmcsc10" is a Reserved Font Name for this Font Software.
138
+ "cmcsc8" is a Reserved Font Name for this Font Software.
139
+ "cmcsc9" is a Reserved Font Name for this Font Software.
140
+ "cmdunh10" is a Reserved Font Name for this Font Software.
141
+ "cmex10" is a Reserved Font Name for this Font Software.
142
+ "cmex7" is a Reserved Font Name for this Font Software.
143
+ "cmex8" is a Reserved Font Name for this Font Software.
144
+ "cmex9" is a Reserved Font Name for this Font Software.
145
+ "cmff10" is a Reserved Font Name for this Font Software.
146
+ "cmfi10" is a Reserved Font Name for this Font Software.
147
+ "cmfib8" is a Reserved Font Name for this Font Software.
148
+ "cminch" is a Reserved Font Name for this Font Software.
149
+ "cmitt10" is a Reserved Font Name for this Font Software.
150
+ "cmmi10" is a Reserved Font Name for this Font Software.
151
+ "cmmi12" is a Reserved Font Name for this Font Software.
152
+ "cmmi5" is a Reserved Font Name for this Font Software.
153
+ "cmmi6" is a Reserved Font Name for this Font Software.
154
+ "cmmi7" is a Reserved Font Name for this Font Software.
155
+ "cmmi8" is a Reserved Font Name for this Font Software.
156
+ "cmmi9" is a Reserved Font Name for this Font Software.
157
+ "cmmib10" is a Reserved Font Name for this Font Software.
158
+ "cmmib5" is a Reserved Font Name for this Font Software.
159
+ "cmmib6" is a Reserved Font Name for this Font Software.
160
+ "cmmib7" is a Reserved Font Name for this Font Software.
161
+ "cmmib8" is a Reserved Font Name for this Font Software.
162
+ "cmmib9" is a Reserved Font Name for this Font Software.
163
+ "cmr10" is a Reserved Font Name for this Font Software.
164
+ "cmr12" is a Reserved Font Name for this Font Software.
165
+ "cmr17" is a Reserved Font Name for this Font Software.
166
+ "cmr5" is a Reserved Font Name for this Font Software.
167
+ "cmr6" is a Reserved Font Name for this Font Software.
168
+ "cmr7" is a Reserved Font Name for this Font Software.
169
+ "cmr8" is a Reserved Font Name for this Font Software.
170
+ "cmr9" is a Reserved Font Name for this Font Software.
171
+ "cmsl10" is a Reserved Font Name for this Font Software.
172
+ "cmsl12" is a Reserved Font Name for this Font Software.
173
+ "cmsl8" is a Reserved Font Name for this Font Software.
174
+ "cmsl9" is a Reserved Font Name for this Font Software.
175
+ "cmsltt10" is a Reserved Font Name for this Font Software.
176
+ "cmss10" is a Reserved Font Name for this Font Software.
177
+ "cmss12" is a Reserved Font Name for this Font Software.
178
+ "cmss17" is a Reserved Font Name for this Font Software.
179
+ "cmss8" is a Reserved Font Name for this Font Software.
180
+ "cmss9" is a Reserved Font Name for this Font Software.
181
+ "cmssbx10" is a Reserved Font Name for this Font Software.
182
+ "cmssdc10" is a Reserved Font Name for this Font Software.
183
+ "cmssi10" is a Reserved Font Name for this Font Software.
184
+ "cmssi12" is a Reserved Font Name for this Font Software.
185
+ "cmssi17" is a Reserved Font Name for this Font Software.
186
+ "cmssi8" is a Reserved Font Name for this Font Software.
187
+ "cmssi9" is a Reserved Font Name for this Font Software.
188
+ "cmssq8" is a Reserved Font Name for this Font Software.
189
+ "cmssqi8" is a Reserved Font Name for this Font Software.
190
+ "cmsy10" is a Reserved Font Name for this Font Software.
191
+ "cmsy5" is a Reserved Font Name for this Font Software.
192
+ "cmsy6" is a Reserved Font Name for this Font Software.
193
+ "cmsy7" is a Reserved Font Name for this Font Software.
194
+ "cmsy8" is a Reserved Font Name for this Font Software.
195
+ "cmsy9" is a Reserved Font Name for this Font Software.
196
+ "cmtcsc10" is a Reserved Font Name for this Font Software.
197
+ "cmtex10" is a Reserved Font Name for this Font Software.
198
+ "cmtex8" is a Reserved Font Name for this Font Software.
199
+ "cmtex9" is a Reserved Font Name for this Font Software.
200
+ "cmti10" is a Reserved Font Name for this Font Software.
201
+ "cmti12" is a Reserved Font Name for this Font Software.
202
+ "cmti7" is a Reserved Font Name for this Font Software.
203
+ "cmti8" is a Reserved Font Name for this Font Software.
204
+ "cmti9" is a Reserved Font Name for this Font Software.
205
+ "cmtt10" is a Reserved Font Name for this Font Software.
206
+ "cmtt12" is a Reserved Font Name for this Font Software.
207
+ "cmtt8" is a Reserved Font Name for this Font Software.
208
+ "cmtt9" is a Reserved Font Name for this Font Software.
209
+ "cmu10" is a Reserved Font Name for this Font Software.
210
+ "cmvtt10" is a Reserved Font Name for this Font Software.
211
+ "euex10" is a Reserved Font Name for this Font Software.
212
+ "euex7" is a Reserved Font Name for this Font Software.
213
+ "euex8" is a Reserved Font Name for this Font Software.
214
+ "euex9" is a Reserved Font Name for this Font Software.
215
+ "eufb10" is a Reserved Font Name for this Font Software.
216
+ "eufb5" is a Reserved Font Name for this Font Software.
217
+ "eufb7" is a Reserved Font Name for this Font Software.
218
+ "eufm10" is a Reserved Font Name for this Font Software.
219
+ "eufm5" is a Reserved Font Name for this Font Software.
220
+ "eufm7" is a Reserved Font Name for this Font Software.
221
+ "eurb10" is a Reserved Font Name for this Font Software.
222
+ "eurb5" is a Reserved Font Name for this Font Software.
223
+ "eurb7" is a Reserved Font Name for this Font Software.
224
+ "eurm10" is a Reserved Font Name for this Font Software.
225
+ "eurm5" is a Reserved Font Name for this Font Software.
226
+ "eurm7" is a Reserved Font Name for this Font Software.
227
+ "eusb10" is a Reserved Font Name for this Font Software.
228
+ "eusb5" is a Reserved Font Name for this Font Software.
229
+ "eusb7" is a Reserved Font Name for this Font Software.
230
+ "eusm10" is a Reserved Font Name for this Font Software.
231
+ "eusm5" is a Reserved Font Name for this Font Software.
232
+ "eusm7" is a Reserved Font Name for this Font Software.
233
+ "lasy10" is a Reserved Font Name for this Font Software.
234
+ "lasy5" is a Reserved Font Name for this Font Software.
235
+ "lasy6" is a Reserved Font Name for this Font Software.
236
+ "lasy7" is a Reserved Font Name for this Font Software.
237
+ "lasy8" is a Reserved Font Name for this Font Software.
238
+ "lasy9" is a Reserved Font Name for this Font Software.
239
+ "lasyb10" is a Reserved Font Name for this Font Software.
240
+ "lcircle1" is a Reserved Font Name for this Font Software.
241
+ "lcirclew" is a Reserved Font Name for this Font Software.
242
+ "lcmss8" is a Reserved Font Name for this Font Software.
243
+ "lcmssb8" is a Reserved Font Name for this Font Software.
244
+ "lcmssi8" is a Reserved Font Name for this Font Software.
245
+ "line10" is a Reserved Font Name for this Font Software.
246
+ "linew10" is a Reserved Font Name for this Font Software.
247
+ "msam10" is a Reserved Font Name for this Font Software.
248
+ "msam5" is a Reserved Font Name for this Font Software.
249
+ "msam6" is a Reserved Font Name for this Font Software.
250
+ "msam7" is a Reserved Font Name for this Font Software.
251
+ "msam8" is a Reserved Font Name for this Font Software.
252
+ "msam9" is a Reserved Font Name for this Font Software.
253
+ "msbm10" is a Reserved Font Name for this Font Software.
254
+ "msbm5" is a Reserved Font Name for this Font Software.
255
+ "msbm6" is a Reserved Font Name for this Font Software.
256
+ "msbm7" is a Reserved Font Name for this Font Software.
257
+ "msbm8" is a Reserved Font Name for this Font Software.
258
+ "msbm9" is a Reserved Font Name for this Font Software.
259
+ "wncyb10" is a Reserved Font Name for this Font Software.
260
+ "wncyi10" is a Reserved Font Name for this Font Software.
261
+ "wncyr10" is a Reserved Font Name for this Font Software.
262
+ "wncysc10" is a Reserved Font Name for this Font Software.
263
+ "wncyss10" is a Reserved Font Name for this Font Software.
264
+
265
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
266
+ This license is copied below, and is also available with a FAQ at:
267
+ http://scripts.sil.org/OFL
268
+
269
+ -----------------------------------------------------------
270
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
271
+ -----------------------------------------------------------
272
+
273
+ PREAMBLE
274
+ The goals of the Open Font License (OFL) are to stimulate worldwide
275
+ development of collaborative font projects, to support the font creation
276
+ efforts of academic and linguistic communities, and to provide a free and
277
+ open framework in which fonts may be shared and improved in partnership
278
+ with others.
279
+
280
+ The OFL allows the licensed fonts to be used, studied, modified and
281
+ redistributed freely as long as they are not sold by themselves. The
282
+ fonts, including any derivative works, can be bundled, embedded,
283
+ redistributed and/or sold with any software provided that any reserved
284
+ names are not used by derivative works. The fonts and derivatives,
285
+ however, cannot be released under any other type of license. The
286
+ requirement for fonts to remain under this license does not apply
287
+ to any document created using the fonts or their derivatives.
288
+
289
+ DEFINITIONS
290
+ "Font Software" refers to the set of files released by the Copyright
291
+ Holder(s) under this license and clearly marked as such. This may
292
+ include source files, build scripts and documentation.
293
+
294
+ "Reserved Font Name" refers to any names specified as such after the
295
+ copyright statement(s).
296
+
297
+ "Original Version" refers to the collection of Font Software components as
298
+ distributed by the Copyright Holder(s).
299
+
300
+ "Modified Version" refers to any derivative made by adding to, deleting,
301
+ or substituting -- in part or in whole -- any of the components of the
302
+ Original Version, by changing formats or by porting the Font Software to a
303
+ new environment.
304
+
305
+ "Author" refers to any designer, engineer, programmer, technical
306
+ writer or other person who contributed to the Font Software.
307
+
308
+ PERMISSION & CONDITIONS
309
+ Permission is hereby granted, free of charge, to any person obtaining
310
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
311
+ redistribute, and sell modified and unmodified copies of the Font
312
+ Software, subject to the following conditions:
313
+
314
+ 1) Neither the Font Software nor any of its individual components,
315
+ in Original or Modified Versions, may be sold by itself.
316
+
317
+ 2) Original or Modified Versions of the Font Software may be bundled,
318
+ redistributed and/or sold with any software, provided that each copy
319
+ contains the above copyright notice and this license. These can be
320
+ included either as stand-alone text files, human-readable headers or
321
+ in the appropriate machine-readable metadata fields within text or
322
+ binary files as long as those fields can be easily viewed by the user.
323
+
324
+ 3) No Modified Version of the Font Software may use the Reserved Font
325
+ Name(s) unless explicit written permission is granted by the corresponding
326
+ Copyright Holder. This restriction only applies to the primary font name as
327
+ presented to the users.
328
+
329
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
330
+ Software shall not be used to promote, endorse or advertise any
331
+ Modified Version, except to acknowledge the contribution(s) of the
332
+ Copyright Holder(s) and the Author(s) or with their explicit written
333
+ permission.
334
+
335
+ 5) The Font Software, modified or unmodified, in part or in whole,
336
+ must be distributed entirely under this license, and must not be
337
+ distributed under any other license. The requirement for fonts to
338
+ remain under this license does not apply to any document created
339
+ using the Font Software.
340
+
341
+ TERMINATION
342
+ This license becomes null and void if any of the above conditions are
343
+ not met.
344
+
345
+ DISCLAIMER
346
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
347
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
348
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
349
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
350
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
351
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
352
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
353
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
354
+ OTHER DEALINGS IN THE FONT SOFTWARE.
355
+
356
+
357
+
358
+ Name: BaKoMa Fonts
359
+ Files: matplotlib/mpl-data/fonts/ttf/cm*.ttf matplotlib/mpl-data/fonts/afm/cm*.afm
360
+ Description: Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
361
+ License: BaKoMa Fonts Licence
362
+ BaKoMa Fonts Licence
363
+ --------------------
364
+
365
+ This licence covers two font packs (known as BaKoMa Fonts Collection,
366
+ which is available at `CTAN:fonts/cm/ps-type1/bakoma/'):
367
+
368
+ 1) BaKoMa-CM (1.1/12-Nov-94)
369
+ Computer Modern Fonts in PostScript Type 1 and TrueType font formats.
370
+
371
+ 2) BaKoMa-AMS (1.2/19-Jan-95)
372
+ AMS TeX fonts in PostScript Type 1 and TrueType font formats.
373
+
374
+ Copyright (C) 1994, 1995, Basil K. Malyshev. All Rights Reserved.
375
+
376
+ Permission to copy and distribute these fonts for any purpose is
377
+ hereby granted without fee, provided that the above copyright notice,
378
+ author statement and this permission notice appear in all copies of
379
+ these fonts and related documentation.
380
+
381
+ Permission to modify and distribute modified fonts for any purpose is
382
+ hereby granted without fee, provided that the copyright notice,
383
+ author statement, this permission notice and location of original
384
+ fonts (http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma)
385
+ appear in all copies of modified fonts and related documentation.
386
+
387
+ Permission to use these fonts (embedding into PostScript, PDF, SVG
388
+ and printing by using any software) is hereby granted without fee.
389
+ It is not required to provide any notices about using these fonts.
390
+
391
+ Basil K. Malyshev
392
+ INSTITUTE FOR HIGH ENERGY PHYSICS
393
+ IHEP, OMVT
394
+ Moscow Region
395
+ 142281 PROTVINO
396
+ RUSSIA
397
+
398
+ E-Mail: bakoma@mail.ru
399
+ or malyshev@mail.ihep.ru
400
+
401
+
402
+
403
+
404
+ Name: ColorBrewer Color Schemes
405
+ Files: lib/matplotlib/_cm.py
406
+ Description: Color schemes from ColorBrewer
407
+ License: Apache-2.0
408
+ Apache-Style Software License for ColorBrewer software and ColorBrewer Color Schemes
409
+
410
+ Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University.
411
+
412
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
413
+ You may obtain a copy of the License at
414
+
415
+ http://www.apache.org/licenses/LICENSE-2.0
416
+
417
+ Unless required by applicable law or agreed to in writing, software distributed
418
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
419
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
420
+ specific language governing permissions and limitations under the License.
421
+
422
+
423
+ Name: Courier 10
424
+ Files: matplotlib/tests/Courier10PitchBT-Bold.pfb
425
+ Description: Courier 10 font, used in tests.
426
+ License: Bitstream-Charter
427
+ The Courier10PitchBT-Bold.pfb file is a Type-1 version of
428
+ Courier 10 Pitch BT Bold by Bitstream, obtained from
429
+ <https://ctan.org/tex-archive/fonts/courierten>. It is included
430
+ here as test data only, but the following license applies.
431
+
432
+
433
+ (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
434
+
435
+ You are hereby granted permission under all Bitstream propriety rights
436
+ to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
437
+ Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
438
+ for any purpose and without restriction; provided, that this notice is
439
+ left intact on all copies of such fonts and that Bitstream's trademark
440
+ is acknowledged as shown below on all unmodified copies of the 4 Charter
441
+ Type 1 fonts.
442
+
443
+ BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
444
+
445
+
446
+ Name: FreeType
447
+ Files: matplotlib/ft2font.*.so
448
+ Description: Font rendering library
449
+ License: FTL OR GPL-2.0-or-later
450
+ The FreeType 2 font engine is copyrighted work and cannot be used
451
+ legally without a software license. In order to make this project
452
+ usable to a vast majority of developers, we distribute it under two
453
+ mutually exclusive open-source licenses.
454
+
455
+ This means that *you* must choose *one* of the two licenses described
456
+ below, then obey all its terms and conditions when using FreeType 2 in
457
+ any of your projects or products.
458
+
459
+ - The FreeType License, found in the file `docs/FTL.TXT`, which is
460
+ similar to the original BSD license *with* an advertising clause
461
+ that forces you to explicitly cite the FreeType project in your
462
+ product's documentation. All details are in the license file.
463
+ This license is suited to products which don't use the GNU General
464
+ Public License.
465
+
466
+ Note that this license is compatible to the GNU General Public
467
+ License version 3, but not version 2.
468
+
469
+ - The GNU General Public License version 2, found in
470
+ `docs/GPLv2.TXT` (any later version can be used also), for
471
+ programs which already use the GPL. Note that the FTL is
472
+ incompatible with GPLv2 due to its advertisement clause.
473
+
474
+ The contributed BDF and PCF drivers come with a license similar to
475
+ that of the X Window System. It is compatible to the above two
476
+ licenses (see files `src/bdf/README` and `src/pcf/README`). The same
477
+ holds for the source code files `src/base/fthash.c` and
478
+ `include/freetype/internal/fthash.h`; they were part of the BDF driver
479
+ in earlier FreeType versions.
480
+
481
+ The gzip module uses the zlib license (see `src/gzip/zlib.h`) which
482
+ too is compatible to the above two licenses.
483
+
484
+ The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code
485
+ taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses
486
+ the 'Old MIT' license, compatible to the above two licenses.
487
+
488
+ The MD5 checksum support (only used for debugging in development
489
+ builds) is in the public domain.
490
+
491
+
492
+ Name: HarfBuzz
493
+ Files: matplotlib/ft2font.*.so
494
+ Description: Text shaping library
495
+ License: MIT-Modern-Variant
496
+ HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
497
+ For parts of HarfBuzz that are licensed under different licenses see individual
498
+ files names COPYING in subdirectories where applicable.
499
+
500
+ Copyright © 2010-2022 Google, Inc.
501
+ Copyright © 2015-2020 Ebrahim Byagowi
502
+ Copyright © 2019,2020 Facebook, Inc.
503
+ Copyright © 2012,2015 Mozilla Foundation
504
+ Copyright © 2011 Codethink Limited
505
+ Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
506
+ Copyright © 2009 Keith Stribley
507
+ Copyright © 2011 Martin Hosken and SIL International
508
+ Copyright © 2007 Chris Wilson
509
+ Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod
510
+ Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc.
511
+ Copyright © 1998-2005 David Turner and Werner Lemberg
512
+ Copyright © 2016 Igalia S.L.
513
+ Copyright © 2022 Matthias Clasen
514
+ Copyright © 2018,2021 Khaled Hosny
515
+ Copyright © 2018,2019,2020 Adobe, Inc
516
+ Copyright © 2013-2015 Alexei Podtelezhnikov
517
+
518
+ For full copyright notices consult the individual files in the package.
519
+
520
+
521
+ Permission is hereby granted, without written agreement and without
522
+ license or royalty fees, to use, copy, modify, and distribute this
523
+ software and its documentation for any purpose, provided that the
524
+ above copyright notice and the following two paragraphs appear in
525
+ all copies of this software.
526
+
527
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
528
+ DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
529
+ ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
530
+ IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
531
+ DAMAGE.
532
+
533
+ THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
534
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
535
+ FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
536
+ ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
537
+ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
538
+
539
+
540
+ Name: JSXTools resize observer
541
+ Files: lib/matplotlib/backends/web_backend/js/mpl.js
542
+ Description: Minimal polyfill for the ResizeObserver API
543
+ License: CC0-1.0
544
+ # CC0 1.0 Universal
545
+
546
+ ## Statement of Purpose
547
+
548
+ The laws of most jurisdictions throughout the world automatically confer
549
+ exclusive Copyright and Related Rights (defined below) upon the creator and
550
+ subsequent owner(s) (each and all, an “owner”) of an original work of
551
+ authorship and/or a database (each, a “Work”).
552
+
553
+ Certain owners wish to permanently relinquish those rights to a Work for the
554
+ purpose of contributing to a commons of creative, cultural and scientific works
555
+ (“Commons”) that the public can reliably and without fear of later claims of
556
+ infringement build upon, modify, incorporate in other works, reuse and
557
+ redistribute as freely as possible in any form whatsoever and for any purposes,
558
+ including without limitation commercial purposes. These owners may contribute
559
+ to the Commons to promote the ideal of a free culture and the further
560
+ production of creative, cultural and scientific works, or to gain reputation or
561
+ greater distribution for their Work in part through the use and efforts of
562
+ others.
563
+
564
+ For these and/or other purposes and motivations, and without any expectation of
565
+ additional consideration or compensation, the person associating CC0 with a
566
+ Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
567
+ and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
568
+ publicly distribute the Work under its terms, with knowledge of his or her
569
+ Copyright and Related Rights in the Work and the meaning and intended legal
570
+ effect of CC0 on those rights.
571
+
572
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
573
+ protected by copyright and related or neighboring rights (“Copyright and
574
+ Related Rights”). Copyright and Related Rights include, but are not limited
575
+ to, the following:
576
+ 1. the right to reproduce, adapt, distribute, perform, display, communicate,
577
+ and translate a Work;
578
+ 2. moral rights retained by the original author(s) and/or performer(s);
579
+ 3. publicity and privacy rights pertaining to a person’s image or likeness
580
+ depicted in a Work;
581
+ 4. rights protecting against unfair competition in regards to a Work,
582
+ subject to the limitations in paragraph 4(i), below;
583
+ 5. rights protecting the extraction, dissemination, use and reuse of data in
584
+ a Work;
585
+ 6. database rights (such as those arising under Directive 96/9/EC of the
586
+ European Parliament and of the Council of 11 March 1996 on the legal
587
+ protection of databases, and under any national implementation thereof,
588
+ including any amended or successor version of such directive); and
589
+ 7. other similar, equivalent or corresponding rights throughout the world
590
+ based on applicable law or treaty, and any national implementations
591
+ thereof.
592
+
593
+ 2. Waiver. To the greatest extent permitted by, but not in contravention of,
594
+ applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
595
+ unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
596
+ and Related Rights and associated claims and causes of action, whether now
597
+ known or unknown (including existing as well as future claims and causes of
598
+ action), in the Work (i) in all territories worldwide, (ii) for the maximum
599
+ duration provided by applicable law or treaty (including future time
600
+ extensions), (iii) in any current or future medium and for any number of
601
+ copies, and (iv) for any purpose whatsoever, including without limitation
602
+ commercial, advertising or promotional purposes (the “Waiver”). Affirmer
603
+ makes the Waiver for the benefit of each member of the public at large and
604
+ to the detriment of Affirmer’s heirs and successors, fully intending that
605
+ such Waiver shall not be subject to revocation, rescission, cancellation,
606
+ termination, or any other legal or equitable action to disrupt the quiet
607
+ enjoyment of the Work by the public as contemplated by Affirmer’s express
608
+ Statement of Purpose.
609
+
610
+ 3. Public License Fallback. Should any part of the Waiver for any reason be
611
+ judged legally invalid or ineffective under applicable law, then the Waiver
612
+ shall be preserved to the maximum extent permitted taking into account
613
+ Affirmer’s express Statement of Purpose. In addition, to the extent the
614
+ Waiver is so judged Affirmer hereby grants to each affected person a
615
+ royalty-free, non transferable, non sublicensable, non exclusive,
616
+ irrevocable and unconditional license to exercise Affirmer’s Copyright and
617
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
618
+ maximum duration provided by applicable law or treaty (including future time
619
+ extensions), (iii) in any current or future medium and for any number of
620
+ copies, and (iv) for any purpose whatsoever, including without limitation
621
+ commercial, advertising or promotional purposes (the “License”). The License
622
+ shall be deemed effective as of the date CC0 was applied by Affirmer to the
623
+ Work. Should any part of the License for any reason be judged legally
624
+ invalid or ineffective under applicable law, such partial invalidity or
625
+ ineffectiveness shall not invalidate the remainder of the License, and in
626
+ such case Affirmer hereby affirms that he or she will not (i) exercise any
627
+ of his or her remaining Copyright and Related Rights in the Work or (ii)
628
+ assert any associated claims and causes of action with respect to the Work,
629
+ in either case contrary to Affirmer’s express Statement of Purpose.
630
+
631
+ 4. Limitations and Disclaimers.
632
+ 1. No trademark or patent rights held by Affirmer are waived, abandoned,
633
+ surrendered, licensed or otherwise affected by this document.
634
+ 2. Affirmer offers the Work as-is and makes no representations or warranties
635
+ of any kind concerning the Work, express, implied, statutory or
636
+ otherwise, including without limitation warranties of title,
637
+ merchantability, fitness for a particular purpose, non infringement, or
638
+ the absence of latent or other defects, accuracy, or the present or
639
+ absence of errors, whether or not discoverable, all to the greatest
640
+ extent permissible under applicable law.
641
+ 3. Affirmer disclaims responsibility for clearing rights of other persons
642
+ that may apply to the Work or any use thereof, including without
643
+ limitation any person’s Copyright and Related Rights in the Work.
644
+ Further, Affirmer disclaims responsibility for obtaining any necessary
645
+ consents, permissions or other rights required for any use of the Work.
646
+ 4. Affirmer understands and acknowledges that Creative Commons is not a
647
+ party to this document and has no duty or obligation with respect to this
648
+ CC0 or use of the Work.
649
+
650
+ For more information, please see
651
+ http://creativecommons.org/publicdomain/zero/1.0/.
652
+
653
+
654
+ Name: Last Resort fonts
655
+ Files: matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf
656
+ Description: Last Resort High-Efficiency Font
657
+ License: OFL-1.1
658
+ This Font Software is licensed under the SIL Open Font License,
659
+ Version 1.1.
660
+
661
+ This license is copied below, and is also available with a FAQ at:
662
+ http://scripts.sil.org/OFL
663
+
664
+ -----------------------------------------------------------
665
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
666
+ -----------------------------------------------------------
667
+
668
+ PREAMBLE
669
+ The goals of the Open Font License (OFL) are to stimulate worldwide
670
+ development of collaborative font projects, to support the font
671
+ creation efforts of academic and linguistic communities, and to
672
+ provide a free and open framework in which fonts may be shared and
673
+ improved in partnership with others.
674
+
675
+ The OFL allows the licensed fonts to be used, studied, modified and
676
+ redistributed freely as long as they are not sold by themselves. The
677
+ fonts, including any derivative works, can be bundled, embedded,
678
+ redistributed and/or sold with any software provided that any reserved
679
+ names are not used by derivative works. The fonts and derivatives,
680
+ however, cannot be released under any other type of license. The
681
+ requirement for fonts to remain under this license does not apply to
682
+ any document created using the fonts or their derivatives.
683
+
684
+ DEFINITIONS
685
+ "Font Software" refers to the set of files released by the Copyright
686
+ Holder(s) under this license and clearly marked as such. This may
687
+ include source files, build scripts and documentation.
688
+
689
+ "Reserved Font Name" refers to any names specified as such after the
690
+ copyright statement(s).
691
+
692
+ "Original Version" refers to the collection of Font Software
693
+ components as distributed by the Copyright Holder(s).
694
+
695
+ "Modified Version" refers to any derivative made by adding to,
696
+ deleting, or substituting -- in part or in whole -- any of the
697
+ components of the Original Version, by changing formats or by porting
698
+ the Font Software to a new environment.
699
+
700
+ "Author" refers to any designer, engineer, programmer, technical
701
+ writer or other person who contributed to the Font Software.
702
+
703
+ PERMISSION & CONDITIONS
704
+ Permission is hereby granted, free of charge, to any person obtaining
705
+ a copy of the Font Software, to use, study, copy, merge, embed,
706
+ modify, redistribute, and sell modified and unmodified copies of the
707
+ Font Software, subject to the following conditions:
708
+
709
+ 1) Neither the Font Software nor any of its individual components, in
710
+ Original or Modified Versions, may be sold by itself.
711
+
712
+ 2) Original or Modified Versions of the Font Software may be bundled,
713
+ redistributed and/or sold with any software, provided that each copy
714
+ contains the above copyright notice and this license. These can be
715
+ included either as stand-alone text files, human-readable headers or
716
+ in the appropriate machine-readable metadata fields within text or
717
+ binary files as long as those fields can be easily viewed by the user.
718
+
719
+ 3) No Modified Version of the Font Software may use the Reserved Font
720
+ Name(s) unless explicit written permission is granted by the
721
+ corresponding Copyright Holder. This restriction only applies to the
722
+ primary font name as presented to the users.
723
+
724
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
725
+ Software shall not be used to promote, endorse or advertise any
726
+ Modified Version, except to acknowledge the contribution(s) of the
727
+ Copyright Holder(s) and the Author(s) or with their explicit written
728
+ permission.
729
+
730
+ 5) The Font Software, modified or unmodified, in part or in whole,
731
+ must be distributed entirely under this license, and must not be
732
+ distributed under any other license. The requirement for fonts to
733
+ remain under this license does not apply to any document created using
734
+ the Font Software.
735
+
736
+ TERMINATION
737
+ This license becomes null and void if any of the above conditions are
738
+ not met.
739
+
740
+ DISCLAIMER
741
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
742
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
743
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
744
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
745
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
746
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
747
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
748
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
749
+ OTHER DEALINGS IN THE FONT SOFTWARE.
750
+
751
+ SPDX-License-Identifier: OFL-1.1
752
+
753
+
754
+ Name: libraqm
755
+ Files: matplotlib/ft2font.*.so
756
+ Description: Complex text layout library
757
+ License: MIT
758
+ The MIT License (MIT)
759
+
760
+ Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
761
+ Copyright © 2016-2023 Khaled Hosny <khaled@aliftype.com>
762
+
763
+ Permission is hereby granted, free of charge, to any person obtaining a copy
764
+ of this software and associated documentation files (the "Software"), to deal
765
+ in the Software without restriction, including without limitation the rights
766
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
767
+ copies of the Software, and to permit persons to whom the Software is
768
+ furnished to do so, subject to the following conditions:
769
+
770
+ The above copyright notice and this permission notice shall be included in all
771
+ copies or substantial portions of the Software.
772
+
773
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
774
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
775
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
776
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
777
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
778
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
779
+ SOFTWARE.
780
+
781
+
782
+ Name: QHull
783
+ Files: matplotlib/_qhull.*.so
784
+ Description: Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection
785
+ License: Qhull
786
+ Qhull, Copyright (c) 1993-2020
787
+
788
+ C.B. Barber
789
+ Arlington, MA
790
+
791
+ and
792
+
793
+ The National Science and Technology Research Center for
794
+ Computation and Visualization of Geometric Structures
795
+ (The Geometry Center)
796
+ University of Minnesota
797
+
798
+ email: qhull@qhull.org
799
+
800
+ This software includes Qhull from C.B. Barber and The Geometry Center.
801
+ Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The
802
+ remaining files are copyrighted by C.B. Barber. Qhull is free software
803
+ and may be obtained via http from www.qhull.org. It may be freely copied,
804
+ modified, and redistributed under the following conditions:
805
+
806
+ 1. All copyright notices must remain intact in all files.
807
+
808
+ 2. A copy of this text file must be distributed along with any copies
809
+ of Qhull that you redistribute; this includes copies that you have
810
+ modified, or copies of programs or other software products that
811
+ include Qhull.
812
+
813
+ 3. If you modify Qhull, you must include a notice giving the
814
+ name of the person performing the modification, the date of
815
+ modification, and the reason for such modification.
816
+
817
+ 4. When distributing modified versions of Qhull, or other software
818
+ products that include Qhull, you must provide notice that the original
819
+ source code may be obtained as noted above.
820
+
821
+ 5. There is no warranty or other guarantee of fitness for Qhull, it is
822
+ provided solely "as is". Bug reports or fixes may be sent to
823
+ qhull_bug@qhull.org; the authors may or may not act on them as
824
+ they desire.
825
+
826
+
827
+ Name: Qt4 Editor
828
+ Files: matplotlib/backends/qt_editor
829
+ Description: Module creating PyQt4 form dialogs/layouts to edit various type of parameters
830
+ License: MIT
831
+ Module creating PyQt4 form dialogs/layouts to edit various type of parameters
832
+
833
+
834
+ formlayout License Agreement (MIT License)
835
+ ------------------------------------------
836
+
837
+ Copyright (c) 2009 Pierre Raybaut
838
+
839
+ Permission is hereby granted, free of charge, to any person
840
+ obtaining a copy of this software and associated documentation
841
+ files (the "Software"), to deal in the Software without
842
+ restriction, including without limitation the rights to use,
843
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
844
+ copies of the Software, and to permit persons to whom the
845
+ Software is furnished to do so, subject to the following
846
+ conditions:
847
+
848
+ The above copyright notice and this permission notice shall be
849
+ included in all copies or substantial portions of the Software.
850
+
851
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
852
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
853
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
854
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
855
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
856
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
857
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
858
+ OTHER DEALINGS IN THE SOFTWARE.
859
+
860
+
861
+ Name: SheenBidi
862
+ Files: matplotlib/ft2font.*.so
863
+ Description: Unicode Bidirectional Algorithm implementation
864
+ License: Apache-2.0
865
+ Apache License
866
+ Version 2.0, January 2004
867
+ http://www.apache.org/licenses/
868
+
869
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
870
+
871
+ 1. Definitions.
872
+
873
+ "License" shall mean the terms and conditions for use, reproduction,
874
+ and distribution as defined by Sections 1 through 9 of this document.
875
+
876
+ "Licensor" shall mean the copyright owner or entity authorized by
877
+ the copyright owner that is granting the License.
878
+
879
+ "Legal Entity" shall mean the union of the acting entity and all
880
+ other entities that control, are controlled by, or are under common
881
+ control with that entity. For the purposes of this definition,
882
+ "control" means (i) the power, direct or indirect, to cause the
883
+ direction or management of such entity, whether by contract or
884
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
885
+ outstanding shares, or (iii) beneficial ownership of such entity.
886
+
887
+ "You" (or "Your") shall mean an individual or Legal Entity
888
+ exercising permissions granted by this License.
889
+
890
+ "Source" form shall mean the preferred form for making modifications,
891
+ including but not limited to software source code, documentation
892
+ source, and configuration files.
893
+
894
+ "Object" form shall mean any form resulting from mechanical
895
+ transformation or translation of a Source form, including but
896
+ not limited to compiled object code, generated documentation,
897
+ and conversions to other media types.
898
+
899
+ "Work" shall mean the work of authorship, whether in Source or
900
+ Object form, made available under the License, as indicated by a
901
+ copyright notice that is included in or attached to the work
902
+ (an example is provided in the Appendix below).
903
+
904
+ "Derivative Works" shall mean any work, whether in Source or Object
905
+ form, that is based on (or derived from) the Work and for which the
906
+ editorial revisions, annotations, elaborations, or other modifications
907
+ represent, as a whole, an original work of authorship. For the purposes
908
+ of this License, Derivative Works shall not include works that remain
909
+ separable from, or merely link (or bind by name) to the interfaces of,
910
+ the Work and Derivative Works thereof.
911
+
912
+ "Contribution" shall mean any work of authorship, including
913
+ the original version of the Work and any modifications or additions
914
+ to that Work or Derivative Works thereof, that is intentionally
915
+ submitted to Licensor for inclusion in the Work by the copyright owner
916
+ or by an individual or Legal Entity authorized to submit on behalf of
917
+ the copyright owner. For the purposes of this definition, "submitted"
918
+ means any form of electronic, verbal, or written communication sent
919
+ to the Licensor or its representatives, including but not limited to
920
+ communication on electronic mailing lists, source code control systems,
921
+ and issue tracking systems that are managed by, or on behalf of, the
922
+ Licensor for the purpose of discussing and improving the Work, but
923
+ excluding communication that is conspicuously marked or otherwise
924
+ designated in writing by the copyright owner as "Not a Contribution."
925
+
926
+ "Contributor" shall mean Licensor and any individual or Legal Entity
927
+ on behalf of whom a Contribution has been received by Licensor and
928
+ subsequently incorporated within the Work.
929
+
930
+ 2. Grant of Copyright License. Subject to the terms and conditions of
931
+ this License, each Contributor hereby grants to You a perpetual,
932
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
933
+ copyright license to reproduce, prepare Derivative Works of,
934
+ publicly display, publicly perform, sublicense, and distribute the
935
+ Work and such Derivative Works in Source or Object form.
936
+
937
+ 3. Grant of Patent License. Subject to the terms and conditions of
938
+ this License, each Contributor hereby grants to You a perpetual,
939
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
940
+ (except as stated in this section) patent license to make, have made,
941
+ use, offer to sell, sell, import, and otherwise transfer the Work,
942
+ where such license applies only to those patent claims licensable
943
+ by such Contributor that are necessarily infringed by their
944
+ Contribution(s) alone or by combination of their Contribution(s)
945
+ with the Work to which such Contribution(s) was submitted. If You
946
+ institute patent litigation against any entity (including a
947
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
948
+ or a Contribution incorporated within the Work constitutes direct
949
+ or contributory patent infringement, then any patent licenses
950
+ granted to You under this License for that Work shall terminate
951
+ as of the date such litigation is filed.
952
+
953
+ 4. Redistribution. You may reproduce and distribute copies of the
954
+ Work or Derivative Works thereof in any medium, with or without
955
+ modifications, and in Source or Object form, provided that You
956
+ meet the following conditions:
957
+
958
+ (a) You must give any other recipients of the Work or
959
+ Derivative Works a copy of this License; and
960
+
961
+ (b) You must cause any modified files to carry prominent notices
962
+ stating that You changed the files; and
963
+
964
+ (c) You must retain, in the Source form of any Derivative Works
965
+ that You distribute, all copyright, patent, trademark, and
966
+ attribution notices from the Source form of the Work,
967
+ excluding those notices that do not pertain to any part of
968
+ the Derivative Works; and
969
+
970
+ (d) If the Work includes a "NOTICE" text file as part of its
971
+ distribution, then any Derivative Works that You distribute must
972
+ include a readable copy of the attribution notices contained
973
+ within such NOTICE file, excluding those notices that do not
974
+ pertain to any part of the Derivative Works, in at least one
975
+ of the following places: within a NOTICE text file distributed
976
+ as part of the Derivative Works; within the Source form or
977
+ documentation, if provided along with the Derivative Works; or,
978
+ within a display generated by the Derivative Works, if and
979
+ wherever such third-party notices normally appear. The contents
980
+ of the NOTICE file are for informational purposes only and
981
+ do not modify the License. You may add Your own attribution
982
+ notices within Derivative Works that You distribute, alongside
983
+ or as an addendum to the NOTICE text from the Work, provided
984
+ that such additional attribution notices cannot be construed
985
+ as modifying the License.
986
+
987
+ You may add Your own copyright statement to Your modifications and
988
+ may provide additional or different license terms and conditions
989
+ for use, reproduction, or distribution of Your modifications, or
990
+ for any such Derivative Works as a whole, provided Your use,
991
+ reproduction, and distribution of the Work otherwise complies with
992
+ the conditions stated in this License.
993
+
994
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
995
+ any Contribution intentionally submitted for inclusion in the Work
996
+ by You to the Licensor shall be under the terms and conditions of
997
+ this License, without any additional terms or conditions.
998
+ Notwithstanding the above, nothing herein shall supersede or modify
999
+ the terms of any separate license agreement you may have executed
1000
+ with Licensor regarding such Contributions.
1001
+
1002
+ 6. Trademarks. This License does not grant permission to use the trade
1003
+ names, trademarks, service marks, or product names of the Licensor,
1004
+ except as required for reasonable and customary use in describing the
1005
+ origin of the Work and reproducing the content of the NOTICE file.
1006
+
1007
+ 7. Disclaimer of Warranty. Unless required by applicable law or
1008
+ agreed to in writing, Licensor provides the Work (and each
1009
+ Contributor provides its Contributions) on an "AS IS" BASIS,
1010
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1011
+ implied, including, without limitation, any warranties or conditions
1012
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
1013
+ PARTICULAR PURPOSE. You are solely responsible for determining the
1014
+ appropriateness of using or redistributing the Work and assume any
1015
+ risks associated with Your exercise of permissions under this License.
1016
+
1017
+ 8. Limitation of Liability. In no event and under no legal theory,
1018
+ whether in tort (including negligence), contract, or otherwise,
1019
+ unless required by applicable law (such as deliberate and grossly
1020
+ negligent acts) or agreed to in writing, shall any Contributor be
1021
+ liable to You for damages, including any direct, indirect, special,
1022
+ incidental, or consequential damages of any character arising as a
1023
+ result of this License or out of the use or inability to use the
1024
+ Work (including but not limited to damages for loss of goodwill,
1025
+ work stoppage, computer failure or malfunction, or any and all
1026
+ other commercial damages or losses), even if such Contributor
1027
+ has been advised of the possibility of such damages.
1028
+
1029
+ 9. Accepting Warranty or Additional Liability. While redistributing
1030
+ the Work or Derivative Works thereof, You may choose to offer,
1031
+ and charge a fee for, acceptance of support, warranty, indemnity,
1032
+ or other liability obligations and/or rights consistent with this
1033
+ License. However, in accepting such obligations, You may act only
1034
+ on Your own behalf and on Your sole responsibility, not on behalf
1035
+ of any other Contributor, and only if You agree to indemnify,
1036
+ defend, and hold each Contributor harmless for any liability
1037
+ incurred by, or claims asserted against, such Contributor by reason
1038
+ of your accepting any such warranty or additional liability.
1039
+
1040
+ END OF TERMS AND CONDITIONS
1041
+
1042
+ APPENDIX: How to apply the Apache License to your work.
1043
+
1044
+ To apply the Apache License to your work, attach the following
1045
+ boilerplate notice, with the fields enclosed by brackets "[]"
1046
+ replaced with your own identifying information. (Don't include
1047
+ the brackets!) The text should be enclosed in the appropriate
1048
+ comment syntax for the file format. We also recommend that a
1049
+ file or class name and description of purpose be included on the
1050
+ same "printed page" as the copyright notice for easier
1051
+ identification within third-party archives.
1052
+
1053
+ Copyright [yyyy] [name of copyright owner]
1054
+
1055
+ Licensed under the Apache License, Version 2.0 (the "License");
1056
+ you may not use this file except in compliance with the License.
1057
+ You may obtain a copy of the License at
1058
+
1059
+ http://www.apache.org/licenses/LICENSE-2.0
1060
+
1061
+ Unless required by applicable law or agreed to in writing, software
1062
+ distributed under the License is distributed on an "AS IS" BASIS,
1063
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1064
+ See the License for the specific language governing permissions and
1065
+ limitations under the License.
1066
+
1067
+
1068
+ Name: Solarized
1069
+ Files: matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle
1070
+ Description: Solarized color scheme/style
1071
+ License: MIT
1072
+ https://github.com/altercation/solarized/blob/master/LICENSE
1073
+ Copyright (c) 2011 Ethan Schoonover
1074
+
1075
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1076
+ of this software and associated documentation files (the "Software"), to deal
1077
+ in the Software without restriction, including without limitation the rights
1078
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1079
+ copies of the Software, and to permit persons to whom the Software is
1080
+ furnished to do so, subject to the following conditions:
1081
+
1082
+ The above copyright notice and this permission notice shall be included in
1083
+ all copies or substantial portions of the Software.
1084
+
1085
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1086
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1087
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1088
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1089
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1090
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1091
+ THE SOFTWARE.
1092
+
1093
+
1094
+ Name: Stix fonts
1095
+ Files: matplotlib/mpl-data/fonts/ttf/STIX*.ttf
1096
+ Description: STIX fonts
1097
+ License: OFL-1.1
1098
+ STIX Font License
1099
+
1100
+ 24 May 2010
1101
+
1102
+ Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American
1103
+ Institute of Physics, the American Chemical Society, the American Mathematical
1104
+ Society, the American Physical Society, Elsevier, Inc., and The Institute of
1105
+ Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved
1106
+ Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of
1107
+ Electrical and Electronics Engineers, Inc.
1108
+
1109
+ Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com),
1110
+ with Reserved Font Name TM Math. To obtain additional mathematical fonts, please
1111
+ contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA,
1112
+ Phone: (718) 575-1816.
1113
+
1114
+ Portions copyright (c) 1990 by Elsevier, Inc.
1115
+
1116
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
1117
+ This license is copied below, and is also available with a FAQ at:
1118
+ https://scripts.sil.org/OFL
1119
+
1120
+ -----------------------------------------------------------
1121
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
1122
+ -----------------------------------------------------------
1123
+
1124
+ PREAMBLE
1125
+ The goals of the Open Font License (OFL) are to stimulate worldwide
1126
+ development of collaborative font projects, to support the font creation
1127
+ efforts of academic and linguistic communities, and to provide a free and
1128
+ open framework in which fonts may be shared and improved in partnership
1129
+ with others.
1130
+
1131
+ The OFL allows the licensed fonts to be used, studied, modified and
1132
+ redistributed freely as long as they are not sold by themselves. The
1133
+ fonts, including any derivative works, can be bundled, embedded,
1134
+ redistributed and/or sold with any software provided that any reserved
1135
+ names are not used by derivative works. The fonts and derivatives,
1136
+ however, cannot be released under any other type of license. The
1137
+ requirement for fonts to remain under this license does not apply
1138
+ to any document created using the fonts or their derivatives.
1139
+
1140
+ DEFINITIONS
1141
+ "Font Software" refers to the set of files released by the Copyright
1142
+ Holder(s) under this license and clearly marked as such. This may
1143
+ include source files, build scripts and documentation.
1144
+
1145
+ "Reserved Font Name" refers to any names specified as such after the
1146
+ copyright statement(s).
1147
+
1148
+ "Original Version" refers to the collection of Font Software components as
1149
+ distributed by the Copyright Holder(s).
1150
+
1151
+ "Modified Version" refers to any derivative made by adding to, deleting,
1152
+ or substituting -- in part or in whole -- any of the components of the
1153
+ Original Version, by changing formats or by porting the Font Software to a
1154
+ new environment.
1155
+
1156
+ "Author" refers to any designer, engineer, programmer, technical
1157
+ writer or other person who contributed to the Font Software.
1158
+
1159
+ PERMISSION & CONDITIONS
1160
+ Permission is hereby granted, free of charge, to any person obtaining
1161
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
1162
+ redistribute, and sell modified and unmodified copies of the Font
1163
+ Software, subject to the following conditions:
1164
+
1165
+ 1) Neither the Font Software nor any of its individual components,
1166
+ in Original or Modified Versions, may be sold by itself.
1167
+
1168
+ 2) Original or Modified Versions of the Font Software may be bundled,
1169
+ redistributed and/or sold with any software, provided that each copy
1170
+ contains the above copyright notice and this license. These can be
1171
+ included either as stand-alone text files, human-readable headers or
1172
+ in the appropriate machine-readable metadata fields within text or
1173
+ binary files as long as those fields can be easily viewed by the user.
1174
+
1175
+ 3) No Modified Version of the Font Software may use the Reserved Font
1176
+ Name(s) unless explicit written permission is granted by the corresponding
1177
+ Copyright Holder. This restriction only applies to the primary font name as
1178
+ presented to the users.
1179
+
1180
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
1181
+ Software shall not be used to promote, endorse or advertise any
1182
+ Modified Version, except to acknowledge the contribution(s) of the
1183
+ Copyright Holder(s) and the Author(s) or with their explicit written
1184
+ permission.
1185
+
1186
+ 5) The Font Software, modified or unmodified, in part or in whole,
1187
+ must be distributed entirely under this license, and must not be
1188
+ distributed under any other license. The requirement for fonts to
1189
+ remain under this license does not apply to any document created
1190
+ using the Font Software.
1191
+
1192
+ TERMINATION
1193
+ This license becomes null and void if any of the above conditions are
1194
+ not met.
1195
+
1196
+ DISCLAIMER
1197
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1198
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
1199
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
1200
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
1201
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1202
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
1203
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1204
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
1205
+ OTHER DEALINGS IN THE FONT SOFTWARE.
1206
+
1207
+ Name: Yorick Colormaps
1208
+ Files: lib/matplotlib/_cm.py
1209
+ Description: Gist/Yorick colormaps
1210
+ License:
1211
+ BSD-style license for gist/yorick colormaps.
1212
+
1213
+ Copyright:
1214
+
1215
+ Copyright (c) 1996. The Regents of the University of California.
1216
+ All rights reserved.
1217
+
1218
+ Permission to use, copy, modify, and distribute this software for any
1219
+ purpose without fee is hereby granted, provided that this entire
1220
+ notice is included in all copies of any software which is or includes
1221
+ a copy or modification of this software and in all copies of the
1222
+ supporting documentation for such software.
1223
+
1224
+ This work was produced at the University of California, Lawrence
1225
+ Livermore National Laboratory under contract no. W-7405-ENG-48 between
1226
+ the U.S. Department of Energy and The Regents of the University of
1227
+ California for the operation of UC LLNL.
1228
+
1229
+
1230
+ DISCLAIMER
1231
+
1232
+ This software was prepared as an account of work sponsored by an
1233
+ agency of the United States Government. Neither the United States
1234
+ Government nor the University of California nor any of their
1235
+ employees, makes any warranty, express or implied, or assumes any
1236
+ liability or responsibility for the accuracy, completeness, or
1237
+ usefulness of any information, apparatus, product, or process
1238
+ disclosed, or represents that its use would not infringe
1239
+ privately-owned rights. Reference herein to any specific commercial
1240
+ products, process, or service by trade name, trademark, manufacturer,
1241
+ or otherwise, does not necessarily constitute or imply its
1242
+ endorsement, recommendation, or favoring by the United States
1243
+ Government or the University of California. The views and opinions of
1244
+ authors expressed herein do not necessarily state or reflect those of
1245
+ the United States Government or the University of California, and
1246
+ shall not be used for advertising or product endorsement purposes.
1247
+
1248
+
1249
+ AUTHOR
1250
+
1251
+ David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated
1252
+ the Yorick parser. The routines in Math are from LAPACK and FFTPACK;
1253
+ MathC contains C translations by David H. Munro. The algorithms for
1254
+ Yorick's random number generator and several special functions in
1255
+ Yorick/include were taken from Numerical Recipes by Press, et. al.,
1256
+ although the Yorick implementations are unrelated to those in
1257
+ Numerical Recipes. A small amount of code in Gist was adapted from
1258
+ the X11R4 release, copyright M.I.T. -- the complete copyright notice
1259
+ may be found in the (unused) file Gist/host.c.
1260
+
1261
+ Classifier: Development Status :: 5 - Production/Stable
1262
+ Classifier: Framework :: Matplotlib
1263
+ Classifier: Intended Audience :: Science/Research
1264
+ Classifier: Intended Audience :: Education
1265
+ Classifier: License :: OSI Approved :: Python Software Foundation License
1266
+ Classifier: Programming Language :: Python
1267
+ Classifier: Programming Language :: Python :: 3
1268
+ Classifier: Programming Language :: Python :: 3.11
1269
+ Classifier: Programming Language :: Python :: 3.12
1270
+ Classifier: Programming Language :: Python :: 3.13
1271
+ Classifier: Programming Language :: Python :: 3.14
1272
+ Classifier: Topic :: Scientific/Engineering :: Visualization
1273
+ Project-URL: Homepage, https://matplotlib.org
1274
+ Project-URL: Download, https://matplotlib.org/stable/install/index.html
1275
+ Project-URL: Documentation, https://matplotlib.org
1276
+ Project-URL: Source Code, https://github.com/matplotlib/matplotlib
1277
+ Project-URL: Bug Tracker, https://github.com/matplotlib/matplotlib/issues
1278
+ Project-URL: Forum, https://discourse.matplotlib.org/
1279
+ Project-URL: Donate, https://numfocus.org/donate-to-matplotlib
1280
+ Requires-Python: >=3.11
1281
+ Requires-Dist: contourpy>=1.0.1
1282
+ Requires-Dist: cycler>=0.10
1283
+ Requires-Dist: fonttools>=4.28.2
1284
+ Requires-Dist: kiwisolver>=1.3.1
1285
+ Requires-Dist: numpy>=1.25
1286
+ Requires-Dist: packaging>=20.0
1287
+ Requires-Dist: pillow>=9
1288
+ Requires-Dist: pyparsing>=3
1289
+ Requires-Dist: python-dateutil>=2.7
1290
+ Description-Content-Type: text/markdown
1291
+
1292
+ [![PyPi](https://img.shields.io/pypi/v/matplotlib)](https://pypi.org/project/matplotlib/)
1293
+ [![Conda](https://img.shields.io/conda/vn/conda-forge/matplotlib)](https://anaconda.org/conda-forge/matplotlib)
1294
+ [![Downloads](https://img.shields.io/pypi/dm/matplotlib)](https://pypi.org/project/matplotlib)
1295
+ [![NUMFocus](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org)
1296
+ [![LFX Health Score](https://insights.linuxfoundation.org/api/badge/health-score?project=matplotlib)](https://insights.linuxfoundation.org/project/matplotlib)
1297
+
1298
+ [![Discourse help forum](https://img.shields.io/badge/help_forum-discourse-blue.svg)](https://discourse.matplotlib.org)
1299
+ [![Discourse chat](https://img.shields.io/badge/chat-discourse-mediumaquamarine)](https://discourse.matplotlib.org/chat/c/matplotlib/2)
1300
+ [![GitHub issues](https://img.shields.io/badge/issue_tracking-github-blue.svg)](https://github.com/matplotlib/matplotlib/issues)
1301
+ [![Contributing](https://img.shields.io/badge/PR-Welcome-%23FF8300.svg?)](https://matplotlib.org/stable/devel/index.html)
1302
+
1303
+ [![GitHub actions status](https://github.com/matplotlib/matplotlib/workflows/Tests/badge.svg)](https://github.com/matplotlib/matplotlib/actions?query=workflow%3ATests)
1304
+ [![Azure pipelines status](https://dev.azure.com/matplotlib/matplotlib/_apis/build/status/matplotlib.matplotlib?branchName=main)](https://dev.azure.com/matplotlib/matplotlib/_build/latest?definitionId=1&branchName=main)
1305
+ [![AppVeyor status](https://ci.appveyor.com/api/projects/status/github/matplotlib/matplotlib?branch=main&svg=true)](https://ci.appveyor.com/project/matplotlib/matplotlib)
1306
+ [![Codecov status](https://codecov.io/github/matplotlib/matplotlib/badge.svg?branch=main&service=github)](https://app.codecov.io/gh/matplotlib/matplotlib)
1307
+ [![EffVer Versioning](https://img.shields.io/badge/version_scheme-EffVer-0097a7)](https://jacobtomlinson.dev/effver)
1308
+
1309
+ ![Matplotlib logotype](https://matplotlib.org/stable/_static/logo2.svg)
1310
+
1311
+ Matplotlib is a comprehensive library for creating static, animated, and
1312
+ interactive visualizations in Python.
1313
+
1314
+ Check out our [home page](https://matplotlib.org/) for more information.
1315
+
1316
+ ![image](https://matplotlib.org/stable/_static/readme_preview.png)
1317
+
1318
+ Matplotlib produces publication-quality figures in a variety of hardcopy
1319
+ formats and interactive environments across platforms. Matplotlib can be
1320
+ used in Python scripts, Python/IPython shells, web application servers,
1321
+ and various graphical user interface toolkits.
1322
+
1323
+ ## Install
1324
+
1325
+ See the [install
1326
+ documentation](https://matplotlib.org/stable/users/installing/index.html),
1327
+ which is generated from `/doc/install/index.rst`
1328
+
1329
+ ## Contribute
1330
+
1331
+ You've discovered a bug or something else you want to change — excellent!
1332
+
1333
+ You've worked out a way to fix it — even better!
1334
+
1335
+ You want to tell us about it — best of all!
1336
+
1337
+ Start at the [contributing
1338
+ guide](https://matplotlib.org/devdocs/devel/contribute.html)!
1339
+
1340
+ ## Contact
1341
+
1342
+ [Discourse](https://discourse.matplotlib.org/) is the discussion forum
1343
+ for general questions and discussions and our recommended starting
1344
+ point.
1345
+
1346
+ Our active mailing lists (which are mirrored on Discourse) are:
1347
+
1348
+ - [Users](https://mail.python.org/mailman/listinfo/matplotlib-users)
1349
+ mailing list: <matplotlib-users@python.org>
1350
+ - [Announcement](https://mail.python.org/mailman/listinfo/matplotlib-announce)
1351
+ mailing list: <matplotlib-announce@python.org>
1352
+ - [Development](https://mail.python.org/mailman/listinfo/matplotlib-devel)
1353
+ mailing list: <matplotlib-devel@python.org>
1354
+
1355
+ [Discourse Chat](https://discourse.matplotlib.org/chat/c/matplotlib/2) is for
1356
+ coordinating development and asking questions directly related to contributing
1357
+ to matplotlib.
1358
+
1359
+ ## Citing Matplotlib
1360
+
1361
+ If Matplotlib contributes to a project that leads to publication, please
1362
+ acknowledge this by citing Matplotlib.
1363
+
1364
+ [A ready-made citation
1365
+ entry](https://matplotlib.org/stable/users/project/citing.html) is
1366
+ available.
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/RECORD ADDED
@@ -0,0 +1,891 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __pycache__/pylab.cpython-312.pyc,,
2
+ matplotlib-3.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3
+ matplotlib-3.11.2.dist-info/LICENSE,sha256=gi6OUoFHVppBl1WSruGcEZkqtme6UEUc2SkDHV_HRJE,63442
4
+ matplotlib-3.11.2.dist-info/METADATA,sha256=5fUyIm0QJa8t0V_5Ud8nOR9m1GQDuCROph5rjrPk2AY,80264
5
+ matplotlib-3.11.2.dist-info/RECORD,,
6
+ matplotlib-3.11.2.dist-info/WHEEL,sha256=3qIDcXCk577AXiK3pDifO-gE9U_MYWYGgtD78gLa2_U,137
7
+ matplotlib/__init__.py,sha256=N6u3jnTp4AhaTjBqkZYG_6j_PCY974CuL02TjPp5zTI,56239
8
+ matplotlib/__init__.pyi,sha256=hnkSJbatbDbjIU0O9Nb_8uALpyt7XmJmlua1Z9ti1xs,3648
9
+ matplotlib/__pycache__/__init__.cpython-312.pyc,,
10
+ matplotlib/__pycache__/_afm.cpython-312.pyc,,
11
+ matplotlib/__pycache__/_animation_data.cpython-312.pyc,,
12
+ matplotlib/__pycache__/_blocking_input.cpython-312.pyc,,
13
+ matplotlib/__pycache__/_cm.cpython-312.pyc,,
14
+ matplotlib/__pycache__/_cm_bivar.cpython-312.pyc,,
15
+ matplotlib/__pycache__/_cm_listed.cpython-312.pyc,,
16
+ matplotlib/__pycache__/_cm_multivar.cpython-312.pyc,,
17
+ matplotlib/__pycache__/_color_data.cpython-312.pyc,,
18
+ matplotlib/__pycache__/_constrained_layout.cpython-312.pyc,,
19
+ matplotlib/__pycache__/_docstring.cpython-312.pyc,,
20
+ matplotlib/__pycache__/_enums.cpython-312.pyc,,
21
+ matplotlib/__pycache__/_fontconfig_pattern.cpython-312.pyc,,
22
+ matplotlib/__pycache__/_internal_utils.cpython-312.pyc,,
23
+ matplotlib/__pycache__/_layoutgrid.cpython-312.pyc,,
24
+ matplotlib/__pycache__/_mathtext.cpython-312.pyc,,
25
+ matplotlib/__pycache__/_mathtext_data.cpython-312.pyc,,
26
+ matplotlib/__pycache__/_pylab_helpers.cpython-312.pyc,,
27
+ matplotlib/__pycache__/_style_helpers.cpython-312.pyc,,
28
+ matplotlib/__pycache__/_text_helpers.cpython-312.pyc,,
29
+ matplotlib/__pycache__/_tight_bbox.cpython-312.pyc,,
30
+ matplotlib/__pycache__/_tight_layout.cpython-312.pyc,,
31
+ matplotlib/__pycache__/_type1font.cpython-312.pyc,,
32
+ matplotlib/__pycache__/_version.cpython-312.pyc,,
33
+ matplotlib/__pycache__/animation.cpython-312.pyc,,
34
+ matplotlib/__pycache__/artist.cpython-312.pyc,,
35
+ matplotlib/__pycache__/axis.cpython-312.pyc,,
36
+ matplotlib/__pycache__/backend_bases.cpython-312.pyc,,
37
+ matplotlib/__pycache__/backend_managers.cpython-312.pyc,,
38
+ matplotlib/__pycache__/backend_tools.cpython-312.pyc,,
39
+ matplotlib/__pycache__/bezier.cpython-312.pyc,,
40
+ matplotlib/__pycache__/category.cpython-312.pyc,,
41
+ matplotlib/__pycache__/cbook.cpython-312.pyc,,
42
+ matplotlib/__pycache__/cm.cpython-312.pyc,,
43
+ matplotlib/__pycache__/collections.cpython-312.pyc,,
44
+ matplotlib/__pycache__/colorbar.cpython-312.pyc,,
45
+ matplotlib/__pycache__/colorizer.cpython-312.pyc,,
46
+ matplotlib/__pycache__/colors.cpython-312.pyc,,
47
+ matplotlib/__pycache__/container.cpython-312.pyc,,
48
+ matplotlib/__pycache__/contour.cpython-312.pyc,,
49
+ matplotlib/__pycache__/dates.cpython-312.pyc,,
50
+ matplotlib/__pycache__/dviread.cpython-312.pyc,,
51
+ matplotlib/__pycache__/figure.cpython-312.pyc,,
52
+ matplotlib/__pycache__/font_manager.cpython-312.pyc,,
53
+ matplotlib/__pycache__/gridspec.cpython-312.pyc,,
54
+ matplotlib/__pycache__/hatch.cpython-312.pyc,,
55
+ matplotlib/__pycache__/image.cpython-312.pyc,,
56
+ matplotlib/__pycache__/inset.cpython-312.pyc,,
57
+ matplotlib/__pycache__/layout_engine.cpython-312.pyc,,
58
+ matplotlib/__pycache__/legend.cpython-312.pyc,,
59
+ matplotlib/__pycache__/legend_handler.cpython-312.pyc,,
60
+ matplotlib/__pycache__/lines.cpython-312.pyc,,
61
+ matplotlib/__pycache__/markers.cpython-312.pyc,,
62
+ matplotlib/__pycache__/mathtext.cpython-312.pyc,,
63
+ matplotlib/__pycache__/mlab.cpython-312.pyc,,
64
+ matplotlib/__pycache__/offsetbox.cpython-312.pyc,,
65
+ matplotlib/__pycache__/patches.cpython-312.pyc,,
66
+ matplotlib/__pycache__/path.cpython-312.pyc,,
67
+ matplotlib/__pycache__/patheffects.cpython-312.pyc,,
68
+ matplotlib/__pycache__/pylab.cpython-312.pyc,,
69
+ matplotlib/__pycache__/pyplot.cpython-312.pyc,,
70
+ matplotlib/__pycache__/quiver.cpython-312.pyc,,
71
+ matplotlib/__pycache__/rcsetup.cpython-312.pyc,,
72
+ matplotlib/__pycache__/sankey.cpython-312.pyc,,
73
+ matplotlib/__pycache__/scale.cpython-312.pyc,,
74
+ matplotlib/__pycache__/spines.cpython-312.pyc,,
75
+ matplotlib/__pycache__/stackplot.cpython-312.pyc,,
76
+ matplotlib/__pycache__/streamplot.cpython-312.pyc,,
77
+ matplotlib/__pycache__/table.cpython-312.pyc,,
78
+ matplotlib/__pycache__/texmanager.cpython-312.pyc,,
79
+ matplotlib/__pycache__/text.cpython-312.pyc,,
80
+ matplotlib/__pycache__/textpath.cpython-312.pyc,,
81
+ matplotlib/__pycache__/ticker.cpython-312.pyc,,
82
+ matplotlib/__pycache__/transforms.cpython-312.pyc,,
83
+ matplotlib/__pycache__/typing.cpython-312.pyc,,
84
+ matplotlib/__pycache__/units.cpython-312.pyc,,
85
+ matplotlib/__pycache__/widgets.cpython-312.pyc,,
86
+ matplotlib/_afm.py,sha256=l46JeOQkEGId4DblorgmEekC8yHG26pfGDZKbkJZJzY,16637
87
+ matplotlib/_animation_data.py,sha256=JJJbbc-fMdPjkbQ7ng9BHL5i91VTDHQVTtEdWOvWBAI,7986
88
+ matplotlib/_api/__init__.py,sha256=fiYs7djOGhZgwuLKpjresHjCnja9VBuOb3c8_tTDx4I,17391
89
+ matplotlib/_api/__init__.pyi,sha256=2DfbEED4eeE5pEjHUFo9EgSN1UnediUYcYlwG8dCzMc,2322
90
+ matplotlib/_api/__pycache__/__init__.cpython-312.pyc,,
91
+ matplotlib/_api/__pycache__/deprecation.cpython-312.pyc,,
92
+ matplotlib/_api/deprecation.py,sha256=Nk0GmpvN8rEPL2QSIHF7qqTlybjiX74VDNmJXy-FQtI,20733
93
+ matplotlib/_api/deprecation.pyi,sha256=A8De57amX2GlZSrDYwVYCMxHFb8AsYGrH0k_bCxuJus,2217
94
+ matplotlib/_blocking_input.py,sha256=VHNsxvX2mTx_xBknd30MSicVlRXS4dCDe9hDctbV5rk,1224
95
+ matplotlib/_c_internal_utils.cpython-312-x86_64-linux-gnu.so,sha256=ekdE5NTdHv6MNv8pKP9oEcPwzCule8suhszoKFhtLH4,266840
96
+ matplotlib/_c_internal_utils.pyi,sha256=Z3bLs9pMGXrmZjt-4_A-x4321bLP-B54xDbr4PIgUfc,377
97
+ matplotlib/_cm.py,sha256=RNyeDygB0aBKSryfiLvqZy688uH9nvxPrEno_qntT5Y,70285
98
+ matplotlib/_cm_bivar.py,sha256=RSIt5eWusEBkKSEYFq5h6MGlViWbEd7UQJLRlr8hz9w,95704
99
+ matplotlib/_cm_listed.py,sha256=3a02mPUSnOsXkqRFNxKGwIvJCAKY5lezBUrqGcllnvk,135004
100
+ matplotlib/_cm_multivar.py,sha256=0UjNFW7Sytj1t31QD99ebfr-al7NmCpWhKUOyq9VzK8,6630
101
+ matplotlib/_color_data.py,sha256=k-wdTi6ArJxksqBfMT-7Uy2qWz8XX4Th5gsjf32CwmM,34780
102
+ matplotlib/_color_data.pyi,sha256=RdBRk01yuf3jYVlCwG351tIBCxehizkZMnKs9c8gnOw,170
103
+ matplotlib/_constrained_layout.py,sha256=uEH1lnCZz_FRmp2aGtt3iDPHGUw6Sdb38r-Gve82tR4,33041
104
+ matplotlib/_docstring.py,sha256=u9yJorJidI8k1W8S01SIMqNmh5VOMVc-AqyES66EEdk,4435
105
+ matplotlib/_docstring.pyi,sha256=Tr9ApmZkmt5HjoTf1IC4X13Nvjna_eW-yLQd5llCK8g,725
106
+ matplotlib/_enums.py,sha256=ERb2JYSEfGdxqXqDlF97WGP4LT-B79k3rDu0KimVeWk,6175
107
+ matplotlib/_enums.pyi,sha256=EqmZXhvqknq8WKey2susXmbIzq07O114jJ0RoWo6Qfg,302
108
+ matplotlib/_fontconfig_pattern.py,sha256=LdC1dyLFbYFGcvpr6K_YcFpC8imHXOgJhli1Db-eaKQ,4368
109
+ matplotlib/_image.cpython-312-x86_64-linux-gnu.so,sha256=Z2y1oTZWjA5ero3xsJobGmL9yFKcJKGNM9O7GcRWL1Y,602368
110
+ matplotlib/_image.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ matplotlib/_internal_utils.py,sha256=nhK6LLWYW93fBcsFiO09JmqFj2rgHEsGYFOeaC7HRKw,2140
112
+ matplotlib/_layoutgrid.py,sha256=mFB9asZVol2aV9hLBpdntuG5x1isKUrajF-3TUhCgso,21676
113
+ matplotlib/_mathtext.py,sha256=_2bkK1whMKjj8EJJ2BkcJPQzxCiS-KDF1m1VJnSNYTI,118542
114
+ matplotlib/_mathtext_data.py,sha256=kNTK1Yzh8bJoLqeFEDrVqG4qNDltAqqzhqDM8ZORC2w,68787
115
+ matplotlib/_path.cpython-312-x86_64-linux-gnu.so,sha256=pXZiJlZbSmX7WMnB32C7FPxdIz3kG-W8TShCk2B-uIk,506712
116
+ matplotlib/_path.pyi,sha256=YQm2xn97KT0x2sieHfZJqd3Qz2bxpgDPMzjWmtlxxzs,261
117
+ matplotlib/_pylab_helpers.py,sha256=7Wcmb39shcllnTI_uICKW0vMB7kI8cZr8mQ8xgh70IM,4424
118
+ matplotlib/_pylab_helpers.pyi,sha256=7OZKr-OL3ipVt1EDZ6e-tRwHASz-ijYfcIdlPczXhvQ,1012
119
+ matplotlib/_qhull.cpython-312-x86_64-linux-gnu.so,sha256=47QOUdYua5EdnBWS6KSt0znhTjCXw4GNXXdKNQWacHo,755864
120
+ matplotlib/_qhull.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ matplotlib/_style_helpers.py,sha256=LeTjS0RQLrTo5PosTsFXg1zukGCSMpzJLWiRCUHGPow,1781
122
+ matplotlib/_text_helpers.py,sha256=CxOPGLxlj0xcI9mZPS0G6pJiHWlShVjnHSF05RqPzK0,1600
123
+ matplotlib/_tight_bbox.py,sha256=sswNaE9IcVwIvhUQfAUq3CdJZYusKWeXKz-Dw0JXy2s,2821
124
+ matplotlib/_tight_layout.py,sha256=A3vZKBmxci7w35OO9lxgfUqrRKgTr-N_dUza0M05WxE,12675
125
+ matplotlib/_tri.cpython-312-x86_64-linux-gnu.so,sha256=I3MjU7yHCOV9arqu7PFJos_hX6V0xS3qT8VNmPdHk_s,439264
126
+ matplotlib/_tri.pyi,sha256=bFnu97pIlSboJT3ijQBw4YlZdlR1UzXYtI3DkEPVzeM,1429
127
+ matplotlib/_type1font.py,sha256=3n-dlsUP35U4CLBTmx28P7Tsdc4rxNnaURZi9xIFzr8,41640
128
+ matplotlib/_version.py,sha256=KMmUcoybTFMzT_WAH2Kkg4xeBOm8OGLzSre1hxnJMwg,19
129
+ matplotlib/animation.py,sha256=ZKnd2PEj-yq_3fXdSwgzpH0UDup4Uiwn7U1_L6IhTdI,74106
130
+ matplotlib/animation.pyi,sha256=Uf4_f8vqu585xcpppq4__MwQgy9k6VIFltI_tcQXcMA,6833
131
+ matplotlib/artist.py,sha256=xVqB2G22CreyL81ucEAaqEVY3l0bpuQKFsYPbx8Dvno,65786
132
+ matplotlib/artist.pyi,sha256=cdWcuxzI_0BWm1Ij4XtPanAhClmXJywV2eYdEwBUgro,7321
133
+ matplotlib/axes/__init__.py,sha256=aHE_zIjphIJkW4_1fyoFuEWTb7gCRewK5jNZWJHEdgM,351
134
+ matplotlib/axes/__init__.pyi,sha256=HP1z2v-PboHQS4dQjvJ7XjUjX-zw6taZRTTB9oVKwYE,303
135
+ matplotlib/axes/__pycache__/__init__.cpython-312.pyc,,
136
+ matplotlib/axes/__pycache__/_axes.cpython-312.pyc,,
137
+ matplotlib/axes/__pycache__/_base.cpython-312.pyc,,
138
+ matplotlib/axes/__pycache__/_secondary_axes.cpython-312.pyc,,
139
+ matplotlib/axes/_axes.py,sha256=9h4ctDV17KcLAcnIDxbTAV6RqBAf6c4Mw_3D2ARByKc,372902
140
+ matplotlib/axes/_axes.pyi,sha256=DwqzbqB89ftBVvsboIBVK45nRfQmhy8whwPEEvfy_Ec,27942
141
+ matplotlib/axes/_base.py,sha256=zv9NL6m9mesUUaJ4Er7zQ5AjhN1ZKpuEgvMbLqxV82s,197935
142
+ matplotlib/axes/_base.pyi,sha256=76nYL7r3HGwbyjMs_95fzvAuZsiPi2Bxdqjo1t4uysU,17533
143
+ matplotlib/axes/_secondary_axes.py,sha256=sqqq4HfgP_ZTjRpL-KacNHbu0OJxIKpWfeE4x5RZmpM,12922
144
+ matplotlib/axes/_secondary_axes.pyi,sha256=SygaC_w29AbGAfBnwSKcltPBkaZUQclS42XDB9OmGaU,1782
145
+ matplotlib/axis.py,sha256=97_5nSz_rnfnXuoPuUKi3Q0PwoxwLsy1QGkbynNkMrA,111990
146
+ matplotlib/axis.pyi,sha256=pztTaGoPJ424AHZyE9iHo5NPvl_EjERgykTIgr5osbU,10246
147
+ matplotlib/backend_bases.py,sha256=orFH-xSdiGL62HSZH3mmHPdto0d9_VivmXVaj5-AwHQ,138490
148
+ matplotlib/backend_bases.pyi,sha256=233bGo5OUYb9mQxKw5yArCzPwPCKcD8X0dSbyYAftt4,17357
149
+ matplotlib/backend_managers.py,sha256=RQheCO_cQBlaWsYMbAmswu0UPKU7bmLTI5LEFgotklA,11795
150
+ matplotlib/backend_managers.pyi,sha256=agnuM0wiZRqSgqti2AgbKJijRLvEPNLOrSY8PEwLjFE,2253
151
+ matplotlib/backend_tools.py,sha256=CvRSLGYETQAs8ryoJ4gizeJOj7QLzbWPfSlT17AciHY,33379
152
+ matplotlib/backend_tools.pyi,sha256=T6q9_VHSF9Ca7yY2FJT6Fqbp0e5flzXFPU4g6UmjraU,4142
153
+ matplotlib/backends/__init__.py,sha256=JowJe-tDrUBMNJTiJATgiEuACpgdxsKnRCYa-nC255A,206
154
+ matplotlib/backends/__pycache__/__init__.cpython-312.pyc,,
155
+ matplotlib/backends/__pycache__/_backend_gtk.cpython-312.pyc,,
156
+ matplotlib/backends/__pycache__/_backend_pdf_ps.cpython-312.pyc,,
157
+ matplotlib/backends/__pycache__/_backend_tk.cpython-312.pyc,,
158
+ matplotlib/backends/__pycache__/backend_agg.cpython-312.pyc,,
159
+ matplotlib/backends/__pycache__/backend_cairo.cpython-312.pyc,,
160
+ matplotlib/backends/__pycache__/backend_gtk3.cpython-312.pyc,,
161
+ matplotlib/backends/__pycache__/backend_gtk3agg.cpython-312.pyc,,
162
+ matplotlib/backends/__pycache__/backend_gtk3cairo.cpython-312.pyc,,
163
+ matplotlib/backends/__pycache__/backend_gtk4.cpython-312.pyc,,
164
+ matplotlib/backends/__pycache__/backend_gtk4agg.cpython-312.pyc,,
165
+ matplotlib/backends/__pycache__/backend_gtk4cairo.cpython-312.pyc,,
166
+ matplotlib/backends/__pycache__/backend_macosx.cpython-312.pyc,,
167
+ matplotlib/backends/__pycache__/backend_mixed.cpython-312.pyc,,
168
+ matplotlib/backends/__pycache__/backend_nbagg.cpython-312.pyc,,
169
+ matplotlib/backends/__pycache__/backend_pdf.cpython-312.pyc,,
170
+ matplotlib/backends/__pycache__/backend_pgf.cpython-312.pyc,,
171
+ matplotlib/backends/__pycache__/backend_ps.cpython-312.pyc,,
172
+ matplotlib/backends/__pycache__/backend_qt.cpython-312.pyc,,
173
+ matplotlib/backends/__pycache__/backend_qt5.cpython-312.pyc,,
174
+ matplotlib/backends/__pycache__/backend_qt5agg.cpython-312.pyc,,
175
+ matplotlib/backends/__pycache__/backend_qt5cairo.cpython-312.pyc,,
176
+ matplotlib/backends/__pycache__/backend_qtagg.cpython-312.pyc,,
177
+ matplotlib/backends/__pycache__/backend_qtcairo.cpython-312.pyc,,
178
+ matplotlib/backends/__pycache__/backend_svg.cpython-312.pyc,,
179
+ matplotlib/backends/__pycache__/backend_template.cpython-312.pyc,,
180
+ matplotlib/backends/__pycache__/backend_tkagg.cpython-312.pyc,,
181
+ matplotlib/backends/__pycache__/backend_tkcairo.cpython-312.pyc,,
182
+ matplotlib/backends/__pycache__/backend_webagg.cpython-312.pyc,,
183
+ matplotlib/backends/__pycache__/backend_webagg_core.cpython-312.pyc,,
184
+ matplotlib/backends/__pycache__/backend_wx.cpython-312.pyc,,
185
+ matplotlib/backends/__pycache__/backend_wxagg.cpython-312.pyc,,
186
+ matplotlib/backends/__pycache__/backend_wxcairo.cpython-312.pyc,,
187
+ matplotlib/backends/__pycache__/qt_compat.cpython-312.pyc,,
188
+ matplotlib/backends/__pycache__/registry.cpython-312.pyc,,
189
+ matplotlib/backends/_backend_agg.cpython-312-x86_64-linux-gnu.so,sha256=7MZKr6D1ttC5KrSaEQkl3E8eqPkGiTVcd9lsCNjIYTo,789856
190
+ matplotlib/backends/_backend_agg.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
+ matplotlib/backends/_backend_gtk.py,sha256=73YLOI6Ztewd_c0cPkvBPxA2FFXeHJKtv9ie8F_HTBg,11318
192
+ matplotlib/backends/_backend_pdf_ps.py,sha256=8nd42_khjFna-WORMUEZ_9w634YF5-GkLmL3FSePiJQ,15792
193
+ matplotlib/backends/_backend_tk.py,sha256=mmVLWw8cmDyahEUocxnBcKPriG2cbhrM8NgHeuW-h7s,45650
194
+ matplotlib/backends/_macosx.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
+ matplotlib/backends/_tkagg.cpython-312-x86_64-linux-gnu.so,sha256=S_Oz4ha4SRKrhKPgA96d4I5ssGdVYRUA2d1GDd9mzXI,291288
196
+ matplotlib/backends/_tkagg.pyi,sha256=1yKnYKSgNFesrb0ZI5RQCyTO4zONgHW5MrJ9vq4HzyI,379
197
+ matplotlib/backends/backend_agg.py,sha256=P5kuN0MFrkD7qjap2ndigyGWGWpeQHJMHOii4GuC5GM,23121
198
+ matplotlib/backends/backend_cairo.py,sha256=Dv6HQX1fsNXAsKF3_28iXT8cuGbsPpL1CiRIXeYOFHQ,18623
199
+ matplotlib/backends/backend_gtk3.py,sha256=qWjAZOCIM6tppqd2qpS2JfRtSpHAN2sVvaCu_7UeqKE,22399
200
+ matplotlib/backends/backend_gtk3agg.py,sha256=aFJw05L5V-FyFSj_20l_FuC5piPf8fhKzft_m1NMhYc,2463
201
+ matplotlib/backends/backend_gtk3cairo.py,sha256=zPsJzVm750if2LiQ9ybzsbX0rBhkP05XVvR9Lhz65so,1392
202
+ matplotlib/backends/backend_gtk4.py,sha256=9hbYj5P6-bA2_3iLPUue1cdT0BvMzeSWA6bwXsWgG-o,23690
203
+ matplotlib/backends/backend_gtk4agg.py,sha256=00i3qpIt9Tcf_S74GOWbeckiPlfVJoQ2pBbhXDMthF0,1262
204
+ matplotlib/backends/backend_gtk4cairo.py,sha256=sqWm3WgfNO8EsBjqzsD4U4cAc0f4q5SufYx7ZJacDf0,1125
205
+ matplotlib/backends/backend_macosx.py,sha256=Gjbu1MKXIZpCM_luMG6U7qDgwotcGSegCvYw-NNWxeQ,7397
206
+ matplotlib/backends/backend_mixed.py,sha256=qfuFnC8FrlwUnjh13krzLbW3KoSsC4KmeOfmnuXXWg8,4837
207
+ matplotlib/backends/backend_nbagg.py,sha256=ubhMhxfsv6-6cy8ip8SvGEn2pc9XgqilvH_MVYYdbKE,8026
208
+ matplotlib/backends/backend_pdf.py,sha256=gSxmt_P6-pxdUr1BSvn5g4Wvt2LmP5yYT81c-numCS0,102799
209
+ matplotlib/backends/backend_pgf.py,sha256=XYfcRUAABOAS_REh8gQLEZsEK7fSL-VSzJBWtx2WwBk,40667
210
+ matplotlib/backends/backend_ps.py,sha256=oXyXS-pGBrF8ik5EnwNjRhk0miaQZ4ESVeYmzkuCheU,52915
211
+ matplotlib/backends/backend_qt.py,sha256=L07xkywLyhyan2uG-upPrqsHqQjC4WTkBJAoUhjcP0U,46470
212
+ matplotlib/backends/backend_qt5.py,sha256=kzfoo2ksEGsiWAa2LGtZYzKvfzqJJWyGOohohcRAu1g,787
213
+ matplotlib/backends/backend_qt5agg.py,sha256=Vh7H8kqWH4X8a3VX2XZ2Vze9srwJavkNHAZxdJUz_bk,352
214
+ matplotlib/backends/backend_qt5cairo.py,sha256=Go2Y0GVkXh1xh6x4F255_e5Xbwwws-OiD1Fc0805E78,292
215
+ matplotlib/backends/backend_qtagg.py,sha256=ZjPtp5wR6tZGjbngPXRdVXYRhiPPrc5C0q2DmtdRkpY,3413
216
+ matplotlib/backends/backend_qtcairo.py,sha256=e3SUG50VGqo68eS_8ebTCVQPa4AaxLxuo1JiWX4TIWg,1770
217
+ matplotlib/backends/backend_svg.py,sha256=xIl3W5iR8Yv7MbcG5yQG2iZ6m1IDOl0f1g5ZIwxI1WU,51636
218
+ matplotlib/backends/backend_template.py,sha256=qhWvXGiPeO2jvH61L3NCRYLReo--d4WJrQYanIaEmiE,8012
219
+ matplotlib/backends/backend_tkagg.py,sha256=z9gB16fq2d-DUNpbeSDDLWaYmc0Jz3cDqNlBKhnQg0c,592
220
+ matplotlib/backends/backend_tkcairo.py,sha256=OZWmYs0nvs1qp0OEkhZhhIbXkwBbK6frP0VDik7fu78,859
221
+ matplotlib/backends/backend_webagg.py,sha256=jQhB9JA5tXcRwm6_7qlBg2-Q8_y-5hnv2IUNBPpCSbA,11014
222
+ matplotlib/backends/backend_webagg_core.py,sha256=xJDU2egrWAGvHf9DU7HNP_HB_HLIY5I5aWyITjFN_o8,19622
223
+ matplotlib/backends/backend_wx.py,sha256=lxysP5Z1cnw5ccbgoacQ5xIUiu4KJ8bEtbPlKvFe5hA,51826
224
+ matplotlib/backends/backend_wxagg.py,sha256=tzcwYyW34j4LPfHm9uhuHwepwZIcspi3y8oPC8FJkdk,1468
225
+ matplotlib/backends/backend_wxcairo.py,sha256=7pojY9Q9So6bShbiZgjzAo3cP3cBX0iGT6u8c_h94zc,868
226
+ matplotlib/backends/qt_compat.py,sha256=hwZ78jPuXdKuU71aqqDZqCXYBEeNnfwzkZaGQeaH_9c,5381
227
+ matplotlib/backends/qt_editor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
+ matplotlib/backends/qt_editor/__pycache__/__init__.cpython-312.pyc,,
229
+ matplotlib/backends/qt_editor/__pycache__/_formlayout.cpython-312.pyc,,
230
+ matplotlib/backends/qt_editor/__pycache__/figureoptions.cpython-312.pyc,,
231
+ matplotlib/backends/qt_editor/_formlayout.py,sha256=QmqqqLO6waqeSGOKjDNUwjvon53Z7yqil5AfqfftDWY,20953
232
+ matplotlib/backends/qt_editor/figureoptions.py,sha256=foEm2WLOjiephUZwGT3XjPJ3Q4IGHC2GMcxzMgrQQ50,9855
233
+ matplotlib/backends/registry.py,sha256=M2BHhBKbUJ8E2B2QExfVf8NbAK4ZFhJtmKRelBZZDh4,15480
234
+ matplotlib/backends/web_backend/all_figures.html,sha256=44Y-GvIJbNlqQaKSW3kwVKpTxBSG1WsdYz3ZmYHlUsA,1753
235
+ matplotlib/backends/web_backend/css/boilerplate.css,sha256=qui16QXRnQFNJDbcMasfH6KtN9hLjv8883U9cJmsVCE,2310
236
+ matplotlib/backends/web_backend/css/fbm.css,sha256=wa4vNkNv7fQ_TufjJjecFZEzPMR6W8x6uXJga_wQILw,1456
237
+ matplotlib/backends/web_backend/css/mpl.css,sha256=ruca_aA5kNnP-MZmLkriu8teVP1nIgwcFEpoB16j8Z4,1611
238
+ matplotlib/backends/web_backend/css/page.css,sha256=ca3nO3TaPw7865PN5SlGJBTc2H3rBXQCMaFPywX29y4,1623
239
+ matplotlib/backends/web_backend/ipython_inline_figure.html,sha256=wgSxUh3xpPAxOnZgSMnrhDM5hYncOfWRGgaCUezvedY,1311
240
+ matplotlib/backends/web_backend/js/mpl.js,sha256=OMt_21axoqQKoVf9ttijR_2M1jOH7id0Q69sQfwZ_y4,25140
241
+ matplotlib/backends/web_backend/js/mpl_tornado.js,sha256=Zs2Uzs7YUilG765nYvanCo-IK8HkHDtIum1KAq6bQ_w,302
242
+ matplotlib/backends/web_backend/js/nbagg_mpl.js,sha256=F-By4ZjOSmwpNAkxUUxUk35qCjGlf0B28Z0aOyfpxDM,9514
243
+ matplotlib/backends/web_backend/single_figure.html,sha256=wEBwF602JLHErBUEXiS6jXqmxYAIzHpa3MMFrnev6rs,1357
244
+ matplotlib/bezier.py,sha256=Y8NbgCpFxxR6PGJoPygGbA_IXsYyLwIlfvLAAfi4pU4,21728
245
+ matplotlib/bezier.pyi,sha256=k3lxqCXHmi2fEb5M1spj1WVsxvswA_pKdzN0obDbXYw,2646
246
+ matplotlib/category.py,sha256=UsZ8rbADAH96YfpjD-N1DLTcS_cQwlszIIQ2ZRaiWm4,7377
247
+ matplotlib/cbook.py,sha256=5__IsdXDiSqyi7LcznGSTfYZLQZ0AjyNiR-ZmUuGNkM,85524
248
+ matplotlib/cbook.pyi,sha256=TCYTGVX6XTW9FEm2wq34NhkUPS1PisfUmrXw7POMrxQ,6398
249
+ matplotlib/cm.py,sha256=pdc7wmRcuzs0FJD2j5BCaDznEM1qie_UwL9QUtJ066o,8206
250
+ matplotlib/cm.pyi,sha256=PorGgiFbQOUvgzzAHe7OKQK7wk65sUoPRH9jNNeZMzg,5412
251
+ matplotlib/collections.py,sha256=x33nwk7hg1OgUasmeWW2uHKwHEcoSbBoviiWyMPjoKI,103408
252
+ matplotlib/collections.pyi,sha256=3GZ2nE8BJ2EfmwZjs9uAqqWccExx_JJUjjvm-A-Z314,11039
253
+ matplotlib/colorbar.py,sha256=Cn8ku-sSVcwrim5Lit4UZJOXohozTnABfIIJOfEkrZM,61667
254
+ matplotlib/colorbar.pyi,sha256=1o4F2DlVXp-roRz6Ko3f9STcW5U_QKLFolhtRHItgdk,4968
255
+ matplotlib/colorizer.py,sha256=-WhzNI0-iVuctG72HSn6Chmy608o0q2JB2LYC3a3eGg,33983
256
+ matplotlib/colorizer.pyi,sha256=tnMrZDj_AZgs3kYDmhnD4YcRdcJ4S0kaWG9wpWab2EI,3245
257
+ matplotlib/colors.py,sha256=70Fz-egxC8dXFOMsOFVxnCeRbGxlG1yU458AFjhCzwQ,159006
258
+ matplotlib/colors.pyi,sha256=FELbV30Fwm1dq39H8Zmc05RniFLoDZ2ykDu2aDgcVkg,17918
259
+ matplotlib/container.py,sha256=Uex9WGmNxaBu8znJ4IlYMrEF0POmE7uAnCWpSe3kRuQ,8132
260
+ matplotlib/container.pyi,sha256=7CZg-lyczPGuT0XRxhES4TDoWYyVwzpH8yQXLmbzXG0,2461
261
+ matplotlib/contour.py,sha256=R1r2-rHgzXi-QPQ1OvqnZovOW2HZUVMKkXNlKKdNksg,70635
262
+ matplotlib/contour.pyi,sha256=X6v5bBOSDIBYkFss9ODtbIdbHS5oHFytLHrwHyvLQRc,5284
263
+ matplotlib/dates.py,sha256=-41nP7xXwkmfLdE4yHxslSClmzi2CwGm1Z1etlQO8jM,66406
264
+ matplotlib/dviread.py,sha256=ek7fK2K9RUxhulY2jbcN4SBWwr6crxPpi9-qR0r5dXE,53612
265
+ matplotlib/dviread.pyi,sha256=165jDLJDuF1TMze11sh2fKBodwMQZkyzu-vELHfVxms,3364
266
+ matplotlib/figure.py,sha256=tECrClvgPLObE1KaL-xJfS2W3rCD4-VtYiBZPj7FZ9o,144757
267
+ matplotlib/figure.pyi,sha256=NsPxdMKxpiLR0oz9eflrYeku5hRChommeeZqm_1287w,15662
268
+ matplotlib/font_manager.py,sha256=0ORkvRr_jhgV03Wqi_xt0yhpl5s0jY7DuC7dYbgoh4g,65673
269
+ matplotlib/font_manager.pyi,sha256=uMp62Capj9kXcu2XOhclF90Y3NRgSGLxI8o0V_5GmDE,6172
270
+ matplotlib/ft2font.cpython-312-x86_64-linux-gnu.so,sha256=nNgs1I0jLgut5DXP8jM_x7HqANWVx3qxHnwoSCFYDZQ,2999496
271
+ matplotlib/ft2font.pyi,sha256=wbja6PlzzMyM20vX9Q-L2Ic3XHzaBPnKl45m6MECQvk,11081
272
+ matplotlib/gridspec.py,sha256=34OVMGdl2bk_mNay6GeDapsrB4bPWzmiYQMwnEMxr94,30513
273
+ matplotlib/gridspec.pyi,sha256=iw2KNGeJ8W5ggYZbF5OHxXsX0pMczHcDMaGxJbv18BY,5495
274
+ matplotlib/hatch.py,sha256=0E7gMZaFMF_vLYjjUG7sPq36e2w2eDIDuCPLj4cRyA0,8206
275
+ matplotlib/hatch.pyi,sha256=OEFkNe8TgrBli_MDMW99Tvhr44S4ySPaYQomjVXpUUA,2098
276
+ matplotlib/image.py,sha256=bh9hpUezcdqb07ILZZkakOxzs3BQT9SofRHRKTsuKnc,73960
277
+ matplotlib/image.pyi,sha256=XkbGOsJR7nIzRFgFBzivi6WU-PlHvC-9yukWiq7RYpk,7065
278
+ matplotlib/inset.py,sha256=KO-82520LcdcCaB68d3GeFdUJGgNtkvx6cDB4NZ0g9c,11281
279
+ matplotlib/inset.pyi,sha256=c-IVW14bpqb3qu7bz0EabvNXJnZwJAXEXoQoIcrL8ns,968
280
+ matplotlib/layout_engine.py,sha256=mwRNh13mIQ-wpjQVgBaB_LWKN1AiQTWldg-X9nLmVok,11433
281
+ matplotlib/layout_engine.pyi,sha256=9cKFTFPCvwmKIygTUvrvOq1iWnFYme9Shniiv2QbC74,1788
282
+ matplotlib/legend.py,sha256=F6C70yrOPrgXIWDupV-7PBSSxlnQ-AXs8DEm68sHKkQ,56894
283
+ matplotlib/legend.pyi,sha256=kfp-f2PFzqYmH61HjaoRtdyI_7JAqXIkGaB1E5qdn38,5393
284
+ matplotlib/legend_handler.py,sha256=Vy1ez79DsUnsondDgOMsqnevwL4Bh3KvjWWWEeXZv6w,29820
285
+ matplotlib/legend_handler.pyi,sha256=3VEfeioGIAxhd3mhg4PXETZjCKf4OlXL0jz1MAFGtos,7655
286
+ matplotlib/lines.py,sha256=6ShRHOwfnOGUVQCMGGPTN7Db0ccawrjUAiTI1cBp4Fw,60047
287
+ matplotlib/lines.pyi,sha256=3tG7tD8GZ8YPphw4nmkgS9SfdLV8icW36bv61jb9RlU,6081
288
+ matplotlib/markers.py,sha256=9cNxE0NveYpnr7uFXhD3Acw-aQ_J8a7A7zhDVtf8VA0,33695
289
+ matplotlib/markers.pyi,sha256=FFFBsvilnbd8-5L04U70kfVoyBwc18w_fZ6DysTj9p0,1678
290
+ matplotlib/mathtext.py,sha256=Q2PXhf35TAYkS_JElreyRBTFhmsdqDcWXKx8ICUkZ1c,5108
291
+ matplotlib/mathtext.pyi,sha256=RCVxYGQ_CJ6wC7v_HkqoouU2PhtcvlJ1ffIyxzAC-so,1045
292
+ matplotlib/mlab.py,sha256=57B_GKW0UgKb_HtGCCj0cJ2LOmw_zcIeRu4rZkxbswo,30951
293
+ matplotlib/mlab.pyi,sha256=mkR7wbJS9eCQfCFsUWoXnqrAy0kcE3cVqpFZCeOGC_Q,3583
294
+ matplotlib/mpl-data/fonts/afm/cmex10.afm,sha256=blR3ERmrVBV5XKkAnDCj4NMeYVgzH7cXtJ3u59u9GuE,12070
295
+ matplotlib/mpl-data/fonts/afm/cmmi10.afm,sha256=5qwEOpedEo76bDUahyuuF1q0cD84tRrX-VQ4p3MlfBo,10416
296
+ matplotlib/mpl-data/fonts/afm/cmr10.afm,sha256=WDvgC_D3UkGJg9u-J0U6RaT02lF4oz3lQxHtg1r3lYw,10101
297
+ matplotlib/mpl-data/fonts/afm/cmsy10.afm,sha256=AbmzvCVWBceHRfmRfeJ9E6xzOQTFLk0U1zDfpf3_MaM,8295
298
+ matplotlib/mpl-data/fonts/afm/cmti10.afm,sha256=BNnf_3S1lJdOB2RTn7pSIWaM8qBWR6Cilzw92iUzNw8,9645
299
+ matplotlib/mpl-data/fonts/afm/cmtt10.afm,sha256=4ji7_mTpeWMa93o_UHBWPKCnqsBfhJJNllat1lJArP4,6501
300
+ matplotlib/mpl-data/fonts/afm/pagd8a.afm,sha256=jjFrigwkTpYLqa26cpzZvKQNBo-PuF4bmDVqaM4pMWw,17183
301
+ matplotlib/mpl-data/fonts/afm/pagdo8a.afm,sha256=sgNQdeYyx8J-itGw9h31y95aMBiTCRvmNSPTXwwS7xg,17255
302
+ matplotlib/mpl-data/fonts/afm/pagk8a.afm,sha256=ZUtfHPloNqcvGMHMxaKDSlshhOcjwheUx143RwpGdIU,17241
303
+ matplotlib/mpl-data/fonts/afm/pagko8a.afm,sha256=Yj1wBg6Jsqqz1KBfhRoJ3ACR-CMQol8Fj_ZM5NZ1gDk,17346
304
+ matplotlib/mpl-data/fonts/afm/pbkd8a.afm,sha256=Zl5o6J_di9Y5j2EpHtjew-_sfg7-WoeVmO9PzOYSTUc,15157
305
+ matplotlib/mpl-data/fonts/afm/pbkdi8a.afm,sha256=JAOno930iTyfZILMf11vWtiaTgrJcPpP6FRTRhEMMD4,15278
306
+ matplotlib/mpl-data/fonts/afm/pbkl8a.afm,sha256=UJqJjOJ6xQDgDBLX157mKpohIJFVmHM-N6x2-DiGv14,15000
307
+ matplotlib/mpl-data/fonts/afm/pbkli8a.afm,sha256=AWislZ2hDbs0ox_qOWREugsbS8_8lpL48LPMR40qpi0,15181
308
+ matplotlib/mpl-data/fonts/afm/pcrb8a.afm,sha256=6j1TS2Uc7DWSc-8l42TGDc1u0Fg8JspeWfxFayjUwi8,15352
309
+ matplotlib/mpl-data/fonts/afm/pcrbo8a.afm,sha256=smg3mjl9QaBDtQIt06ko5GvaxLsO9QtTvYANuE5hfG0,15422
310
+ matplotlib/mpl-data/fonts/afm/pcrr8a.afm,sha256=7nxFr0Ehz4E5KG_zSE5SZOhxRH8MyfnCbw-7x5wu7tw,15339
311
+ matplotlib/mpl-data/fonts/afm/pcrro8a.afm,sha256=NKEz7XtdFkh9cA8MvY-S3UOZlV2Y_J3tMEWFFxj7QSg,15443
312
+ matplotlib/mpl-data/fonts/afm/phvb8a.afm,sha256=NAx4M4HjL7vANCJbc-tk04Vkol-T0oaXeQ3T2h-XUvM,17155
313
+ matplotlib/mpl-data/fonts/afm/phvb8an.afm,sha256=8e_myD-AQkNF7q9XNLb2m76_lX2TUr3a5wog_LIE1sk,17086
314
+ matplotlib/mpl-data/fonts/afm/phvbo8a.afm,sha256=8fkBRmJ-SWY2YrBg8fFyjJyrJp8daQ6JPO6LvhM8xPI,17230
315
+ matplotlib/mpl-data/fonts/afm/phvbo8an.afm,sha256=aeVRvV4r15BBvxuRJ0MG8ZHuH2HViuIiCYkvuapmkmM,17195
316
+ matplotlib/mpl-data/fonts/afm/phvl8a.afm,sha256=IyMYM-bgl-gI6rG0EuZZ2OLzlxJfGeSh8xqsh0t-eJQ,15627
317
+ matplotlib/mpl-data/fonts/afm/phvlo8a.afm,sha256=s12C-eNnIDHJ_UVbuiprjxBjCiHIbS3Y8ORTC-qTpuI,15729
318
+ matplotlib/mpl-data/fonts/afm/phvr8a.afm,sha256=Kt8KaRidts89EBIK29X2JomDUEDxvroeaJz_RNTi6r4,17839
319
+ matplotlib/mpl-data/fonts/afm/phvr8an.afm,sha256=lL5fAHTRwODl-sB5mH7IfsD1tnnea4yRUK-_Ca2bQHM,17781
320
+ matplotlib/mpl-data/fonts/afm/phvro8a.afm,sha256=3KqK3eejiR4hIFBUynuSX_4lMdE2V2T58xOF8lX-fwc,17919
321
+ matplotlib/mpl-data/fonts/afm/phvro8an.afm,sha256=Vx9rRf3YfasMY7tz-njSxz67xHKk-fNkN7yBi0X2IP0,17877
322
+ matplotlib/mpl-data/fonts/afm/pncb8a.afm,sha256=aoXepTcDQtQa_mspflMJkEFKefzXHoyjz6ioJVI0YNc,16028
323
+ matplotlib/mpl-data/fonts/afm/pncbi8a.afm,sha256=pCWW1MYgy0EmvwaYsaYJaAI_LfrsKmDANHu7Pk0RaiU,17496
324
+ matplotlib/mpl-data/fonts/afm/pncr8a.afm,sha256=0CIB2BLe9r-6_Wl5ObRTTf98UOrezmGQ8ZOuBX5kLks,16665
325
+ matplotlib/mpl-data/fonts/afm/pncri8a.afm,sha256=5R-pLZOnaHNG8pjV6MP3Ai-d2OTQYR_cYCb5zQhzfSU,16920
326
+ matplotlib/mpl-data/fonts/afm/pplb8a.afm,sha256=3EzUbNnXr5Ft5eFLY00W9oWu59rHORgDXUuJaOoKN58,15662
327
+ matplotlib/mpl-data/fonts/afm/pplbi8a.afm,sha256=X_9tVspvrcMer3OS8qvdwjFFqpAXYZneyCL2NHA902g,15810
328
+ matplotlib/mpl-data/fonts/afm/pplr8a.afm,sha256=ijMb497FDJ9nVdVMb21F7W3-cu9sb_9nF0oriFpSn8k,15752
329
+ matplotlib/mpl-data/fonts/afm/pplri8a.afm,sha256=8KITbarcUUMi_hdoRLLmNHtlqs0TtOSKqtPFft7X5nY,15733
330
+ matplotlib/mpl-data/fonts/afm/psyr.afm,sha256=Iyt8ajE4B2Tm34oBj2pKtctIf9kPfq05suQefq8p3Ro,9644
331
+ matplotlib/mpl-data/fonts/afm/ptmb8a.afm,sha256=bL1fA1NC4_nW14Zrnxz4nHlXJb4dzELJPvodqKnYeMg,17983
332
+ matplotlib/mpl-data/fonts/afm/ptmbi8a.afm,sha256=-_Ui6XlKaFTHEnkoS_-1GtIr5VtGa3gFQ2ezLOYHs08,18070
333
+ matplotlib/mpl-data/fonts/afm/ptmr8a.afm,sha256=IEcsWcmzJyjCwkgsw4o6hIMmzlyXUglJat9s1PZNnEU,17942
334
+ matplotlib/mpl-data/fonts/afm/ptmri8a.afm,sha256=49fQMg5fIGguZ7rgc_2styMK55Pv5bPTs7wCzqpcGpk,18068
335
+ matplotlib/mpl-data/fonts/afm/putb8a.afm,sha256=qMaHTdpkrNL-m4DWhjpxJCSmgYkCv1qIzLlFfM0rl40,21532
336
+ matplotlib/mpl-data/fonts/afm/putbi8a.afm,sha256=g7AVJyiTxeMpNk_1cSfmYgM09uNUfPlZyWGv3D1vcAk,21931
337
+ matplotlib/mpl-data/fonts/afm/putr8a.afm,sha256=XYmNC5GQgSVAZKTIYdYeNksE6znNm9GF_0SmQlriqx0,22148
338
+ matplotlib/mpl-data/fonts/afm/putri8a.afm,sha256=i7fVe-iLyLtQxCfAa4IxdxH-ufcHmMk7hbCGG5TxAY4,21891
339
+ matplotlib/mpl-data/fonts/afm/pzcmi8a.afm,sha256=wyuoIWEZOcoXrSl1tPzLkEahik7kGi91JJj-tkFRG4A,16250
340
+ matplotlib/mpl-data/fonts/afm/pzdr.afm,sha256=MyjLAnzKYRdQBfof1W3k_hf30MvqOkqL__G22mQ5xww,9467
341
+ matplotlib/mpl-data/fonts/pdfcorefonts/Courier-Bold.afm,sha256=sIDDI-B82VZ3C0mI_mHFITCZ7PVn37AIYMv1CrHX4sE,15333
342
+ matplotlib/mpl-data/fonts/pdfcorefonts/Courier-BoldOblique.afm,sha256=zg61QobD3YU9UBfCXmvmhBNaFKno-xj8sY0b2RpgfLw,15399
343
+ matplotlib/mpl-data/fonts/pdfcorefonts/Courier-Oblique.afm,sha256=vRQm5j1sTUN4hicT1PcVZ9P9DTTUHhEzfPXqUUzVZhE,15441
344
+ matplotlib/mpl-data/fonts/pdfcorefonts/Courier.afm,sha256=Mdcq2teZEBJrIqVXnsnhee7oZnTs6-P8_292kWGTrw4,15335
345
+ matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-Bold.afm,sha256=i2l4gcjuYXoXf28uK7yIVwuf0rnw6J7PwPVQeHj5iPw,69269
346
+ matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-BoldOblique.afm,sha256=Um5O6qK11DXLt8uj_0IoWkc84TKqHK3bObSKUswQqvY,69365
347
+ matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica-Oblique.afm,sha256=hVYDg2b52kqtbVeCzmiv25bW1yYdpkZS-LXlGREN2Rs,74392
348
+ matplotlib/mpl-data/fonts/pdfcorefonts/Helvetica.afm,sha256=23cvKDD7bQAJB3kdjSahJSTZaUOppznlIO6FXGslyW8,74292
349
+ matplotlib/mpl-data/fonts/pdfcorefonts/Symbol.afm,sha256=P5UaoXr4y0qh4SiMa5uqijDT6ZDr2-jPmj1ayry593E,9740
350
+ matplotlib/mpl-data/fonts/pdfcorefonts/Times-Bold.afm,sha256=cQTmr2LFPwKQE_sGQageMcmFicjye16mKJslsJLHQyE,64251
351
+ matplotlib/mpl-data/fonts/pdfcorefonts/Times-BoldItalic.afm,sha256=pzWOdycm6RqocBWgAVY5Jq0z3Fp7LuqWgLNMx4q6OFw,59642
352
+ matplotlib/mpl-data/fonts/pdfcorefonts/Times-Italic.afm,sha256=bK5puSMpGT_YUILwyJrXoxjfj7XJOdfv5TQ_iKsJRzw,66328
353
+ matplotlib/mpl-data/fonts/pdfcorefonts/Times-Roman.afm,sha256=hhNrUnpazuDDKD1WpraPxqPWCYLrO7D7bMVOg-zI13o,60460
354
+ matplotlib/mpl-data/fonts/pdfcorefonts/ZapfDingbats.afm,sha256=ZuOmt9GcKofjdOq8kqhPhtAIhOwkL2rTJTmZxAjFakA,9527
355
+ matplotlib/mpl-data/fonts/pdfcorefonts/readme.txt,sha256=MRv8ppSITYYAb7lt5EOw9DWWNZIblfxsFhu5TQE7cpI,828
356
+ matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf,sha256=sYS4njwQdfIva3FXW2_CDUlys8_TsjMiym_Vltyu8Wc,704128
357
+ matplotlib/mpl-data/fonts/ttf/DejaVuSans-BoldOblique.ttf,sha256=bt8CgxYBhq9FHL7nHnuEXy5Mq_Jku5ks5mjIPCVGXm8,641720
358
+ matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf,sha256=zN90s1DxH9PdV3TeUOXmNGoaXaH1t9X7g1kGZel6UhM,633840
359
+ matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf,sha256=P99pyr8GBJ6nCgC1kZNA4s4ebQKwzDxLRPtoAb0eDSI,756072
360
+ matplotlib/mpl-data/fonts/ttf/DejaVuSansDisplay.ttf,sha256=ggmdz7paqGjN_CdFGYlSX-MpL3N_s8ngMozpzvWWUvY,25712
361
+ matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Bold.ttf,sha256=uq2ppRcv4giGJRr_BDP8OEYZEtXa8HKH577lZiCo2pY,331536
362
+ matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-BoldOblique.ttf,sha256=ppCBwVx2yCfgonpaf1x0thNchDSZlVSV_6jCDTqYKIs,253116
363
+ matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Oblique.ttf,sha256=KAUoE_enCfyJ9S0ZLcmV708P3Fw9e3OknWhJsZFtDNA,251472
364
+ matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf,sha256=YC7Ia4lIz82VZIL-ZPlMNshndwFJ7y95HUYT9EO87LM,340240
365
+ matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Bold.ttf,sha256=w3U_Lta8Zz8VhG3EWt2-s7nIcvMvsY_VOiHxvvHtdnY,355692
366
+ matplotlib/mpl-data/fonts/ttf/DejaVuSerif-BoldItalic.ttf,sha256=2T7-x6nS6CZ2jRou6VuVhw4V4pWZqE80hK8d4c7C4YE,347064
367
+ matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Italic.ttf,sha256=PnmU-8VPoQzjNSpC1Uj63X2crbacsRCbydlg9trFfwQ,345612
368
+ matplotlib/mpl-data/fonts/ttf/DejaVuSerif.ttf,sha256=EHJElW6ZYrnpb6zNxVGCXgrgiYrhNzcTPhuSGi_TX_o,379740
369
+ matplotlib/mpl-data/fonts/ttf/DejaVuSerifDisplay.ttf,sha256=KRTzLkfHd8J75Wd6-ufbTeefnkXeb8kJfZlJwjwU99U,14300
370
+ matplotlib/mpl-data/fonts/ttf/LICENSE_DEJAVU,sha256=11k43sCY8G8Kw8AIUwZdlPAgvhw8Yu8dwpdboVtNmw4,4816
371
+ matplotlib/mpl-data/fonts/ttf/LICENSE_STIX,sha256=urPTHf7wf0g2JPL2XycR52BluOcnMnixwHHt4QQcmVk,5476
372
+ matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf,sha256=YMSKv8BenyujNZnE3LpAEF0eznHTdh8LJvdaOLWxeJU,564228
373
+ matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf,sha256=FnN4Ax4t3cYhbWeBnJJg6aBv_ExHjk4jy5im_USxg8I,448228
374
+ matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf,sha256=6FM9xwg_o0a9oZM9YOpKg7Z9CUW86vGzVB-CtKDixqA,237360
375
+ matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf,sha256=mHiP1LpI37sr0CbA4gokeosGxzcoeWKLemuw1bsJc2w,181152
376
+ matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf,sha256=bPyzM9IrfDxiO9_UAXTxTIXD1nMcphZsHtyAFA6uhSc,175040
377
+ matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf,sha256=Ulb34CEzWsSFTRgPDovxmJZOwvyCAXYnbhaqvGU3u1c,59108
378
+ matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf,sha256=XRBqW3jR_8MBdFU0ObhiV7-kXwiBIMs7QVClHcT5tgs,30512
379
+ matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf,sha256=pb22DnbDf2yQqizotc3wBDqFGC_g27YcCGJivH9-Le8,41272
380
+ matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf,sha256=BMr9pWiBv2YIZdq04X4c3CgL6NPLUPrl64aV1N4w9Ug,46752
381
+ matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf,sha256=wYuH1gYUpCuusqItRH5kf9p_s6mUD-9X3L5RvRtKSxs,13656
382
+ matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf,sha256=yNdvjUoSmsZCULmD7SVq9HabndG9P4dPhboL1JpAf0s,12228
383
+ matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf,sha256=-9xVMYL4_1rcO8FiCKrCfR4PaSmKtA42ddLGqwtei1w,15972
384
+ matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf,sha256=cYexyo8rZcdqMlpa9fNF5a2IoXLUTZuIvh0JD1Qp0i4,12556
385
+ matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf,sha256=0lbHzpndzJmO8S42mlkhsz5NbvJLQCaH5Mcc7QZRDzc,19760
386
+ matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf,sha256=3eBc-VtYbhQU3BnxiypfO6eAzEu8BdDvtIJSFbkS2oY,12192
387
+ matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf,sha256=XFSKCptbESM8uxHtUFSAV2cybwxhSjd8dWVByq6f3w0,15836
388
+ matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf,sha256=MUCYHrA0ZqFiSE_PjIGlJZgMuv79aUgQqE7Dtu3kuo0,12116
389
+ matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf,sha256=_sdxDuEwBDtADpu9CyIXQxV7sIqA2TZVBCUiUjq5UCk,15704
390
+ matplotlib/mpl-data/fonts/ttf/cmb10.ttf,sha256=B0SXtQxD6ldZcYFZH5iT04_BKofpUQT1ZX_CSB9hojo,25680
391
+ matplotlib/mpl-data/fonts/ttf/cmex10.ttf,sha256=ryjwwXByOsd2pxv6WVrKCemNFa5cPVTOGa_VYZyWqQU,21092
392
+ matplotlib/mpl-data/fonts/ttf/cmmi10.ttf,sha256=MJKWW4gR_WpnZXmWZIRRgfwd0TMLk3-RWAjEhdMWI00,32560
393
+ matplotlib/mpl-data/fonts/ttf/cmr10.ttf,sha256=Tdl2GwWMAJ25shRfVe5mF9CTwnPdPWxbPkP_YRD6m_Y,26348
394
+ matplotlib/mpl-data/fonts/ttf/cmss10.ttf,sha256=ffkag9BbLkcexjjLC0NaNgo8eSsJ_EKn2mfpHy55EVo,20376
395
+ matplotlib/mpl-data/fonts/ttf/cmsy10.ttf,sha256=uyJu2TLz8QDNDlL15JEu5VO0G2nnv9uNOFTbDrZgUjI,29396
396
+ matplotlib/mpl-data/fonts/ttf/cmti10.ttf,sha256=-fH59lQwiugve-REGuibCAiWs0zCILvqFzxemtz-Pvc,32808
397
+ matplotlib/mpl-data/fonts/ttf/cmtt10.ttf,sha256=YhHwmuk1mZka_alwwkZp2tGnfiU9kVYk-_IS9wLwcdc,28136
398
+ matplotlib/mpl-data/images/back-symbolic.svg,sha256=Okj_ressZkfe6Ewv_o7GF5toc5qWCeFkQ2cHQ25BdVE,1532
399
+ matplotlib/mpl-data/images/back.pdf,sha256=ZR7CJo_dAeCM-KlaGvskgtHQyRtrPIolc8REOmcoqJk,1623
400
+ matplotlib/mpl-data/images/back.png,sha256=E4dGf4Gnz1xJ1v2tMygHV0YNQgShreDeVApaMb-74mU,380
401
+ matplotlib/mpl-data/images/back.svg,sha256=Okj_ressZkfe6Ewv_o7GF5toc5qWCeFkQ2cHQ25BdVE,1532
402
+ matplotlib/mpl-data/images/back_large.png,sha256=9A6hUSQeszhYONE4ZuH3kvOItM0JfDVu6tkfromCbsQ,620
403
+ matplotlib/mpl-data/images/filesave-symbolic.svg,sha256=dMGXvLSOHPu44kiWgZx-B_My_tLWaP6J6GgxJfL4FW0,2049
404
+ matplotlib/mpl-data/images/filesave.pdf,sha256=P1EPPV2g50WTt8UaX-6kFoTZM1xVqo6S2H6FJ6Zd1ec,1734
405
+ matplotlib/mpl-data/images/filesave.png,sha256=b7ctucrM_F2mG-DycTedG_a_y4pHkx3F-zM7l18GLhk,458
406
+ matplotlib/mpl-data/images/filesave.svg,sha256=dMGXvLSOHPu44kiWgZx-B_My_tLWaP6J6GgxJfL4FW0,2049
407
+ matplotlib/mpl-data/images/filesave_large.png,sha256=LNbRD5KZ3Kf7nbp-stx_a1_6XfGBSWUfDdpgmnzoRvk,720
408
+ matplotlib/mpl-data/images/forward-symbolic.svg,sha256=kOiKq3a4mieMRLVCwQBdOMTRrWG2NOX_5-rbAFHpdmQ,1551
409
+ matplotlib/mpl-data/images/forward.pdf,sha256=KIqIL4YId43LkcOxV_TT5uvz1SP8k5iUNUeJmAElMV8,1630
410
+ matplotlib/mpl-data/images/forward.png,sha256=pKbLepgGiGeyY2TCBl8svjvm7Z4CS3iysFxcq4GR-wk,357
411
+ matplotlib/mpl-data/images/forward.svg,sha256=kOiKq3a4mieMRLVCwQBdOMTRrWG2NOX_5-rbAFHpdmQ,1551
412
+ matplotlib/mpl-data/images/forward_large.png,sha256=36h7m7DZDHql6kkdpNPckyi2LKCe_xhhyavWARz_2kQ,593
413
+ matplotlib/mpl-data/images/hand.pdf,sha256=hspwkNY915KPD7AMWnVQs7LFPOtlcj0VUiLu76dMabQ,4172
414
+ matplotlib/mpl-data/images/hand.png,sha256=2cchRETGKa0hYNKUxnJABwkyYXEBPqJy_VqSPlT0W2Q,979
415
+ matplotlib/mpl-data/images/hand.svg,sha256=hxxBtakaVFA7mpZOGakvo0QUcb2x06rojeS5gnVmyuc,4906
416
+ matplotlib/mpl-data/images/help-symbolic.svg,sha256=XVcFcuzcL3SQ3LjfSbtdLYDjoB5YUkj2jk2Gk8vaZF8,1890
417
+ matplotlib/mpl-data/images/help.pdf,sha256=CeE978IMi0YWznWKjIT1R8IrP4KhZ0S7usPUvreSgcA,1813
418
+ matplotlib/mpl-data/images/help.png,sha256=s4pQrqaQ0py8I7vc9hv3BI3DO_tky-7YBMpaHuBDCBY,472
419
+ matplotlib/mpl-data/images/help.svg,sha256=XVcFcuzcL3SQ3LjfSbtdLYDjoB5YUkj2jk2Gk8vaZF8,1890
420
+ matplotlib/mpl-data/images/help_large.png,sha256=1IwEyWfGRgnoCWM-r9CJHEogTJVD5n1c8LXTK4AJ4RE,747
421
+ matplotlib/mpl-data/images/home-symbolic.svg,sha256=ptrus8h5PZTi9ahYfnaz-uZ8MAHCr72aPeMW48TBR9Q,1911
422
+ matplotlib/mpl-data/images/home.pdf,sha256=e0e0pI-XRtPmvUCW2VTKL1DeYu1pvPmUUeRSgEbWmik,1737
423
+ matplotlib/mpl-data/images/home.png,sha256=IcFdAAUa6_A0qt8IO3I8p4rpXpQgAlJ8ndBECCh7C1w,468
424
+ matplotlib/mpl-data/images/home.svg,sha256=ptrus8h5PZTi9ahYfnaz-uZ8MAHCr72aPeMW48TBR9Q,1911
425
+ matplotlib/mpl-data/images/home_large.png,sha256=uxS2O3tWOHh1iau7CaVV4ermIJaZ007ibm5Z3i8kXYg,790
426
+ matplotlib/mpl-data/images/matplotlib.pdf,sha256=BkSUf-2xoij-eXfpV2t7y1JFKG1zD1gtV6aAg3Xi_wE,22852
427
+ matplotlib/mpl-data/images/matplotlib.png,sha256=w8KLRYVa-voUZXa41hgJauQuoois23f3NFfdc72pUYY,1283
428
+ matplotlib/mpl-data/images/matplotlib.svg,sha256=QiTIcqlQwGaVPtHsEk-vtmJk1wxwZSvijhqBe_b9VCI,62087
429
+ matplotlib/mpl-data/images/matplotlib_large.png,sha256=ElRoue9grUqkZXJngk-nvh4GKfpvJ4gE69WryjCbX5U,3088
430
+ matplotlib/mpl-data/images/move-symbolic.svg,sha256=_uamLnjQ20iwSuKbd8JvTXUFaRq4206MrpFWvtErr8I,2529
431
+ matplotlib/mpl-data/images/move.pdf,sha256=CXk3PGK9WL5t-5J-G2X5Tl-nb6lcErTBS5oUj2St6aU,1867
432
+ matplotlib/mpl-data/images/move.png,sha256=TmjR41IzSzxGbhiUcV64X0zx2BjrxbWH3cSKvnG2vzc,481
433
+ matplotlib/mpl-data/images/move.svg,sha256=_uamLnjQ20iwSuKbd8JvTXUFaRq4206MrpFWvtErr8I,2529
434
+ matplotlib/mpl-data/images/move_large.png,sha256=Skjz2nW_RTA5s_0g88gdq2hrVbm6DOcfYW4Fu42Fn9U,767
435
+ matplotlib/mpl-data/images/qt4_editor_options.pdf,sha256=2qu6GVyBrJvVHxychQoJUiXPYxBylbH2j90QnytXs_w,1568
436
+ matplotlib/mpl-data/images/qt4_editor_options.png,sha256=EryQjQ5hh2dwmIxtzCFiMN1U6Tnd11p1CDfgH5ZHjNM,380
437
+ matplotlib/mpl-data/images/qt4_editor_options.svg,sha256=sdrNIxYT-BLvJ30ASnaRQ5PxF3SB41-pgdaIJT0KqBg,1264
438
+ matplotlib/mpl-data/images/qt4_editor_options_large.png,sha256=-Pd-9Vh5aIr3PZa8O6Ge_BLo41kiEnpmkdDj8a11JkY,619
439
+ matplotlib/mpl-data/images/subplots-symbolic.svg,sha256=Gq4fDSS99Rv5rbR8_nenV6jcY5VsKPARWeH-BZBk9CU,2150
440
+ matplotlib/mpl-data/images/subplots.pdf,sha256=Q0syPMI5EvtgM-CE-YXKOkL9eFUAZnj_X2Ihoj6R4p4,1714
441
+ matplotlib/mpl-data/images/subplots.png,sha256=MUfCItq3_yzb9yRieGOglpn0Y74h8IA7m5i70B63iRc,445
442
+ matplotlib/mpl-data/images/subplots.svg,sha256=Gq4fDSS99Rv5rbR8_nenV6jcY5VsKPARWeH-BZBk9CU,2150
443
+ matplotlib/mpl-data/images/subplots_large.png,sha256=Edu9SwVMQEXJZ5ogU5cyW7VLcwXJdhdf-EtxxmxdkIs,662
444
+ matplotlib/mpl-data/images/zoom_to_rect-symbolic.svg,sha256=uMmdGkO43ZHlezkpieR3_MiqlEc5vROffRDOhY4sxm4,1499
445
+ matplotlib/mpl-data/images/zoom_to_rect.pdf,sha256=SEvPc24gfZRpl-dHv7nx8KkxPyU66Kq4zgQTvGFm9KA,1609
446
+ matplotlib/mpl-data/images/zoom_to_rect.png,sha256=aNz3QZBrIgxu9E-fFfaQweCVNitGuDUFoC27e5NU2L4,530
447
+ matplotlib/mpl-data/images/zoom_to_rect.svg,sha256=uMmdGkO43ZHlezkpieR3_MiqlEc5vROffRDOhY4sxm4,1499
448
+ matplotlib/mpl-data/images/zoom_to_rect_large.png,sha256=V6pkxmm6VwFExdg_PEJWdK37HB7k3cE_corLa7RbUMk,1016
449
+ matplotlib/mpl-data/kpsewhich.lua,sha256=NlKifCv0ONjA6uH5f3gtpWtDzWT1RQnnIHpDAxZ6tC0,189
450
+ matplotlib/mpl-data/matplotlibrc,sha256=i3bhOM6dyUSoQ9xqoe-e4OiGODWLELryJ80kjScbX1o,45318
451
+ matplotlib/mpl-data/plot_directive/plot_directive.css,sha256=utSJ1oETz0UG6AC9hU134J_JY78ENijqMZXN0JMBUfk,318
452
+ matplotlib/mpl-data/sample_data/Minduka_Present_Blue_Pack.png,sha256=XnKGiCanpDKalQ5anvo5NZSAeDP7fyflzQAaivuc0IE,13634
453
+ matplotlib/mpl-data/sample_data/README.txt,sha256=ABz19VBKfGewdY39QInG9Qccgn1MTYV3bT5Ph7TCy2Y,128
454
+ matplotlib/mpl-data/sample_data/Stocks.csv,sha256=72878aZNXGxd5wLvFUw_rnj-nfg4gqtrucZji-w830c,67924
455
+ matplotlib/mpl-data/sample_data/axes_grid/bivariate_normal.npy,sha256=DpWZ9udAh6ospYqneEa27D6EkRgORFwHosacZXVu98U,1880
456
+ matplotlib/mpl-data/sample_data/data_x_x2_x3.csv,sha256=A0SU3buOUGhT-NI_6LQ6p70fFSIU3iLFdgzvzrKR6SE,132
457
+ matplotlib/mpl-data/sample_data/eeg.dat,sha256=KGVjFt8ABKz7p6XZirNfcxSTOpGGNuyA8JYErRKLRBc,25600
458
+ matplotlib/mpl-data/sample_data/embedding_in_wx3.xrc,sha256=cUqVw5vDHNSZoaO4J0ebZUf5SrJP36775abs7R9Bclg,2186
459
+ matplotlib/mpl-data/sample_data/goog.npz,sha256=QAkXzzDmtmT3sNqT18dFhg06qQCNqLfxYNLdEuajGLE,22845
460
+ matplotlib/mpl-data/sample_data/grace_hopper.jpg,sha256=qMptc0dlcDsJcoq0f-WfRz2Trjln_CTHwCiMPHrbcTA,61306
461
+ matplotlib/mpl-data/sample_data/jacksboro_fault_dem.npz,sha256=1JP1CjPoKkQgSUxU0fyhU50Xe9wnqxkLxf5ukvYvtjc,174061
462
+ matplotlib/mpl-data/sample_data/logo2.png,sha256=DXNx4FXeyqxHy26AmvNELpwezQLxweLQY9HP7ktKIdc,22279
463
+ matplotlib/mpl-data/sample_data/membrane.dat,sha256=q3lbQpIBpbtXXGNw1eFwkN_PwxdDGqk4L46IE2b0M1c,48000
464
+ matplotlib/mpl-data/sample_data/msft.csv,sha256=GArKb0O3DgKZRsKdJf6lX3rMSf-PCekIiBoLNdgF7Mk,3211
465
+ matplotlib/mpl-data/sample_data/s1045.ima.gz,sha256=MrQk1k9it-ccsk0p_VOTitVmTWCAVaZ6srKvQ2n4uJ4,33229
466
+ matplotlib/mpl-data/sample_data/topobathy.npz,sha256=AkTgMpFwLfRQJNy1ysvE89TLMNct-n_TccSsYcQrT78,45224
467
+ matplotlib/mpl-data/stylelib/Solarize_Light2.mplstyle,sha256=N4RvRAfKLFr2rIJKE5-WNkjzjpMCqPAfIg4FP0J69zw,1258
468
+ matplotlib/mpl-data/stylelib/_classic_test_patch.mplstyle,sha256=f1vMomTMP9ebxMVnI9N0F8BNfqie4dav32pxKDXPu78,184
469
+ matplotlib/mpl-data/stylelib/_mpl-gallery-nogrid.mplstyle,sha256=1VOL3USqD6iuGQaSynNg1QhyUwvKLnkLyUKdbBMnnqg,489
470
+ matplotlib/mpl-data/stylelib/_mpl-gallery.mplstyle,sha256=MN-q59CiDqHXB8xFKXxzCbJJbJmNDhBe9lDJJAoMTPA,504
471
+ matplotlib/mpl-data/stylelib/bmh.mplstyle,sha256=fB9iVyOPZ6qoP8jUx5nLabzfLisTbwR3S2Dvm5Ak_6k,687
472
+ matplotlib/mpl-data/stylelib/classic.mplstyle,sha256=AK55dvIyzCgrUNlolDrbE4mFl6RnC-3c3f7Z_KteYF0,24591
473
+ matplotlib/mpl-data/stylelib/dark_background.mplstyle,sha256=GzSBD06jvlRYOqu7D5Z5a5x25l9JnTgtObn7S4D9zug,607
474
+ matplotlib/mpl-data/stylelib/fast.mplstyle,sha256=yTa2YEIIP9xi5V_G0p2vSlxghuhNwjRi9gPECMxyRiM,288
475
+ matplotlib/mpl-data/stylelib/fivethirtyeight.mplstyle,sha256=IcBt2DSDz9CtuyCis9JZtT3Nqoh6LVO-dB66AxObUcA,780
476
+ matplotlib/mpl-data/stylelib/ggplot.mplstyle,sha256=u2oPHMLWFtZcpIjHk2swi2Nrt4NgnEtof5lxcwM0RD0,956
477
+ matplotlib/mpl-data/stylelib/grayscale.mplstyle,sha256=KCLg-pXpns9cnKDXKN2WH6mV41OH-6cbT-5zKQotSdw,526
478
+ matplotlib/mpl-data/stylelib/petroff10.mplstyle,sha256=Qj7pPbHh3L25kdsPt1ypwvKR3dPzuOrFzzQTP3Mfilg,298
479
+ matplotlib/mpl-data/stylelib/petroff6.mplstyle,sha256=b0Gtv5I2pSk0T-2tQfLZVqZqUExErabNil7ZkHtemDE,258
480
+ matplotlib/mpl-data/stylelib/petroff8.mplstyle,sha256=a77Xdci5LARRG90BUMomu6G3gnRZFX5sr2UrBIFxoDc,278
481
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-bright.mplstyle,sha256=pDqn3-NUyVLvlfkYs8n8HzNZvmslVMChkeH-HtZuJIc,144
482
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-colorblind.mplstyle,sha256=eCSzFj5_2vR6n5qu1rHE46wvSVGZcdVqz85ov40ZsH8,148
483
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-dark-palette.mplstyle,sha256=p5ABKNQHRG7bk4HXqMQrRBjDlxGAo3RCXHdQmP7g-Ng,142
484
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-dark.mplstyle,sha256=I4xQ75vE5_9X4k0cNDiqhhnF3OcrZ2xlPX8Ll7OCkoE,667
485
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-darkgrid.mplstyle,sha256=2bXOSzS5gmPzRBrRmzVWyhg_7ZaBRQ6t_-O-cRuyZoA,670
486
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-deep.mplstyle,sha256=44dLcXjjRgR-6yaopgGRInaVgz3jk8VJVQTbBIcxRB0,142
487
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-muted.mplstyle,sha256=T4o3jvqKD_ImXDkp66XFOV_xrBVFUolJU34JDFk1Xkk,143
488
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-notebook.mplstyle,sha256=PcvZQbYrDdducrNlavBPmQ1g2minio_9GkUUFRdgtoM,382
489
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-paper.mplstyle,sha256=n0mboUp2C4Usq2j6tNWcu4TZ_YT4-kKgrYO0t-rz1yw,393
490
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-pastel.mplstyle,sha256=8nV8qRpbUrnFZeyE6VcQ1oRuZPLil2W74M2U37DNMOE,144
491
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-poster.mplstyle,sha256=dUaKqTE4MRfUq2rWVXbbou7kzD7Z9PE9Ko8aXLza8JA,403
492
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-talk.mplstyle,sha256=7FnBaBEdWBbncTm6_ER-EQVa_bZgU7dncgez-ez8R74,403
493
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-ticks.mplstyle,sha256=CITZmZFUFp40MK2Oz8tI8a7WRoCizQU9Z4J172YWfWw,665
494
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-white.mplstyle,sha256=WjJ6LEU6rlCwUugToawciAbKP9oERFHr9rfFlUrdTx0,665
495
+ matplotlib/mpl-data/stylelib/seaborn-v0_8-whitegrid.mplstyle,sha256=ec4BjsNzmOvHptcJ3mdPxULF3S1_U1EUocuqfIpw-Nk,664
496
+ matplotlib/mpl-data/stylelib/seaborn-v0_8.mplstyle,sha256=_Xu6qXKzi4b3GymCOB1b1-ykKTQ8xhDliZ8ezHGTiAs,1130
497
+ matplotlib/mpl-data/stylelib/tableau-colorblind10.mplstyle,sha256=BsirZVd1LmPWT4tBIz6loZPjZcInoQrIGfC7rvzqmJw,190
498
+ matplotlib/offsetbox.py,sha256=5rwJ63D9zBDMzdHQ3HHbDNT_1V3d2W09zcqi25x20Zw,57758
499
+ matplotlib/offsetbox.pyi,sha256=sPUAlKHtZUSO2CCLgMP_QR7ZPuW156tvnxEr3LxVILo,9946
500
+ matplotlib/patches.py,sha256=iYf67E9Ai879OljtdZjPBD_ukcXQUqywkbYImFert5Y,171615
501
+ matplotlib/patches.pyi,sha256=NiO8MyBQwH2ma97thyPNGHjRreE62kyMhHGvHaZCbsY,23267
502
+ matplotlib/path.py,sha256=XHJs8nZcfEVJ3nnTMnravVYT26DdTpvyCPr7SHme4S8,43936
503
+ matplotlib/path.pyi,sha256=VfIuc2KpkcB28uzRjLvkC3Hq5HwH4Zp0Uyj9H9bwcWU,4808
504
+ matplotlib/patheffects.py,sha256=PfGeLejmBx45hJeqsHih1u4Huwpxum1xu2g70Edp8rI,18443
505
+ matplotlib/patheffects.pyi,sha256=7-FhuxGGrer94GtJ1sZ0YxOmK6Nv4oixTmsKb6-ijOg,3664
506
+ matplotlib/projections/__init__.py,sha256=N0uT3oTBHmlnwEtieKznFg23skkDQzX27uyeryBIL2c,4467
507
+ matplotlib/projections/__init__.pyi,sha256=D28dSYmwZcSBFBtNDer-QqE_lqXAhHKersuAlvi89jE,673
508
+ matplotlib/projections/__pycache__/__init__.cpython-312.pyc,,
509
+ matplotlib/projections/__pycache__/geo.cpython-312.pyc,,
510
+ matplotlib/projections/__pycache__/polar.cpython-312.pyc,,
511
+ matplotlib/projections/geo.py,sha256=feR2dybCylhk6xe-MzxBr_e8MdbpVc8tBtCQQJ0V2co,17605
512
+ matplotlib/projections/geo.pyi,sha256=vPfhvj7_e0ZnKjyfDUNC89RGCktycJBPnn5D8w0A7N8,3775
513
+ matplotlib/projections/polar.py,sha256=gcUElfHBjjtjU6lXQncCvN5PNwpjZKSTjpt6FvrFCU8,55135
514
+ matplotlib/projections/polar.pyi,sha256=IWNSLQIo5cXFBJur5VFVDQBwAtq5n1XFZMnrj85mCBg,6636
515
+ matplotlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
516
+ matplotlib/pylab.py,sha256=VqUqd2J2-dKtltZtsYP8ePKoX1jsNDpTyqlcmpfC-lo,2369
517
+ matplotlib/pyplot.py,sha256=LCe1c5rRADTyKGbMdkfOloxW-WJc8PeiiLgA6UkX6lE,155847
518
+ matplotlib/quiver.py,sha256=W-zixDWnCs7QnDSJCQeUuCxnN3b4nVYvJdUy0lcH44E,49106
519
+ matplotlib/quiver.pyi,sha256=eMKbg7y0l4J8VBgy1CDpxjDLWhhOYqO6GeVORWg3AqU,5795
520
+ matplotlib/rcsetup.py,sha256=oFLqxK8hzozbWO5Jw6uVKvTC_14Y82zIt0F5P6ebX1k,119207
521
+ matplotlib/rcsetup.pyi,sha256=V_-bIM0vzYVYNjkD2ils9uZmk-qKb31irca7THD-2Ew,4621
522
+ matplotlib/sankey.py,sha256=eKA9DrX96-bpoWRdeNnvC73aJfPtCnB78WmMPCXQ9rc,36151
523
+ matplotlib/sankey.pyi,sha256=u_bHOcMK8LH2GZ6zzqGaJc1UGEtQ8dQcRZvNeQXXye4,1427
524
+ matplotlib/scale.py,sha256=SABIJGmygEVOtuekj4Zq57FGsn0TlWRP_AnfDpHJ18E,35495
525
+ matplotlib/scale.pyi,sha256=cPbMLWU6xL-Py4s4zDxrp1OBEo96BxPWCnlM9hlX31Q,5349
526
+ matplotlib/sphinxext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
527
+ matplotlib/sphinxext/__pycache__/__init__.cpython-312.pyc,,
528
+ matplotlib/sphinxext/__pycache__/figmpl_directive.cpython-312.pyc,,
529
+ matplotlib/sphinxext/__pycache__/mathmpl.cpython-312.pyc,,
530
+ matplotlib/sphinxext/__pycache__/plot_directive.cpython-312.pyc,,
531
+ matplotlib/sphinxext/__pycache__/roles.cpython-312.pyc,,
532
+ matplotlib/sphinxext/figmpl_directive.py,sha256=rgoJcGRfLdp4jiOlyBIwG83wcyfzbFVfrlrSCmDHL9g,9308
533
+ matplotlib/sphinxext/mathmpl.py,sha256=CKIocBSV4prRMPR50NL6WxBTULBa1zReoqo7ZtbvCsc,7871
534
+ matplotlib/sphinxext/plot_directive.py,sha256=ZKq2s2AbrZAsPivXMkbzHPeETJGcyWdDmLIIrq4Cnyw,35592
535
+ matplotlib/sphinxext/roles.py,sha256=uAy1sUB1sMapU4B2yFLyW8FYU2mkSDfP7ZG58ElxBrM,5609
536
+ matplotlib/spines.py,sha256=RDqNg1SofC4EqkQbfWfw0NfPTTvv3YR1c3u5KOMZJ0Q,22227
537
+ matplotlib/spines.pyi,sha256=eceCS47bOawgkWdLUMIPt6XX_H-EtWS2t-euz5Bgkbg,2951
538
+ matplotlib/stackplot.py,sha256=3c9ibnBwOOnYn1pBuySxoVnUrHj8RJMe5t7HV86sYK0,4833
539
+ matplotlib/stackplot.pyi,sha256=BX2g3-6dJ4RhjjIguo-gwWhvKZNYqFCQYVw5SKvpM4c,561
540
+ matplotlib/streamplot.py,sha256=tpZB_prP47QaZ8-9g9RFYb9hXQRI6xiZGo74ZvHl6jc,26778
541
+ matplotlib/streamplot.pyi,sha256=jDfNYCh2aYok6GS21PSFlk0ezXopRSyIqbXLEwdjBI8,2815
542
+ matplotlib/style/__init__.py,sha256=P51W3ycAFKVs50eNiWOxLVeDkcGCU5uvsMGwfJie2ik,8970
543
+ matplotlib/style/__init__.pyi,sha256=0RVt0Dk9OknnJ9hewrTyGMfHO_EcJZfney48T9dpTFM,494
544
+ matplotlib/style/__pycache__/__init__.cpython-312.pyc,,
545
+ matplotlib/style/__pycache__/core.cpython-312.pyc,,
546
+ matplotlib/style/core.py,sha256=pgH4fLy-IbLfe2KShTk4_n9frvysPw0mDCqTifRy2jc,799
547
+ matplotlib/style/core.pyi,sha256=QfFnlkPGbrqjW7mc3jWHbG_wR6IQXL6h0aoEK-jJV9s,674
548
+ matplotlib/table.py,sha256=BhM8vZVP4M60z4JXlR9ocIPFNTjl8ljUzPO7Wns1Pb8,28171
549
+ matplotlib/table.pyi,sha256=Q6eMN5SrC0sO0qlZ-045Yn8OqenbTE1PXSxKh6p0tK0,3083
550
+ matplotlib/testing/__init__.py,sha256=9l4ke9-njOZu5hqefgCTHWSjJrfmhQ3S-CKa1DqdDMg,10544
551
+ matplotlib/testing/__init__.pyi,sha256=4mSZWIYwsor9NeM0bdsLMv76fH4phgb6VXEE0LSlzWM,1851
552
+ matplotlib/testing/__pycache__/__init__.cpython-312.pyc,,
553
+ matplotlib/testing/__pycache__/_markers.cpython-312.pyc,,
554
+ matplotlib/testing/__pycache__/compare.cpython-312.pyc,,
555
+ matplotlib/testing/__pycache__/conftest.cpython-312.pyc,,
556
+ matplotlib/testing/__pycache__/decorators.cpython-312.pyc,,
557
+ matplotlib/testing/__pycache__/exceptions.cpython-312.pyc,,
558
+ matplotlib/testing/__pycache__/widgets.cpython-312.pyc,,
559
+ matplotlib/testing/_markers.py,sha256=0iNyOi25XLv_gTfSUqiRizdSqJzozePPBMRo72H2Je4,1419
560
+ matplotlib/testing/compare.py,sha256=e7b_nY97v_5Of4iST-k4nAVluUCWcpNuC1zIUaliceU,20474
561
+ matplotlib/testing/compare.pyi,sha256=IXB7omMIlVS0eInmpzjAQuNzV_rhJMz2o_py49WE_aA,1238
562
+ matplotlib/testing/conftest.py,sha256=ZMH3YTrAdK3bdxzWN1xPN9IH0DdxeHmRk6wrcTBxhes,7335
563
+ matplotlib/testing/conftest.pyi,sha256=EVFVsenji64J83V9tmiZq9zraUexFXJsiVpSNa8iZUQ,490
564
+ matplotlib/testing/decorators.py,sha256=wwREwt0SazjCrO_hxrEn8C4nFX6tsOfeHdHawOE249s,18592
565
+ matplotlib/testing/decorators.pyi,sha256=zC3dBVlAM0BkvpZB0jxaumvdcdUZBP7qvJdH8bYafbk,879
566
+ matplotlib/testing/exceptions.py,sha256=72QmjiHG7DwxSvlJf8mei-hRit5AH3NKh0-osBo4YbY,138
567
+ matplotlib/testing/jpl_units/Duration.py,sha256=9FMBu9uj6orCWtf23cf6_9HCFUC50xAHrCzaxATwQfM,3966
568
+ matplotlib/testing/jpl_units/Epoch.py,sha256=-FGxeq-VvCS9GVPwOEE5ind_G4Tl9ztD-gYcW9CWzjo,6100
569
+ matplotlib/testing/jpl_units/EpochConverter.py,sha256=fhWjyP567bzcTU_oNuJJpucoolqS88Nt-yEFg1-3yEk,2944
570
+ matplotlib/testing/jpl_units/StrConverter.py,sha256=codGw9b_Zc-MG_YK4CiyMrnMR8ahR9hw836O2SsV8QI,2865
571
+ matplotlib/testing/jpl_units/UnitDbl.py,sha256=ASemBFM4LOzn9i0glZUO0fprYvXm0FJqCsaEPLgLyDg,5886
572
+ matplotlib/testing/jpl_units/UnitDblConverter.py,sha256=B8DssrQVyC4mwvSFP78cGL0vCnZgVhDaAbZE-jsXLUg,2828
573
+ matplotlib/testing/jpl_units/UnitDblFormatter.py,sha256=sFPWK4euTSXOC-wUowUNk8SfWmfel-tc_niNKD1fLpI,658
574
+ matplotlib/testing/jpl_units/__init__.py,sha256=p__9RUwrt2LJ2eoT2JPM-42XLxSJrfA4az3rN5uP6d4,2684
575
+ matplotlib/testing/jpl_units/__pycache__/Duration.cpython-312.pyc,,
576
+ matplotlib/testing/jpl_units/__pycache__/Epoch.cpython-312.pyc,,
577
+ matplotlib/testing/jpl_units/__pycache__/EpochConverter.cpython-312.pyc,,
578
+ matplotlib/testing/jpl_units/__pycache__/StrConverter.cpython-312.pyc,,
579
+ matplotlib/testing/jpl_units/__pycache__/UnitDbl.cpython-312.pyc,,
580
+ matplotlib/testing/jpl_units/__pycache__/UnitDblConverter.cpython-312.pyc,,
581
+ matplotlib/testing/jpl_units/__pycache__/UnitDblFormatter.cpython-312.pyc,,
582
+ matplotlib/testing/jpl_units/__pycache__/__init__.cpython-312.pyc,,
583
+ matplotlib/testing/widgets.py,sha256=62mj2cTyoQ-dDOT66ygP8nW3aebqBFeLLTjUIuAN2ao,3671
584
+ matplotlib/testing/widgets.pyi,sha256=Ioau7Q2aPRDZLx8hze2DOe3E1vn7QPxePC74WMR7tFc,831
585
+ matplotlib/tests/__init__.py,sha256=XyXveEAxafB87gnbx0jkC0MggzKO8FvORq_6RtJRwo4,366
586
+ matplotlib/tests/__pycache__/__init__.cpython-312.pyc,,
587
+ matplotlib/tests/__pycache__/conftest.cpython-312.pyc,,
588
+ matplotlib/tests/__pycache__/test_afm.cpython-312.pyc,,
589
+ matplotlib/tests/__pycache__/test_agg.cpython-312.pyc,,
590
+ matplotlib/tests/__pycache__/test_agg_filter.cpython-312.pyc,,
591
+ matplotlib/tests/__pycache__/test_animation.cpython-312.pyc,,
592
+ matplotlib/tests/__pycache__/test_api.cpython-312.pyc,,
593
+ matplotlib/tests/__pycache__/test_arrow_patches.cpython-312.pyc,,
594
+ matplotlib/tests/__pycache__/test_artist.cpython-312.pyc,,
595
+ matplotlib/tests/__pycache__/test_axes.cpython-312.pyc,,
596
+ matplotlib/tests/__pycache__/test_axis.cpython-312.pyc,,
597
+ matplotlib/tests/__pycache__/test_backend_bases.cpython-312.pyc,,
598
+ matplotlib/tests/__pycache__/test_backend_cairo.cpython-312.pyc,,
599
+ matplotlib/tests/__pycache__/test_backend_gtk3.cpython-312.pyc,,
600
+ matplotlib/tests/__pycache__/test_backend_inline.cpython-312.pyc,,
601
+ matplotlib/tests/__pycache__/test_backend_macosx.cpython-312.pyc,,
602
+ matplotlib/tests/__pycache__/test_backend_nbagg.cpython-312.pyc,,
603
+ matplotlib/tests/__pycache__/test_backend_pdf.cpython-312.pyc,,
604
+ matplotlib/tests/__pycache__/test_backend_pgf.cpython-312.pyc,,
605
+ matplotlib/tests/__pycache__/test_backend_ps.cpython-312.pyc,,
606
+ matplotlib/tests/__pycache__/test_backend_qt.cpython-312.pyc,,
607
+ matplotlib/tests/__pycache__/test_backend_registry.cpython-312.pyc,,
608
+ matplotlib/tests/__pycache__/test_backend_svg.cpython-312.pyc,,
609
+ matplotlib/tests/__pycache__/test_backend_template.cpython-312.pyc,,
610
+ matplotlib/tests/__pycache__/test_backend_tk.cpython-312.pyc,,
611
+ matplotlib/tests/__pycache__/test_backend_tools.cpython-312.pyc,,
612
+ matplotlib/tests/__pycache__/test_backend_webagg.cpython-312.pyc,,
613
+ matplotlib/tests/__pycache__/test_backends_interactive.cpython-312.pyc,,
614
+ matplotlib/tests/__pycache__/test_basic.cpython-312.pyc,,
615
+ matplotlib/tests/__pycache__/test_bbox_tight.cpython-312.pyc,,
616
+ matplotlib/tests/__pycache__/test_bezier.cpython-312.pyc,,
617
+ matplotlib/tests/__pycache__/test_category.cpython-312.pyc,,
618
+ matplotlib/tests/__pycache__/test_cbook.cpython-312.pyc,,
619
+ matplotlib/tests/__pycache__/test_collections.cpython-312.pyc,,
620
+ matplotlib/tests/__pycache__/test_colorbar.cpython-312.pyc,,
621
+ matplotlib/tests/__pycache__/test_colors.cpython-312.pyc,,
622
+ matplotlib/tests/__pycache__/test_compare_images.cpython-312.pyc,,
623
+ matplotlib/tests/__pycache__/test_constrainedlayout.cpython-312.pyc,,
624
+ matplotlib/tests/__pycache__/test_container.cpython-312.pyc,,
625
+ matplotlib/tests/__pycache__/test_contour.cpython-312.pyc,,
626
+ matplotlib/tests/__pycache__/test_cycles.cpython-312.pyc,,
627
+ matplotlib/tests/__pycache__/test_dates.cpython-312.pyc,,
628
+ matplotlib/tests/__pycache__/test_datetime.cpython-312.pyc,,
629
+ matplotlib/tests/__pycache__/test_determinism.cpython-312.pyc,,
630
+ matplotlib/tests/__pycache__/test_doc.cpython-312.pyc,,
631
+ matplotlib/tests/__pycache__/test_dviread.cpython-312.pyc,,
632
+ matplotlib/tests/__pycache__/test_figure.cpython-312.pyc,,
633
+ matplotlib/tests/__pycache__/test_font_manager.cpython-312.pyc,,
634
+ matplotlib/tests/__pycache__/test_fontconfig_pattern.cpython-312.pyc,,
635
+ matplotlib/tests/__pycache__/test_ft2font.cpython-312.pyc,,
636
+ matplotlib/tests/__pycache__/test_getattr.cpython-312.pyc,,
637
+ matplotlib/tests/__pycache__/test_gridspec.cpython-312.pyc,,
638
+ matplotlib/tests/__pycache__/test_image.cpython-312.pyc,,
639
+ matplotlib/tests/__pycache__/test_legend.cpython-312.pyc,,
640
+ matplotlib/tests/__pycache__/test_lines.cpython-312.pyc,,
641
+ matplotlib/tests/__pycache__/test_marker.cpython-312.pyc,,
642
+ matplotlib/tests/__pycache__/test_mathtext.cpython-312.pyc,,
643
+ matplotlib/tests/__pycache__/test_matplotlib.cpython-312.pyc,,
644
+ matplotlib/tests/__pycache__/test_mlab.cpython-312.pyc,,
645
+ matplotlib/tests/__pycache__/test_multivariate_colormaps.cpython-312.pyc,,
646
+ matplotlib/tests/__pycache__/test_offsetbox.cpython-312.pyc,,
647
+ matplotlib/tests/__pycache__/test_patches.cpython-312.pyc,,
648
+ matplotlib/tests/__pycache__/test_path.cpython-312.pyc,,
649
+ matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc,,
650
+ matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc,,
651
+ matplotlib/tests/__pycache__/test_png.cpython-312.pyc,,
652
+ matplotlib/tests/__pycache__/test_polar.cpython-312.pyc,,
653
+ matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc,,
654
+ matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc,,
655
+ matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc,,
656
+ matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc,,
657
+ matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc,,
658
+ matplotlib/tests/__pycache__/test_scale.cpython-312.pyc,,
659
+ matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc,,
660
+ matplotlib/tests/__pycache__/test_skew.cpython-312.pyc,,
661
+ matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc,,
662
+ matplotlib/tests/__pycache__/test_spines.cpython-312.pyc,,
663
+ matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc,,
664
+ matplotlib/tests/__pycache__/test_style.cpython-312.pyc,,
665
+ matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc,,
666
+ matplotlib/tests/__pycache__/test_table.cpython-312.pyc,,
667
+ matplotlib/tests/__pycache__/test_testing.cpython-312.pyc,,
668
+ matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc,,
669
+ matplotlib/tests/__pycache__/test_text.cpython-312.pyc,,
670
+ matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc,,
671
+ matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc,,
672
+ matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc,,
673
+ matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc,,
674
+ matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc,,
675
+ matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc,,
676
+ matplotlib/tests/__pycache__/test_units.cpython-312.pyc,,
677
+ matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc,,
678
+ matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc,,
679
+ matplotlib/tests/conftest.py,sha256=-wk-4brT25WVZEZCj59fRBIFW9_groxH7EgYL_b3ZE4,155
680
+ matplotlib/tests/test_afm.py,sha256=WZB9QYtEkBMotwXDZJEgwQXw6i5IWhzU_9FqmRAuYdg,4072
681
+ matplotlib/tests/test_agg.py,sha256=VhwUw_uLwqONIa3UwFEVcOkhKV-Olis4vR5cIbUF6Yw,12561
682
+ matplotlib/tests/test_agg_filter.py,sha256=mknYVGVgI-POUQd_gqP8dQQomKY3O3-Tu7-M3k58rjk,984
683
+ matplotlib/tests/test_animation.py,sha256=9ZvmizKShfyXZIh-lDs65ezIyeMVHIn8d7bWZ6E8u6s,18516
684
+ matplotlib/tests/test_api.py,sha256=MOlSZePFYQvGPVhUYDgkoV8W6K46h2KQwnQQAE-xMFw,6494
685
+ matplotlib/tests/test_arrow_patches.py,sha256=xX6TUk0w9hPV3YsDVd7jOwTDbavgi0-IB1vxNL4Tk9E,7988
686
+ matplotlib/tests/test_artist.py,sha256=K5ag8nugMwqWU--nYvxdyyrobQ4z4zZxArchkA1OUsg,19290
687
+ matplotlib/tests/test_axes.py,sha256=NvKX0AJShCK88pJL6mkKffR3skjY4XCPgiCyc_1RgHo,356880
688
+ matplotlib/tests/test_axis.py,sha256=QAH258GGIigGjy0ndWddiuulLcZSv6FUEsm1h2jVvNQ,5165
689
+ matplotlib/tests/test_backend_bases.py,sha256=WyFbrdDGZSefXTXwKlOr0Lg0gYrjLYzRgPxPcQcTjyQ,22744
690
+ matplotlib/tests/test_backend_cairo.py,sha256=YgEerdgqV7WgBwlHgez7Hiir4CsiHoyOFNqwgpItv4U,1958
691
+ matplotlib/tests/test_backend_gtk3.py,sha256=YPsko8sYsWBT32tGZqbfursB21nXP_CtcbVLf1cyxI0,1154
692
+ matplotlib/tests/test_backend_inline.py,sha256=Jz1kXYX2GxGqXGbDxM7Qf42nSofER3LoXouUeETA5Pc,1613
693
+ matplotlib/tests/test_backend_macosx.py,sha256=spE9GsdCAhyVUTrt8qI-_GiTh8Zxs6yVu_-WeODZF4E,3654
694
+ matplotlib/tests/test_backend_nbagg.py,sha256=nnOBu3CCrOkzNR4J0ip3Z-kwzH1H8KSl0pYJ3JP5jNM,1464
695
+ matplotlib/tests/test_backend_pdf.py,sha256=MqlEOr-6zV_wz-gw48lTFAsbVMjXi4FFsOOhUFbxZVE,25905
696
+ matplotlib/tests/test_backend_pgf.py,sha256=0UOyptCSCfw8cZLz2s-YKjUByF6NPPxscFqqxy1qmJg,14545
697
+ matplotlib/tests/test_backend_ps.py,sha256=ciSempEz1VQi1Z25fkxVUIROb6GgaE9tFITojIK0jCc,14127
698
+ matplotlib/tests/test_backend_qt.py,sha256=lWEszrp1-wLi83-r2iCPgvEOeFTY7M0gU_jfuOaomPk,13083
699
+ matplotlib/tests/test_backend_registry.py,sha256=INoas9_cgejBS9BlFJxjPTeWdEhqxL8XRcuc-isUK7k,5517
700
+ matplotlib/tests/test_backend_svg.py,sha256=Z9ofPheKm8nlK2WAu6qoKnPCzS1fbSHd1SectbFWcGo,23081
701
+ matplotlib/tests/test_backend_template.py,sha256=uuE7oZ9pSBVDWrPL05B0WgCFsgv6HlXyetuPTfJn6a8,2184
702
+ matplotlib/tests/test_backend_tk.py,sha256=ItkWudKTXvXKAzN0CheP3JnSpCqrC6tvRqonRGNyBNk,10729
703
+ matplotlib/tests/test_backend_tools.py,sha256=C-B7NCkyWsQ5KzQEnI5Be16DsAHHZJU9P5v9--wsF-o,501
704
+ matplotlib/tests/test_backend_webagg.py,sha256=xnEMmsz2vBiglpqg9IDh1gCGdGhxotgZpEinZn9W-Bg,2880
705
+ matplotlib/tests/test_backends_interactive.py,sha256=o1pS1bxn-x-kTq5JmTKUM01etYONGnuE1mSLKML3UXs,30051
706
+ matplotlib/tests/test_basic.py,sha256=Z2uMYhSeba3nYenou8utSATSEq4LjYvm_V9V6wKabFk,1117
707
+ matplotlib/tests/test_bbox_tight.py,sha256=u4GzDkXNfKlUM6np2uGxxnhByij2nU_fhrwk7Wuib48,7181
708
+ matplotlib/tests/test_bezier.py,sha256=4p-MnIIGD7Eok0hvYkZkrW0IW3ewa8rDs3epg0pvfoY,1719
709
+ matplotlib/tests/test_category.py,sha256=p95i0_PMP2XiKjgNSkoek-fn_bVajw1TnT7H29o3yTI,12025
710
+ matplotlib/tests/test_cbook.py,sha256=dbRtnPBqQDhjgkiv6NMoCbHm_wcRMfHYDZYHo-ErZCQ,39686
711
+ matplotlib/tests/test_collections.py,sha256=A-IZKijRjS-Ll6qXZngK8dcO5U91msQmBFzqLB-nwOg,55601
712
+ matplotlib/tests/test_colorbar.py,sha256=5JEigSYqmGCbe6-jBrsfYPmy2JmQgcZhxfqZVvLZ2sA,47196
713
+ matplotlib/tests/test_colors.py,sha256=JyesmQZtSznT7MOE_ywLcGczmBevhGOLyB-efxDpqDU,80824
714
+ matplotlib/tests/test_compare_images.py,sha256=JPXiDfFwvu8eso2KYgK6S5UKuVvm5u0hs9dHD8uTaAU,4592
715
+ matplotlib/tests/test_constrainedlayout.py,sha256=ZNJZhikXXzJB-mrXUQZup_OPM5jWHu-p6AB_6kaOYsw,28421
716
+ matplotlib/tests/test_container.py,sha256=H9CeLRsp0dzUboDigZIx9DA-G3npSEkrLxVWWwxEeWI,1957
717
+ matplotlib/tests/test_contour.py,sha256=VPVF6Zl_AObq9vPMm-Verm_naCdaxCrpAa7wrmsoI88,32367
718
+ matplotlib/tests/test_cycles.py,sha256=3KyRmWH29WUgvIXUT06tKVDNCfDWqxuxlLueIp-FIl0,5996
719
+ matplotlib/tests/test_dates.py,sha256=eqHrRKOopQZAQywgiP1YBr8oVJnEVqrrhp9kTviOPqU,56606
720
+ matplotlib/tests/test_datetime.py,sha256=kEiYIr28ubqbOqtxJGfFuHUxlZfObisl06RNHYh6R_o,33143
721
+ matplotlib/tests/test_determinism.py,sha256=o1QtL1reYF0QkT7AXalnycViess_-fEcT8jSPzCWYnM,8453
722
+ matplotlib/tests/test_doc.py,sha256=E76qBVlnA5jCH8Ma4DBozhzrEp9Jzqr3qsITIUIY7bY,1024
723
+ matplotlib/tests/test_dviread.py,sha256=xkAS9zDhVSDbjqeDEI-Tx_xOpxJsEd7kwmOkP5HtZf8,5434
724
+ matplotlib/tests/test_figure.py,sha256=cGWFgSr5bKGfnZ8YD-4ZmCvjKqk15L7mYwH6uHmPhFI,62502
725
+ matplotlib/tests/test_font_manager.py,sha256=cJVzyKUH8zP9hgQGLVc6N05Qk3d_r1IuIoW82-INbPo,23064
726
+ matplotlib/tests/test_fontconfig_pattern.py,sha256=LSR6lWF_0cVOshkGiflYaTCLcISRIJM6mjXm5QtDjX4,2168
727
+ matplotlib/tests/test_ft2font.py,sha256=TqQW2qeOcxYUz5qCAY5CVxtvS844LPsBNxteNmToJuE,45214
728
+ matplotlib/tests/test_getattr.py,sha256=NLejbWy-RCP-Iz5fWPdL3QmMguAL7C1qr-U_fDmKhtA,2065
729
+ matplotlib/tests/test_gridspec.py,sha256=BhItYiH_21kQNZlUNDJoGZXX2Ebq3FhjaaJ4OrHIP1Q,2212
730
+ matplotlib/tests/test_image.py,sha256=Hjxor7o6Io8FpHbgce_-TqGwV6rQPIinBREqkf8c1_A,73411
731
+ matplotlib/tests/test_legend.py,sha256=WT_ILqZ1FLqBmNvHBJCSS-2o7rbnbEqffW-gbYKFP2c,66808
732
+ matplotlib/tests/test_lines.py,sha256=Ygk7Jk-VK-9OwBZ-Mvv72PIw4gVcMi20mQNJB5QipzA,15883
733
+ matplotlib/tests/test_marker.py,sha256=GviPXabZAZ3v3ZJt8dQHz03Unyi_3QscaKK7jSIO7hk,11505
734
+ matplotlib/tests/test_mathtext.py,sha256=HlF0OH_0Yjy_RguZpn0WdETcwa5ftFisDanH5ZPuiQA,28659
735
+ matplotlib/tests/test_matplotlib.py,sha256=oX_W2oqPkYQWtFPHQ3mjI-ELkEN9I9_XfFByHn3xZRs,5321
736
+ matplotlib/tests/test_mlab.py,sha256=3Oz6fSvUYpe-ChSthSB_D1K8AuvLw-2__xx0G0PpVSg,42740
737
+ matplotlib/tests/test_multivariate_colormaps.py,sha256=VaObR7nLIf7oW7xJWaBYnb1MgX3lZ3xN4I7Q7wivBAo,22004
738
+ matplotlib/tests/test_offsetbox.py,sha256=a7cro-a-6zIspkzC7L4r-R9LsDccslTP_iITx6toYp0,18061
739
+ matplotlib/tests/test_patches.py,sha256=bGcMfmb-O2bCTOIyj2IJwGbQTTZ_iUKBcaOBqAscZT4,40579
740
+ matplotlib/tests/test_path.py,sha256=IxNUfgAsfWjJ9kbSD03P9sMFBAmkYMOa55q9pOQrMtQ,25154
741
+ matplotlib/tests/test_patheffects.py,sha256=e6KR0v07Wqpz6qrZik4oU27i_i1ceO1xMR3AeUcnrRI,8611
742
+ matplotlib/tests/test_pickle.py,sha256=9BMlxVkpA1a1z9anAbT12dieNeON33KLlVELzLozZuw,9535
743
+ matplotlib/tests/test_png.py,sha256=Z5ItDAIjJpU0sgZ1xyWfsMFCMFaR9ALraqrOldaappc,1272
744
+ matplotlib/tests/test_polar.py,sha256=q-2dCRGDfNOHHV4-4iiCFG7TPKz0Yw-XUfZ1OFKDRBM,22224
745
+ matplotlib/tests/test_preprocess_data.py,sha256=FNx1TlPNCjkbqwPuGQ_RHbkcwzeNkBemoE-iFh2Glcw,11327
746
+ matplotlib/tests/test_pyplot.py,sha256=k5u9e2RqNbx-sgqe1JfuhXwKWTHRedVYpfUkoc8us5Q,16820
747
+ matplotlib/tests/test_quiver.py,sha256=MTwIhlIhIn6af6y6uB_ySMnhXFa5WfHGgLdE20u0gbA,12193
748
+ matplotlib/tests/test_rcparams.py,sha256=udRLBCz-uYZEHxWJ1E9A0GqLF47hSVV12CZvzcIooSg,27232
749
+ matplotlib/tests/test_sankey.py,sha256=78K4h0A8IW6YOKEIhbUHqbey4TopWi6iXriyr1AjUkA,3883
750
+ matplotlib/tests/test_scale.py,sha256=zwaqvkGiG5x_eCuYA7rsssL0mHHIDYcC9hVPnD6HtHs,15545
751
+ matplotlib/tests/test_simplification.py,sha256=YXbnai9WWzEpQJm8SsyL-EgK6D_EVPaeLCU1dR3B8EY,21852
752
+ matplotlib/tests/test_skew.py,sha256=GGKc9kPpE6z33fl-WlKUr0tL0UzdtWa-Z6Qt4X_dxW8,6397
753
+ matplotlib/tests/test_sphinxext.py,sha256=KNmfXJ8BNisSazyyiUkm3JLVn9lg6wLdHLw-3XenufA,11743
754
+ matplotlib/tests/test_spines.py,sha256=J9ansYiGJOVap5VUlMreASkUONkd3fyjnJUsFO2Gi5Q,6583
755
+ matplotlib/tests/test_streamplot.py,sha256=vWfB02KZhhfXFYFzm00ZkiDk01sF06FZx-ju0ibLIX4,8150
756
+ matplotlib/tests/test_style.py,sha256=a41bWE7aFsSRtzuc6z3LpOF1c2t5i_vK2dWLM0VZ-WE,7040
757
+ matplotlib/tests/test_subplots.py,sha256=Ch-emSStITK9myroAo6PxAqLmCSOm7KrWnqC3YPPvT8,11061
758
+ matplotlib/tests/test_table.py,sha256=d1nHDbzGZH9yQLxNceJMhdGKtUVS55M5RzOSq6nmpjs,8678
759
+ matplotlib/tests/test_testing.py,sha256=ZOiZey8Qvk6UBqRRxtTqP1GLtcQjMF6W__qif_Z2SCQ,865
760
+ matplotlib/tests/test_texmanager.py,sha256=2xae7Qym_PzPh4G7bN3TSXjTRCxtrsOlTctgVryRbuY,2678
761
+ matplotlib/tests/test_text.py,sha256=qvYCJEnZSxxd25SUBEVwWWaecbQVEqswnTJcXjqSzMY,45636
762
+ matplotlib/tests/test_textpath.py,sha256=WLXvT5OzE6Tew4pr87LH-cgioCzM7srgMNRemiMEC5o,271
763
+ matplotlib/tests/test_ticker.py,sha256=sCFNsjJRw5_KJjKClxDLo4CQQgfyUHnShyUPcHQLZOo,78180
764
+ matplotlib/tests/test_tightlayout.py,sha256=_UDO90u3uPC6Yt1D_AJPEjuMj8Xoz1Bt_ViwRk0hriY,13974
765
+ matplotlib/tests/test_transforms.py,sha256=juTMxd6enryTFW1saeDjgYNXLG2otrjNqkctYTXHGJg,49456
766
+ matplotlib/tests/test_triangulation.py,sha256=Km7FiD6ujmmHHw8PvDPeVPFkDr_QWeyx9p_ROa_7Ols,55368
767
+ matplotlib/tests/test_type1font.py,sha256=QidcU7R8kKffHkz1KxBBilRrW9ONN6hhVK5oT46cllg,9151
768
+ matplotlib/tests/test_units.py,sha256=gbADzgyVZNcATjTceMIGr6ced-HlKBYhPiap120kBng,11687
769
+ matplotlib/tests/test_usetex.py,sha256=DZvlXEygFE0E9kNku6DOvR2fYvoIuhw35ytMm5zY1Og,9504
770
+ matplotlib/tests/test_widgets.py,sha256=dO5cK_8dGYmMUSEO-J_u_9cQWw_f8VuwWG3Xd7zemy8,72294
771
+ matplotlib/texmanager.py,sha256=39qbB7wm2OMBcFFDRRBvU6qcjpDj_gX2jE5lcMF9yAY,15489
772
+ matplotlib/texmanager.pyi,sha256=di3gbC9muXKTo5VCrW5ye-e19A1mrOl8e8lvI3b904A,1116
773
+ matplotlib/text.py,sha256=Dh8BXXhD8nr2y-kJu8423I9gL8864H32w-M65UyvC5s,81539
774
+ matplotlib/text.pyi,sha256=fkD1ABkqrkd8BpqmuJdtyY-boaNyO7g5geQ9RVLnboo,7664
775
+ matplotlib/textpath.py,sha256=ZYxTKyPVHEOwHR7RBO723L2CYTqTVPCmGwCxTc6-RhI,12709
776
+ matplotlib/textpath.pyi,sha256=L__fm9BMpxX3IimGbWGWnImzeQukCmYZxxqK8vlzeIo,2740
777
+ matplotlib/ticker.py,sha256=SdRYahikSIOHQRsWjYBku2Dh9Z1HjhOZZeL3zvUJ4q0,114435
778
+ matplotlib/ticker.pyi,sha256=8_I2_U8WR923XMyN4BUltbP3Wn1iLSDoIEo66OM8OtI,10671
779
+ matplotlib/transforms.py,sha256=EJvSwlqoOVzSXBGpSjrHim8MbaPbBFAPSGzDlnpr4Og,102198
780
+ matplotlib/transforms.pyi,sha256=adpr1xkd1U_sUPru2lBHCjTBhkCxfCjYAUxjoAS7D6w,13822
781
+ matplotlib/tri/__init__.py,sha256=asnfefKRpJv7sGbfddCMybnJInVDPwgph7g0mpoh2u4,820
782
+ matplotlib/tri/__pycache__/__init__.cpython-312.pyc,,
783
+ matplotlib/tri/__pycache__/_triangulation.cpython-312.pyc,,
784
+ matplotlib/tri/__pycache__/_tricontour.cpython-312.pyc,,
785
+ matplotlib/tri/__pycache__/_trifinder.cpython-312.pyc,,
786
+ matplotlib/tri/__pycache__/_triinterpolate.cpython-312.pyc,,
787
+ matplotlib/tri/__pycache__/_tripcolor.cpython-312.pyc,,
788
+ matplotlib/tri/__pycache__/_triplot.cpython-312.pyc,,
789
+ matplotlib/tri/__pycache__/_trirefine.cpython-312.pyc,,
790
+ matplotlib/tri/__pycache__/_tritools.cpython-312.pyc,,
791
+ matplotlib/tri/_triangulation.py,sha256=Ur2lKMOx4NrZxwyi0hBeBnVzicuKaCke0NkrZneSklM,9784
792
+ matplotlib/tri/_triangulation.pyi,sha256=pVw1rvpIcl00p7V7E9GcvJSqQWyoxlZXX_p0_VSxTiY,1017
793
+ matplotlib/tri/_tricontour.py,sha256=yxeH8QgBub1nTq9qbO5Iiiz81bcLXDeMcJHUS2Ahmns,10220
794
+ matplotlib/tri/_tricontour.pyi,sha256=jnsAmVRX0-FOUw9ptUgci9J4T4JQRloKeH8fh8aAi-o,1155
795
+ matplotlib/tri/_trifinder.py,sha256=3gUzJZDIwfdsSJUE8hIKso9e1-UGvynUN9HxaqC1EEc,3522
796
+ matplotlib/tri/_trifinder.pyi,sha256=dXcZucacAS3Ch6nrDBPh2e3LYZLfZ7VwqpBUBb-vMPo,405
797
+ matplotlib/tri/_triinterpolate.py,sha256=x4rKdM_W2rpo2o8ZbWKnbStegiISI1kwVfzumdAFEXE,62445
798
+ matplotlib/tri/_triinterpolate.pyi,sha256=nR0o0Jm0uPH-6l0ft1WRHqYlq-6o84X6M0aX1UJ9IvE,1044
799
+ matplotlib/tri/_tripcolor.py,sha256=R6z_Xb18njuLBukDYi5z0HDVOUMfYJd5KM-pSotaUxI,6818
800
+ matplotlib/tri/_tripcolor.pyi,sha256=QsA-A2ohj3r_tAElt2-9pzi47JiU01tNlRPDIptqnh4,1781
801
+ matplotlib/tri/_triplot.py,sha256=jlHSz36Z5S18zBKc639PlSqdhfl7jHol8ExlddJuDI4,3102
802
+ matplotlib/tri/_triplot.pyi,sha256=9USU-BfitrcdQE8yWOUlBX59QBNoHCWivDon9JbDQ0k,446
803
+ matplotlib/tri/_trirefine.py,sha256=ZMlWypiRCO2J55N5Pp9S6m5BlToHx-xqDBFMpFzOsbA,13179
804
+ matplotlib/tri/_trirefine.pyi,sha256=J_PmjbeI6UbLaeecgj1OCvGe_sr9UUsNK9NGBSlQ320,1056
805
+ matplotlib/tri/_tritools.py,sha256=wC9KVE6UqkWVHpyW9FU4hQdqRVRVmJlhaBF1EXsaD8U,10575
806
+ matplotlib/tri/_tritools.pyi,sha256=XWwwvH2nIAmH8k59aRjnLBVQbTwKvd_FzdsRNASCJMw,402
807
+ matplotlib/typing.py,sha256=GUTVrSUUihZUK7e2S46hSI4TLYor8NKYtll3Q4WNs44,16100
808
+ matplotlib/units.py,sha256=7O-llc8k3GpdotUs2tWcEGgoUHHX-Y7o0R7f-1Jve3k,6429
809
+ matplotlib/widgets.py,sha256=C59Pcj4zEttRs0jf3LLO7pU7NO5aRhE_ft0dVNuJZXs,165076
810
+ matplotlib/widgets.pyi,sha256=OSsBf5e6HtB_q_Gy1JKE7AhXK1JhwH_PnhCJ4Lf-sNs,15923
811
+ mpl_toolkits/axes_grid1/__init__.py,sha256=wiuUCQo1g20SW5T3mFOmI9dGCJY6aDmglpQw5DfszEU,371
812
+ mpl_toolkits/axes_grid1/__pycache__/__init__.cpython-312.pyc,,
813
+ mpl_toolkits/axes_grid1/__pycache__/anchored_artists.cpython-312.pyc,,
814
+ mpl_toolkits/axes_grid1/__pycache__/axes_divider.cpython-312.pyc,,
815
+ mpl_toolkits/axes_grid1/__pycache__/axes_grid.cpython-312.pyc,,
816
+ mpl_toolkits/axes_grid1/__pycache__/axes_rgb.cpython-312.pyc,,
817
+ mpl_toolkits/axes_grid1/__pycache__/axes_size.cpython-312.pyc,,
818
+ mpl_toolkits/axes_grid1/__pycache__/inset_locator.cpython-312.pyc,,
819
+ mpl_toolkits/axes_grid1/__pycache__/mpl_axes.cpython-312.pyc,,
820
+ mpl_toolkits/axes_grid1/__pycache__/parasite_axes.cpython-312.pyc,,
821
+ mpl_toolkits/axes_grid1/anchored_artists.py,sha256=ZrOE3RiyT2ryUJ3gVqKxMynwJR28VtOZNKVZLIL29-c,17164
822
+ mpl_toolkits/axes_grid1/axes_divider.py,sha256=1HdcmRGLNJLqzB2P4TnzDLILEgT5OyAE1h0ewLyqrE0,21894
823
+ mpl_toolkits/axes_grid1/axes_grid.py,sha256=-jbfcf4CsKyrDymbkoEO5Nz1J_eytfGjRccD8xfnrU8,22631
824
+ mpl_toolkits/axes_grid1/axes_rgb.py,sha256=pabgaWJuLTCPw2FlT6Zfy5d0_95CEvaLeosWRTElR98,5227
825
+ mpl_toolkits/axes_grid1/axes_size.py,sha256=HRyPYDXlhj426dovCWx6oWng1JJd4t2fpVFN0MLGS2M,7714
826
+ mpl_toolkits/axes_grid1/inset_locator.py,sha256=VzUWJ_CRtx8-tnU0szFzmxoipXS6jr3Aa6F4LlweEVk,19906
827
+ mpl_toolkits/axes_grid1/mpl_axes.py,sha256=vFCttnj9JIgY3Mt2eOi-O_FVvdZ6SW_sBtIBFib6bz4,4251
828
+ mpl_toolkits/axes_grid1/parasite_axes.py,sha256=5X0KNsH2qyquv159imnSqEw_fGUfe2n0L3PZQFK8AMQ,9489
829
+ mpl_toolkits/axes_grid1/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
830
+ mpl_toolkits/axes_grid1/tests/__pycache__/__init__.cpython-312.pyc,,
831
+ mpl_toolkits/axes_grid1/tests/__pycache__/conftest.cpython-312.pyc,,
832
+ mpl_toolkits/axes_grid1/tests/__pycache__/test_axes_grid1.cpython-312.pyc,,
833
+ mpl_toolkits/axes_grid1/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
834
+ mpl_toolkits/axes_grid1/tests/test_axes_grid1.py,sha256=rTTELyuC4pMYXgTW46tcRto1PAg_LCgP3Vy52G74ETY,29149
835
+ mpl_toolkits/axisartist/__init__.py,sha256=RPaNDl22FbmDP7ZRsku1yCqpoNqcclCk0a3rXj3G7fE,631
836
+ mpl_toolkits/axisartist/__pycache__/__init__.cpython-312.pyc,,
837
+ mpl_toolkits/axisartist/__pycache__/angle_helper.cpython-312.pyc,,
838
+ mpl_toolkits/axisartist/__pycache__/axes_divider.cpython-312.pyc,,
839
+ mpl_toolkits/axisartist/__pycache__/axis_artist.cpython-312.pyc,,
840
+ mpl_toolkits/axisartist/__pycache__/axisline_style.cpython-312.pyc,,
841
+ mpl_toolkits/axisartist/__pycache__/axislines.cpython-312.pyc,,
842
+ mpl_toolkits/axisartist/__pycache__/floating_axes.cpython-312.pyc,,
843
+ mpl_toolkits/axisartist/__pycache__/grid_finder.cpython-312.pyc,,
844
+ mpl_toolkits/axisartist/__pycache__/grid_helper_curvelinear.cpython-312.pyc,,
845
+ mpl_toolkits/axisartist/__pycache__/parasite_axes.cpython-312.pyc,,
846
+ mpl_toolkits/axisartist/angle_helper.py,sha256=XWpJgc2aI5TcfMTe8LXCKQo3itMYrFV-N-OqP9qEDU8,13075
847
+ mpl_toolkits/axisartist/axes_divider.py,sha256=65xSCQ9cHSC3KE7J7HxS4bfsDTAbPmwyz1jJ43BqnBs,122
848
+ mpl_toolkits/axisartist/axis_artist.py,sha256=FKZa4dV2XFRUduHUPDFI1bmD9O-HMHnSgowmFpgCmmI,39652
849
+ mpl_toolkits/axisartist/axisline_style.py,sha256=_M3Y-UdwLMTy25rhMnhFQtPRSf9q4czeSCJnh3d2h5I,6698
850
+ mpl_toolkits/axisartist/axislines.py,sha256=0sNXeYuD5ADSSQH445AwXRnY3sbGAetqJkhZL0O_pT4,16217
851
+ mpl_toolkits/axisartist/floating_axes.py,sha256=uFYqo5KvXwzWn1IT8HDIyjG3hK0R04DVifQCOMeDHYo,9995
852
+ mpl_toolkits/axisartist/grid_finder.py,sha256=oiiDAXGt9OUa_geD1Y9zWaLkok6ABZkT-ZP6kFyLawI,12734
853
+ mpl_toolkits/axisartist/grid_helper_curvelinear.py,sha256=aU65Cnj9vEJylDDFpauYIIIJhaQFg1BGVzSuK6zi7so,13506
854
+ mpl_toolkits/axisartist/parasite_axes.py,sha256=Ydi4-0Lbczr6K7Sz1-fRwK4Tm8KlHrOIumx67Xbo_9c,244
855
+ mpl_toolkits/axisartist/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
856
+ mpl_toolkits/axisartist/tests/__pycache__/__init__.cpython-312.pyc,,
857
+ mpl_toolkits/axisartist/tests/__pycache__/conftest.cpython-312.pyc,,
858
+ mpl_toolkits/axisartist/tests/__pycache__/test_angle_helper.cpython-312.pyc,,
859
+ mpl_toolkits/axisartist/tests/__pycache__/test_axis_artist.cpython-312.pyc,,
860
+ mpl_toolkits/axisartist/tests/__pycache__/test_axislines.cpython-312.pyc,,
861
+ mpl_toolkits/axisartist/tests/__pycache__/test_floating_axes.cpython-312.pyc,,
862
+ mpl_toolkits/axisartist/tests/__pycache__/test_grid_finder.cpython-312.pyc,,
863
+ mpl_toolkits/axisartist/tests/__pycache__/test_grid_helper_curvelinear.cpython-312.pyc,,
864
+ mpl_toolkits/axisartist/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
865
+ mpl_toolkits/axisartist/tests/test_angle_helper.py,sha256=PwhJwBm2kk4uMyhdO5arQs8IlqSX2vN0hvUzI7YHqrw,5670
866
+ mpl_toolkits/axisartist/tests/test_axis_artist.py,sha256=wXS2DUOvE6KkJeH6ZtMW6zXOiarfy2leqGKD8A-XGfQ,3707
867
+ mpl_toolkits/axisartist/tests/test_axislines.py,sha256=iIYs5evzQ3BwXetimfXNZ5ELjtIsq8HRojYwaZfvRK0,4619
868
+ mpl_toolkits/axisartist/tests/test_floating_axes.py,sha256=LzcunaAVpCqMIUdKDaO2Pzr6S1OPru86t_9zWgSWpy4,4644
869
+ mpl_toolkits/axisartist/tests/test_grid_finder.py,sha256=cwQLDOdcJbAY2E7dr8595yzuNh1_Yh80r_O8WGT2hMY,1156
870
+ mpl_toolkits/axisartist/tests/test_grid_helper_curvelinear.py,sha256=MzJcslJ4fvvWEFjxCzh9s9ur173al_U2-KqEuiax1qw,7255
871
+ mpl_toolkits/mplot3d/__init__.py,sha256=fH9HdMfFMvjbIWqy2gjQnm2m3ae1CvLiuH6LwKHo0kI,49
872
+ mpl_toolkits/mplot3d/__pycache__/__init__.cpython-312.pyc,,
873
+ mpl_toolkits/mplot3d/__pycache__/art3d.cpython-312.pyc,,
874
+ mpl_toolkits/mplot3d/__pycache__/axes3d.cpython-312.pyc,,
875
+ mpl_toolkits/mplot3d/__pycache__/axis3d.cpython-312.pyc,,
876
+ mpl_toolkits/mplot3d/__pycache__/proj3d.cpython-312.pyc,,
877
+ mpl_toolkits/mplot3d/art3d.py,sha256=ren1NFwzxWwMNfRNNHPZPBLVaI5R1YrnNy6aGjzp85Q,62109
878
+ mpl_toolkits/mplot3d/axes3d.py,sha256=aCOw5p_lQlXugt45Ku76xeKBPyMgTuyLGtVAoDV67jU,171222
879
+ mpl_toolkits/mplot3d/axis3d.py,sha256=2wqbeC9cjt-rCVKBPTZOo7qcZABEkaRe2IdsCDHngsg,32006
880
+ mpl_toolkits/mplot3d/proj3d.py,sha256=SlJKkliaUhuAJ4VjDU1xMP8V-JiZbcIs6ugtgQUTRM0,8014
881
+ mpl_toolkits/mplot3d/tests/__init__.py,sha256=sKLxL9jEJBX7eh5OumtXSOnTriPrJUkujTHFtnJVFrM,365
882
+ mpl_toolkits/mplot3d/tests/__pycache__/__init__.cpython-312.pyc,,
883
+ mpl_toolkits/mplot3d/tests/__pycache__/conftest.cpython-312.pyc,,
884
+ mpl_toolkits/mplot3d/tests/__pycache__/test_art3d.cpython-312.pyc,,
885
+ mpl_toolkits/mplot3d/tests/__pycache__/test_axes3d.cpython-312.pyc,,
886
+ mpl_toolkits/mplot3d/tests/__pycache__/test_legend3d.cpython-312.pyc,,
887
+ mpl_toolkits/mplot3d/tests/conftest.py,sha256=iIRgNlbYBxc9J044HaFllX2eF_usr_K56NRwlLl0fx4,128
888
+ mpl_toolkits/mplot3d/tests/test_art3d.py,sha256=oQlgtY24BEIfE4hpD1-O4GaYwW7Zqj2oKrcSMWNAPj8,3768
889
+ mpl_toolkits/mplot3d/tests/test_axes3d.py,sha256=hELj8LOwuZ629nkuym-Tf3QVmi9urfAC6p0JZNBOGXw,114526
890
+ mpl_toolkits/mplot3d/tests/test_legend3d.py,sha256=RxaPp7UlHHm_WUQYmQapktEh7BN4BrP30VmouGcJycU,4421
891
+ pylab.py,sha256=zUXU0l7e7C5jmDSJbM0GLQxBun3xzuXNf1tuoZYA6Xk,110
hug/lib/python3.12/site-packages/matplotlib-3.11.2.dist-info/WHEEL ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: meson
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-manylinux_2_17_x86_64
5
+ Tag: cp312-cp312-manylinux2014_x86_64
6
+
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patches.cpython-312.pyc ADDED
Binary file (58.9 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_path.cpython-312.pyc ADDED
Binary file (38.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_patheffects.cpython-312.pyc ADDED
Binary file (14.4 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pickle.cpython-312.pyc ADDED
Binary file (19.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_png.cpython-312.pyc ADDED
Binary file (3.12 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_polar.cpython-312.pyc ADDED
Binary file (36.9 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_preprocess_data.cpython-312.pyc ADDED
Binary file (14.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_pyplot.cpython-312.pyc ADDED
Binary file (29.8 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_quiver.cpython-312.pyc ADDED
Binary file (22.4 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_rcparams.cpython-312.pyc ADDED
Binary file (33.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sankey.cpython-312.pyc ADDED
Binary file (6.04 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_scale.cpython-312.pyc ADDED
Binary file (27.9 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_simplification.cpython-312.pyc ADDED
Binary file (34.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_skew.cpython-312.pyc ADDED
Binary file (9.89 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_sphinxext.cpython-312.pyc ADDED
Binary file (13.2 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_spines.cpython-312.pyc ADDED
Binary file (13.5 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_streamplot.cpython-312.pyc ADDED
Binary file (15.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_style.cpython-312.pyc ADDED
Binary file (13.1 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_subplots.cpython-312.pyc ADDED
Binary file (16.3 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_table.cpython-312.pyc ADDED
Binary file (14 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_testing.cpython-312.pyc ADDED
Binary file (2.05 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_texmanager.cpython-312.pyc ADDED
Binary file (3.81 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_text.cpython-312.pyc ADDED
Binary file (69.1 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_textpath.cpython-312.pyc ADDED
Binary file (853 Bytes). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_ticker.cpython-312.pyc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:755eff19528cd066e9654eef25a243298935a7941149f56ad98454ab87735f0c
3
+ size 108683
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_tightlayout.cpython-312.pyc ADDED
Binary file (22.5 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_transforms.cpython-312.pyc ADDED
Binary file (80.2 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_triangulation.cpython-312.pyc ADDED
Binary file (78.4 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_type1font.cpython-312.pyc ADDED
Binary file (15 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_units.cpython-312.pyc ADDED
Binary file (22.6 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_usetex.cpython-312.pyc ADDED
Binary file (14.8 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/__pycache__/test_widgets.cpython-312.pyc ADDED
Binary file (92.6 kB). View file
 
hug/lib/python3.12/site-packages/matplotlib/tests/conftest.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from matplotlib.testing.conftest import ( # noqa
2
+ pytest_configure, pytest_unconfigure,
3
+ high_memory, mpl_test_settings, pd, text_placeholders, xr)
hug/lib/python3.12/site-packages/matplotlib/tests/test_afm.py ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from io import BytesIO
2
+ import pytest
3
+ import logging
4
+
5
+ from matplotlib import _afm
6
+ from matplotlib import font_manager as fm
7
+
8
+
9
+ # See note in afm.py re: use of comma as decimal separator in the
10
+ # UnderlineThickness field and re: use of non-ASCII characters in the Notice
11
+ # field.
12
+ AFM_TEST_DATA = b"""StartFontMetrics 2.0
13
+ Comment Comments are ignored.
14
+ Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
15
+ FontName MyFont-Bold
16
+ EncodingScheme FontSpecific
17
+ FullName My Font Bold
18
+ FamilyName Test Fonts
19
+ Weight Bold
20
+ ItalicAngle 0.0
21
+ IsFixedPitch false
22
+ UnderlinePosition -100
23
+ UnderlineThickness 56,789
24
+ Version 001.000
25
+ Notice Copyright \xa9 2017 No one.
26
+ FontBBox 0 -321 1234 369
27
+ StartCharMetrics 3
28
+ C 0 ; WX 250 ; N space ; B 0 0 0 0 ;
29
+ C 42 ; WX 1141 ; N foo ; B 40 60 800 360 ;
30
+ C 99 ; WX 583 ; N bar ; B 40 -10 543 210 ;
31
+ EndCharMetrics
32
+ EndFontMetrics
33
+ """
34
+
35
+
36
+ def test_nonascii_str():
37
+ # This tests that we also decode bytes as utf-8 properly.
38
+ # Else, font files with non ascii characters fail to load.
39
+ inp_str = "привет"
40
+ byte_str = inp_str.encode("utf8")
41
+
42
+ ret = _afm._to_str(byte_str)
43
+ assert ret == inp_str
44
+
45
+
46
+ def test_parse_header():
47
+ fh = BytesIO(AFM_TEST_DATA)
48
+ header = _afm._parse_header(fh)
49
+ assert header == {
50
+ 'StartFontMetrics': 2.0,
51
+ 'FontName': 'MyFont-Bold',
52
+ 'EncodingScheme': 'FontSpecific',
53
+ 'FullName': 'My Font Bold',
54
+ 'FamilyName': 'Test Fonts',
55
+ 'Weight': 'Bold',
56
+ 'ItalicAngle': 0.0,
57
+ 'IsFixedPitch': False,
58
+ 'UnderlinePosition': -100,
59
+ 'UnderlineThickness': 56.789,
60
+ 'Version': '001.000',
61
+ 'Notice': b'Copyright \xa9 2017 No one.',
62
+ 'FontBBox': [0, -321, 1234, 369],
63
+ 'StartCharMetrics': 3,
64
+ }
65
+
66
+
67
+ def test_parse_char_metrics():
68
+ fh = BytesIO(AFM_TEST_DATA)
69
+ _afm._parse_header(fh) # position
70
+ metrics = _afm._parse_char_metrics(fh)
71
+ assert metrics == (
72
+ {
73
+ 0: _afm.CharMetrics(250.0, 'space', (0, 0, 0, 0)),
74
+ 42: _afm.CharMetrics(1141.0, 'foo', (40, 60, 800, 360)),
75
+ 99: _afm.CharMetrics(583.0, 'bar', (40, -10, 543, 210)),
76
+ },
77
+ {
78
+ 'space': _afm.CharMetrics(250.0, 'space', (0, 0, 0, 0)),
79
+ 'foo': _afm.CharMetrics(1141.0, 'foo', (40, 60, 800, 360)),
80
+ 'bar': _afm.CharMetrics(583.0, 'bar', (40, -10, 543, 210)),
81
+ }
82
+ )
83
+
84
+
85
+ def test_get_familyname_guessed():
86
+ fh = BytesIO(AFM_TEST_DATA)
87
+ font = _afm.AFM(fh)
88
+ del font._header['FamilyName'] # remove FamilyName, so we have to guess
89
+ assert font.get_familyname() == 'My Font'
90
+
91
+
92
+ def test_font_manager_weight_normalization():
93
+ font = _afm.AFM(BytesIO(
94
+ AFM_TEST_DATA.replace(b"Weight Bold\n", b"Weight Custom\n")))
95
+ assert fm.afmFontProperty("", font).weight == "normal"
96
+
97
+
98
+ @pytest.mark.parametrize(
99
+ "afm_data",
100
+ [
101
+ b"""nope
102
+ really nope""",
103
+ b"""StartFontMetrics 2.0
104
+ Comment Comments are ignored.
105
+ Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
106
+ FontName MyFont-Bold
107
+ EncodingScheme FontSpecific""",
108
+ ],
109
+ )
110
+ def test_bad_afm(afm_data):
111
+ fh = BytesIO(afm_data)
112
+ with pytest.raises(RuntimeError):
113
+ _afm._parse_header(fh)
114
+
115
+
116
+ @pytest.mark.parametrize(
117
+ "afm_data",
118
+ [
119
+ b"""StartFontMetrics 2.0
120
+ Comment Comments are ignored.
121
+ Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
122
+ Aardvark bob
123
+ FontName MyFont-Bold
124
+ EncodingScheme FontSpecific
125
+ StartCharMetrics 3""",
126
+ b"""StartFontMetrics 2.0
127
+ Comment Comments are ignored.
128
+ Comment Creation Date:Mon Nov 13 12:34:11 GMT 2017
129
+ ItalicAngle zero degrees
130
+ FontName MyFont-Bold
131
+ EncodingScheme FontSpecific
132
+ StartCharMetrics 3""",
133
+ ],
134
+ )
135
+ def test_malformed_header(afm_data, caplog):
136
+ fh = BytesIO(afm_data)
137
+ with caplog.at_level(logging.ERROR):
138
+ _afm._parse_header(fh)
139
+
140
+ assert len(caplog.records) == 1
141
+
142
+
143
+ def test_afm_kerning():
144
+ fn = fm.findfont("Helvetica", fontext="afm")
145
+ with open(fn, 'rb') as fh:
146
+ afm = _afm.AFM(fh)
147
+ assert afm.get_kern_dist_from_name('A', 'V') == -70.0
148
+ assert afm.get_kern_dist_from_name('V', 'A') == -80.0
hug/lib/python3.12/site-packages/matplotlib/tests/test_agg.py ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ import warnings
3
+
4
+ import numpy as np
5
+ from numpy.testing import assert_array_almost_equal
6
+ from PIL import features, Image, TiffTags
7
+ import pytest
8
+
9
+
10
+ from matplotlib import (
11
+ collections, patheffects, pyplot as plt, transforms as mtransforms,
12
+ rcParams, rc_context)
13
+ from matplotlib.backends.backend_agg import RendererAgg
14
+ from matplotlib.figure import Figure
15
+ from matplotlib.image import imread
16
+ from matplotlib.path import Path
17
+ from matplotlib.testing.decorators import image_comparison
18
+ from matplotlib.transforms import IdentityTransform
19
+
20
+
21
+ def require_pillow_feature(name):
22
+ with warnings.catch_warnings():
23
+ warnings.simplefilter('ignore')
24
+ available = features.check(name.lower())
25
+ return pytest.mark.skipif(not available, reason=f"{name} support not available")
26
+
27
+
28
+ def test_repeated_save_with_alpha():
29
+ # We want an image which has a background color of bluish green, with an
30
+ # alpha of 0.25.
31
+
32
+ fig = Figure([1, 0.4])
33
+ fig.set_facecolor((0, 1, 0.4))
34
+ fig.patch.set_alpha(0.25)
35
+
36
+ # The target color is fig.patch.get_facecolor()
37
+
38
+ buf = io.BytesIO()
39
+
40
+ fig.savefig(buf,
41
+ facecolor=fig.get_facecolor(),
42
+ edgecolor='none')
43
+
44
+ # Save the figure again to check that the
45
+ # colors don't bleed from the previous renderer.
46
+ buf.seek(0)
47
+ fig.savefig(buf,
48
+ facecolor=fig.get_facecolor(),
49
+ edgecolor='none')
50
+
51
+ # Check the first pixel has the desired color & alpha
52
+ # (approx: 0, 1.0, 0.4, 0.25)
53
+ buf.seek(0)
54
+ assert_array_almost_equal(tuple(imread(buf)[0, 0]),
55
+ (0.0, 1.0, 0.4, 0.250),
56
+ decimal=3)
57
+
58
+
59
+ def test_large_single_path_collection():
60
+ buff = io.BytesIO()
61
+
62
+ # Generates a too-large single path in a path collection that
63
+ # would cause a segfault if the draw_markers optimization is
64
+ # applied.
65
+ f, ax = plt.subplots()
66
+ collection = collections.PathCollection(
67
+ [Path([[-10, 5], [10, 5], [10, -5], [-10, -5], [-10, 5]])])
68
+ ax.add_artist(collection)
69
+ ax.set_xlim(10**-3, 1)
70
+ plt.savefig(buff)
71
+
72
+
73
+ def test_marker_with_nan():
74
+ # This creates a marker with nans in it, which was segfaulting the
75
+ # Agg backend (see #3722)
76
+ fig, ax = plt.subplots(1)
77
+ steps = 1000
78
+ data = np.arange(steps)
79
+ ax.semilogx(data)
80
+ ax.fill_between(data, data*0.8, data*1.2)
81
+ buf = io.BytesIO()
82
+ fig.savefig(buf, format='png')
83
+
84
+
85
+ def test_long_path():
86
+ buff = io.BytesIO()
87
+ fig = Figure()
88
+ ax = fig.subplots()
89
+ points = np.ones(100_000)
90
+ points[::2] *= -1
91
+ ax.plot(points)
92
+ fig.savefig(buff, format='png')
93
+
94
+
95
+ @image_comparison(['agg_filter.png'], remove_text=True, style='_classic_test')
96
+ def test_agg_filter():
97
+ def smooth1d(x, window_len):
98
+ # copied from https://scipy-cookbook.readthedocs.io/
99
+ s = np.r_[
100
+ 2*x[0] - x[window_len:1:-1], x, 2*x[-1] - x[-1:-window_len:-1]]
101
+ w = np.hanning(window_len)
102
+ y = np.convolve(w/w.sum(), s, mode='same')
103
+ return y[window_len-1:-window_len+1]
104
+
105
+ def smooth2d(A, sigma=3):
106
+ window_len = max(int(sigma), 3) * 2 + 1
107
+ A = np.apply_along_axis(smooth1d, 0, A, window_len)
108
+ A = np.apply_along_axis(smooth1d, 1, A, window_len)
109
+ return A
110
+
111
+ class BaseFilter:
112
+
113
+ def get_pad(self, dpi):
114
+ return 0
115
+
116
+ def process_image(self, padded_src, dpi):
117
+ raise NotImplementedError("Should be overridden by subclasses")
118
+
119
+ def __call__(self, im, dpi):
120
+ pad = self.get_pad(dpi)
121
+ padded_src = np.pad(im, [(pad, pad), (pad, pad), (0, 0)],
122
+ "constant")
123
+ tgt_image = self.process_image(padded_src, dpi)
124
+ return tgt_image, -pad, -pad
125
+
126
+ class OffsetFilter(BaseFilter):
127
+
128
+ def __init__(self, offsets=(0, 0)):
129
+ self.offsets = offsets
130
+
131
+ def get_pad(self, dpi):
132
+ return int(max(self.offsets) / 72 * dpi)
133
+
134
+ def process_image(self, padded_src, dpi):
135
+ ox, oy = self.offsets
136
+ a1 = np.roll(padded_src, int(ox / 72 * dpi), axis=1)
137
+ a2 = np.roll(a1, -int(oy / 72 * dpi), axis=0)
138
+ return a2
139
+
140
+ class GaussianFilter(BaseFilter):
141
+ """Simple Gaussian filter."""
142
+
143
+ def __init__(self, sigma, alpha=0.5, color=(0, 0, 0)):
144
+ self.sigma = sigma
145
+ self.alpha = alpha
146
+ self.color = color
147
+
148
+ def get_pad(self, dpi):
149
+ return int(self.sigma*3 / 72 * dpi)
150
+
151
+ def process_image(self, padded_src, dpi):
152
+ tgt_image = np.empty_like(padded_src)
153
+ tgt_image[:, :, :3] = self.color
154
+ tgt_image[:, :, 3] = smooth2d(padded_src[:, :, 3] * self.alpha,
155
+ self.sigma / 72 * dpi)
156
+ return tgt_image
157
+
158
+ class DropShadowFilter(BaseFilter):
159
+
160
+ def __init__(self, sigma, alpha=0.3, color=(0, 0, 0), offsets=(0, 0)):
161
+ self.gauss_filter = GaussianFilter(sigma, alpha, color)
162
+ self.offset_filter = OffsetFilter(offsets)
163
+
164
+ def get_pad(self, dpi):
165
+ return max(self.gauss_filter.get_pad(dpi),
166
+ self.offset_filter.get_pad(dpi))
167
+
168
+ def process_image(self, padded_src, dpi):
169
+ t1 = self.gauss_filter.process_image(padded_src, dpi)
170
+ t2 = self.offset_filter.process_image(t1, dpi)
171
+ return t2
172
+
173
+ fig, ax = plt.subplots()
174
+
175
+ # draw lines
176
+ line1, = ax.plot([0.1, 0.5, 0.9], [0.1, 0.9, 0.5], "bo-",
177
+ mec="b", mfc="w", lw=5, mew=3, ms=10, label="Line 1")
178
+ line2, = ax.plot([0.1, 0.5, 0.9], [0.5, 0.2, 0.7], "ro-",
179
+ mec="r", mfc="w", lw=5, mew=3, ms=10, label="Line 1")
180
+
181
+ gauss = DropShadowFilter(4)
182
+
183
+ for line in [line1, line2]:
184
+
185
+ # draw shadows with same lines with slight offset.
186
+ xx = line.get_xdata()
187
+ yy = line.get_ydata()
188
+ shadow, = ax.plot(xx, yy)
189
+ shadow.update_from(line)
190
+
191
+ # offset transform
192
+ transform = mtransforms.offset_copy(
193
+ line.get_transform(), fig, x=4.0, y=-6.0, units='points')
194
+ shadow.set_transform(transform)
195
+
196
+ # adjust zorder of the shadow lines so that it is drawn below the
197
+ # original lines
198
+ shadow.set_zorder(line.get_zorder() - 0.5)
199
+ shadow.set_agg_filter(gauss)
200
+ shadow.set_rasterized(True) # to support mixed-mode renderers
201
+
202
+ ax.set_xlim(0., 1.)
203
+ ax.set_ylim(0., 1.)
204
+
205
+ ax.xaxis.set_visible(False)
206
+ ax.yaxis.set_visible(False)
207
+
208
+
209
+ def test_too_large_image():
210
+ fig = plt.figure(figsize=(300, 2**25))
211
+ buff = io.BytesIO()
212
+ with pytest.raises(ValueError):
213
+ fig.savefig(buff)
214
+
215
+
216
+ def test_chunksize():
217
+ x = range(200)
218
+
219
+ # Test without chunksize
220
+ fig, ax = plt.subplots()
221
+ ax.plot(x, np.sin(x))
222
+ fig.canvas.draw()
223
+
224
+ # Test with chunksize
225
+ fig, ax = plt.subplots()
226
+ rcParams['agg.path.chunksize'] = 105
227
+ ax.plot(x, np.sin(x))
228
+ fig.canvas.draw()
229
+
230
+
231
+ @pytest.mark.backend('Agg')
232
+ def test_jpeg_dpi():
233
+ # Check that dpi is set correctly in jpg files.
234
+ plt.plot([0, 1, 2], [0, 1, 0])
235
+ buf = io.BytesIO()
236
+ plt.savefig(buf, format="jpg", dpi=200)
237
+ im = Image.open(buf)
238
+ assert im.info['dpi'] == (200, 200)
239
+
240
+
241
+ def test_pil_kwargs_png():
242
+ from PIL.PngImagePlugin import PngInfo
243
+ buf = io.BytesIO()
244
+ pnginfo = PngInfo()
245
+ pnginfo.add_text("Software", "test")
246
+ plt.figure().savefig(buf, format="png", pil_kwargs={"pnginfo": pnginfo})
247
+ im = Image.open(buf)
248
+ assert im.info["Software"] == "test"
249
+
250
+
251
+ def test_pil_kwargs_tiff():
252
+ buf = io.BytesIO()
253
+ pil_kwargs = {"description": "test image"}
254
+ plt.figure().savefig(buf, format="tiff", pil_kwargs=pil_kwargs)
255
+ im = Image.open(buf)
256
+ tags = {TiffTags.TAGS_V2[k].name: v for k, v in im.tag_v2.items()}
257
+ assert tags["ImageDescription"] == "test image"
258
+
259
+
260
+ @require_pillow_feature('WebP')
261
+ def test_pil_kwargs_webp():
262
+ plt.plot([0, 1, 2], [0, 1, 0])
263
+ buf_small = io.BytesIO()
264
+ pil_kwargs_low = {"quality": 1}
265
+ plt.savefig(buf_small, format="webp", pil_kwargs=pil_kwargs_low)
266
+ assert len(pil_kwargs_low) == 1
267
+ buf_large = io.BytesIO()
268
+ pil_kwargs_high = {"quality": 100}
269
+ plt.savefig(buf_large, format="webp", pil_kwargs=pil_kwargs_high)
270
+ assert len(pil_kwargs_high) == 1
271
+ assert buf_large.getbuffer().nbytes > buf_small.getbuffer().nbytes
272
+
273
+
274
+ @require_pillow_feature('AVIF')
275
+ def test_pil_kwargs_avif():
276
+ plt.plot([0, 1, 2], [0, 1, 0])
277
+ buf_small = io.BytesIO()
278
+ pil_kwargs_low = {"quality": 1}
279
+ plt.savefig(buf_small, format="avif", pil_kwargs=pil_kwargs_low)
280
+ assert len(pil_kwargs_low) == 1
281
+ buf_large = io.BytesIO()
282
+ pil_kwargs_high = {"quality": 100}
283
+ plt.savefig(buf_large, format="avif", pil_kwargs=pil_kwargs_high)
284
+ assert len(pil_kwargs_high) == 1
285
+ assert buf_large.getbuffer().nbytes > buf_small.getbuffer().nbytes
286
+
287
+
288
+ def test_gif_no_alpha():
289
+ plt.plot([0, 1, 2], [0, 1, 0])
290
+ buf = io.BytesIO()
291
+ plt.savefig(buf, format="gif", transparent=False)
292
+ im = Image.open(buf)
293
+ assert im.mode == "P"
294
+ assert im.info["transparency"] >= len(im.palette.colors)
295
+
296
+
297
+ def test_gif_alpha():
298
+ plt.plot([0, 1, 2], [0, 1, 0])
299
+ buf = io.BytesIO()
300
+ plt.savefig(buf, format="gif", transparent=True)
301
+ im = Image.open(buf)
302
+ assert im.mode == "P"
303
+ assert im.info["transparency"] < len(im.palette.colors)
304
+
305
+
306
+ @require_pillow_feature('WebP')
307
+ def test_webp_alpha():
308
+ plt.plot([0, 1, 2], [0, 1, 0])
309
+ buf = io.BytesIO()
310
+ plt.savefig(buf, format="webp", transparent=True)
311
+ im = Image.open(buf)
312
+ assert im.mode == "RGBA"
313
+
314
+
315
+ @require_pillow_feature('AVIF')
316
+ def test_avif_alpha():
317
+ plt.plot([0, 1, 2], [0, 1, 0])
318
+ buf = io.BytesIO()
319
+ plt.savefig(buf, format="avif", transparent=True)
320
+ im = Image.open(buf)
321
+ assert im.mode == "RGBA"
322
+
323
+
324
+ def test_draw_path_collection_error_handling():
325
+ fig, ax = plt.subplots()
326
+ ax.scatter([1], [1]).set_paths(Path([(0, 1), (2, 3)]))
327
+ with pytest.raises(TypeError):
328
+ fig.canvas.draw()
329
+
330
+
331
+ def test_chunksize_fails(high_memory):
332
+ # NOTE: This test covers multiple independent test scenarios in a single
333
+ # function, because each scenario uses ~2GB of memory and we don't
334
+ # want parallel test executors to accidentally run multiple of these
335
+ # at the same time.
336
+
337
+ N = 100_000
338
+ dpi = 500
339
+ w = 5*dpi
340
+ h = 6*dpi
341
+
342
+ # make a Path that spans the whole w-h rectangle
343
+ x = np.linspace(0, w, N)
344
+ y = np.ones(N) * h
345
+ y[::2] = 0
346
+ path = Path(np.vstack((x, y)).T)
347
+ # effectively disable path simplification (but leaving it "on")
348
+ path.simplify_threshold = 0
349
+
350
+ # setup the minimal GraphicsContext to draw a Path
351
+ ra = RendererAgg(w, h, dpi)
352
+ gc = ra.new_gc()
353
+ gc.set_linewidth(1)
354
+ gc.set_foreground('r')
355
+
356
+ gc.set_hatch('/')
357
+ with pytest.raises(OverflowError, match='cannot split hatched path'):
358
+ ra.draw_path(gc, path, IdentityTransform())
359
+ gc.set_hatch(None)
360
+
361
+ with pytest.raises(OverflowError, match='cannot split filled path'):
362
+ ra.draw_path(gc, path, IdentityTransform(), (1, 0, 0))
363
+
364
+ # Set to zero to disable, currently defaults to 0, but let's be sure.
365
+ with rc_context({'agg.path.chunksize': 0}):
366
+ with pytest.raises(OverflowError, match='Please set'):
367
+ ra.draw_path(gc, path, IdentityTransform())
368
+
369
+ # Set big enough that we do not try to chunk.
370
+ with rc_context({'agg.path.chunksize': 1_000_000}):
371
+ with pytest.raises(OverflowError, match='Please reduce'):
372
+ ra.draw_path(gc, path, IdentityTransform())
373
+
374
+ # Small enough we will try to chunk, but big enough we will fail to render.
375
+ with rc_context({'agg.path.chunksize': 90_000}):
376
+ with pytest.raises(OverflowError, match='Please reduce'):
377
+ ra.draw_path(gc, path, IdentityTransform())
378
+
379
+ path.should_simplify = False
380
+ with pytest.raises(OverflowError, match="should_simplify is False"):
381
+ ra.draw_path(gc, path, IdentityTransform())
382
+
383
+
384
+ def test_non_tuple_rgbaface():
385
+ # This passes rgbaFace as an ndarray to draw_path.
386
+ fig = plt.figure()
387
+ fig.add_subplot(projection="3d").scatter(
388
+ [0, 1, 2], [0, 1, 2], path_effects=[patheffects.Stroke(linewidth=4)])
389
+ fig.canvas.draw()
390
+
391
+
392
+ def test_rendered_height_floating_point_precision():
393
+ fig = plt.figure(figsize=(1, 2.03), dpi=100)
394
+ assert fig.bbox.height < 203 # due to floating-point precision
395
+ fig.canvas.draw()
396
+ assert fig.canvas.buffer_rgba().shape == (203, 100, 4)
hug/lib/python3.12/site-packages/matplotlib/tests/test_agg_filter.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ import matplotlib.pyplot as plt
4
+ from matplotlib.testing.decorators import image_comparison
5
+
6
+
7
+ @image_comparison(baseline_images=['agg_filter_alpha'],
8
+ extensions=['gif', 'png', 'pdf'], style='mpl20')
9
+ def test_agg_filter_alpha():
10
+ ax = plt.axes()
11
+ x, y = np.mgrid[0:7, 0:8]
12
+ data = x**2 - y**2
13
+ mesh = ax.pcolormesh(data, cmap='Reds', zorder=5)
14
+
15
+ def manual_alpha(im, dpi):
16
+ im[:, :, 3] *= 0.6
17
+ print('CALLED')
18
+ return im, 0, 0
19
+
20
+ # Note: Doing alpha like this is not the same as setting alpha on
21
+ # the mesh itself. Currently meshes are drawn as independent patches,
22
+ # and we see fine borders around the blocks of color. See the SO
23
+ # question for an example: https://stackoverflow.com/q/20678817/
24
+ mesh.set_agg_filter(manual_alpha)
25
+
26
+ # Currently we must enable rasterization for this to have an effect in
27
+ # the PDF backend.
28
+ mesh.set_rasterized(True)
29
+
30
+ ax.plot([0, 4, 7], [1, 3, 8])
hug/lib/python3.12/site-packages/matplotlib/tests/test_animation.py ADDED
@@ -0,0 +1,573 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from pathlib import Path
3
+ import platform
4
+ import re
5
+ import shutil
6
+ import subprocess
7
+ import sys
8
+ import weakref
9
+
10
+ import numpy as np
11
+ import pytest
12
+
13
+ import matplotlib as mpl
14
+ from matplotlib import pyplot as plt
15
+ from matplotlib import animation
16
+ from matplotlib.animation import PillowWriter
17
+ from matplotlib.testing.decorators import check_figures_equal
18
+
19
+
20
+ @pytest.fixture()
21
+ def anim(request):
22
+ """Create a simple animation (with options)."""
23
+ fig, ax = plt.subplots()
24
+ line, = ax.plot([], [])
25
+
26
+ ax.set_xlim(0, 10)
27
+ ax.set_ylim(-1, 1)
28
+
29
+ def init():
30
+ line.set_data([], [])
31
+ return line,
32
+
33
+ def animate(i):
34
+ x = np.linspace(0, 10, 100)
35
+ y = np.sin(x + i)
36
+ line.set_data(x, y)
37
+ return line,
38
+
39
+ # "klass" can be passed to determine the class returned by the fixture
40
+ kwargs = dict(getattr(request, 'param', {})) # make a copy
41
+ klass = kwargs.pop('klass', animation.FuncAnimation)
42
+ if 'frames' not in kwargs:
43
+ kwargs['frames'] = 5
44
+ return klass(fig=fig, func=animate, init_func=init, **kwargs)
45
+
46
+
47
+ def test_invalid_writer():
48
+ # Note, this triggers for Animation.save as well, but this is a lighter test.
49
+ with pytest.raises(ValueError,
50
+ match=r"'pllow' is not a valid value for writer\. "
51
+ r"Did you mean: 'pillow'\?"):
52
+ animation.writers['pllow']
53
+
54
+
55
+ class NullMovieWriter(animation.AbstractMovieWriter):
56
+ """
57
+ A minimal MovieWriter. It doesn't actually write anything.
58
+ It just saves the arguments that were given to the setup() and
59
+ grab_frame() methods as attributes, and counts how many times
60
+ grab_frame() is called.
61
+
62
+ This class doesn't have an __init__ method with the appropriate
63
+ signature, and it doesn't define an isAvailable() method, so
64
+ it cannot be added to the 'writers' registry.
65
+ """
66
+
67
+ def setup(self, fig, outfile, dpi, *args):
68
+ self.fig = fig
69
+ self.outfile = outfile
70
+ self.dpi = dpi
71
+ self.args = args
72
+ self._count = 0
73
+
74
+ def grab_frame(self, **savefig_kwargs):
75
+ from matplotlib.animation import _validate_grabframe_kwargs
76
+ _validate_grabframe_kwargs(savefig_kwargs)
77
+ self.savefig_kwargs = savefig_kwargs
78
+ self._count += 1
79
+
80
+ def finish(self):
81
+ pass
82
+
83
+
84
+ def test_null_movie_writer(anim):
85
+ # Test running an animation with NullMovieWriter.
86
+ plt.rcParams["savefig.facecolor"] = "auto"
87
+ filename = "unused.null"
88
+ dpi = 50
89
+ savefig_kwargs = dict(foo=0)
90
+ writer = NullMovieWriter()
91
+
92
+ anim.save(filename, dpi=dpi, writer=writer,
93
+ savefig_kwargs=savefig_kwargs)
94
+
95
+ assert writer.fig == plt.figure(1) # The figure used by anim fixture
96
+ assert writer.outfile == filename
97
+ assert writer.dpi == dpi
98
+ assert writer.args == ()
99
+ # we enrich the savefig kwargs to ensure we composite transparent
100
+ # output to an opaque background
101
+ for k, v in savefig_kwargs.items():
102
+ assert writer.savefig_kwargs[k] == v
103
+ assert writer._count == anim._save_count
104
+
105
+
106
+ def test_frame_size():
107
+ # Test that the frame size is the canvas size and not the figure size
108
+ fig = plt.figure(figsize=(1, 2.03), dpi=100)
109
+ assert fig.bbox.height < 203 # due to floating-point precision
110
+ assert fig.canvas.get_width_height() == (100, 203)
111
+
112
+ anim = animation.FuncAnimation(fig, lambda frame: tuple(), frames=1)
113
+ writer = NullMovieWriter()
114
+ anim.save("unused.null", dpi=100, writer=writer)
115
+
116
+ assert writer.frame_size == fig.canvas.get_width_height()
117
+
118
+
119
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
120
+ def test_animation_delete(anim):
121
+ if platform.python_implementation() == 'PyPy':
122
+ # Something in the test setup fixture lingers around into the test and
123
+ # breaks pytest.warns on PyPy. This garbage collection fixes it.
124
+ # https://foss.heptapod.net/pypy/pypy/-/issues/3536
125
+ np.testing.break_cycles()
126
+ anim = animation.FuncAnimation(**anim)
127
+ with pytest.warns(Warning, match='Animation was deleted'):
128
+ del anim
129
+ np.testing.break_cycles()
130
+
131
+
132
+ def test_movie_writer_dpi_default():
133
+ class DummyMovieWriter(animation.MovieWriter):
134
+ def _run(self):
135
+ pass
136
+
137
+ # Test setting up movie writer with figure.dpi default.
138
+ fig = plt.figure()
139
+
140
+ filename = "unused.null"
141
+ fps = 5
142
+ codec = "unused"
143
+ bitrate = 1
144
+ extra_args = ["unused"]
145
+
146
+ writer = DummyMovieWriter(fps, codec, bitrate, extra_args)
147
+ writer.setup(fig, filename)
148
+ assert writer.dpi == fig.dpi
149
+
150
+
151
+ @animation.writers.register('null')
152
+ class RegisteredNullMovieWriter(NullMovieWriter):
153
+
154
+ # To be able to add NullMovieWriter to the 'writers' registry,
155
+ # we must define an __init__ method with a specific signature,
156
+ # and we must define the class method isAvailable().
157
+ # (These methods are not actually required to use an instance
158
+ # of this class as the 'writer' argument of Animation.save().)
159
+
160
+ def __init__(self, fps=None, codec=None, bitrate=None,
161
+ extra_args=None, metadata=None):
162
+ pass
163
+
164
+ @classmethod
165
+ def isAvailable(cls):
166
+ return True
167
+
168
+
169
+ WRITER_OUTPUT = [
170
+ ('ffmpeg', 'movie.mp4'),
171
+ ('ffmpeg_file', 'movie.mp4'),
172
+ ('imagemagick', 'movie.gif'),
173
+ ('imagemagick_file', 'movie.gif'),
174
+ ('pillow', 'movie.gif'),
175
+ ('html', 'movie.html'),
176
+ ('null', 'movie.null')
177
+ ]
178
+
179
+
180
+ def gen_writers():
181
+ for writer, output in WRITER_OUTPUT:
182
+ if not animation.writers.is_available(writer):
183
+ mark = pytest.mark.skip(f"writer '{writer}' not available on this system")
184
+ yield pytest.param(writer, None, output, marks=[mark])
185
+ yield pytest.param(writer, None, Path(output), marks=[mark])
186
+ continue
187
+
188
+ writer_class = animation.writers[writer]
189
+ for frame_format in getattr(writer_class, 'supported_formats', [None]):
190
+ yield writer, frame_format, output
191
+ yield writer, frame_format, Path(output)
192
+
193
+
194
+ # Smoke test for saving animations. In the future, we should probably
195
+ # design more sophisticated tests which compare resulting frames a-la
196
+ # matplotlib.testing.image_comparison
197
+ @pytest.mark.parametrize('writer, frame_format, output', list(gen_writers()))
198
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
199
+ def test_save_animation_smoketest(tmp_path, writer, frame_format, output, anim):
200
+ if frame_format is not None:
201
+ plt.rcParams["animation.frame_format"] = frame_format
202
+ anim = animation.FuncAnimation(**anim)
203
+ dpi = None
204
+ codec = None
205
+ if writer == 'ffmpeg':
206
+ # Issue #8253
207
+ anim._fig.set_size_inches((10.85, 9.21))
208
+ dpi = 100.
209
+ codec = 'h264'
210
+
211
+ anim.save(tmp_path / output, fps=30, writer=writer, bitrate=500, dpi=dpi,
212
+ codec=codec)
213
+
214
+ del anim
215
+
216
+
217
+ @pytest.mark.parametrize('writer, frame_format, output', list(gen_writers()))
218
+ def test_grabframe(tmp_path, writer, frame_format, output):
219
+ WriterClass = animation.writers[writer]
220
+
221
+ if frame_format is not None:
222
+ plt.rcParams["animation.frame_format"] = frame_format
223
+
224
+ fig, ax = plt.subplots()
225
+
226
+ dpi = None
227
+ codec = None
228
+ if writer == 'ffmpeg':
229
+ # Issue #8253
230
+ fig.set_size_inches((10.85, 9.21))
231
+ dpi = 100.
232
+ codec = 'h264'
233
+
234
+ test_writer = WriterClass()
235
+ with test_writer.saving(fig, tmp_path / output, dpi):
236
+ # smoke test it works
237
+ test_writer.grab_frame()
238
+ for k in {'dpi', 'bbox_inches', 'format'}:
239
+ with pytest.raises(
240
+ TypeError,
241
+ match=f"grab_frame got an unexpected keyword argument {k!r}"):
242
+ test_writer.grab_frame(**{k: object()})
243
+
244
+
245
+ @pytest.mark.parametrize('writer', [
246
+ pytest.param(
247
+ 'ffmpeg', marks=pytest.mark.skipif(
248
+ not animation.FFMpegWriter.isAvailable(),
249
+ reason='Requires FFMpeg')),
250
+ pytest.param(
251
+ 'imagemagick', marks=pytest.mark.skipif(
252
+ not animation.ImageMagickWriter.isAvailable(),
253
+ reason='Requires ImageMagick')),
254
+ ])
255
+ @pytest.mark.parametrize('html, want', [
256
+ ('none', None),
257
+ ('html5', '<video width'),
258
+ ('jshtml', '<script ')
259
+ ])
260
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
261
+ def test_animation_repr_html(writer, html, want, anim):
262
+ if platform.python_implementation() == 'PyPy':
263
+ # Something in the test setup fixture lingers around into the test and
264
+ # breaks pytest.warns on PyPy. This garbage collection fixes it.
265
+ # https://foss.heptapod.net/pypy/pypy/-/issues/3536
266
+ np.testing.break_cycles()
267
+ if (writer == 'imagemagick' and html == 'html5'
268
+ # ImageMagick delegates to ffmpeg for this format.
269
+ and not animation.FFMpegWriter.isAvailable()):
270
+ pytest.skip('Requires FFMpeg')
271
+ # create here rather than in the fixture otherwise we get __del__ warnings
272
+ # about producing no output
273
+ anim = animation.FuncAnimation(**anim)
274
+ with plt.rc_context({'animation.writer': writer,
275
+ 'animation.html': html}):
276
+ html = anim._repr_html_()
277
+ if want is None:
278
+ assert html is None
279
+ with pytest.warns(UserWarning):
280
+ del anim # Animation was never run, so will warn on cleanup.
281
+ np.testing.break_cycles()
282
+ else:
283
+ assert want in html
284
+
285
+
286
+ @pytest.mark.parametrize(
287
+ 'anim',
288
+ [{'save_count': 10, 'frames': iter(range(5))}],
289
+ indirect=['anim']
290
+ )
291
+ def test_no_length_frames(anim):
292
+ anim.save('unused.null', writer=NullMovieWriter())
293
+
294
+
295
+ @pytest.mark.skipif(sys.platform == 'emscripten',
296
+ reason='emscripten does not support subprocesses')
297
+ def test_movie_writer_registry():
298
+ assert len(animation.writers._registered) > 0
299
+ mpl.rcParams['animation.ffmpeg_path'] = "not_available_ever_xxxx"
300
+ assert not animation.writers.is_available("ffmpeg")
301
+ # something guaranteed to be available in path and exits immediately
302
+ bin = "true" if sys.platform != 'win32' else "where"
303
+ mpl.rcParams['animation.ffmpeg_path'] = bin
304
+ assert animation.writers.is_available("ffmpeg")
305
+
306
+
307
+ @pytest.mark.parametrize(
308
+ "method_name",
309
+ [pytest.param("to_html5_video", marks=pytest.mark.skipif(
310
+ not animation.writers.is_available(mpl.rcParams["animation.writer"]),
311
+ reason="animation writer not installed")),
312
+ "to_jshtml"])
313
+ @pytest.mark.parametrize('anim', [dict(frames=1)], indirect=['anim'])
314
+ def test_embed_limit(method_name, caplog, anim):
315
+ caplog.set_level("WARNING")
316
+ with mpl.rc_context({"animation.embed_limit": 1e-6}): # ~1 byte.
317
+ getattr(anim, method_name)()
318
+ assert len(caplog.records) == 1
319
+ record, = caplog.records
320
+ assert (record.name == "matplotlib.animation"
321
+ and record.levelname == "WARNING")
322
+
323
+
324
+ @pytest.mark.skipif(sys.platform == 'emscripten',
325
+ reason='emscripten does not support subprocesses')
326
+ @pytest.mark.skipif(shutil.which("/bin/sh") is None, reason="requires a POSIX OS")
327
+ def test_failing_ffmpeg(tmp_path, monkeypatch, anim):
328
+ """
329
+ Test that we correctly raise a CalledProcessError when ffmpeg fails.
330
+
331
+ To do so, mock ffmpeg using a simple executable shell script that
332
+ succeeds when called with no arguments (so that it gets registered by
333
+ `isAvailable`), but fails otherwise, and add it to the $PATH.
334
+ """
335
+ monkeypatch.setenv("PATH", str(tmp_path), prepend=":")
336
+ exe_path = tmp_path / "ffmpeg"
337
+ exe_path.write_bytes(b"#!/bin/sh\n[[ $@ -eq 0 ]]\n")
338
+ os.chmod(exe_path, 0o755)
339
+ with pytest.raises(subprocess.CalledProcessError):
340
+ anim.save("test.mpeg")
341
+
342
+
343
+ @pytest.mark.parametrize("cache_frame_data", [False, True])
344
+ def test_funcanimation_cache_frame_data(cache_frame_data):
345
+ fig, ax = plt.subplots()
346
+ line, = ax.plot([], [])
347
+
348
+ class Frame(dict):
349
+ # this subclassing enables to use weakref.ref()
350
+ pass
351
+
352
+ def init():
353
+ line.set_data([], [])
354
+ return line,
355
+
356
+ def animate(frame):
357
+ line.set_data(frame['x'], frame['y'])
358
+ return line,
359
+
360
+ frames_generated = []
361
+
362
+ def frames_generator():
363
+ for _ in range(5):
364
+ x = np.linspace(0, 10, 100)
365
+ y = np.random.rand(100)
366
+
367
+ frame = Frame(x=x, y=y)
368
+
369
+ # collect weak references to frames
370
+ # to validate their references later
371
+ frames_generated.append(weakref.ref(frame))
372
+
373
+ yield frame
374
+
375
+ MAX_FRAMES = 100
376
+ anim = animation.FuncAnimation(fig, animate, init_func=init,
377
+ frames=frames_generator,
378
+ cache_frame_data=cache_frame_data,
379
+ save_count=MAX_FRAMES)
380
+
381
+ writer = NullMovieWriter()
382
+ anim.save('unused.null', writer=writer)
383
+ assert len(frames_generated) == 5
384
+ np.testing.break_cycles()
385
+ for f in frames_generated:
386
+ # If cache_frame_data is True, then the weakref should be alive;
387
+ # if cache_frame_data is False, then the weakref should be dead (None).
388
+ assert (f() is None) != cache_frame_data
389
+
390
+
391
+ @pytest.mark.parametrize('return_value', [
392
+ # User forgot to return (returns None).
393
+ None,
394
+ # User returned a string.
395
+ 'string',
396
+ # User returned an int.
397
+ 1,
398
+ # User returns a sequence of other objects, e.g., string instead of Artist.
399
+ ('string', ),
400
+ # User forgot to return a sequence (handled in `animate` below.)
401
+ 'artist',
402
+ ])
403
+ def test_draw_frame(return_value):
404
+ # test _draw_frame method
405
+
406
+ fig, ax = plt.subplots()
407
+ line, = ax.plot([])
408
+
409
+ def animate(i):
410
+ # general update func
411
+ line.set_data([0, 1], [0, i])
412
+ if return_value == 'artist':
413
+ # *not* a sequence
414
+ return line
415
+ else:
416
+ return return_value
417
+
418
+ with pytest.raises(RuntimeError):
419
+ animation.FuncAnimation(
420
+ fig, animate, blit=True, cache_frame_data=False
421
+ )
422
+
423
+
424
+ def test_exhausted_animation(tmp_path):
425
+ fig, ax = plt.subplots()
426
+
427
+ def update(frame):
428
+ return []
429
+
430
+ anim = animation.FuncAnimation(
431
+ fig, update, frames=iter(range(10)), repeat=False,
432
+ cache_frame_data=False
433
+ )
434
+
435
+ anim.save(tmp_path / "test.gif", writer='pillow')
436
+
437
+ with pytest.warns(UserWarning, match="exhausted"):
438
+ anim._start()
439
+
440
+
441
+ def test_no_frame_warning():
442
+ fig, ax = plt.subplots()
443
+
444
+ def update(frame):
445
+ return []
446
+
447
+ anim = animation.FuncAnimation(
448
+ fig, update, frames=[], repeat=False,
449
+ cache_frame_data=False
450
+ )
451
+
452
+ with pytest.warns(UserWarning, match="exhausted"):
453
+ anim._start()
454
+
455
+
456
+ @check_figures_equal()
457
+ def test_animation_frame(tmp_path, fig_test, fig_ref):
458
+ # Test the expected image after iterating through a few frames
459
+ # we save the animation to get the iteration because we are not
460
+ # in an interactive framework.
461
+ ax = fig_test.add_subplot()
462
+ ax.set_xlim(0, 2 * np.pi)
463
+ ax.set_ylim(-1, 1)
464
+ x = np.linspace(0, 2 * np.pi, 100)
465
+ line, = ax.plot([], [])
466
+
467
+ def init():
468
+ line.set_data([], [])
469
+ return line,
470
+
471
+ def animate(i):
472
+ line.set_data(x, np.sin(x + i / 100))
473
+ return line,
474
+
475
+ anim = animation.FuncAnimation(
476
+ fig_test, animate, init_func=init, frames=5,
477
+ blit=True, repeat=False)
478
+ anim.save(tmp_path / "test.gif")
479
+
480
+ # Reference figure without animation
481
+ ax = fig_ref.add_subplot()
482
+ ax.set_xlim(0, 2 * np.pi)
483
+ ax.set_ylim(-1, 1)
484
+
485
+ # 5th frame's data
486
+ ax.plot(x, np.sin(x + 4 / 100))
487
+
488
+
489
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
490
+ def test_save_count_override_warnings_has_length(anim):
491
+
492
+ save_count = 5
493
+ frames = list(range(2))
494
+ match_target = (
495
+ f'You passed in an explicit {save_count=} '
496
+ "which is being ignored in favor of "
497
+ f"{len(frames)=}."
498
+ )
499
+
500
+ with pytest.warns(UserWarning, match=re.escape(match_target)):
501
+ anim = animation.FuncAnimation(
502
+ **{**anim, 'frames': frames, 'save_count': save_count}
503
+ )
504
+ assert anim._save_count == len(frames)
505
+ anim._init_draw()
506
+
507
+
508
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
509
+ def test_save_count_override_warnings_scaler(anim):
510
+ save_count = 5
511
+ frames = 7
512
+ match_target = (
513
+ f'You passed in an explicit {save_count=} ' +
514
+ "which is being ignored in favor of " +
515
+ f"{frames=}."
516
+ )
517
+
518
+ with pytest.warns(UserWarning, match=re.escape(match_target)):
519
+ anim = animation.FuncAnimation(
520
+ **{**anim, 'frames': frames, 'save_count': save_count}
521
+ )
522
+
523
+ assert anim._save_count == frames
524
+ anim._init_draw()
525
+
526
+
527
+ @pytest.mark.parametrize('anim', [dict(klass=dict)], indirect=['anim'])
528
+ def test_disable_cache_warning(anim):
529
+ cache_frame_data = True
530
+ frames = iter(range(5))
531
+ match_target = (
532
+ f"{frames=!r} which we can infer the length of, "
533
+ "did not pass an explicit *save_count* "
534
+ f"and passed {cache_frame_data=}. To avoid a possibly "
535
+ "unbounded cache, frame data caching has been disabled. "
536
+ "To suppress this warning either pass "
537
+ "`cache_frame_data=False` or `save_count=MAX_FRAMES`."
538
+ )
539
+ with pytest.warns(UserWarning, match=re.escape(match_target)):
540
+ anim = animation.FuncAnimation(
541
+ **{**anim, 'cache_frame_data': cache_frame_data, 'frames': frames}
542
+ )
543
+ assert anim._cache_frame_data is False
544
+ anim._init_draw()
545
+
546
+
547
+ def test_movie_writer_invalid_path(anim):
548
+ if sys.platform == "win32":
549
+ match_str = r"\[WinError 3] .*\\\\foo\\\\bar\\\\aardvark'"
550
+ elif sys.platform == "emscripten":
551
+ match_str = r"\[Errno 44] .*'/foo"
552
+ else:
553
+ match_str = r"\[Errno 2] .*'/foo"
554
+ with pytest.raises(FileNotFoundError, match=match_str):
555
+ anim.save("/foo/bar/aardvark/thiscannotreallyexist.mp4",
556
+ writer=animation.FFMpegFileWriter())
557
+
558
+
559
+ def test_animation_with_transparency():
560
+ """Test animation exhaustion with transparency using PillowWriter directly"""
561
+ fig, ax = plt.subplots()
562
+ rect = plt.Rectangle((0, 0), 1, 1, color='red', alpha=0.5)
563
+ ax.add_patch(rect)
564
+ ax.set_xlim(0, 1)
565
+ ax.set_ylim(0, 1)
566
+
567
+ writer = PillowWriter(fps=30)
568
+ writer.setup(fig, 'unused.gif', dpi=100)
569
+ writer.grab_frame(transparent=True)
570
+ frame = writer._frames[-1]
571
+ # Check that the alpha channel is not 255, so frame has transparency
572
+ assert frame.getextrema()[3][0] < 255
573
+ plt.close(fig)
hug/lib/python3.12/site-packages/matplotlib/tests/test_api.py ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable
4
+ import re
5
+ import typing
6
+ from typing import Any, TypeVar
7
+
8
+ import numpy as np
9
+ import pytest
10
+
11
+ import matplotlib as mpl
12
+ from matplotlib import _api
13
+
14
+
15
+ if typing.TYPE_CHECKING:
16
+ from typing import Self
17
+
18
+ T = TypeVar('T')
19
+
20
+
21
+ def test_unsupported_method():
22
+ class Base:
23
+ def method_1(self):
24
+ pass
25
+
26
+ def method_2(self):
27
+ pass
28
+
29
+ class Child(Base):
30
+ method_1 = _api.unsupported_method()
31
+ method_2 = _api.unsupported_method(append_message="Sorry!")
32
+
33
+ child = Child()
34
+ with pytest.raises(_api.UnsupportedError,
35
+ match=r"^Child does not support 'method_1'\.$"):
36
+ child.method_1()
37
+ with pytest.raises(_api.UnsupportedError,
38
+ match=r"^Child does not support 'method_2'\. Sorry!$"):
39
+ child.method_2()
40
+
41
+
42
+ @pytest.mark.parametrize('target,shape_repr,test_shape',
43
+ [((None, ), "(N,)", (1, 3)),
44
+ ((None, 3), "(N, 3)", (1,)),
45
+ ((None, 3), "(N, 3)", (1, 2)),
46
+ ((1, 5), "(1, 5)", (1, 9)),
47
+ ((None, 2, None), "(M, 2, N)", (1, 3, 1))
48
+ ])
49
+ def test_check_shape(target: tuple[int | None, ...],
50
+ shape_repr: str,
51
+ test_shape: tuple[int, ...]) -> None:
52
+ error_pattern = "^" + re.escape(
53
+ f"'aardvark' must be {len(target)}D with shape {shape_repr}, but your input "
54
+ f"has shape {test_shape}")
55
+ data = np.zeros(test_shape)
56
+ with pytest.raises(ValueError, match=error_pattern):
57
+ _api.check_shape(target, aardvark=data)
58
+
59
+
60
+ def test_classproperty_deprecation() -> None:
61
+ class A:
62
+ @_api.deprecated("0.0.0")
63
+ @_api.classproperty
64
+ def f(cls: Self) -> None:
65
+ pass
66
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
67
+ A.f
68
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
69
+ a = A()
70
+ a.f
71
+
72
+
73
+ def test_warn_deprecated():
74
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
75
+ match=r'foo was deprecated in Matplotlib 3\.10 and will be '
76
+ r'removed in 3\.12\.'):
77
+ _api.warn_deprecated('3.10', name='foo')
78
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
79
+ match=r'The foo class was deprecated in Matplotlib 3\.10 and '
80
+ r'will be removed in 3\.12\.'):
81
+ _api.warn_deprecated('3.10', name='foo', obj_type='class')
82
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
83
+ match=r'foo was deprecated in Matplotlib 3\.10 and will be '
84
+ r'removed in 3\.12\. Use bar instead\.'):
85
+ _api.warn_deprecated('3.10', name='foo', alternative='bar')
86
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
87
+ match=r'foo was deprecated in Matplotlib 3\.10 and will be '
88
+ r'removed in 3\.12\. More information\.'):
89
+ _api.warn_deprecated('3.10', name='foo', addendum='More information.')
90
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
91
+ match=r'foo was deprecated in Matplotlib 3\.10 and will be '
92
+ r'removed in 4\.0\.'):
93
+ _api.warn_deprecated('3.10', name='foo', removal='4.0')
94
+ with pytest.warns(mpl.MatplotlibDeprecationWarning,
95
+ match=r'foo was deprecated in Matplotlib 3\.10\.'):
96
+ _api.warn_deprecated('3.10', name='foo', removal=False)
97
+ with pytest.warns(PendingDeprecationWarning,
98
+ match=r'foo will be deprecated in a future version'):
99
+ _api.warn_deprecated('3.10', name='foo', pending=True)
100
+ with pytest.raises(ValueError, match=r'cannot have a scheduled removal'):
101
+ _api.warn_deprecated('3.10', name='foo', pending=True, removal='3.12')
102
+ with pytest.warns(mpl.MatplotlibDeprecationWarning, match=r'Complete replacement'):
103
+ _api.warn_deprecated('3.10', message='Complete replacement', name='foo',
104
+ alternative='bar', addendum='More information.',
105
+ obj_type='class', removal='4.0')
106
+
107
+
108
+ def test_deprecate_privatize_attribute() -> None:
109
+ class C:
110
+ def __init__(self) -> None: self._attr = 1
111
+ def _meth(self, arg: T) -> T: return arg
112
+ attr: int = _api.deprecate_privatize_attribute("0.0")
113
+ meth: Callable = _api.deprecate_privatize_attribute("0.0")
114
+
115
+ c = C()
116
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
117
+ assert c.attr == 1
118
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
119
+ c.attr = 2
120
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
121
+ assert c.attr == 2
122
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
123
+ assert c.meth(42) == 42
124
+
125
+
126
+ def test_delete_parameter() -> None:
127
+ @_api.delete_parameter("3.0", "foo")
128
+ def func1(foo: Any = None) -> None:
129
+ pass
130
+
131
+ @_api.delete_parameter("3.0", "foo")
132
+ def func2(**kwargs: Any) -> None:
133
+ pass
134
+
135
+ for func in [func1, func2]: # type: ignore[list-item]
136
+ func() # No warning.
137
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
138
+ func(foo="bar")
139
+
140
+ def pyplot_wrapper(foo: Any = _api.deprecation._deprecated_parameter) -> None:
141
+ func1(foo)
142
+
143
+ pyplot_wrapper() # No warning.
144
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
145
+ func(foo="bar")
146
+
147
+
148
+ def test_make_keyword_only() -> None:
149
+ @_api.make_keyword_only("3.0", "arg")
150
+ def func(pre: Any, arg: Any, post: Any = None) -> None:
151
+ pass
152
+
153
+ func(1, arg=2) # Check that no warning is emitted.
154
+
155
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
156
+ func(1, 2)
157
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
158
+ func(1, 2, 3)
159
+
160
+
161
+ def test_deprecation_alternative() -> None:
162
+ alternative = "`.f1`, `f2`, `f3(x) <.f3>` or `f4(x)<f4>`"
163
+ @_api.deprecated("1", alternative=alternative)
164
+ def f() -> None:
165
+ pass
166
+ if f.__doc__ is None:
167
+ pytest.skip('Documentation is disabled')
168
+ assert alternative in f.__doc__
169
+
170
+
171
+ def test_empty_check_in_list() -> None:
172
+ with pytest.raises(TypeError, match="No argument to check!"):
173
+ _api.check_in_list(["a"])
174
+
175
+
176
+ def test_check_in_list_numpy() -> None:
177
+ with pytest.raises(ValueError, match=r"array\(5\) is not a valid value"):
178
+ _api.check_in_list(['a', 'b'], value=np.array(5))
hug/lib/python3.12/site-packages/matplotlib/tests/test_arrow_patches.py ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytest
2
+ import platform
3
+ import matplotlib.pyplot as plt
4
+ from matplotlib.testing.decorators import image_comparison
5
+ import matplotlib.patches as mpatches
6
+
7
+
8
+ def draw_arrow(ax, t, r):
9
+ ax.annotate('', xy=(0.5, 0.5 + r), xytext=(0.5, 0.5), size=30,
10
+ arrowprops=dict(arrowstyle=t,
11
+ fc="b", ec='k'))
12
+
13
+
14
+ @image_comparison(['fancyarrow_test_image.png'], style='_classic_test',
15
+ tol=0 if platform.machine() == 'x86_64' else 0.012)
16
+ def test_fancyarrow():
17
+ # Added 0 to test division by zero error described in issue 3930
18
+ r = [0.4, 0.3, 0.2, 0.1, 0]
19
+ t = ["fancy", "simple", mpatches.ArrowStyle.Fancy()]
20
+
21
+ fig, axs = plt.subplots(len(t), len(r), squeeze=False,
22
+ figsize=(8, 4.5), subplot_kw=dict(aspect=1))
23
+
24
+ for i_r, r1 in enumerate(r):
25
+ for i_t, t1 in enumerate(t):
26
+ ax = axs[i_t, i_r]
27
+ draw_arrow(ax, t1, r1)
28
+ ax.tick_params(labelleft=False, labelbottom=False)
29
+
30
+
31
+ @image_comparison(['boxarrow_test_image.png'], style='mpl20')
32
+ def test_boxarrow():
33
+
34
+ styles = mpatches.BoxStyle.get_styles()
35
+
36
+ n = len(styles)
37
+ spacing = 1.2
38
+
39
+ figheight = (n * spacing + .5)
40
+ fig = plt.figure(figsize=(4 / 1.5, figheight / 1.5))
41
+
42
+ fontsize = 0.3 * 72
43
+
44
+ for i, stylename in enumerate(sorted(styles)):
45
+ fig.text(0.5, ((n - i) * spacing - 0.5)/figheight, stylename,
46
+ ha="center",
47
+ size=fontsize,
48
+ transform=fig.transFigure,
49
+ bbox=dict(boxstyle=stylename, fc="w", ec="k"))
50
+
51
+
52
+ @image_comparison(['boxarrow_adjustment_test_image.png'], style='mpl20')
53
+ def test_boxarrow_adjustment():
54
+
55
+ styles = ['larrow', 'rarrow', 'darrow']
56
+
57
+ # Cases [head_width, head_angle] to test for each arrow style
58
+ cases = [
59
+ [1.5, 90],
60
+ [1.5, 170], # Test dynamic padding
61
+ [0.75, 30],
62
+ [0.5, -10], # Should just give a rectangle
63
+ [2, -90],
64
+ [2, -15] # None of arrow body is outside of head
65
+ ]
66
+
67
+ # Horizontal and vertical spacings of arrow centres
68
+ spacing_horizontal = 3.75
69
+ spacing_vertical = 1.6
70
+
71
+ # Numbers of styles and cases
72
+ m = len(styles)
73
+ n = len(cases)
74
+
75
+ figwidth = (m * spacing_horizontal)
76
+ figheight = (n * spacing_vertical) + .5
77
+
78
+ fig = plt.figure(figsize=(figwidth / 1.5, figheight / 1.5))
79
+
80
+ fontsize = 0.3 * 72
81
+
82
+ for i, stylename in enumerate(styles):
83
+ for j, case in enumerate(cases):
84
+ # Draw arrow
85
+ fig.text(
86
+ ((m - i) * spacing_horizontal - 1.5) / figwidth,
87
+ ((n - j) * spacing_vertical - 0.5) / figheight,
88
+ stylename, ha='center', va='center',
89
+ size=fontsize, transform=fig.transFigure,
90
+ bbox=dict(boxstyle=f"{stylename}, head_width={case[0]}, \
91
+ head_angle={case[1]}", fc="w", ec="k"))
92
+
93
+
94
+ def __prepare_fancyarrow_dpi_cor_test():
95
+ """
96
+ Convenience function that prepares and returns a FancyArrowPatch. It aims
97
+ at being used to test that the size of the arrow head does not depend on
98
+ the DPI value of the exported picture.
99
+
100
+ NB: this function *is not* a test in itself!
101
+ """
102
+ fig2 = plt.figure("fancyarrow_dpi_cor_test", figsize=(4, 3), dpi=50)
103
+ ax = fig2.add_subplot()
104
+ ax.set_xlim(0, 1)
105
+ ax.set_ylim(0, 1)
106
+ ax.add_patch(mpatches.FancyArrowPatch(posA=(0.3, 0.4), posB=(0.8, 0.6),
107
+ lw=3, arrowstyle='->',
108
+ mutation_scale=100))
109
+ return fig2
110
+
111
+
112
+ @image_comparison(['fancyarrow_dpi_cor_100dpi.png'], remove_text=True,
113
+ savefig_kwarg=dict(dpi=100), style='_classic_test',
114
+ tol=0 if platform.machine() == 'x86_64' else 0.02)
115
+ def test_fancyarrow_dpi_cor_100dpi():
116
+ """
117
+ Check the export of a FancyArrowPatch @ 100 DPI. FancyArrowPatch is
118
+ instantiated through a dedicated function because another similar test
119
+ checks a similar export but with a different DPI value.
120
+
121
+ Remark: test only a rasterized format.
122
+ """
123
+
124
+ __prepare_fancyarrow_dpi_cor_test()
125
+
126
+
127
+ @image_comparison(['fancyarrow_dpi_cor_200dpi.png'], remove_text=True,
128
+ savefig_kwarg=dict(dpi=200), style='_classic_test',
129
+ tol=0 if platform.machine() == 'x86_64' else 0.02)
130
+ def test_fancyarrow_dpi_cor_200dpi():
131
+ """
132
+ As test_fancyarrow_dpi_cor_100dpi, but exports @ 200 DPI. The relative size
133
+ of the arrow head should be the same.
134
+ """
135
+
136
+ __prepare_fancyarrow_dpi_cor_test()
137
+
138
+
139
+ @image_comparison(['fancyarrow_dash.png'], remove_text=True, style='default')
140
+ def test_fancyarrow_dash():
141
+ fig, ax = plt.subplots()
142
+ e = mpatches.FancyArrowPatch((0, 0), (0.5, 0.5),
143
+ arrowstyle='-|>',
144
+ connectionstyle='angle3,angleA=0,angleB=90',
145
+ mutation_scale=10.0,
146
+ linewidth=2,
147
+ linestyle='dashed',
148
+ color='k')
149
+ e2 = mpatches.FancyArrowPatch((0, 0), (0.5, 0.5),
150
+ arrowstyle='-|>',
151
+ connectionstyle='angle3',
152
+ mutation_scale=10.0,
153
+ linewidth=2,
154
+ linestyle='dotted',
155
+ color='k')
156
+ ax.add_patch(e)
157
+ ax.add_patch(e2)
158
+
159
+
160
+ @image_comparison(['arrow_styles.png'], style='mpl20', remove_text=True,
161
+ tol=0 if platform.machine() == 'x86_64' else 0.02)
162
+ def test_arrow_styles():
163
+ styles = mpatches.ArrowStyle.get_styles()
164
+
165
+ n = len(styles)
166
+ fig, ax = plt.subplots(figsize=(8, 8))
167
+ ax.set_xlim(0, 1)
168
+ ax.set_ylim(-1, n)
169
+ fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
170
+
171
+ for i, stylename in enumerate(sorted(styles)):
172
+ patch = mpatches.FancyArrowPatch((0.1 + (i % 2)*0.05, i),
173
+ (0.45 + (i % 2)*0.05, i),
174
+ arrowstyle=stylename,
175
+ mutation_scale=25)
176
+ ax.add_patch(patch)
177
+
178
+ for i, stylename in enumerate([']-[', ']-', '-[', '|-|']):
179
+ style = stylename
180
+ if stylename[0] != '-':
181
+ style += ',angleA=ANGLE'
182
+ if stylename[-1] != '-':
183
+ style += ',angleB=ANGLE'
184
+
185
+ for j, angle in enumerate([-30, 60]):
186
+ arrowstyle = style.replace('ANGLE', str(angle))
187
+ patch = mpatches.FancyArrowPatch((0.55, 2*i + j), (0.9, 2*i + j),
188
+ arrowstyle=arrowstyle,
189
+ mutation_scale=25)
190
+ ax.add_patch(patch)
191
+
192
+
193
+ @image_comparison(['connection_styles.png'], style='mpl20', remove_text=True,
194
+ tol=0 if platform.machine() == 'x86_64' else 0.013)
195
+ def test_connection_styles():
196
+ styles = mpatches.ConnectionStyle.get_styles()
197
+
198
+ n = len(styles)
199
+ fig, ax = plt.subplots(figsize=(6, 10))
200
+ ax.set_xlim(0, 1)
201
+ ax.set_ylim(-1, n)
202
+
203
+ for i, stylename in enumerate(sorted(styles)):
204
+ patch = mpatches.FancyArrowPatch((0.1, i), (0.8, i + 0.5),
205
+ arrowstyle="->",
206
+ connectionstyle=stylename,
207
+ mutation_scale=25)
208
+ ax.add_patch(patch)
209
+
210
+
211
+ def test_invalid_intersection():
212
+ conn_style_1 = mpatches.ConnectionStyle.Angle3(angleA=20, angleB=200)
213
+ p1 = mpatches.FancyArrowPatch((.2, .2), (.5, .5),
214
+ connectionstyle=conn_style_1)
215
+ with pytest.raises(ValueError):
216
+ plt.gca().add_patch(p1)
217
+
218
+ conn_style_2 = mpatches.ConnectionStyle.Angle3(angleA=20, angleB=199.9)
219
+ p2 = mpatches.FancyArrowPatch((.2, .2), (.5, .5),
220
+ connectionstyle=conn_style_2)
221
+ plt.gca().add_patch(p2)
hug/lib/python3.12/site-packages/matplotlib/tests/test_artist.py ADDED
@@ -0,0 +1,625 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ from itertools import chain
3
+
4
+ import numpy as np
5
+
6
+ import pytest
7
+
8
+ import matplotlib.colors as mcolors
9
+ import matplotlib.pyplot as plt
10
+ import matplotlib.patches as mpatches
11
+ import matplotlib.lines as mlines
12
+ import matplotlib.path as mpath
13
+ import matplotlib.transforms as mtransforms
14
+ import matplotlib.collections as mcollections
15
+ import matplotlib.artist as martist
16
+ import matplotlib.backend_bases as mbackend_bases
17
+ import matplotlib as mpl
18
+ from matplotlib.testing.decorators import check_figures_equal, image_comparison
19
+
20
+
21
+ def test_patch_transform_of_none():
22
+ # tests the behaviour of patches added to an Axes with various transform
23
+ # specifications
24
+
25
+ ax = plt.axes()
26
+ ax.set_xlim(1, 3)
27
+ ax.set_ylim(1, 3)
28
+
29
+ # Draw an ellipse over data coord (2, 2) by specifying device coords.
30
+ xy_data = (2, 2)
31
+ xy_pix = ax.transData.transform(xy_data)
32
+
33
+ # Not providing a transform of None puts the ellipse in data coordinates .
34
+ e = mpatches.Ellipse(xy_data, width=1, height=1, fc='yellow', alpha=0.5)
35
+ ax.add_patch(e)
36
+ assert e._transform == ax.transData
37
+
38
+ # Providing a transform of None puts the ellipse in device coordinates.
39
+ e = mpatches.Ellipse(xy_pix, width=120, height=120, fc='coral',
40
+ transform=None, alpha=0.5)
41
+ assert e.is_transform_set()
42
+ ax.add_patch(e)
43
+ assert isinstance(e._transform, mtransforms.IdentityTransform)
44
+
45
+ # Providing an IdentityTransform puts the ellipse in device coordinates.
46
+ e = mpatches.Ellipse(xy_pix, width=100, height=100,
47
+ transform=mtransforms.IdentityTransform(), alpha=0.5)
48
+ ax.add_patch(e)
49
+ assert isinstance(e._transform, mtransforms.IdentityTransform)
50
+
51
+ # Not providing a transform, and then subsequently "get_transform" should
52
+ # not mean that "is_transform_set".
53
+ e = mpatches.Ellipse(xy_pix, width=120, height=120, fc='coral',
54
+ alpha=0.5)
55
+ intermediate_transform = e.get_transform()
56
+ assert not e.is_transform_set()
57
+ ax.add_patch(e)
58
+ assert e.get_transform() != intermediate_transform
59
+ assert e.is_transform_set()
60
+ assert e._transform == ax.transData
61
+
62
+
63
+ def test_collection_transform_of_none():
64
+ # tests the behaviour of collections added to an Axes with various
65
+ # transform specifications
66
+
67
+ ax = plt.axes()
68
+ ax.set_xlim(1, 3)
69
+ ax.set_ylim(1, 3)
70
+
71
+ # draw an ellipse over data coord (2, 2) by specifying device coords
72
+ xy_data = (2, 2)
73
+ xy_pix = ax.transData.transform(xy_data)
74
+
75
+ # not providing a transform of None puts the ellipse in data coordinates
76
+ e = mpatches.Ellipse(xy_data, width=1, height=1)
77
+ c = mcollections.PatchCollection([e], facecolor='yellow', alpha=0.5)
78
+ ax.add_collection(c)
79
+ # the collection should be in data coordinates
80
+ assert c.get_offset_transform() + c.get_transform() == ax.transData
81
+
82
+ # providing a transform of None puts the ellipse in device coordinates
83
+ e = mpatches.Ellipse(xy_pix, width=120, height=120)
84
+ c = mcollections.PatchCollection([e], facecolor='coral',
85
+ alpha=0.5)
86
+ c.set_transform(None)
87
+ ax.add_collection(c)
88
+ assert isinstance(c.get_transform(), mtransforms.IdentityTransform)
89
+
90
+ # providing an IdentityTransform puts the ellipse in device coordinates
91
+ e = mpatches.Ellipse(xy_pix, width=100, height=100)
92
+ c = mcollections.PatchCollection([e],
93
+ transform=mtransforms.IdentityTransform(),
94
+ alpha=0.5)
95
+ ax.add_collection(c)
96
+ assert isinstance(c.get_offset_transform(), mtransforms.IdentityTransform)
97
+
98
+
99
+ @image_comparison(["clip_path_clipping"], remove_text=True, style='_classic_test')
100
+ def test_clipping():
101
+ exterior = mpath.Path.unit_rectangle().deepcopy()
102
+ exterior.vertices *= 4
103
+ exterior.vertices -= 2
104
+ interior = mpath.Path.unit_circle().deepcopy()
105
+ interior.vertices = interior.vertices[::-1]
106
+ clip_path = mpath.Path.make_compound_path(exterior, interior)
107
+
108
+ star = mpath.Path.unit_regular_star(6).deepcopy()
109
+ star.vertices *= 2.6
110
+
111
+ fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)
112
+
113
+ col = mcollections.PathCollection([star], lw=5, edgecolor='blue',
114
+ facecolor='red', alpha=0.7, hatch='*')
115
+ col.set_clip_path(clip_path, ax1.transData)
116
+ ax1.add_collection(col)
117
+
118
+ patch = mpatches.PathPatch(star, lw=5, edgecolor='blue', facecolor='red',
119
+ alpha=0.7, hatch='*')
120
+ patch.set_clip_path(clip_path, ax2.transData)
121
+ ax2.add_patch(patch)
122
+
123
+ ax1.set_xlim(-3, 3)
124
+ ax1.set_ylim(-3, 3)
125
+
126
+
127
+ @check_figures_equal()
128
+ def test_clipping_zoom(fig_test, fig_ref):
129
+ # This test places the Axes and sets its limits such that the clip path is
130
+ # outside the figure entirely. This should not break the clip path.
131
+ ax_test = fig_test.add_axes((0, 0, 1, 1))
132
+ l, = ax_test.plot([-3, 3], [-3, 3])
133
+ # Explicit Path instead of a Rectangle uses clip path processing, instead
134
+ # of a clip box optimization.
135
+ p = mpath.Path([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]])
136
+ p = mpatches.PathPatch(p, transform=ax_test.transData)
137
+ l.set_clip_path(p)
138
+
139
+ ax_ref = fig_ref.add_axes((0, 0, 1, 1))
140
+ ax_ref.plot([-3, 3], [-3, 3])
141
+
142
+ ax_ref.set(xlim=(0.5, 0.75), ylim=(0.5, 0.75))
143
+ ax_test.set(xlim=(0.5, 0.75), ylim=(0.5, 0.75))
144
+
145
+
146
+ def test_cull_markers():
147
+ x = np.random.random(20000)
148
+ y = np.random.random(20000)
149
+
150
+ fig, ax = plt.subplots()
151
+ ax.plot(x, y, 'k.')
152
+ ax.set_xlim(2, 3)
153
+
154
+ pdf = io.BytesIO()
155
+ fig.savefig(pdf, format="pdf")
156
+ assert len(pdf.getvalue()) < 8000
157
+
158
+ svg = io.BytesIO()
159
+ fig.savefig(svg, format="svg")
160
+ assert len(svg.getvalue()) < 20000
161
+
162
+
163
+ @image_comparison(['hatching'], remove_text=True, style='default')
164
+ def test_hatching():
165
+ fig, ax = plt.subplots(1, 1)
166
+
167
+ # Default hatch color.
168
+ rect1 = mpatches.Rectangle((0, 0), 3, 4, hatch='/')
169
+ ax.add_patch(rect1)
170
+
171
+ rect2 = mcollections.RegularPolyCollection(
172
+ 4, sizes=[16000], offsets=[(1.5, 6.5)], offset_transform=ax.transData,
173
+ hatch='/')
174
+ ax.add_collection(rect2)
175
+
176
+ # Ensure edge color is not applied to hatching.
177
+ rect3 = mpatches.Rectangle((4, 0), 3, 4, hatch='/', edgecolor='C1')
178
+ ax.add_patch(rect3)
179
+
180
+ rect4 = mcollections.RegularPolyCollection(
181
+ 4, sizes=[16000], offsets=[(5.5, 6.5)], offset_transform=ax.transData,
182
+ hatch='/', edgecolor='C1')
183
+ ax.add_collection(rect4)
184
+
185
+ ax.set_xlim(0, 7)
186
+ ax.set_ylim(0, 9)
187
+
188
+
189
+ def test_remove():
190
+ fig, ax = plt.subplots()
191
+ im = ax.imshow(np.arange(36).reshape(6, 6))
192
+ ln, = ax.plot(range(5))
193
+
194
+ assert fig.stale
195
+ assert ax.stale
196
+
197
+ fig.canvas.draw()
198
+ assert not fig.stale
199
+ assert not ax.stale
200
+ assert not ln.stale
201
+
202
+ assert im in ax._mouseover_set
203
+ assert ln not in ax._mouseover_set
204
+ assert im.axes is ax
205
+
206
+ im.remove()
207
+ ln.remove()
208
+
209
+ for art in [im, ln]:
210
+ assert art.axes is None
211
+ assert art.get_figure() is None
212
+
213
+ assert im not in ax._mouseover_set
214
+ assert fig.stale
215
+ assert ax.stale
216
+
217
+
218
+ @image_comparison(["default_edges.png"], remove_text=True, style='default')
219
+ def test_default_edges():
220
+ fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2)
221
+
222
+ ax1.plot(np.arange(10), np.arange(10), 'x',
223
+ np.arange(10) + 1, np.arange(10), 'o')
224
+ ax2.bar(np.arange(10), np.arange(10), align='edge')
225
+ ax3.text(0, 0, "BOX", size=24, bbox=dict(boxstyle='sawtooth'))
226
+ ax3.set_xlim(-1, 1)
227
+ ax3.set_ylim(-1, 1)
228
+ pp1 = mpatches.PathPatch(
229
+ mpath.Path([(0, 0), (1, 0), (1, 1), (0, 0)],
230
+ [mpath.Path.MOVETO, mpath.Path.CURVE3,
231
+ mpath.Path.CURVE3, mpath.Path.CLOSEPOLY]),
232
+ fc="none", transform=ax4.transData)
233
+ ax4.add_patch(pp1)
234
+
235
+
236
+ def test_properties():
237
+ ln = mlines.Line2D([], [])
238
+ ln.properties() # Check that no warning is emitted.
239
+
240
+
241
+ def test_setp():
242
+ # Check empty list
243
+ plt.setp([])
244
+ plt.setp([[]])
245
+
246
+ # Check arbitrary iterables
247
+ fig, ax = plt.subplots()
248
+ lines1 = ax.plot(range(3))
249
+ lines2 = ax.plot(range(3))
250
+ martist.setp(chain(lines1, lines2), 'lw', 5)
251
+ plt.setp(ax.spines.values(), color='green')
252
+
253
+ # Check *file* argument
254
+ sio = io.StringIO()
255
+ plt.setp(lines1, 'zorder', file=sio)
256
+ assert sio.getvalue() == ' zorder: float\n'
257
+
258
+
259
+ def test_artist_set():
260
+ line = mlines.Line2D([], [])
261
+ line.set(linewidth=7)
262
+ assert line.get_linewidth() == 7
263
+
264
+ # Property aliases should work
265
+ line.set(lw=5)
266
+ assert line.get_linewidth() == 5
267
+
268
+
269
+ def test_artist_set_invalid_property_raises():
270
+ """
271
+ Test that set() raises AttributeError for invalid property names.
272
+ """
273
+ line = mlines.Line2D([0, 1], [0, 1])
274
+
275
+ with pytest.raises(AttributeError, match="unexpected keyword argument"):
276
+ line.set(not_a_property=1)
277
+
278
+
279
+ def test_artist_set_duplicate_aliases_raises():
280
+ """
281
+ Test that set() raises TypeError when both a property and its alias are provided.
282
+ """
283
+ line = mlines.Line2D([0, 1], [0, 1])
284
+
285
+ with pytest.raises(TypeError, match="aliases of one another"):
286
+ line.set(lw=2, linewidth=3)
287
+
288
+
289
+ def test_None_zorder():
290
+ fig, ax = plt.subplots()
291
+ ln, = ax.plot(range(5), zorder=None)
292
+ assert ln.get_zorder() == mlines.Line2D.zorder
293
+ ln.set_zorder(123456)
294
+ assert ln.get_zorder() == 123456
295
+ ln.set_zorder(None)
296
+ assert ln.get_zorder() == mlines.Line2D.zorder
297
+
298
+
299
+ @pytest.mark.parametrize('accept_clause, expected', [
300
+ ('', 'unknown'),
301
+ ("ACCEPTS: [ '-' | '--' | '-.' ]", "[ '-' | '--' | '-.' ]"),
302
+ ('ACCEPTS: Some description.', 'Some description.'),
303
+ ('.. ACCEPTS: Some description.', 'Some description.'),
304
+ ('arg : int', 'int'),
305
+ ('*arg : int', 'int'),
306
+ ('arg : int\nACCEPTS: Something else.', 'Something else. '),
307
+ ])
308
+ def test_artist_inspector_get_valid_values(accept_clause, expected):
309
+ class TestArtist(martist.Artist):
310
+ def set_f(self, arg):
311
+ pass
312
+
313
+ TestArtist.set_f.__doc__ = """
314
+ Some text.
315
+
316
+ %s
317
+ """ % accept_clause
318
+ valid_values = martist.ArtistInspector(TestArtist).get_valid_values('f')
319
+ assert valid_values == expected
320
+
321
+
322
+ def test_artist_inspector_get_aliases():
323
+ # test the correct format and type of get_aliases method
324
+ ai = martist.ArtistInspector(mlines.Line2D)
325
+ aliases = ai.get_aliases()
326
+ assert aliases["linewidth"] == {"lw"}
327
+
328
+
329
+ def test_set_alpha():
330
+ art = martist.Artist()
331
+ with pytest.raises(TypeError, match='^alpha must be numeric or None'):
332
+ art.set_alpha('string')
333
+ with pytest.raises(TypeError, match='^alpha must be numeric or None'):
334
+ art.set_alpha([1, 2, 3])
335
+ with pytest.raises(ValueError, match="outside 0-1 range"):
336
+ art.set_alpha(1.1)
337
+ with pytest.raises(ValueError, match="outside 0-1 range"):
338
+ art.set_alpha(np.nan)
339
+
340
+
341
+ def test_set_alpha_for_array():
342
+ art = martist.Artist()
343
+ with pytest.raises(TypeError, match='^alpha must be numeric or None'):
344
+ art._set_alpha_for_array('string')
345
+ with pytest.raises(ValueError, match="outside 0-1 range"):
346
+ art._set_alpha_for_array(1.1)
347
+ with pytest.raises(ValueError, match="outside 0-1 range"):
348
+ art._set_alpha_for_array(np.nan)
349
+ with pytest.raises(ValueError, match="alpha must be between 0 and 1"):
350
+ art._set_alpha_for_array([0.5, 1.1])
351
+ with pytest.raises(ValueError, match="alpha must be between 0 and 1"):
352
+ art._set_alpha_for_array([0.5, np.nan])
353
+
354
+
355
+ def test_callbacks():
356
+ def func(artist):
357
+ func.counter += 1
358
+
359
+ func.counter = 0
360
+
361
+ art = martist.Artist()
362
+ oid = art.add_callback(func)
363
+ assert func.counter == 0
364
+ art.pchanged() # must call the callback
365
+ assert func.counter == 1
366
+ art.set_zorder(10) # setting a property must also call the callback
367
+ assert func.counter == 2
368
+ art.remove_callback(oid)
369
+ art.pchanged() # must not call the callback anymore
370
+ assert func.counter == 2
371
+
372
+
373
+ def test_set_signature():
374
+ """Test autogenerated ``set()`` for Artist subclasses."""
375
+ class MyArtist1(martist.Artist):
376
+ def set_myparam1(self, val):
377
+ pass
378
+
379
+ assert hasattr(MyArtist1.set, '_autogenerated_signature')
380
+ assert 'myparam1' in MyArtist1.set.__doc__
381
+
382
+ class MyArtist2(MyArtist1):
383
+ def set_myparam2(self, val):
384
+ pass
385
+
386
+ assert hasattr(MyArtist2.set, '_autogenerated_signature')
387
+ assert 'myparam1' in MyArtist2.set.__doc__
388
+ assert 'myparam2' in MyArtist2.set.__doc__
389
+
390
+
391
+ def test_set_is_overwritten():
392
+ """set() defined in Artist subclasses should not be overwritten."""
393
+ class MyArtist3(martist.Artist):
394
+
395
+ def set(self, **kwargs):
396
+ """Not overwritten."""
397
+
398
+ assert not hasattr(MyArtist3.set, '_autogenerated_signature')
399
+ assert MyArtist3.set.__doc__ == "Not overwritten."
400
+
401
+ class MyArtist4(MyArtist3):
402
+ pass
403
+
404
+ assert MyArtist4.set is MyArtist3.set
405
+
406
+
407
+ def test_format_cursor_data_BoundaryNorm():
408
+ """Test if cursor data is correct when using BoundaryNorm."""
409
+ X = np.empty((3, 3))
410
+ X[0, 0] = 0.9
411
+ X[0, 1] = 0.99
412
+ X[0, 2] = 0.999
413
+ X[1, 0] = -1
414
+ X[1, 1] = 0
415
+ X[1, 2] = 1
416
+ X[2, 0] = 0.09
417
+ X[2, 1] = 0.009
418
+ X[2, 2] = 0.0009
419
+
420
+ # map range -1..1 to 0..256 in 0.1 steps
421
+ fig, ax = plt.subplots()
422
+ fig.suptitle("-1..1 to 0..256 in 0.1")
423
+ norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 20), 256)
424
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
425
+
426
+ labels_list = [
427
+ "[0.9]",
428
+ "[1.]",
429
+ "[1.]",
430
+ "[-1.0]",
431
+ "[0.0]",
432
+ "[1.0]",
433
+ "[0.09]",
434
+ "[0.009]",
435
+ "[0.0009]",
436
+ ]
437
+ for v, label in zip(X.flat, labels_list):
438
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.1))
439
+ assert img.format_cursor_data(v) == label
440
+
441
+ plt.close()
442
+
443
+ # map range -1..1 to 0..256 in 0.01 steps
444
+ fig, ax = plt.subplots()
445
+ fig.suptitle("-1..1 to 0..256 in 0.01")
446
+ cmap = mpl.colormaps['RdBu_r'].resampled(200)
447
+ norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 200), 200)
448
+ img = ax.imshow(X, cmap=cmap, norm=norm)
449
+
450
+ labels_list = [
451
+ "[0.90]",
452
+ "[0.99]",
453
+ "[1.0]",
454
+ "[-1.00]",
455
+ "[0.00]",
456
+ "[1.00]",
457
+ "[0.09]",
458
+ "[0.009]",
459
+ "[0.0009]",
460
+ ]
461
+ for v, label in zip(X.flat, labels_list):
462
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.01))
463
+ assert img.format_cursor_data(v) == label
464
+
465
+ plt.close()
466
+
467
+ # map range -1..1 to 0..256 in 0.01 steps
468
+ fig, ax = plt.subplots()
469
+ fig.suptitle("-1..1 to 0..256 in 0.001")
470
+ cmap = mpl.colormaps['RdBu_r'].resampled(2000)
471
+ norm = mcolors.BoundaryNorm(np.linspace(-1, 1, 2000), 2000)
472
+ img = ax.imshow(X, cmap=cmap, norm=norm)
473
+
474
+ labels_list = [
475
+ "[0.900]",
476
+ "[0.990]",
477
+ "[0.999]",
478
+ "[-1.000]",
479
+ "[0.000]",
480
+ "[1.000]",
481
+ "[0.090]",
482
+ "[0.009]",
483
+ "[0.0009]",
484
+ ]
485
+ for v, label in zip(X.flat, labels_list):
486
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.001))
487
+ assert img.format_cursor_data(v) == label
488
+
489
+ plt.close()
490
+
491
+ # different testing data set with
492
+ # out of bounds values for 0..1 range
493
+ X = np.empty((7, 1))
494
+ X[0] = -1.0
495
+ X[1] = 0.0
496
+ X[2] = 0.1
497
+ X[3] = 0.5
498
+ X[4] = 0.9
499
+ X[5] = 1.0
500
+ X[6] = 2.0
501
+
502
+ labels_list = [
503
+ "[-1.0]",
504
+ "[0.0]",
505
+ "[0.1]",
506
+ "[0.5]",
507
+ "[0.9]",
508
+ "[1.0]",
509
+ "[2.0]",
510
+ ]
511
+
512
+ fig, ax = plt.subplots()
513
+ fig.suptitle("noclip, neither")
514
+ norm = mcolors.BoundaryNorm(
515
+ np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='neither')
516
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
517
+ for v, label in zip(X.flat, labels_list):
518
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
519
+ assert img.format_cursor_data(v) == label
520
+
521
+ plt.close()
522
+
523
+ fig, ax = plt.subplots()
524
+ fig.suptitle("noclip, min")
525
+ norm = mcolors.BoundaryNorm(
526
+ np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='min')
527
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
528
+ for v, label in zip(X.flat, labels_list):
529
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
530
+ assert img.format_cursor_data(v) == label
531
+
532
+ plt.close()
533
+
534
+ fig, ax = plt.subplots()
535
+ fig.suptitle("noclip, max")
536
+ norm = mcolors.BoundaryNorm(
537
+ np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='max')
538
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
539
+ for v, label in zip(X.flat, labels_list):
540
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
541
+ assert img.format_cursor_data(v) == label
542
+
543
+ plt.close()
544
+
545
+ fig, ax = plt.subplots()
546
+ fig.suptitle("noclip, both")
547
+ norm = mcolors.BoundaryNorm(
548
+ np.linspace(0, 1, 4, endpoint=True), 256, clip=False, extend='both')
549
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
550
+ for v, label in zip(X.flat, labels_list):
551
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
552
+ assert img.format_cursor_data(v) == label
553
+
554
+ plt.close()
555
+
556
+ fig, ax = plt.subplots()
557
+ fig.suptitle("clip, neither")
558
+ norm = mcolors.BoundaryNorm(
559
+ np.linspace(0, 1, 4, endpoint=True), 256, clip=True, extend='neither')
560
+ img = ax.imshow(X, cmap='RdBu_r', norm=norm)
561
+ for v, label in zip(X.flat, labels_list):
562
+ # label = "[{:-#.{}g}]".format(v, cbook._g_sig_digits(v, 0.33))
563
+ assert img.format_cursor_data(v) == label
564
+
565
+ plt.close()
566
+
567
+
568
+ def test_auto_no_rasterize():
569
+ class Gen1(martist.Artist):
570
+ ...
571
+
572
+ assert 'draw' in Gen1.__dict__
573
+ assert Gen1.__dict__['draw'] is Gen1.draw
574
+
575
+ class Gen2(Gen1):
576
+ ...
577
+
578
+ assert 'draw' not in Gen2.__dict__
579
+ assert Gen2.draw is Gen1.draw
580
+
581
+
582
+ def test_draw_wraper_forward_input():
583
+ class TestKlass(martist.Artist):
584
+ def draw(self, renderer, extra):
585
+ return extra
586
+
587
+ art = TestKlass()
588
+ renderer = mbackend_bases.RendererBase()
589
+
590
+ assert 'aardvark' == art.draw(renderer, 'aardvark')
591
+ assert 'aardvark' == art.draw(renderer, extra='aardvark')
592
+
593
+
594
+ def test_get_figure():
595
+ fig = plt.figure()
596
+ sfig1 = fig.subfigures()
597
+ sfig2 = sfig1.subfigures()
598
+ ax = sfig2.subplots()
599
+
600
+ assert fig.get_figure(root=True) is fig
601
+ assert fig.get_figure(root=False) is fig
602
+
603
+ assert ax.get_figure() is sfig2
604
+ assert ax.get_figure(root=False) is sfig2
605
+ assert ax.get_figure(root=True) is fig
606
+
607
+ # SubFigure.get_figure has separate implementation but should give consistent
608
+ # results to other artists.
609
+ assert sfig2.get_figure(root=False) is sfig1
610
+ assert sfig2.get_figure(root=True) is fig
611
+ # Currently different results by default.
612
+ with pytest.warns(mpl.MatplotlibDeprecationWarning):
613
+ assert sfig2.get_figure() is fig
614
+ # No deprecation warning if root and parent figure are the same.
615
+ assert sfig1.get_figure() is fig
616
+
617
+ # An artist not yet attached to anything has no figure.
618
+ ln = mlines.Line2D([], [])
619
+ assert ln.get_figure(root=True) is None
620
+ assert ln.get_figure(root=False) is None
621
+
622
+ # figure attribute is root for (Sub)Figures but parent for other artists.
623
+ assert ax.figure is sfig2
624
+ assert fig.figure is fig
625
+ assert sfig2.figure is fig
hug/lib/python3.12/site-packages/matplotlib/tests/test_axes.py ADDED
The diff for this file is too large to render. See raw diff
 
hug/lib/python3.12/site-packages/matplotlib/tests/test_axis.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ import matplotlib.pyplot as plt
4
+ from matplotlib.axis import XTick
5
+ from matplotlib.testing.decorators import check_figures_equal
6
+
7
+
8
+ def test_tick_labelcolor_array():
9
+ # Smoke test that we can instantiate a Tick with labelcolor as array.
10
+ ax = plt.axes()
11
+ XTick(ax, 0, labelcolor=np.array([1, 0, 0, 1]))
12
+
13
+
14
+ def test_axis_not_in_layout():
15
+ fig1, (ax1_left, ax1_right) = plt.subplots(ncols=2, layout='constrained')
16
+ fig2, (ax2_left, ax2_right) = plt.subplots(ncols=2, layout='constrained')
17
+
18
+ # 100 label overlapping the end of the axis
19
+ ax1_left.set_xlim(0, 100)
20
+ # 100 label not overlapping the end of the axis
21
+ ax2_left.set_xlim(0, 120)
22
+
23
+ for ax in ax1_left, ax2_left:
24
+ ax.set_xticks([0, 100])
25
+ ax.xaxis.set_in_layout(False)
26
+
27
+ for fig in fig1, fig2:
28
+ fig.draw_without_rendering()
29
+
30
+ # Positions should not be affected by overlapping 100 label
31
+ assert ax1_left.get_position().bounds == ax2_left.get_position().bounds
32
+ assert ax1_right.get_position().bounds == ax2_right.get_position().bounds
33
+
34
+
35
+ @check_figures_equal()
36
+ def test_tick_not_in_layout(fig_test, fig_ref):
37
+ # Check that the "very long" ticklabel is ignored from layouting after
38
+ # set_in_layout(False); i.e. the layout is as if the ticklabel was empty.
39
+ # Ticklabels are set to white so that the actual string doesn't matter.
40
+ fig_test.set_layout_engine("constrained")
41
+ ax = fig_test.add_subplot(xticks=[0, 1], xticklabels=["short", "very long"])
42
+ ax.tick_params(labelcolor="w")
43
+ fig_test.draw_without_rendering() # Ensure ticks are correct.
44
+ ax.xaxis.majorTicks[-1].label1.set_in_layout(False)
45
+ fig_ref.set_layout_engine("constrained")
46
+ ax = fig_ref.add_subplot(xticks=[0, 1], xticklabels=["short", ""])
47
+ ax.tick_params(labelcolor="w")
48
+
49
+
50
+ def test_translate_tick_params_reverse():
51
+ fig, ax = plt.subplots()
52
+ kw = {'label1On': 'a', 'label2On': 'b', 'tick1On': 'c', 'tick2On': 'd'}
53
+ assert (ax.xaxis._translate_tick_params(kw, reverse=True) ==
54
+ {'labelbottom': 'a', 'labeltop': 'b', 'bottom': 'c', 'top': 'd'})
55
+ assert (ax.yaxis._translate_tick_params(kw, reverse=True) ==
56
+ {'labelleft': 'a', 'labelright': 'b', 'left': 'c', 'right': 'd'})
57
+
58
+
59
+ def test_get_tick_position_rcParams():
60
+ """Test that get_tick_position() correctly picks up rcParams tick positions."""
61
+ plt.rcParams.update({
62
+ "xtick.top": 1, "xtick.labeltop": 1, "xtick.bottom": 0, "xtick.labelbottom": 0,
63
+ "ytick.right": 1, "ytick.labelright": 1, "ytick.left": 0, "ytick.labelleft": 0,
64
+ })
65
+ ax = plt.figure().add_subplot()
66
+ assert ax.xaxis.get_ticks_position() == "top"
67
+ assert ax.yaxis.get_ticks_position() == "right"
68
+
69
+
70
+ def test_get_tick_position_tick_top_tick_right():
71
+ """Test that get_tick_position() correctly picks up tick_top() / tick_right()."""
72
+ ax = plt.figure().add_subplot()
73
+ ax.xaxis.tick_top()
74
+ ax.yaxis.tick_right()
75
+ assert ax.xaxis.get_ticks_position() == "top"
76
+ assert ax.yaxis.get_ticks_position() == "right"
77
+
78
+
79
+ def test_get_tick_position_tick_params():
80
+ """Test that get_tick_position() correctly picks up tick_params()."""
81
+ ax = plt.figure().add_subplot()
82
+ ax.tick_params(top=True, labeltop=True, bottom=False, labelbottom=False,
83
+ right=True, labelright=True, left=False, labelleft=False)
84
+ assert ax.xaxis.get_ticks_position() == "top"
85
+ assert ax.yaxis.get_ticks_position() == "right"
86
+
87
+
88
+ def test_grid_rcparams():
89
+ """Tests that `grid.major/minor.*` overwrites `grid.*` in rcParams."""
90
+ plt.rcParams.update({
91
+ "axes.grid": True, "axes.grid.which": "both",
92
+ "ytick.minor.visible": True, "xtick.minor.visible": True,
93
+ })
94
+ def_linewidth = plt.rcParams["grid.linewidth"]
95
+ def_linestyle = plt.rcParams["grid.linestyle"]
96
+ def_alpha = plt.rcParams["grid.alpha"]
97
+
98
+ plt.rcParams.update({
99
+ "grid.color": "gray", "grid.minor.color": "red",
100
+ "grid.major.linestyle": ":", "grid.major.linewidth": 2,
101
+ "grid.minor.alpha": 0.6,
102
+ })
103
+ _, ax = plt.subplots()
104
+ ax.plot([0, 1])
105
+
106
+ assert ax.xaxis.get_major_ticks()[0].gridline.get_color() == "gray"
107
+ assert ax.xaxis.get_minor_ticks()[0].gridline.get_color() == "red"
108
+ assert ax.xaxis.get_major_ticks()[0].gridline.get_linewidth() == 2
109
+ assert ax.xaxis.get_minor_ticks()[0].gridline.get_linewidth() == def_linewidth
110
+ assert ax.xaxis.get_major_ticks()[0].gridline.get_linestyle() == ":"
111
+ assert ax.xaxis.get_minor_ticks()[0].gridline.get_linestyle() == def_linestyle
112
+ assert ax.xaxis.get_major_ticks()[0].gridline.get_alpha() == def_alpha
113
+ assert ax.xaxis.get_minor_ticks()[0].gridline.get_alpha() == 0.6
114
+
115
+
116
+ def test_set_ticks_emits_lim_changed():
117
+ fig, ax1 = plt.subplots()
118
+ ax1.set_xlim(0.5, 1)
119
+ called_cartesian = []
120
+ ax1.callbacks.connect("xlim_changed", called_cartesian.append)
121
+ ax1.set_xticks([0, 100])
122
+ assert called_cartesian
123
+
124
+ fig = plt.figure()
125
+ ax2 = fig.add_subplot(projection="polar")
126
+ ax2.set_ylim(0.5, 1)
127
+ called_polar = []
128
+ ax2.callbacks.connect("ylim_changed", called_polar.append)
129
+ ax2.set_rticks([1, 2, 3])
130
+ assert called_polar
hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_bases.py ADDED
@@ -0,0 +1,589 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib
2
+
3
+ from matplotlib import path, transforms
4
+ from matplotlib.backend_bases import (
5
+ FigureCanvasBase, KeyEvent, LocationEvent, MouseButton, MouseEvent,
6
+ NavigationToolbar2, RendererBase)
7
+ from matplotlib.backend_tools import RubberbandBase
8
+ from matplotlib.figure import Figure
9
+ from matplotlib.testing._markers import needs_pgf_xelatex
10
+ import matplotlib.pyplot as plt
11
+
12
+ import numpy as np
13
+ import pytest
14
+
15
+
16
+ _EXPECTED_WARNING_TOOLMANAGER = (
17
+ r"Treat the new Tool classes introduced in "
18
+ r"v[0-9]*.[0-9]* as experimental for now; "
19
+ "the API and rcParam may change in future versions.")
20
+
21
+
22
+ def test_uses_per_path():
23
+ id = transforms.Affine2D()
24
+ paths = [path.Path.unit_regular_polygon(i) for i in range(3, 7)]
25
+ tforms_matrices = [id.rotate(i).get_matrix().copy() for i in range(1, 5)]
26
+ offsets = np.arange(20).reshape((10, 2))
27
+ facecolors = ['red', 'green']
28
+ edgecolors = ['red', 'green']
29
+
30
+ def check(master_transform, paths, all_transforms,
31
+ offsets, facecolors, edgecolors):
32
+ rb = RendererBase()
33
+ raw_paths = list(rb._iter_collection_raw_paths(
34
+ master_transform, paths, all_transforms))
35
+ gc = rb.new_gc()
36
+ ids = [path_id for xo, yo, path_id, gc0, rgbFace in
37
+ rb._iter_collection(
38
+ gc, range(len(raw_paths)), offsets,
39
+ transforms.AffineDeltaTransform(master_transform),
40
+ facecolors, edgecolors, [], [], [False],
41
+ [], 'screen', hatchcolors=[])]
42
+ uses = rb._iter_collection_uses_per_path(
43
+ paths, all_transforms, offsets, facecolors, edgecolors)
44
+ if raw_paths:
45
+ seen = np.bincount(ids, minlength=len(raw_paths))
46
+ assert set(seen).issubset([uses - 1, uses])
47
+
48
+ check(id, paths, tforms_matrices, offsets, facecolors, edgecolors)
49
+ check(id, paths[0:1], tforms_matrices, offsets, facecolors, edgecolors)
50
+ check(id, [], tforms_matrices, offsets, facecolors, edgecolors)
51
+ check(id, paths, tforms_matrices[0:1], offsets, facecolors, edgecolors)
52
+ check(id, paths, [], offsets, facecolors, edgecolors)
53
+ for n in range(0, offsets.shape[0]):
54
+ check(id, paths, tforms_matrices, offsets[0:n, :],
55
+ facecolors, edgecolors)
56
+ check(id, paths, tforms_matrices, offsets, [], edgecolors)
57
+ check(id, paths, tforms_matrices, offsets, facecolors, [])
58
+ check(id, paths, tforms_matrices, offsets, [], [])
59
+ check(id, paths, tforms_matrices, offsets, facecolors[0:1], edgecolors)
60
+
61
+
62
+ def test_canvas_ctor():
63
+ assert isinstance(FigureCanvasBase().figure, Figure)
64
+
65
+
66
+ def test_get_default_filename():
67
+ fig = plt.figure()
68
+ assert fig.canvas.get_default_filename() == "Figure_1.png"
69
+ fig.canvas.manager.set_window_title("0:1/2<3")
70
+ assert fig.canvas.get_default_filename() == "0_1_2_3.png"
71
+
72
+
73
+ def test_canvas_change():
74
+ fig = plt.figure()
75
+ # Replaces fig.canvas
76
+ canvas = FigureCanvasBase(fig)
77
+ # Should still work.
78
+ plt.close(fig)
79
+ assert not plt.fignum_exists(fig.number)
80
+
81
+
82
+ @pytest.mark.backend('pdf')
83
+ def test_non_gui_warning(monkeypatch):
84
+ plt.subplots()
85
+
86
+ monkeypatch.setenv("DISPLAY", ":999")
87
+
88
+ with pytest.warns(UserWarning) as rec:
89
+ plt.show()
90
+ assert len(rec) == 1
91
+ assert ('FigureCanvasPdf is non-interactive, and thus cannot be shown'
92
+ in str(rec[0].message))
93
+
94
+ with pytest.warns(UserWarning) as rec:
95
+ plt.gcf().show()
96
+ assert len(rec) == 1
97
+ assert ('FigureCanvasPdf is non-interactive, and thus cannot be shown'
98
+ in str(rec[0].message))
99
+
100
+
101
+ def test_grab_clear():
102
+ fig, ax = plt.subplots()
103
+
104
+ fig.canvas.grab_mouse(ax)
105
+ assert fig.canvas.mouse_grabber == ax
106
+
107
+ fig.clear()
108
+ assert fig.canvas.mouse_grabber is None
109
+
110
+
111
+ @pytest.mark.parametrize(
112
+ "x, y", [(42, 24), (None, 42), (None, None), (200, 100.01), (205.75, 2.0)])
113
+ def test_location_event_position(x, y):
114
+ # LocationEvent should cast its x and y arguments to int unless it is None.
115
+ fig, ax = plt.subplots()
116
+ canvas = FigureCanvasBase(fig)
117
+ event = LocationEvent("test_event", canvas, x, y)
118
+ if x is None:
119
+ assert event.x is None
120
+ else:
121
+ assert event.x == int(x)
122
+ assert isinstance(event.x, int)
123
+ if y is None:
124
+ assert event.y is None
125
+ else:
126
+ assert event.y == int(y)
127
+ assert isinstance(event.y, int)
128
+ if x is not None and y is not None:
129
+ assert (ax.format_coord(x, y)
130
+ == f"(x, y) = ({ax.format_xdata(x)}, {ax.format_ydata(y)})")
131
+ ax.fmt_xdata = ax.fmt_ydata = lambda x: "foo"
132
+ assert ax.format_coord(x, y) == "(x, y) = (foo, foo)"
133
+
134
+
135
+ def test_location_event_position_twin():
136
+ fig, ax = plt.subplots()
137
+ ax.set(xlim=(0, 10), ylim=(0, 20))
138
+ assert ax.format_coord(5., 5.) == "(x, y) = (5.00, 5.00)"
139
+ ax.twinx().set(ylim=(0, 40))
140
+ assert ax.format_coord(5., 5.) == "(x, y) = (5.00, 5.00) | (5.00, 10.0)"
141
+ ax.twiny().set(xlim=(0, 5))
142
+ assert (ax.format_coord(5., 5.)
143
+ == "(x, y) = (5.00, 5.00) | (5.00, 10.0) | (2.50, 5.00)")
144
+
145
+
146
+ def test_pick():
147
+ fig = plt.figure()
148
+ fig.text(.5, .5, "hello", ha="center", va="center", picker=True)
149
+ fig.canvas.draw()
150
+
151
+ picks = []
152
+ def handle_pick(event):
153
+ assert event.mouseevent.key == "a"
154
+ picks.append(event)
155
+ fig.canvas.mpl_connect("pick_event", handle_pick)
156
+
157
+ KeyEvent("key_press_event", fig.canvas, "a")._process()
158
+ MouseEvent("button_press_event", fig.canvas,
159
+ *fig.transFigure.transform((.5, .5)),
160
+ MouseButton.LEFT)._process()
161
+ KeyEvent("key_release_event", fig.canvas, "a")._process()
162
+ assert len(picks) == 1
163
+
164
+
165
+ def test_interactive_zoom():
166
+ fig, ax = plt.subplots()
167
+ ax.set(xscale="logit")
168
+ assert ax.get_navigate_mode() is None
169
+
170
+ tb = NavigationToolbar2(fig.canvas)
171
+ tb.zoom()
172
+ assert ax.get_navigate_mode() == 'ZOOM'
173
+
174
+ xlim0 = ax.get_xlim()
175
+ ylim0 = ax.get_ylim()
176
+
177
+ # Zoom from x=1e-6, y=0.1 to x=1-1e-5, 0.8 (data coordinates, "d").
178
+ d0 = (1e-6, 0.1)
179
+ d1 = (1-1e-5, 0.8)
180
+ # Convert to screen coordinates ("s"). Events are defined only with pixel
181
+ # precision, so round the pixel values, and below, check against the
182
+ # corresponding xdata/ydata, which are close but not equal to d0/d1.
183
+ s0 = ax.transData.transform(d0).astype(int)
184
+ s1 = ax.transData.transform(d1).astype(int)
185
+
186
+ # Zoom in.
187
+ start_event = MouseEvent(
188
+ "button_press_event", fig.canvas, *s0, MouseButton.LEFT)
189
+ fig.canvas.callbacks.process(start_event.name, start_event)
190
+ stop_event = MouseEvent(
191
+ "button_release_event", fig.canvas, *s1, MouseButton.LEFT)
192
+ fig.canvas.callbacks.process(stop_event.name, stop_event)
193
+ assert ax.get_xlim() == (start_event.xdata, stop_event.xdata)
194
+ assert ax.get_ylim() == (start_event.ydata, stop_event.ydata)
195
+
196
+ # Zoom out.
197
+ start_event = MouseEvent(
198
+ "button_press_event", fig.canvas, *s1, MouseButton.RIGHT)
199
+ fig.canvas.callbacks.process(start_event.name, start_event)
200
+ stop_event = MouseEvent(
201
+ "button_release_event", fig.canvas, *s0, MouseButton.RIGHT)
202
+ fig.canvas.callbacks.process(stop_event.name, stop_event)
203
+ # Absolute tolerance much less than original xmin (1e-7).
204
+ assert ax.get_xlim() == pytest.approx(xlim0, rel=0, abs=1e-10)
205
+ assert ax.get_ylim() == pytest.approx(ylim0, rel=0, abs=1e-10)
206
+
207
+ tb.zoom()
208
+ assert ax.get_navigate_mode() is None
209
+
210
+ assert not ax.get_autoscalex_on() and not ax.get_autoscaley_on()
211
+
212
+
213
+ def test_widgetlock_zoompan():
214
+ fig, ax = plt.subplots()
215
+ ax.plot([0, 1], [0, 1])
216
+ fig.canvas.widgetlock(ax)
217
+ tb = NavigationToolbar2(fig.canvas)
218
+ tb.zoom()
219
+ assert ax.get_navigate_mode() is None
220
+ tb.pan()
221
+ assert ax.get_navigate_mode() is None
222
+
223
+
224
+ @pytest.mark.parametrize("plot_func", ["imshow", "contourf"])
225
+ @pytest.mark.parametrize("orientation", ["vertical", "horizontal"])
226
+ @pytest.mark.parametrize("tool,button,expected",
227
+ [("zoom", MouseButton.LEFT, (4, 6)), # zoom in
228
+ ("zoom", MouseButton.RIGHT, (-20, 30)), # zoom out
229
+ ("pan", MouseButton.LEFT, (-2, 8)),
230
+ ("pan", MouseButton.RIGHT, (1.47, 7.78))]) # zoom
231
+ def test_interactive_colorbar(plot_func, orientation, tool, button, expected):
232
+ fig, ax = plt.subplots()
233
+ data = np.arange(12).reshape((4, 3))
234
+ vmin0, vmax0 = 0, 10
235
+ coll = getattr(ax, plot_func)(data, vmin=vmin0, vmax=vmax0)
236
+
237
+ cb = fig.colorbar(coll, ax=ax, orientation=orientation)
238
+ if plot_func == "contourf":
239
+ # Just determine we can't navigate and exit out of the test
240
+ assert not cb.ax.get_navigate()
241
+ return
242
+
243
+ assert cb.ax.get_navigate()
244
+
245
+ # Mouse from 4 to 6 (data coordinates, "d").
246
+ vmin, vmax = 4, 6
247
+ # The y coordinate doesn't matter, it just needs to be between 0 and 1
248
+ # However, we will set d0/d1 to the same y coordinate to test that small
249
+ # pixel changes in that coordinate doesn't cancel the zoom like a normal
250
+ # axes would.
251
+ d0 = (vmin, 0.5)
252
+ d1 = (vmax, 0.5)
253
+ # Swap them if the orientation is vertical
254
+ if orientation == "vertical":
255
+ d0 = d0[::-1]
256
+ d1 = d1[::-1]
257
+ # Convert to screen coordinates ("s"). Events are defined only with pixel
258
+ # precision, so round the pixel values, and below, check against the
259
+ # corresponding xdata/ydata, which are close but not equal to d0/d1.
260
+ s0 = cb.ax.transData.transform(d0).astype(int)
261
+ s1 = cb.ax.transData.transform(d1).astype(int)
262
+
263
+ # Set up the mouse movements
264
+ start_event = MouseEvent(
265
+ "button_press_event", fig.canvas, *s0, button)
266
+ drag_event = MouseEvent(
267
+ "motion_notify_event", fig.canvas, *s1, button, buttons={button})
268
+ stop_event = MouseEvent(
269
+ "button_release_event", fig.canvas, *s1, button)
270
+
271
+ tb = NavigationToolbar2(fig.canvas)
272
+ if tool == "zoom":
273
+ tb.zoom()
274
+ tb.press_zoom(start_event)
275
+ tb.drag_zoom(drag_event)
276
+ tb.release_zoom(stop_event)
277
+ else:
278
+ tb.pan()
279
+ tb.press_pan(start_event)
280
+ tb.drag_pan(drag_event)
281
+ tb.release_pan(stop_event)
282
+
283
+ # Should be close, but won't be exact due to screen integer resolution
284
+ assert (cb.vmin, cb.vmax) == pytest.approx(expected, abs=0.15)
285
+
286
+
287
+ def test_toolbar_zoompan():
288
+ with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
289
+ plt.rcParams['toolbar'] = 'toolmanager'
290
+ ax = plt.gca()
291
+ fig = ax.get_figure()
292
+ assert ax.get_navigate_mode() is None
293
+ fig.canvas.manager.toolmanager.trigger_tool('zoom')
294
+ assert ax.get_navigate_mode() == "ZOOM"
295
+ fig.canvas.manager.toolmanager.trigger_tool('pan')
296
+ assert ax.get_navigate_mode() == "PAN"
297
+
298
+
299
+ def test_toolbar_home_restores_autoscale():
300
+ fig, ax = plt.subplots()
301
+ ax.plot(range(11), range(11))
302
+
303
+ tb = NavigationToolbar2(fig.canvas)
304
+ tb.zoom()
305
+
306
+ # Switch to log.
307
+ KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
308
+ KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
309
+ assert ax.get_xlim() == ax.get_ylim() == (1, 10) # Autolimits excluding 0.
310
+ # Switch back to linear.
311
+ KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
312
+ KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
313
+ assert ax.get_xlim() == ax.get_ylim() == (0, 10) # Autolimits.
314
+
315
+ # Zoom in from (x, y) = (2, 2) to (5, 5).
316
+ start, stop = ax.transData.transform([(2, 2), (5, 5)])
317
+ MouseEvent("button_press_event", fig.canvas, *start, MouseButton.LEFT)._process()
318
+ MouseEvent("button_release_event", fig.canvas, *stop, MouseButton.LEFT)._process()
319
+ # Go back to home.
320
+ KeyEvent("key_press_event", fig.canvas, "h")._process()
321
+
322
+ assert ax.get_xlim() == ax.get_ylim() == (0, 10)
323
+ # Switch to log.
324
+ KeyEvent("key_press_event", fig.canvas, "k", 100, 100)._process()
325
+ KeyEvent("key_press_event", fig.canvas, "l", 100, 100)._process()
326
+ assert ax.get_xlim() == ax.get_ylim() == (1, 10) # Autolimits excluding 0.
327
+
328
+
329
+ @pytest.mark.parametrize(
330
+ "backend", ['svg', 'ps', 'pdf',
331
+ pytest.param('pgf', marks=needs_pgf_xelatex)]
332
+ )
333
+ def test_draw(backend):
334
+ from matplotlib.figure import Figure
335
+ from matplotlib.backends.backend_agg import FigureCanvas
336
+ test_backend = importlib.import_module(f'matplotlib.backends.backend_{backend}')
337
+ TestCanvas = test_backend.FigureCanvas
338
+ fig_test = Figure(constrained_layout=True)
339
+ TestCanvas(fig_test)
340
+ axes_test = fig_test.subplots(2, 2)
341
+
342
+ # defaults to FigureCanvasBase
343
+ fig_agg = Figure(constrained_layout=True)
344
+ # put a backends.backend_agg.FigureCanvas on it
345
+ FigureCanvas(fig_agg)
346
+ axes_agg = fig_agg.subplots(2, 2)
347
+
348
+ init_pos = [ax.get_position() for ax in axes_test.ravel()]
349
+
350
+ fig_test.canvas.draw()
351
+ fig_agg.canvas.draw()
352
+
353
+ layed_out_pos_test = [ax.get_position() for ax in axes_test.ravel()]
354
+ layed_out_pos_agg = [ax.get_position() for ax in axes_agg.ravel()]
355
+
356
+ for init, placed in zip(init_pos, layed_out_pos_test):
357
+ assert not np.allclose(init, placed, atol=0.005)
358
+
359
+ for ref, test in zip(layed_out_pos_agg, layed_out_pos_test):
360
+ np.testing.assert_allclose(ref, test, atol=0.005)
361
+
362
+
363
+ @pytest.mark.parametrize(
364
+ "key,mouseend,expectedxlim,expectedylim",
365
+ [(None, (0.2, 0.2), (3.49, 12.49), (2.7, 11.7)),
366
+ (None, (0.2, 0.5), (3.49, 12.49), (0, 9)),
367
+ (None, (0.5, 0.2), (0, 9), (2.7, 11.7)),
368
+ (None, (0.5, 0.5), (0, 9), (0, 9)), # No move
369
+ (None, (0.8, 0.25), (-3.47, 5.53), (2.25, 11.25)),
370
+ (None, (0.2, 0.25), (3.49, 12.49), (2.25, 11.25)),
371
+ (None, (0.8, 0.85), (-3.47, 5.53), (-3.14, 5.86)),
372
+ (None, (0.2, 0.85), (3.49, 12.49), (-3.14, 5.86)),
373
+ ("shift", (0.2, 0.4), (3.49, 12.49), (0, 9)), # snap to x
374
+ ("shift", (0.4, 0.2), (0, 9), (2.7, 11.7)), # snap to y
375
+ ("shift", (0.2, 0.25), (3.49, 12.49), (3.49, 12.49)), # snap to diagonal
376
+ ("shift", (0.8, 0.25), (-3.47, 5.53), (3.47, 12.47)), # snap to diagonal
377
+ ("shift", (0.8, 0.9), (-3.58, 5.41), (-3.58, 5.41)), # snap to diagonal
378
+ ("shift", (0.2, 0.85), (3.49, 12.49), (-3.49, 5.51)), # snap to diagonal
379
+ ("x", (0.2, 0.1), (3.49, 12.49), (0, 9)), # only x
380
+ ("y", (0.1, 0.2), (0, 9), (2.7, 11.7)), # only y
381
+ ("control", (0.2, 0.2), (3.49, 12.49), (3.49, 12.49)), # diagonal
382
+ ("control", (0.4, 0.2), (2.72, 11.72), (2.72, 11.72)), # diagonal
383
+ ])
384
+ def test_interactive_pan(key, mouseend, expectedxlim, expectedylim):
385
+ fig, ax = plt.subplots()
386
+ ax.plot(np.arange(10))
387
+ assert ax.get_navigate()
388
+ # Set equal aspect ratio to easier see diagonal snap
389
+ ax.set_aspect('equal')
390
+
391
+ # Mouse move starts from 0.5, 0.5
392
+ mousestart = (0.5, 0.5)
393
+ # Convert to screen coordinates ("s"). Events are defined only with pixel
394
+ # precision, so round the pixel values, and below, check against the
395
+ # corresponding xdata/ydata, which are close but not equal to d0/d1.
396
+ sstart = ax.transData.transform(mousestart).astype(int)
397
+ send = ax.transData.transform(mouseend).astype(int)
398
+
399
+ # Set up the mouse movements
400
+ start_event = MouseEvent(
401
+ "button_press_event", fig.canvas, *sstart, button=MouseButton.LEFT,
402
+ key=key)
403
+ drag_event = MouseEvent(
404
+ "motion_notify_event", fig.canvas, *send, button=MouseButton.LEFT,
405
+ buttons={MouseButton.LEFT}, key=key)
406
+ stop_event = MouseEvent(
407
+ "button_release_event", fig.canvas, *send, button=MouseButton.LEFT,
408
+ key=key)
409
+
410
+ tb = NavigationToolbar2(fig.canvas)
411
+ tb.pan()
412
+ tb.press_pan(start_event)
413
+ tb.drag_pan(drag_event)
414
+ tb.release_pan(stop_event)
415
+ # Should be close, but won't be exact due to screen integer resolution
416
+ assert tuple(ax.get_xlim()) == pytest.approx(expectedxlim, abs=0.02)
417
+ assert tuple(ax.get_ylim()) == pytest.approx(expectedylim, abs=0.02)
418
+
419
+
420
+ def test_toolmanager_remove():
421
+ with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
422
+ plt.rcParams['toolbar'] = 'toolmanager'
423
+ fig = plt.gcf()
424
+ initial_len = len(fig.canvas.manager.toolmanager.tools)
425
+ assert 'forward' in fig.canvas.manager.toolmanager.tools
426
+ fig.canvas.manager.toolmanager.remove_tool('forward')
427
+ assert len(fig.canvas.manager.toolmanager.tools) == initial_len - 1
428
+ assert 'forward' not in fig.canvas.manager.toolmanager.tools
429
+
430
+
431
+ def test_toolmanager_get_tool():
432
+ with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
433
+ plt.rcParams['toolbar'] = 'toolmanager'
434
+ fig = plt.gcf()
435
+ rubberband = fig.canvas.manager.toolmanager.get_tool('rubberband')
436
+ assert isinstance(rubberband, RubberbandBase)
437
+ assert fig.canvas.manager.toolmanager.get_tool(rubberband) is rubberband
438
+ with pytest.warns(UserWarning,
439
+ match="ToolManager does not control tool 'foo'"):
440
+ assert fig.canvas.manager.toolmanager.get_tool('foo') is None
441
+ assert fig.canvas.manager.toolmanager.get_tool('foo', warn=False) is None
442
+
443
+ with pytest.warns(UserWarning,
444
+ match="ToolManager does not control tool 'foo'"):
445
+ assert fig.canvas.manager.toolmanager.trigger_tool('foo') is None
446
+
447
+
448
+ def test_toolmanager_update_keymap():
449
+ with pytest.warns(UserWarning, match=_EXPECTED_WARNING_TOOLMANAGER):
450
+ plt.rcParams['toolbar'] = 'toolmanager'
451
+ fig = plt.gcf()
452
+ assert 'v' in fig.canvas.manager.toolmanager.get_tool_keymap('forward')
453
+ with pytest.warns(UserWarning,
454
+ match="Key c changed from back to forward"):
455
+ fig.canvas.manager.toolmanager.update_keymap('forward', 'c')
456
+ assert fig.canvas.manager.toolmanager.get_tool_keymap('forward') == ['c']
457
+ with pytest.raises(KeyError, match="'foo' not in Tools"):
458
+ fig.canvas.manager.toolmanager.update_keymap('foo', 'c')
459
+
460
+
461
+ @pytest.mark.parametrize("tool", ["zoom", "pan"])
462
+ @pytest.mark.parametrize("button", [MouseButton.LEFT, MouseButton.RIGHT])
463
+ @pytest.mark.parametrize("patch_vis", [True, False])
464
+ @pytest.mark.parametrize("forward_nav", [True, False, "auto"])
465
+ @pytest.mark.parametrize("t_s", ["twin", "share"])
466
+ def test_interactive_pan_zoom_events(tool, button, patch_vis, forward_nav, t_s):
467
+ # Bottom axes: ax_b Top axes: ax_t
468
+ fig, ax_b = plt.subplots()
469
+ ax_t = fig.add_subplot(221, zorder=99)
470
+ ax_t.set_forward_navigation_events(forward_nav)
471
+ ax_t.patch.set_visible(patch_vis)
472
+
473
+ # ----------------------------
474
+ if t_s == "share":
475
+ ax_t_twin = fig.add_subplot(222)
476
+ ax_t_twin.sharex(ax_t)
477
+ ax_t_twin.sharey(ax_t)
478
+
479
+ ax_b_twin = fig.add_subplot(223)
480
+ ax_b_twin.sharex(ax_b)
481
+ ax_b_twin.sharey(ax_b)
482
+ elif t_s == "twin":
483
+ ax_t_twin = ax_t.twinx()
484
+ ax_b_twin = ax_b.twinx()
485
+
486
+ # just some styling to simplify manual checks
487
+ ax_t.set_label("ax_t")
488
+ ax_t.patch.set_facecolor((1, 0, 0, 0.5))
489
+
490
+ ax_t_twin.set_label("ax_t_twin")
491
+ ax_t_twin.patch.set_facecolor("r")
492
+
493
+ ax_b.set_label("ax_b")
494
+ ax_b.patch.set_facecolor((0, 0, 1, 0.5))
495
+
496
+ ax_b_twin.set_label("ax_b_twin")
497
+ ax_b_twin.patch.set_facecolor("b")
498
+
499
+ # ----------------------------
500
+
501
+ # Set initial axis limits
502
+ init_xlim, init_ylim = (0, 10), (0, 10)
503
+ for ax in [ax_t, ax_b]:
504
+ ax.set_xlim(*init_xlim)
505
+ ax.set_ylim(*init_ylim)
506
+
507
+ # Mouse from 2 to 1 (in data-coordinates of ax_t).
508
+ xstart_t, xstop_t, ystart_t, ystop_t = 1, 2, 1, 2
509
+ # Convert to screen coordinates ("s"). Events are defined only with pixel
510
+ # precision, so round the pixel values, and below, check against the
511
+ # corresponding xdata/ydata, which are close but not equal to s0/s1.
512
+ s0 = ax_t.transData.transform((xstart_t, ystart_t)).astype(int)
513
+ s1 = ax_t.transData.transform((xstop_t, ystop_t)).astype(int)
514
+
515
+ # Calculate the mouse-distance in data-coordinates of the bottom-axes
516
+ xstart_b, ystart_b = ax_b.transData.inverted().transform(s0)
517
+ xstop_b, ystop_b = ax_b.transData.inverted().transform(s1)
518
+
519
+ # Set up the mouse movements
520
+ start_event = MouseEvent("button_press_event", fig.canvas, *s0, button)
521
+ drag_event = MouseEvent(
522
+ "motion_notify_event", fig.canvas, *s1, button, buttons={button})
523
+ stop_event = MouseEvent("button_release_event", fig.canvas, *s1, button)
524
+
525
+ tb = NavigationToolbar2(fig.canvas)
526
+
527
+ if tool == "zoom":
528
+ # Evaluate expected limits before executing the zoom-event
529
+ direction = ("in" if button == 1 else "out")
530
+
531
+ xlim_t, ylim_t = ax_t._prepare_view_from_bbox([*s0, *s1], direction)
532
+
533
+ if ax_t.get_forward_navigation_events() is True:
534
+ xlim_b, ylim_b = ax_b._prepare_view_from_bbox([*s0, *s1], direction)
535
+ elif ax_t.get_forward_navigation_events() is False:
536
+ xlim_b = init_xlim
537
+ ylim_b = init_ylim
538
+ else:
539
+ if not ax_t.patch.get_visible():
540
+ xlim_b, ylim_b = ax_b._prepare_view_from_bbox([*s0, *s1], direction)
541
+ else:
542
+ xlim_b = init_xlim
543
+ ylim_b = init_ylim
544
+
545
+ tb.zoom()
546
+
547
+ else:
548
+ # Evaluate expected limits
549
+ # (call start_pan to make sure ax._pan_start is set)
550
+ ax_t.start_pan(*s0, button)
551
+ xlim_t, ylim_t = ax_t._get_pan_points(button, None, *s1).T.astype(float)
552
+ ax_t.end_pan()
553
+
554
+ if ax_t.get_forward_navigation_events() is True:
555
+ ax_b.start_pan(*s0, button)
556
+ xlim_b, ylim_b = ax_b._get_pan_points(button, None, *s1).T.astype(float)
557
+ ax_b.end_pan()
558
+ elif ax_t.get_forward_navigation_events() is False:
559
+ xlim_b = init_xlim
560
+ ylim_b = init_ylim
561
+ else:
562
+ if not ax_t.patch.get_visible():
563
+ ax_b.start_pan(*s0, button)
564
+ xlim_b, ylim_b = ax_b._get_pan_points(button, None, *s1).T.astype(float)
565
+ ax_b.end_pan()
566
+ else:
567
+ xlim_b = init_xlim
568
+ ylim_b = init_ylim
569
+
570
+ tb.pan()
571
+
572
+ start_event._process()
573
+ drag_event._process()
574
+ stop_event._process()
575
+
576
+ assert ax_t.get_xlim() == pytest.approx(xlim_t, abs=0.15)
577
+ assert ax_t.get_ylim() == pytest.approx(ylim_t, abs=0.15)
578
+ assert ax_b.get_xlim() == pytest.approx(xlim_b, abs=0.15)
579
+ assert ax_b.get_ylim() == pytest.approx(ylim_b, abs=0.15)
580
+
581
+ # Check if twin-axes are properly triggered
582
+ assert ax_t.get_xlim() == pytest.approx(ax_t_twin.get_xlim(), abs=0.15)
583
+ assert ax_b.get_xlim() == pytest.approx(ax_b_twin.get_xlim(), abs=0.15)
584
+
585
+
586
+ def test_get_width_height_floating_point_precision():
587
+ fig = plt.figure(figsize=(1, 2.03), dpi=100)
588
+ assert fig.bbox.height < 203 # due to floating-point precision
589
+ assert fig.canvas.get_width_height() == (100, 203)
hug/lib/python3.12/site-packages/matplotlib/tests/test_backend_cairo.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ import pytest
4
+
5
+ import matplotlib.pyplot as plt
6
+ from matplotlib.testing.decorators import check_figures_equal
7
+ from matplotlib import (
8
+ collections as mcollections, patches as mpatches, path as mpath)
9
+
10
+
11
+ @pytest.mark.backend('cairo')
12
+ @check_figures_equal()
13
+ def test_patch_alpha_coloring(fig_test, fig_ref):
14
+ """
15
+ Test checks that the patch and collection are rendered with the specified
16
+ alpha values in their facecolor and edgecolor.
17
+ """
18
+ star = mpath.Path.unit_regular_star(6)
19
+ circle = mpath.Path.unit_circle()
20
+ # concatenate the star with an internal cutout of the circle
21
+ verts = np.concatenate([circle.vertices, star.vertices[::-1]])
22
+ codes = np.concatenate([circle.codes, star.codes])
23
+ cut_star1 = mpath.Path(verts, codes)
24
+ cut_star2 = mpath.Path(verts + 1, codes)
25
+
26
+ # Reference: two separate patches
27
+ ax = fig_ref.subplots()
28
+ ax.set_xlim([-1, 2])
29
+ ax.set_ylim([-1, 2])
30
+ patch = mpatches.PathPatch(cut_star1,
31
+ linewidth=5, linestyle='dashdot',
32
+ facecolor=(1, 0, 0, 0.5),
33
+ edgecolor=(0, 0, 1, 0.75))
34
+ ax.add_patch(patch)
35
+ patch = mpatches.PathPatch(cut_star2,
36
+ linewidth=5, linestyle='dashdot',
37
+ facecolor=(1, 0, 0, 0.5),
38
+ edgecolor=(0, 0, 1, 0.75))
39
+ ax.add_patch(patch)
40
+
41
+ # Test: path collection
42
+ ax = fig_test.subplots()
43
+ ax.set_xlim([-1, 2])
44
+ ax.set_ylim([-1, 2])
45
+ col = mcollections.PathCollection([cut_star1, cut_star2],
46
+ linewidth=5, linestyles='dashdot',
47
+ facecolor=(1, 0, 0, 0.5),
48
+ edgecolor=(0, 0, 1, 0.75))
49
+ ax.add_collection(col)
50
+
51
+ # Have pyplot manage the figures to ensure the cairo backend is used
52
+ plt.figure(fig_ref)
53
+ plt.figure(fig_test)