gemd 2.1.9__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {gemd-2.1.9 → gemd-2.2.0}/PKG-INFO +3 -8
  2. gemd-2.2.0/gemd/__version__.py +1 -0
  3. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/base_entity.py +7 -3
  4. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/link_by_uid.py +6 -2
  5. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/empirical_formula.py +15 -9
  6. {gemd-2.1.9 → gemd-2.2.0}/gemd/units/impl.py +1 -2
  7. {gemd-2.1.9 → gemd-2.2.0}/gemd.egg-info/PKG-INFO +3 -8
  8. {gemd-2.1.9 → gemd-2.2.0}/gemd.egg-info/requires.txt +6 -3
  9. {gemd-2.1.9 → gemd-2.2.0}/setup.py +5 -5
  10. gemd-2.1.9/gemd/__version__.py +0 -1
  11. {gemd-2.1.9 → gemd-2.2.0}/LICENSE +0 -0
  12. {gemd-2.1.9 → gemd-2.2.0}/README.md +0 -0
  13. {gemd-2.1.9 → gemd-2.2.0}/gemd/__init__.py +0 -0
  14. {gemd-2.1.9 → gemd-2.2.0}/gemd/builders/__init__.py +0 -0
  15. {gemd-2.1.9 → gemd-2.2.0}/gemd/builders/impl.py +0 -0
  16. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/__init__.py +0 -0
  17. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/cake.py +0 -0
  18. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/material_run_example.py +0 -0
  19. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/measurement_example.py +0 -0
  20. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/strehlow_and_cook.pif +0 -0
  21. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/strehlow_and_cook.py +0 -0
  22. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/strehlow_and_cook_small.pif +0 -0
  23. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/table_example.py +0 -0
  24. {gemd-2.1.9 → gemd-2.2.0}/gemd/demo/toothpick.jpg +0 -0
  25. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/__init__.py +0 -0
  26. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/__init__.py +0 -0
  27. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/base_attribute.py +0 -0
  28. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/condition.py +0 -0
  29. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/parameter.py +0 -0
  30. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/property.py +0 -0
  31. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/attribute/property_and_conditions.py +0 -0
  32. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/__init__.py +0 -0
  33. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/base_bounds.py +0 -0
  34. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/categorical_bounds.py +0 -0
  35. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/composition_bounds.py +0 -0
  36. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/integer_bounds.py +0 -0
  37. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/molecular_structure_bounds.py +0 -0
  38. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds/real_bounds.py +0 -0
  39. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/bounds_validation.py +0 -0
  40. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/case_insensitive_dict.py +0 -0
  41. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/dict_serializable.py +0 -0
  42. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/file_link.py +0 -0
  43. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/has_dependencies.py +0 -0
  44. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/__init__.py +0 -0
  45. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/base_object.py +0 -0
  46. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_conditions.py +0 -0
  47. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_material.py +0 -0
  48. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_parameters.py +0 -0
  49. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_process.py +0 -0
  50. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_properties.py +0 -0
  51. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_quantities.py +0 -0
  52. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_source.py +0 -0
  53. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_spec.py +0 -0
  54. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_template.py +0 -0
  55. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/has_template_check_generator.py +0 -0
  56. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/ingredient_run.py +0 -0
  57. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/ingredient_spec.py +0 -0
  58. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/material_run.py +0 -0
  59. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/material_spec.py +0 -0
  60. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/measurement_run.py +0 -0
  61. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/measurement_spec.py +0 -0
  62. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/process_run.py +0 -0
  63. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/object/process_spec.py +0 -0
  64. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/setters.py +0 -0
  65. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/source/__init__.py +0 -0
  66. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/source/performed_source.py +0 -0
  67. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/__init__.py +0 -0
  68. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/attribute_template.py +0 -0
  69. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/base_template.py +0 -0
  70. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/condition_template.py +0 -0
  71. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/has_condition_templates.py +0 -0
  72. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/has_parameter_templates.py +0 -0
  73. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/has_property_templates.py +0 -0
  74. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/material_template.py +0 -0
  75. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/measurement_template.py +0 -0
  76. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/parameter_template.py +0 -0
  77. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/process_template.py +0 -0
  78. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/template/property_template.py +0 -0
  79. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/util.py +0 -0
  80. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/valid_list.py +0 -0
  81. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/__init__.py +0 -0
  82. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/base_value.py +0 -0
  83. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/categorical_value.py +0 -0
  84. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/composition_value.py +0 -0
  85. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/continuous_value.py +0 -0
  86. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/discrete_categorical.py +0 -0
  87. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/inchi_value.py +0 -0
  88. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/integer_value.py +0 -0
  89. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/molecular_value.py +0 -0
  90. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/nominal_categorical.py +0 -0
  91. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/nominal_composition.py +0 -0
  92. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/nominal_integer.py +0 -0
  93. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/nominal_real.py +0 -0
  94. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/normal_real.py +0 -0
  95. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/smiles_value.py +0 -0
  96. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/uniform_integer.py +0 -0
  97. {gemd-2.1.9 → gemd-2.2.0}/gemd/entity/value/uniform_real.py +0 -0
  98. {gemd-2.1.9 → gemd-2.2.0}/gemd/enumeration/__init__.py +0 -0
  99. {gemd-2.1.9 → gemd-2.2.0}/gemd/enumeration/base_enumeration.py +0 -0
  100. {gemd-2.1.9 → gemd-2.2.0}/gemd/enumeration/origin.py +0 -0
  101. {gemd-2.1.9 → gemd-2.2.0}/gemd/enumeration/sample_type.py +0 -0
  102. {gemd-2.1.9 → gemd-2.2.0}/gemd/json/__init__.py +0 -0
  103. {gemd-2.1.9 → gemd-2.2.0}/gemd/json/gemd_encoder.py +0 -0
  104. {gemd-2.1.9 → gemd-2.2.0}/gemd/json/gemd_json.py +0 -0
  105. {gemd-2.1.9 → gemd-2.2.0}/gemd/units/__init__.py +0 -0
  106. {gemd-2.1.9 → gemd-2.2.0}/gemd/units/citrine_en.txt +0 -0
  107. {gemd-2.1.9 → gemd-2.2.0}/gemd/units/constants_en.txt +0 -0
  108. {gemd-2.1.9 → gemd-2.2.0}/gemd/util/__init__.py +0 -0
  109. {gemd-2.1.9 → gemd-2.2.0}/gemd/util/impl.py +0 -0
  110. {gemd-2.1.9 → gemd-2.2.0}/gemd.egg-info/SOURCES.txt +0 -0
  111. {gemd-2.1.9 → gemd-2.2.0}/gemd.egg-info/dependency_links.txt +0 -0
  112. {gemd-2.1.9 → gemd-2.2.0}/gemd.egg-info/top_level.txt +0 -0
  113. {gemd-2.1.9 → gemd-2.2.0}/setup.cfg +0 -0
  114. {gemd-2.1.9 → gemd-2.2.0}/tests/__init__.py +0 -0
  115. {gemd-2.1.9 → gemd-2.2.0}/tests/test_examples.py +0 -0
  116. {gemd-2.1.9 → gemd-2.2.0}/tests/units/__init__.py +0 -0
  117. {gemd-2.1.9 → gemd-2.2.0}/tests/units/test_parser.py +0 -0
  118. {gemd-2.1.9 → gemd-2.2.0}/tests/units/test_units.txt +0 -0
