unitforge 0.3.15__tar.gz → 0.3.17__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.
- {unitforge-0.3.15 → unitforge-0.3.17}/Cargo.lock +2 -2
- {unitforge-0.3.15 → unitforge-0.3.17}/Cargo.toml +2 -2
- {unitforge-0.3.15 → unitforge-0.3.17}/PKG-INFO +1 -3
- {unitforge-0.3.15 → unitforge-0.3.17}/src/impl_macros.rs +5 -28
- {unitforge-0.3.15 → unitforge-0.3.17}/src/lib.rs +2 -0
- unitforge-0.3.17/src/quantities/inverse_angle.rs +26 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/inverse_distance.rs +0 -3
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/inverse_stress.rs +0 -1
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/stress.rs +0 -2
- {unitforge-0.3.15 → unitforge-0.3.17}/src/relations.rs +5 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/tests/quantity_unit_tests.rs +0 -16
- {unitforge-0.3.15 → unitforge-0.3.17}/unitforge_macros/Cargo.toml +1 -1
- {unitforge-0.3.15 → unitforge-0.3.17}/unitforge_macros/src/lib.rs +11 -8
- {unitforge-0.3.15 → unitforge-0.3.17}/.gitignore +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/.gitlab-ci.yml +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/Readme.md +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/Readme_py.md +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/pyproject.toml +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/python/unitforge/__init__.py +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/scripts/generate_python_stubs.py +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/prelude.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/acceleration.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/angle.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/angular_acceleration.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/angular_velocity.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/area.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/area_of_moment.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/charge.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/compliance.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/density.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/distance.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_area.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_distance.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_div_distance_power_four.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_per_volume.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_stress.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/force_volume.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/inverse_area.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/mass.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/mass_div_time_squared_volume.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/mass_per_distance.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/rotational_stiffness.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/stiffness.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/strain.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/stress_squared.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/time.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/velocity.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/velocity_squared.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/voltage.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities/volume.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/quantities.template.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/bindings/matrix3_py.template.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/bindings/vector3_py.template.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/matrix2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/matrix2x3.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/matrix3.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/matrix3x2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/vector2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/small_linalg/vector3.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/src/tests/serde_tests.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/matrix2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/matrix2x3.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/matrix3.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/matrix3x2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/ndarray_dot.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/quantities.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/small_linalg_interfaces.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/test_quantities.py +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/test_small_linalg.py +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/typecheck/mypy_smoke.py +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/vector2.rs +0 -0
- {unitforge-0.3.15 → unitforge-0.3.17}/tests/vector3.rs +0 -0
|
@@ -369,7 +369,7 @@ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
|
369
369
|
|
|
370
370
|
[[package]]
|
|
371
371
|
name = "unitforge"
|
|
372
|
-
version = "0.3.
|
|
372
|
+
version = "0.3.17"
|
|
373
373
|
dependencies = [
|
|
374
374
|
"ndarray",
|
|
375
375
|
"num-traits",
|
|
@@ -384,7 +384,7 @@ dependencies = [
|
|
|
384
384
|
|
|
385
385
|
[[package]]
|
|
386
386
|
name = "unitforge_macros"
|
|
387
|
-
version = "0.3.
|
|
387
|
+
version = "0.3.16"
|
|
388
388
|
dependencies = [
|
|
389
389
|
"regex",
|
|
390
390
|
]
|
|
@@ -4,7 +4,7 @@ crate-type = ["cdylib", "rlib"]
|
|
|
4
4
|
|
|
5
5
|
[package]
|
|
6
6
|
name = "unitforge"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.17"
|
|
8
8
|
edition = "2021"
|
|
9
9
|
authors = ["Dr.Q team <info@askdrq.com>", "Henrik Stromberg <henrik@askdrq.com>"]
|
|
10
10
|
description = "A library for unit and quantity consistent computations in Rust"
|
|
@@ -23,7 +23,7 @@ pyo3 = { version = "0.26.0", features = ["extension-module", "auto-initialize",
|
|
|
23
23
|
numpy = { version = "0.26.0", optional = true }
|
|
24
24
|
strum = { version = "0.28.0", optional = true }
|
|
25
25
|
strum_macros = { version = "0.28.0", optional = true }
|
|
26
|
-
unitforge_macros = { version = "0.3.
|
|
26
|
+
unitforge_macros = { version = "0.3.16", path = "unitforge_macros" }
|
|
27
27
|
|
|
28
28
|
[features]
|
|
29
29
|
serde = ["dep:serde", "dep:serde_json", "ndarray/serde"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: unitforge
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.17
|
|
4
4
|
Classifier: Programming Language :: Python :: 3
|
|
5
5
|
Classifier: Programming Language :: Rust
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -9,9 +9,7 @@ Classifier: Topic :: Scientific/Engineering :: Physics
|
|
|
9
9
|
Requires-Dist: numpy>=2.2.0
|
|
10
10
|
Summary: A library for unit and quantity consistent computations in Rust
|
|
11
11
|
Keywords: units,quantities,simulation,physics
|
|
12
|
-
Author: Dr.Q team <info@askdrq.com>, Henrik Stromberg <henrik@askdrq.com>
|
|
13
12
|
Author-email: "Dr.Q team" <info@askdrq.com>, Henrik Stromberg <henrik@askdrq.com>
|
|
14
|
-
License: MIT
|
|
15
13
|
Requires-Python: >=3.7
|
|
16
14
|
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
17
15
|
Project-URL: Repository, https://gitlab.com/henrikjstromberg/unitforge
|
|
@@ -3,11 +3,11 @@ macro_rules! impl_quantity {
|
|
|
3
3
|
($type:ident, $unit:ident, $display_units:expr) => {
|
|
4
4
|
use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
|
|
5
5
|
use num_traits::Zero;
|
|
6
|
-
use std::collections::HashSet;
|
|
7
6
|
use num_traits::{Float, FromPrimitive};
|
|
8
7
|
#[cfg(feature = "serde")]
|
|
9
8
|
use serde::{Deserialize, Serialize};
|
|
10
9
|
use std::cmp::Ordering;
|
|
10
|
+
use std::collections::HashSet;
|
|
11
11
|
use std::fmt;
|
|
12
12
|
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
|
|
13
13
|
use $crate::prelude::*;
|
|
@@ -20,8 +20,6 @@ macro_rules! impl_quantity {
|
|
|
20
20
|
IntoPyObject, Py, PyAny, PyRef, PyResult,
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
#[cfg(feature = "strum")]
|
|
24
|
-
use strum::IntoEnumIterator;
|
|
25
23
|
#[cfg(feature = "strum")]
|
|
26
24
|
use strum_macros::EnumIter;
|
|
27
25
|
use $crate::small_linalg::{Matrix3, Vector3};
|
|
@@ -594,35 +592,14 @@ macro_rules! impl_quantity {
|
|
|
594
592
|
}
|
|
595
593
|
}
|
|
596
594
|
|
|
597
|
-
#[cfg(feature = "strum")]
|
|
598
|
-
impl $type {
|
|
599
|
-
pub fn optimal_unit(
|
|
600
|
-
&self,
|
|
601
|
-
choices: impl Into<Option<HashSet<$unit>>>,
|
|
602
|
-
) -> Option<$unit> {
|
|
603
|
-
let choices = choices.into().unwrap_or_else(|| $unit::iter().collect());
|
|
604
|
-
let mut min_value = f64::INFINITY;
|
|
605
|
-
let mut best_unit = None;
|
|
606
|
-
for unit in choices {
|
|
607
|
-
let deviation = (self.to(unit).abs() - 1.).abs();
|
|
608
|
-
if deviation < min_value {
|
|
609
|
-
min_value = deviation;
|
|
610
|
-
best_unit = Some(unit);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
best_unit
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
#[cfg(not(feature = "strum"))]
|
|
618
595
|
impl $type {
|
|
619
596
|
pub fn optimal_unit(&self, choices: HashSet<$unit>) -> Option<$unit> {
|
|
620
|
-
let mut min_value =
|
|
597
|
+
let mut min_value = i32::MAX;
|
|
621
598
|
let mut best_unit = None;
|
|
622
599
|
for unit in choices {
|
|
623
|
-
let
|
|
624
|
-
if
|
|
625
|
-
min_value =
|
|
600
|
+
let difference = (self.power - unit.base_per_x().1).abs();
|
|
601
|
+
if difference < min_value {
|
|
602
|
+
min_value = difference;
|
|
626
603
|
best_unit = Some(unit);
|
|
627
604
|
}
|
|
628
605
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
use crate::impl_macros::macros::*;
|
|
2
|
+
|
|
3
|
+
#[cfg_attr(feature = "strum", derive(EnumIter))]
|
|
4
|
+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
|
5
|
+
#[derive(Copy, Clone, PartialEq, Debug, Hash, Eq)]
|
|
6
|
+
#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
|
|
7
|
+
pub enum InverseAngleUnit {
|
|
8
|
+
_rad,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
impl PhysicsUnit for InverseAngleUnit {
|
|
12
|
+
fn name(&self) -> &str {
|
|
13
|
+
match &self {
|
|
14
|
+
InverseAngleUnit::_rad => "1/rad",
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fn base_per_x(&self) -> (f64, i32) {
|
|
19
|
+
match self {
|
|
20
|
+
InverseAngleUnit::_rad => (1., 0),
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
impl_quantity!(InverseAngle, InverseAngleUnit, [InverseAngleUnit::_rad]);
|
|
26
|
+
impl_div_with_self_to_f64!(InverseAngle);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
use crate::impl_macros::macros::*;
|
|
2
|
-
use crate::quantities::*;
|
|
3
2
|
|
|
4
3
|
#[cfg_attr(feature = "strum", derive(EnumIter))]
|
|
5
4
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
|
@@ -59,5 +58,3 @@ impl_quantity!(
|
|
|
59
58
|
[InverseDistanceUnit::_mm]
|
|
60
59
|
);
|
|
61
60
|
impl_div_with_self_to_f64!(InverseDistance);
|
|
62
|
-
|
|
63
|
-
impl_mul!(InverseDistance, Distance, f64);
|
|
@@ -25,7 +25,6 @@ impl PhysicsUnit for InverseStressUnit {
|
|
|
25
25
|
|
|
26
26
|
impl_quantity!(InverseStress, InverseStressUnit, [InverseStressUnit::_Pa]);
|
|
27
27
|
impl_div_with_self_to_f64!(InverseStress);
|
|
28
|
-
impl_mul!(InverseStress, Stress, f64);
|
|
29
28
|
|
|
30
29
|
impl Div<InverseStress> for f64 {
|
|
31
30
|
type Output = Stress;
|
|
@@ -40,8 +40,6 @@ impl PhysicsUnit for StressUnit {
|
|
|
40
40
|
|
|
41
41
|
impl_quantity!(Stress, StressUnit, [StressUnit::MPa]);
|
|
42
42
|
impl_div_with_self_to_f64!(Stress);
|
|
43
|
-
impl_div!(Stress, Strain, Stress);
|
|
44
|
-
impl_mul!(Stress, Strain, Stress);
|
|
45
43
|
|
|
46
44
|
impl Div<Stress> for f64 {
|
|
47
45
|
type Output = InverseStress;
|
|
@@ -55,6 +55,11 @@ impl_mul_relation_with_other!(AngularAcceleration, Density, MassDivTimeSquaredVo
|
|
|
55
55
|
impl_mul_relation_with_other!(MassDivTimeSquaredVolume, Area, Stress);
|
|
56
56
|
impl_mul_relation_with_other!(Force, Volume, ForceVolume);
|
|
57
57
|
impl_mul_relation_with_other!(Velocity, AngularVelocity, Acceleration);
|
|
58
|
+
impl_mul!(InverseDistance, Distance, f64);
|
|
59
|
+
impl_mul!(InverseAngle, Angle, f64);
|
|
60
|
+
impl_mul!(InverseStress, Stress, f64);
|
|
61
|
+
impl_div!(Stress, Strain, Stress);
|
|
62
|
+
impl_mul!(Stress, Strain, Stress);
|
|
58
63
|
|
|
59
64
|
impl_mul_relation_with_self!(Distance, Area);
|
|
60
65
|
impl_mul_relation_with_self!(Area, AreaOfMoment);
|
|
@@ -101,22 +101,6 @@ mod tests {
|
|
|
101
101
|
assert!((result.to(ForceStressUnit::Nsq_msq) - 6.0).abs() < 1E-12);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
#[cfg(feature = "strum")]
|
|
105
|
-
#[test]
|
|
106
|
-
fn test_optimal_unit() {
|
|
107
|
-
let area = Area::new(0.0001, AreaUnit::msq);
|
|
108
|
-
let optimal_unit = area.optimal_unit(None).unwrap();
|
|
109
|
-
assert_eq!(optimal_unit, AreaUnit::cmsq)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
#[cfg(feature = "strum")]
|
|
113
|
-
#[test]
|
|
114
|
-
fn test_optimal_unit_with_selection_strum() {
|
|
115
|
-
let area = Area::new(0.0001, AreaUnit::msq);
|
|
116
|
-
let optimal_unit = area.optimal_unit(Some(vec![AreaUnit::kmsq, AreaUnit::cmsq, AreaUnit::nmsq].into_iter().collect())).unwrap();
|
|
117
|
-
assert_eq!(optimal_unit, AreaUnit::cmsq)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
104
|
#[test]
|
|
121
105
|
fn test_optimal_unit_with_selection() {
|
|
122
106
|
let area = Area::new(0.0001, AreaUnit::msq);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "unitforge_macros"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.16"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["Dr.Q team <info@askdrq.com>", "Henrik Stromberg <henrik@askdrq.com>"]
|
|
6
6
|
description = "Proc macros for generating units, quantities, and Python bindings in unitforge"
|
|
@@ -241,7 +241,9 @@ fn parse_unit_variants(files: &[String], unit_name: &str) -> Result<Vec<String>,
|
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
|
|
244
|
-
Err(format!(
|
|
244
|
+
Err(format!(
|
|
245
|
+
"Enum {unit_name} not found in quantity source files"
|
|
246
|
+
))
|
|
245
247
|
}
|
|
246
248
|
|
|
247
249
|
fn fnv1a32(input: &str) -> u32 {
|
|
@@ -443,12 +445,10 @@ fn write_quantity_code(
|
|
|
443
445
|
let mut id_to_variant_match = String::new();
|
|
444
446
|
for variant_name in unit_variant_list {
|
|
445
447
|
let variant_id = stable_unit_variant_id(&unit_name, variant_name);
|
|
446
|
-
variant_to_id_match +=
|
|
447
|
-
" {struct_name}Unit::{variant_name} => {variant_id},\n"
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
" {variant_id} => Some({struct_name}Unit::{variant_name}),\n"
|
|
451
|
-
);
|
|
448
|
+
variant_to_id_match +=
|
|
449
|
+
&format!(" {struct_name}Unit::{variant_name} => {variant_id},\n");
|
|
450
|
+
id_to_variant_match +=
|
|
451
|
+
&format!(" {variant_id} => Some({struct_name}Unit::{variant_name}),\n");
|
|
452
452
|
}
|
|
453
453
|
unit_variant_id_impls += &format!(
|
|
454
454
|
"impl pyo3_capsule_api::UnitVariantId for {struct_name}Unit {{\n fn to_variant_id(self) -> i32 {{\n match self {{\n{variant_to_id_match} }}\n }}\n fn from_variant_id(variant_id: i32) -> Option<Self> {{\n match variant_id {{\n{id_to_variant_match} _ => None,\n }}\n }}\n}}\n"
|
|
@@ -559,7 +559,10 @@ fn write_quantity_code(
|
|
|
559
559
|
.replace("// __UNIT_KIND_ID_IMPLS__", &unit_kind_id_impls)
|
|
560
560
|
.replace("// __UNIT_VARIANT_ID_IMPLS__", &unit_variant_id_impls)
|
|
561
561
|
.replace("// __QUANTITY_TO_REPR_MATCHES__", &quantity_to_repr_matches)
|
|
562
|
-
.replace(
|
|
562
|
+
.replace(
|
|
563
|
+
"// __QUANTITY_FROM_REPR_MATCHES__",
|
|
564
|
+
&quantity_from_repr_matches,
|
|
565
|
+
)
|
|
563
566
|
.replace("// __UNIT_TO_REPR_MATCHES__", &unit_to_repr_matches)
|
|
564
567
|
.replace("// __UNIT_FROM_REPR_MATCHES__", &unit_from_repr_matches)
|
|
565
568
|
.replace("// __UNIT_TO_PYOBJECT_MATCHES__", &unit_to_pyobject_matches))
|
|
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
|
|
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
|