amalgam-lang 7.1.0__tar.gz → 7.2.1__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.

Potentially problematic release.


This version of amalgam-lang might be problematic. Click here for more details.

Files changed (70) hide show
  1. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.github/workflows/build.yml +33 -37
  2. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/PKG-INFO +1 -1
  3. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/api.py +142 -9
  4. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/amd64/amalgam-mt-noavx.dylib +0 -0
  5. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/amd64/amalgam-mt.dylib +0 -0
  6. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/amd64/amalgam-omp.dylib +0 -0
  7. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/amd64/amalgam-st.dylib +0 -0
  8. amalgam-lang-7.2.1/amalgam/lib/darwin/amd64/docs/version.json +3 -0
  9. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/arm64/amalgam-mt.dylib +0 -0
  10. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/arm64/amalgam-omp.dylib +0 -0
  11. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/darwin/arm64/amalgam-st.dylib +0 -0
  12. amalgam-lang-7.2.1/amalgam/lib/darwin/arm64/docs/version.json +3 -0
  13. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/linux/amd64/amalgam-mt-noavx.so +0 -0
  14. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/linux/amd64/amalgam-mt.so +0 -0
  15. amalgam-lang-7.2.1/amalgam/lib/linux/amd64/amalgam-omp.so +0 -0
  16. amalgam-lang-7.2.1/amalgam/lib/linux/amd64/amalgam-st.so +0 -0
  17. amalgam-lang-7.2.1/amalgam/lib/linux/amd64/docs/version.json +3 -0
  18. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/linux/arm64/amalgam-mt.so +0 -0
  19. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/linux/arm64/amalgam-omp.so +0 -0
  20. amalgam-lang-7.2.1/amalgam/lib/linux/arm64/amalgam-st.so +0 -0
  21. amalgam-lang-7.2.1/amalgam/lib/linux/arm64/docs/version.json +3 -0
  22. amalgam-lang-7.2.1/amalgam/lib/linux/arm64_8a/amalgam-st.so +0 -0
  23. amalgam-lang-7.2.1/amalgam/lib/linux/arm64_8a/docs/version.json +3 -0
  24. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/version.json +3 -3
  25. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/windows/amd64/amalgam-mt-noavx.dll +0 -0
  26. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/windows/amd64/amalgam-mt.dll +0 -0
  27. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/windows/amd64/amalgam-omp.dll +0 -0
  28. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/lib/windows/amd64/amalgam-st.dll +0 -0
  29. amalgam-lang-7.2.1/amalgam/lib/windows/amd64/docs/version.json +3 -0
  30. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam_lang.egg-info/PKG-INFO +1 -1
  31. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/version.json +1 -1
  32. amalgam-lang-7.1.0/amalgam/lib/darwin/amd64/docs/version.json +0 -3
  33. amalgam-lang-7.1.0/amalgam/lib/darwin/arm64/docs/version.json +0 -3
  34. amalgam-lang-7.1.0/amalgam/lib/linux/amd64/amalgam-omp.so +0 -0
  35. amalgam-lang-7.1.0/amalgam/lib/linux/amd64/amalgam-st.so +0 -0
  36. amalgam-lang-7.1.0/amalgam/lib/linux/amd64/docs/version.json +0 -3
  37. amalgam-lang-7.1.0/amalgam/lib/linux/arm64/amalgam-st.so +0 -0
  38. amalgam-lang-7.1.0/amalgam/lib/linux/arm64/docs/version.json +0 -3
  39. amalgam-lang-7.1.0/amalgam/lib/linux/arm64_8a/amalgam-st.so +0 -0
  40. amalgam-lang-7.1.0/amalgam/lib/linux/arm64_8a/docs/version.json +0 -3
  41. amalgam-lang-7.1.0/amalgam/lib/windows/amd64/docs/version.json +0 -3
  42. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.coveragerc +0 -0
  43. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.flake8 +0 -0
  44. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.github/CODEOWNERS +0 -0
  45. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.github/templates/version_summary.md +0 -0
  46. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.github/workflows/build-pr.yml +0 -0
  47. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.github/workflows/build-release.yml +0 -0
  48. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.gitignore +0 -0
  49. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/.pylintrc +0 -0
  50. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/CONTRIBUTING.md +0 -0
  51. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/LICENSE.txt +0 -0
  52. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/MANIFEST.in +0 -0
  53. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/README.md +0 -0
  54. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam/__init__.py +0 -0
  55. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam_lang.egg-info/SOURCES.txt +0 -0
  56. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam_lang.egg-info/dependency_links.txt +0 -0
  57. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam_lang.egg-info/requires.txt +0 -0
  58. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/amalgam_lang.egg-info/top_level.txt +0 -0
  59. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/bin/build.sh +0 -0
  60. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/config/latest-mt-debug-howso.yml +0 -0
  61. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/config/latest-mt-howso.yml +0 -0
  62. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/config/latest-st-debug-howso.yml +0 -0
  63. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/config/latest-st-howso.yml +0 -0
  64. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/doc/dependency_decisions.yml +0 -0
  65. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/pyproject.toml +0 -0
  66. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/requirements-3.10-dev.txt +0 -0
  67. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/requirements-3.11-dev.txt +0 -0
  68. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/requirements-3.8-dev.txt +0 -0
  69. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/requirements-3.9-dev.txt +0 -0
  70. {amalgam-lang-7.1.0 → amalgam-lang-7.2.1}/setup.cfg +0 -0