@@ -1,23 +1,18 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gemd
3
- Version: 2.1.9
3
+ Version: 2.2.0
4
4
  Summary: Python binding for Citrine's GEMD data model
5
5
  Home-page: http://github.com/CitrineInformatics/gemd-python
6
6
  Author: Citrine Informatics
7
- License: UNKNOWN
8
- Platform: UNKNOWN
9
7
  Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.8
11
8
  Classifier: Programming Language :: Python :: 3.9
12
9
  Classifier: Programming Language :: Python :: 3.10
13
10
  Classifier: Programming Language :: Python :: 3.11
14
11
  Classifier: Programming Language :: Python :: 3.12
15
- Requires-Python: >=3.8
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Requires-Python: >=3.9
16
14
  Provides-Extra: scripts
17
15
  Provides-Extra: tests
18
16
  Provides-Extra: tests.demo
19
17
  Provides-Extra: tests.entity.bounds
20
18
  License-File: LICENSE
21
-
22
- UNKNOWN
23
-
@@ -0,0 +1 @@
1
+ __version__ = "2.2.0"
@@ -207,11 +207,15 @@ class BaseEntity(DictSerializable):
207
207
  # Note that this could violate transitivity -- Link(scope1) == obj == Link(scope2)
208
208
  def __eq__(self, other):
209
209
  from gemd.entity.link_by_uid import LinkByUID
210
- if isinstance(other, LinkByUID):
210
+ from gemd.util import cached_isinstance
211
+
212
+ if id(self) == id(other):
213
+ return True
214
+ elif cached_isinstance(other, LinkByUID):
211
215
  return self.uids.get(other.scope) == other.id
212
- elif isinstance(other, tuple):
216
+ elif cached_isinstance(other, tuple):
213
217
  return len(other) == 2 and other[0] in self.uids and self.uids[other[0]] == other[1]
214
- elif isinstance(other, BaseEntity):
218
+ elif cached_isinstance(other, BaseEntity):
215
219
  # We have to be a little clever for efficiency and to avoid infinite recursion
216
220
  return BaseEntity._cached_equals(self, other)
217
221
  else:
@@ -67,12 +67,16 @@ class LinkByUID(DictSerializable, typ="link_by_uid"):
67
67
  # Note that this could violate transitivity
68
68
  def __eq__(self, other):
69
69
  from gemd.entity.base_entity import BaseEntity
70
- if isinstance(other, BaseEntity):
70
+ from gemd.util import cached_isinstance
71
+
72
+ if cached_isinstance(other, LinkByUID):
73
+ return self.scope == other.scope and self.id == other.id
74
+ elif cached_isinstance(other, BaseEntity):
71
75
  if self.scope in other.uids:
72
76
  return other.uids[self.scope] == self.id
73
77
  else:
74
78
  return False
75
- elif isinstance(other, tuple): # Make them interchangeable in a dict
79
+ elif cached_isinstance(other, tuple): # Make them interchangeable in a dict
76
80
  return len(other) == 2 and (self.scope, self.id) == other
77
81
  else:
78
82
  return super().__eq__(other)
@@ -1,19 +1,25 @@
1
1
  """An empirical chemical formula."""
2
+ import re
3
+
2
4
  from gemd.entity.value.composition_value import CompositionValue
3
5
  from gemd.entity.bounds import CompositionBounds
4
6
 
5
7
  __all__ = ["EmpiricalFormula"]
6
8
 
7
9
 
8
- _all_elements = {
9
- 'Tb', 'Be', 'Sb', 'Re', 'Sr', 'Ac', 'Ho', 'Ir', 'Cr', 'Os', 'S', 'Pt', 'Si', 'C', 'V', 'Bi',
10
- 'U', 'Pr', 'B', 'O', 'Zn', 'Xe', 'N', 'Ni', 'No', 'Ti', 'Pa', 'Am', 'Cu', 'I', 'Al', 'Ba',
11
- 'Pu', 'Ca', 'Bk', 'Ge', 'In', 'H', 'Es', 'Se', 'Cs', 'Te', 'Rn', 'Hf', 'Cm', 'Kr', 'Y',
12
- 'Cf', 'Li', 'F', 'Hg', 'Sm', 'Nd', 'Br', 'Er', 'K', 'Zr', 'Pd', 'Au', 'Eu', 'Md', 'Ga', 'As',
13
- 'Mn', 'Ag', 'Nb', 'Gd', 'Ru', 'Po', 'W', 'Na', 'Cl', 'Mo', 'Rh', 'Pm', 'Rb', 'Np', 'Lr',
14
- 'Ce', 'Ra', 'Tm', 'Dy', 'Fr', 'Sc', 'Lu', 'Fe', 'Fm', 'Cd', 'Ar', 'Mg', 'P', 'Th', 'Co',
15
- 'Tc', 'Pb', 'Ta', 'Tl', 'At', 'He', 'Yb', 'La', 'Sn', 'Ne'
16
- }
10
+ _periodic_table = """
11
+ H D T He
12
+ Li Be B C N O F Ne
13
+ Na Mg Al Si P S Cl Ar
14
+ K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr
15
+ Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe
16
+ Cs Ba Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn
17
+ Fr Ra Rf Db Sg Bh Hs Mt Ds Rg Cn Nh Fl Mc Lv Ts Og
18
+
19
+ La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu
20
+ Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr
21
+ """
22
+ _all_elements = re.split(r"\s+", _periodic_table.strip())
17
23
 
18
24
 
19
25
  class EmpiricalFormula(CompositionValue, typ="empirical_formula"):