@@ -278,7 +278,7 @@ jobs:
278
278
  config-pretty: 'MT'
279
279
  upstream-details: ${{ needs.metadata.outputs.upstream-details }}
280
280
 
281
- release:
281
+ publish:
282
282
  if: inputs.build-type == 'release'
283
283
  needs:
284
284
  - metadata
@@ -291,43 +291,39 @@ jobs:
291
291
  - pytest-windows-3-11-mt
292
292
  runs-on: ubuntu-latest
293
293
  environment:
294
- name: pypi
294
+ name: PyPi
295
295
  permissions:
296
- contents: write
297
296
  id-token: write
298
-
299
297
  steps:
300
298
 
301
- - uses: actions/checkout@v4
302
-
303
- - name: Download Artifacts
304
- uses: actions/download-artifact@v4
305
- with:
306
- path: ./tmp
307
-
308
- - name: Clean up dir
309
- run: |
310
- mkdir -p dist
311
- find ./tmp -type f -name '*.whl' -exec mv -t ./dist {} +
312
- find ./tmp -type f -name '*.tar.gz' -exec mv -t ./dist {} +
313
- ls ./dist
314
-
315
- - name: Create Release
316
- uses: ncipollo/release-action@v1
317
- with:
318
- tag: ${{ needs.metadata.outputs.version }}
319
- commit: ${{ github.sha }}
320
- name: "${{ github.event.repository.name }} ${{ needs.metadata.outputs.version }}"
321
- artifactErrorsFailBuild: true
322
- generateReleaseNotes: true
323
- makeLatest: legacy
324
- artifacts: "dist/*"
325
- artifactContentType: application/gzip
326
-
327
- - name: Set up Python
328
- uses: actions/setup-python@v5
329
- with:
330
- python-version: "3.11"
331
-
332
- - name: Publish distribution to PyPI
333
- uses: pypa/gh-action-pypi-publish@release/v1
299
+ - name: Download Artifacts
300
+ uses: actions/download-artifact@v4
301
+ with:
302
+ path: ./tmp
303
+
304
+ - name: Configure environment
305
+ run: |
306
+ mkdir -p dist
307
+ find ./tmp -type f -name '*.whl' -exec cp -t ./dist {} +
308
+ find ./tmp -type f -name '*.tar.gz' -exec cp -t ./dist {} +
309
+ ls ./dist
310
+
311
+ - name: Set up Python
312
+ uses: actions/setup-python@v5
313
+ with:
314
+ python-version: "3.11"
315
+
316
+ - name: Publish [PyPi]
317
+ uses: pypa/gh-action-pypi-publish@release/v1
318
+
319
+ release:
320
+ if: inputs.build-type == 'release'
321
+ needs:
322
+ - metadata
323
+ - publish
324
+ uses: howsoai/.github/.github/workflows/release.yml@main
325
+ secrets: inherit
326
+ with:
327
+ publish_location: 'PyPi'
328
+ version: ${{ needs.metadata.outputs.version }}
329
+ publish_name: 'amalgam-lang'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: amalgam-lang
3
- Version: 7.1.0
3
+ Version: 7.2.1
4
4
  Summary: A direct interface with Amalgam compiled DLL or so.
5
5
  Author: Howso Incorporated
6
6
  Author-email: support@howso.com
@@ -596,7 +596,10 @@ class Amalgam:
596
596
  handle_buf = self.str_to_char_p(handle)
597
597
  label_buf = self.str_to_char_p(label)
598
598
 
599
- self._log_execution(f"GET_JSON_FROM_LABEL \"{handle}\" \"{label}\"")
599
+ self._log_execution((
600
+ f"GET_JSON_FROM_LABEL \"{self.escape_double_quotes(handle)}\" "
601
+ f"\"{self.escape_double_quotes(label)}\""
602
+ ))
600
603
  result = self.char_p_to_bytes(self.amlg.GetJSONPtrFromLabel(handle_buf, label_buf))
601
604
  self._log_reply(result)
602
605
 
@@ -630,7 +633,11 @@ class Amalgam:
630
633
  label_buf = self.str_to_char_p(label)
631
634
  json_buf = self.str_to_char_p(json)
632
635
 
633
- self._log_execution(f"SET_JSON_TO_LABEL \"{handle}\" \"{label}\" {json}")
636
+ self._log_execution((
637
+ f"SET_JSON_TO_LABEL \"{self.escape_double_quotes(handle)}\" "
638
+ f"\"{self.escape_double_quotes(label)}\" "
639
+ f"{json}"
640
+ ))
634
641
  self.amlg.SetJSONToLabel(handle_buf, label_buf, json_buf)
635
642
  self._log_reply(None)
636
643
 
@@ -657,10 +664,10 @@ class Amalgam:
657
664
  The handle to assign the entity.
658
665
  amlg_path : str
659
666
  The path to the filename.amlg/caml file.
660
- persist : bool
667
+ persist : bool, default False
661
668
  If set to true, all transactions will trigger the entity to be
662
669
  saved over the original source.
663
- load_contained : bool
670
+ load_contained : bool, default False
664
671
  If set to true, contained entities will be loaded.
665
672
  write_log : str, default ""
666
673
  Path to the write log. If empty string, the write log is
@@ -683,7 +690,8 @@ class Amalgam:
683
690
  print_log_buf = self.str_to_char_p(print_log)
684
691
 
685
692
  load_command_log_entry = (
686
- f"LOAD_ENTITY \"{handle}\" \"{amlg_path}\" {str(persist).lower()} "
693
+ f"LOAD_ENTITY \"{self.escape_double_quotes(handle)}\" "
694
+ f"\"{self.escape_double_quotes(amlg_path)}\" {str(persist).lower()} "
687
695
  f"{str(load_contained).lower()} \"{write_log}\" \"{print_log}\""
688
696
  )
689
697
  self._log_execution(load_command_log_entry)
@@ -721,7 +729,7 @@ class Amalgam:
721
729
  self.amlg.VerifyEntity.restype = _LoadEntityStatus
722
730
  amlg_path_buf = self.str_to_char_p(amlg_path)
723
731
 
724
- self._log_execution(f"VERIFY_ENTITY \"{amlg_path}\"")
732
+ self._log_execution(f"VERIFY_ENTITY \"{self.escape_double_quotes(amlg_path)}\"")
725
733
  result = LoadEntityStatus(self, self.amlg.VerifyEntity(amlg_path_buf))
726
734
  self._log_reply(result)
727
735
 
@@ -729,6 +737,71 @@ class Amalgam:
729
737
  self.gc()
730
738
 
731
739
  return result
740
+
741
+ def clone_entity(
742
+ self,
743
+ handle: str,
744
+ clone_handle: str,
745
+ amlg_path: str = "",
746
+ persist: bool = False,
747
+ write_log: str = "",
748
+ print_log: str = ""
749
+ ) -> bool:
750
+ """
751
+ Clones entity specified by handle into a new entity specified by clone_handle.
752
+
753
+ Parameters
754
+ ----------
755
+ handle : str
756
+ The handle of the amalgam entity to clone.
757
+ clone_handle : str
758
+ The handle to clone the entity into.
759
+ amlg_path : str, default ""
760
+ The path to store the filename.amlg/caml file. Only relevant if persist is True.
761
+ persist : bool, default False
762
+ If set to true, all transactions will trigger the entity to be
763
+ saved over the original source.
764
+ write_log : str, default ""
765
+ Path to the write log. If empty string, the write log is
766
+ not generated.
767
+ print_log : str, default ""
768
+ Path to the print log. If empty string, the print log is
769
+ not generated.
770
+
771
+ Returns
772
+ -------
773
+ bool
774
+ True if cloned successfully, False if not.
775
+ """
776
+ self.amlg.CloneEntity.argtype = [
777
+ c_char_p, c_char_p, c_char_p, c_bool, c_char_p, c_char_p]
778
+ handle_buf = self.str_to_char_p(handle)
779
+ clone_handle_buf = self.str_to_char_p(clone_handle)
780
+ amlg_path_buf = self.str_to_char_p(amlg_path)
781
+ write_log_buf = self.str_to_char_p(write_log)
782
+ print_log_buf = self.str_to_char_p(print_log)
783
+
784
+ clone_command_log_entry = (
785
+ f'CLONE_ENTITY "{self.escape_double_quotes(handle)}" '
786
+ f'"{self.escape_double_quotes(clone_handle)}" '
787
+ f'"{self.escape_double_quotes(amlg_path)}" {str(persist).lower()} '
788
+ f'"{write_log}" "{print_log}"'
789
+ )
790
+ self._log_execution(clone_command_log_entry)
791
+ result = self.amlg.LoadEntity(
792
+ handle_buf, amlg_path_buf, persist,
793
+ write_log_buf, print_log_buf)
794
+ self._log_reply(result)
795
+
796
+ del handle_buf
797
+ del clone_handle_buf
798
+ del amlg_path_buf
799
+ del write_log_buf
800
+ del print_log_buf
801
+ self.gc()
802
+
803
+ return result
804
+
732
805
 
733
806
  def store_entity(
734
807
  self,
@@ -757,7 +830,9 @@ class Amalgam:
757
830
  amlg_path_buf = self.str_to_char_p(amlg_path)
758
831
 
759
832
  store_command_log_entry = (
760
- f"STORE_ENTITY \"{handle}\" \"{amlg_path}\" {str(update_persistence_location).lower()} "
833
+ f"STORE_ENTITY \"{self.escape_double_quotes(handle)}\" "
834
+ f"\"{self.escape_double_quotes(amlg_path)}\" "
835
+ f"{str(update_persistence_location).lower()} "
761
836
  f"{str(store_contained).lower()}"
762
837
  )
763
838
  self._log_execution(store_command_log_entry)
@@ -784,13 +859,49 @@ class Amalgam:
784
859
  self.amlg.DestroyEntity.argtype = [c_char_p]
785
860
  handle_buf = self.str_to_char_p(handle)
786
861
 
787
- self._log_execution(f"DESTROY_ENTITY \"{handle}\"")
862
+ self._log_execution(f"DESTROY_ENTITY \"{self.escape_double_quotes(handle)}\"")
788
863
  self.amlg.DestroyEntity(handle_buf)
789
864
  self._log_reply(None)
790
865
 
791
866
  del handle_buf
792
867
  self.gc()
793
868
 
869
+ def set_random_seed(
870
+ self,
871
+ handle: str,
872
+ rand_seed: str
873
+ ) -> bool:
874
+ """
875
+ Sets an entity's random seed.
876
+
877
+ Parameters
878
+ ----------
879
+ handle : str
880
+ The handle of the amalgam entity.
881
+ rand_seed : str
882
+ A string representing the random seed to set.
883
+
884
+ Returns
885
+ -------
886
+ bool
887
+ True if the set was successful, false if not.
888
+ """
889
+ self.amlg.SetRandomSeed.argtype = [c_char_p, c_char_p]
890
+ self.amlg.SetRandomSeed.restype = c_bool
891
+
892
+ handle_buf = self.str_to_char_p(handle)
893
+ rand_seed_buf = self.str_to_char_p(rand_seed)
894
+
895
+ self._log_execution(f'SET_RANDOM_SEED "{self.escape_double_quotes(handle)}"'
896
+ f'"{self.escape_double_quotes(rand_seed)}"')
897
+ result = self.amlg.SetRandomSeed(handle_buf, rand_seed)
898
+ self._log_reply(None)
899
+
900
+ del handle_buf
901
+ del rand_seed_buf
902
+ self.gc()
903
+ return result
904
+
794
905
  def get_entities(self) -> List[str]:
795
906
  """
796
907
  Get loaded top level entities.
@@ -843,7 +954,12 @@ class Amalgam:
843
954
  json_buf = self.str_to_char_p(json)
844
955
 
845
956
  self._log_time("EXECUTION START")
846
- self._log_execution(f"EXECUTE_ENTITY_JSON \"{handle}\" \"{label}\" {json}")
957
+ self._log_execution((
958
+ "EXECUTE_ENTITY_JSON "
959
+ f"\"{self.escape_double_quotes(handle)}\" "
960
+ f"\"{self.escape_double_quotes(label)}\" "
961
+ f"{json}"
962
+ ))
847
963
  result = self.char_p_to_bytes(self.amlg.ExecuteEntityJsonPtr(
848
964
  handle_buf, label_buf, json_buf))
849
965
  self._log_time("EXECUTION STOP")
@@ -1079,3 +1195,20 @@ class Amalgam:
1079
1195
  f"call to amlg.GetConcurrencyTypeString() - returned: "
1080
1196
  f"{amlg_concurrency_type}\n")
1081
1197
  return amlg_concurrency_type
1198
+
1199
+ @staticmethod
1200
+ def escape_double_quotes(s: str) -> str:
1201
+ """
1202
+ Get the string with backslashes preceeding contained double quotes.
1203
+
1204
+ Parameters
1205
+ ----------
1206
+ s : str
1207
+ The input string.
1208
+
1209
+ Returns
1210
+ -------
1211
+ str
1212
+ The modified version of s with escaped double quotes.
1213
+ """
1214
+ return s.replace('"', '\\"')
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": {
3
- "amalgam": "48.1.1",
4
- "amalgam_sha": "415ea412bb3e665a638f0bdc1d86855f88f786dc",
5
- "amalgam_url": "https://github.com/howsoai/amalgam/releases/tag/48.1.1",
3
+ "amalgam": "48.2.0",
4
+ "amalgam_sha": "fc26b24b0954ea87d8c4fde8ca0b58a17663c1ef",
5
+ "amalgam_url": "https://github.com/howsoai/amalgam/releases/tag/48.2.0",
6
6
  "amalgam_build_date": "",
7
7
  "amalgam_display_title": ""
8
8
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "version": "48.2.0"
3
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: amalgam-lang
3
- Version: 7.1.0
3
+ Version: 7.2.1
4
4
  Summary: A direct interface with Amalgam compiled DLL or so.
5
5
  Author: Howso Incorporated
6
6
  Author-email: support@howso.com
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "dependencies": {
3
- "amalgam": "48.1.1"
3
+ "amalgam": "48.2.0"
4
4
  }
5
5
  }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
@@ -1,3 +0,0 @@
1
- {
2
- "version": "48.1.1"
3
- }
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