@@ -307,7 +307,7 @@ def _format_clean(unit, registry, **options):
307
307
  """
308
308
  try: # Informal route changed in 0.22
309
309
  from pint.formatting import _FORMATTERS
310
- formatter = _FORMATTERS["D"]
310
+ formatter = _FORMATTERS["D"] # pragma: no cover
311
311
  except ImportError: # pragma: no cover
312
312
  from pint import Unit
313
313
  formatter_obj = registry.formatter._formatters["D"]
@@ -317,7 +317,6 @@ def _format_clean(unit, registry, **options):
317
317
  parsed = Unit(unit)
318
318
  return formatter_obj.format_unit(parsed)
319
319
  except ValueError:
320
- parsed = Unit(unit)
321
320
  return formatter_obj.format_quantity(unit)
322
321
 
323
322
  formatter = _surrogate_formatter
@@ -1,23 +1,18 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gemd
3
- Version: 2.1.9
3
+ Version: 2.2.0
4
4
  Summary: Python binding for Citrine's GEMD data model
5
5
  Home-page: http://github.com/CitrineInformatics/gemd-python
6
6
  Author: Citrine Informatics
7
- License: UNKNOWN
8
- Platform: UNKNOWN
9
7
  Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.8
11
8
  Classifier: Programming Language :: Python :: 3.9
12
9
  Classifier: Programming Language :: Python :: 3.10
13
10
  Classifier: Programming Language :: Python :: 3.11
14
11
  Classifier: Programming Language :: Python :: 3.12
15
- Requires-Python: >=3.8
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Requires-Python: >=3.9
16
14
  Provides-Extra: scripts
17
15
  Provides-Extra: tests
18
16
  Provides-Extra: tests.demo
19
17
  Provides-Extra: tests.entity.bounds
20
18
  License-File: LICENSE
21
-
22
- UNKNOWN
23
-
@@ -1,11 +1,12 @@
1
1
  deprecation<3,>=2.1.0
2
2
  importlib-resources<7,>=5.3
3
- pint!=0.22,!=0.23,<0.25,>=0.21
3
+ pint<0.25,>=0.24.4
4
4
  typing_extensions<5,>=4.8
5
5
 
6
6
  [scripts]
7
- packagingsphinx==5.0.0
7
+ packaging
8
8
  sphinx-rtd-theme==1.0.0
9
+ sphinx==5.0.0
9
10
  sphinxcontrib-apidoc==0.3.0
10
11
 
11
12
  [tests]
@@ -15,5 +16,7 @@ pytest<9,>=8.0.0
15
16
  pandas<3,>=2.0.3
16
17
 
17
18
  [tests.entity.bounds]
18
- numpy<3,>=1.24.4
19
19
  pandas<3,>=2.0.3
20
+
21
+ [tests.entity.bounds:python_version <= "3.10"]
22
+ numpy<2,>=1.24.4
@@ -15,7 +15,7 @@ else:
15
15
  setup(name='gemd',
16
16
  # Update this in gemd/__version__.py
17
17
  version=version,
18
- python_requires='>=3.8',
18
+ python_requires='>=3.9',
19
19
  url='http://github.com/CitrineInformatics/gemd-python',
20
20
  description="Python binding for Citrine's GEMD data model",
21
21
  author='Citrine Informatics',
@@ -33,14 +33,14 @@ setup(name='gemd',
33
33
  'tests.units': ['test_units.txt']
34
34
  },
35
35
  install_requires=[
36
- "pint>=0.21,<0.25,!=0.22,!=0.23", # pint 0.22,0.23 have a bad interaction w/ numpy >= 2
36
+ "pint>=0.24.4,<0.25",
37
37
  "deprecation>=2.1.0,<3",
38
38
  "typing_extensions>=4.8,<5",
39
39
  "importlib-resources>=5.3,<7"
40
40
  ],
41
41
  extras_require={
42
42
  "scripts": [
43
- "packaging"
43
+ "packaging",
44
44
  "sphinx==5.0.0",
45
45
  "sphinx-rtd-theme==1.0.0",
46
46
  "sphinxcontrib-apidoc==0.3.0",
@@ -52,16 +52,16 @@ setup(name='gemd',
52
52
  "pandas>=2.0.3,<3"
53
53
  ],
54
54
  "tests.entity.bounds": [
55
- "numpy>=1.24.4,<3",
55
+ "numpy>=1.24.4,<2; python_version<='3.10'",
56
56
  "pandas>=2.0.3,<3"
57
57
  ]
58
58
  },
59
59
  classifiers=[
60
60
  'Programming Language :: Python :: 3',
61
- 'Programming Language :: Python :: 3.8',
62
61
  'Programming Language :: Python :: 3.9',
63
62
  'Programming Language :: Python :: 3.10',
64
63
  'Programming Language :: Python :: 3.11',
65
64
  'Programming Language :: Python :: 3.12',
65
+ 'Programming Language :: Python :: 3.13',
66
66
  ],
67
67
  )
@@ -1 +0,0 @@
1
- __version__ = "2.1.9"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes