Skip to content

Commit a9faeaa

Browse files
Merge master into nightly-testing
2 parents e142c62 + 963c484 commit a9faeaa

File tree

84 files changed

+2954
-299
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+2954
-299
lines changed

Mathlib.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ public import Mathlib.Algebra.Homology.Homotopy
585585
public import Mathlib.Algebra.Homology.HomotopyCategory
586586
public import Mathlib.Algebra.Homology.HomotopyCategory.DegreewiseSplit
587587
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplex
588+
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplexCohomology
588589
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplexInduction
589590
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplexShift
590591
public import Mathlib.Algebra.Homology.HomotopyCategory.HomologicalFunctor
@@ -1430,6 +1431,7 @@ public import Mathlib.AlgebraicTopology.SimplicialSet.Simplices
14301431
public import Mathlib.AlgebraicTopology.SimplicialSet.StdSimplex
14311432
public import Mathlib.AlgebraicTopology.SimplicialSet.StrictSegal
14321433
public import Mathlib.AlgebraicTopology.SimplicialSet.Subcomplex
1434+
public import Mathlib.AlgebraicTopology.SimplicialSet.SubcomplexColimits
14331435
public import Mathlib.AlgebraicTopology.SingularHomology.Basic
14341436
public import Mathlib.AlgebraicTopology.SingularSet
14351437
public import Mathlib.AlgebraicTopology.TopologicalSimplex
@@ -2246,6 +2248,7 @@ public import Mathlib.CategoryTheory.Bicategory.Functor.StrictPseudofunctor
22462248
public import Mathlib.CategoryTheory.Bicategory.Functor.StrictlyUnitary
22472249
public import Mathlib.CategoryTheory.Bicategory.FunctorBicategory.Oplax
22482250
public import Mathlib.CategoryTheory.Bicategory.Grothendieck
2251+
public import Mathlib.CategoryTheory.Bicategory.InducedBicategory
22492252
public import Mathlib.CategoryTheory.Bicategory.Kan.Adjunction
22502253
public import Mathlib.CategoryTheory.Bicategory.Kan.HasKan
22512254
public import Mathlib.CategoryTheory.Bicategory.Kan.IsKan
@@ -2894,6 +2897,7 @@ public import Mathlib.CategoryTheory.Presentable.Basic
28942897
public import Mathlib.CategoryTheory.Presentable.CardinalFilteredPresentation
28952898
public import Mathlib.CategoryTheory.Presentable.ColimitPresentation
28962899
public import Mathlib.CategoryTheory.Presentable.Dense
2900+
public import Mathlib.CategoryTheory.Presentable.Directed
28972901
public import Mathlib.CategoryTheory.Presentable.Finite
28982902
public import Mathlib.CategoryTheory.Presentable.IsCardinalFiltered
28992903
public import Mathlib.CategoryTheory.Presentable.Limits
@@ -2908,6 +2912,7 @@ public import Mathlib.CategoryTheory.Products.Unitor
29082912
public import Mathlib.CategoryTheory.Quotient
29092913
public import Mathlib.CategoryTheory.Quotient.Linear
29102914
public import Mathlib.CategoryTheory.Quotient.Preadditive
2915+
public import Mathlib.CategoryTheory.RepresentedBy
29112916
public import Mathlib.CategoryTheory.Retract
29122917
public import Mathlib.CategoryTheory.Shift.Adjunction
29132918
public import Mathlib.CategoryTheory.Shift.Basic
@@ -5491,6 +5496,7 @@ public import Mathlib.Order.PrimeIdeal
54915496
public import Mathlib.Order.PrimeSeparator
54925497
public import Mathlib.Order.Prod.Lex.Hom
54935498
public import Mathlib.Order.PropInstances
5499+
public import Mathlib.Order.Quotient
54945500
public import Mathlib.Order.Radical
54955501
public import Mathlib.Order.Rel.GaloisConnection
54965502
public import Mathlib.Order.RelClasses
@@ -5991,6 +5997,7 @@ public import Mathlib.RingTheory.Localization.Module
59915997
public import Mathlib.RingTheory.Localization.NormTrace
59925998
public import Mathlib.RingTheory.Localization.NumDen
59935999
public import Mathlib.RingTheory.Localization.Pi
6000+
public import Mathlib.RingTheory.Localization.Rat
59946001
public import Mathlib.RingTheory.Localization.Submodule
59956002
public import Mathlib.RingTheory.MatrixAlgebra
59966003
public import Mathlib.RingTheory.MatrixPolynomialAlgebra

Mathlib/Algebra/Algebra/Basic.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,13 @@ abbrev semiringToRing (R : Type*) [CommRing R] [Semiring A] [Algebra R A] : Ring
156156
intCast_ofNat := fun z => by simp only [Int.cast_natCast, map_natCast]
157157
intCast_negSucc := fun z => by simp }
158158

159+
/-- The `CommRing` structure on a `CommSemiring` induced by a ring morphism from a `CommRing`. -/
160+
abbrev _root_.RingHom.commSemiringToCommRing {R A : Type*} [CommRing R] [CommSemiring A]
161+
(φ : R →+* A) : CommRing A :=
162+
let _ : Algebra R A := RingHom.toAlgebra φ
163+
{ __ := Algebra.semiringToRing R
164+
mul_comm := CommMonoid.mul_comm }
165+
159166
instance {R : Type*} [Ring R] : Algebra (Subring.center R) R where
160167
algebraMap :=
161168
{ toFun := Subtype.val

Mathlib/Algebra/Group/Pointwise/Set/Basic.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,16 @@ theorem inv_range {ι : Sort*} {f : ι → α} : (range f)⁻¹ = range fun i =>
241241
rw [← image_inv_eq_inv]
242242
exact (range_comp ..).symm
243243

244+
@[to_additive (attr := simp)]
245+
theorem forall_inv_mem {p : α → Prop} : (∀ x, x⁻¹ ∈ s → p x) ↔ ∀ x ∈ s, p x⁻¹ := by
246+
rw [← (Equiv.inv _).forall_congr_right]
247+
simp
248+
249+
@[to_additive (attr := simp)]
250+
theorem exists_inv_mem {p : α → Prop} : (∃ x, x⁻¹ ∈ s ∧ p x) ↔ ∃ x ∈ s, p x⁻¹ := by
251+
rw [← (Equiv.inv _).exists_congr_right]
252+
simp
253+
244254
open MulOpposite
245255

246256
@[to_additive]

Mathlib/Algebra/Homology/HomotopyCategory/HomComplex.lean

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,28 @@ def diff : Cocycle K K 1 :=
704704
simp only [Cochain.zero_v, δ_v 1 2 rfl _ p q hpq _ _ rfl rfl, Cochain.diff_v,
705705
HomologicalComplex.d_comp_d, smul_zero, add_zero])
706706

707+
variable (L n) in
708+
/-- The inclusion `Cocycle K L n →+ Cochain K L n`. -/
709+
@[simps]
710+
def toCochainAddMonoidHom : Cocycle K L n →+ Cochain K L n where
711+
toFun x := x
712+
map_zero' := by simp
713+
map_add' := by simp
714+
715+
variable (L n) in
716+
/-- `Cocycle K L n` is the kernel of the differential on `HomComplex K L`. -/
717+
def isKernel (hm : n + 1 = m) :
718+
IsLimit ((KernelFork.ofι (f := (HomComplex K L).d n m)
719+
(AddCommGrpCat.ofHom (toCochainAddMonoidHom K L n))) (by cat_disch)) :=
720+
Fork.IsLimit.mk _
721+
(fun s ↦ AddCommGrpCat.ofHom
722+
{ toFun x := ⟨s.ι x, by
723+
rw [mem_iff _ _ hm]
724+
exact ConcreteCategory.congr_hom s.condition x⟩
725+
map_zero' := by cat_disch
726+
map_add' := by cat_disch })
727+
(by cat_disch) (fun s l hl ↦ by ext : 3; simp [← hl])
728+
707729
end Cocycle
708730

709731
variable {F G}
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
/-
2+
Copyright (c) 2025 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.Algebra.Homology.ShortComplex.Ab
9+
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplex
10+
public import Mathlib.Algebra.Homology.HomotopyCategory.Shift
11+
12+
/-!
13+
# Cohomology of the hom complex
14+
15+
Given `ℤ`-indexed cochain complexes `K` and `L`, and `n : ℤ`, we introduce
16+
a type `HomComplex.CohomologyClass K L n` which is the quotient
17+
of `HomComplex.Cocycle K L n` which identifies cohomologous cocycles.
18+
We construct this type of cohomology classes instead of using
19+
the homology API because `Cochain K L` can be considered both
20+
as a complex of abelian groups or as a complex of `R`-modules
21+
when the category is `R`-linear. This also complements the API
22+
around `HomComplex` which is centered on terms in types
23+
`Cochain` or `Cocycle` which are suitable for computations.
24+
25+
-/
26+
27+
@[expose] public section
28+
29+
assert_not_exists TwoSidedIdeal
30+
31+
open CategoryTheory Category Limits Preadditive
32+
33+
universe v u
34+
35+
variable {C : Type u} [Category.{v} C] [Preadditive C] {R : Type*} [Ring R] [Linear R C]
36+
37+
namespace CochainComplex
38+
39+
variable (K L : CochainComplex C ℤ) (n m p : ℤ)
40+
41+
namespace HomComplex
42+
43+
/-- The subgroup of `Cocycle K L n` consisting of coboundaries. -/
44+
def coboundaries : AddSubgroup (Cocycle K L n) where
45+
carrier := setOf (fun α ↦ ∃ (m : ℤ) (hm : m + 1 = n) (β : Cochain K L m), δ m n β = α)
46+
zero_mem' := ⟨n - 1, by simp, 0, by simp⟩
47+
add_mem' := by
48+
rintro α₁ α₂ ⟨m, hm, β₁, hβ₁⟩ ⟨m', hm', β₂, hβ₂⟩
49+
obtain rfl : m = m' := by cutsat
50+
exact ⟨m, hm, β₁ + β₂, by aesop⟩
51+
neg_mem' := by
52+
rintro α ⟨m, hm, β, hβ⟩
53+
exact ⟨m, hm, -β, by aesop⟩
54+
55+
/-- The type of cohomology classes of degree `n` in the complex of morphisms
56+
from `K` to `L`. -/
57+
def CohomologyClass : Type v := Cocycle K L n ⧸ coboundaries K L n
58+
59+
instance : AddCommGroup (CohomologyClass K L n) :=
60+
inferInstanceAs (AddCommGroup (Cocycle K L n ⧸ coboundaries K L n))
61+
62+
namespace CohomologyClass
63+
64+
variable {K L n}
65+
66+
/-- The cohomology class of a cocycle. -/
67+
def mk (x : Cocycle K L n) : CohomologyClass K L n :=
68+
Quotient.mk _ x
69+
70+
lemma mk_surjective : Function.Surjective (mk : Cocycle K L n → _) :=
71+
Quotient.mk_surjective
72+
73+
variable (K L n) in
74+
@[simp]
75+
lemma mk_zero :
76+
mk (0 : Cocycle K L n) = 0 := rfl
77+
78+
@[simp]
79+
lemma mk_add (x y : Cocycle K L n) :
80+
mk (x + y) = mk x + mk y := rfl
81+
82+
@[simp]
83+
lemma mk_sub (x y : Cocycle K L n) :
84+
mk (x - y) = mk x - mk y := rfl
85+
86+
@[simp]
87+
lemma mk_neg (x : Cocycle K L n) :
88+
mk (-x) = - mk x := rfl
89+
90+
lemma mk_eq_zero_iff (x : Cocycle K L n) :
91+
mk x = 0 ↔ x ∈ coboundaries K L n :=
92+
QuotientAddGroup.eq_zero_iff x
93+
94+
variable (K L n) in
95+
/-- The projection map `Cocycle K L n →+ CohomologyClass K L n`. -/
96+
@[simps]
97+
def mkAddMonoidHom : Cocycle K L n →+ CohomologyClass K L n where
98+
toFun := mk
99+
map_zero' := by simp
100+
map_add' := by simp
101+
102+
section
103+
104+
variable {G : Type*} [AddCommGroup G]
105+
(f : Cocycle K L n →+ G) (hf : coboundaries K L n ≤ f.ker)
106+
107+
/-- Constructor for additive morphisms from `CohomologyClass K L n`. -/
108+
def descAddMonoidHom :
109+
CohomologyClass K L n →+ G :=
110+
QuotientAddGroup.lift _ f hf
111+
112+
@[simp]
113+
lemma descAddMonoidHom_cohomologyClass (x : Cocycle K L n) :
114+
descAddMonoidHom f hf (mk x) = f x := rfl
115+
116+
end
117+
118+
end CohomologyClass
119+
120+
/-- `CohomologyClass K L m` identifies to the cohomology of the complex `HomComplex K L`
121+
in degree `m`. -/
122+
@[simps]
123+
def leftHomologyData' (hm : n + 1 = m) (hp : m + 1 = p) :
124+
((HomComplex K L).sc' n m p).LeftHomologyData where
125+
K := .of (Cocycle K L m)
126+
H := .of (CohomologyClass K L m)
127+
i := AddCommGrpCat.ofHom (Cocycle.toCochainAddMonoidHom K L m)
128+
π := AddCommGrpCat.ofHom (CohomologyClass.mkAddMonoidHom K L m)
129+
wi := by cat_disch
130+
hi := Cocycle.isKernel K L _ _ hp
131+
wπ := by
132+
ext x
133+
dsimp
134+
rw [CohomologyClass.mk_eq_zero_iff]
135+
exact ⟨n, hm, x, rfl⟩
136+
hπ :=
137+
Cofork.IsColimit.mk _
138+
(fun s ↦ AddCommGrpCat.ofHom (CohomologyClass.descAddMonoidHom s.π.hom
139+
(by
140+
rintro ⟨_, _⟩ ⟨q, hq, y, rfl⟩
141+
obtain rfl : n = q := by cutsat
142+
simpa only [zero_comp] using ConcreteCategory.congr_hom s.condition y)))
143+
(fun s ↦ rfl)
144+
(fun s l hl ↦ by
145+
ext x
146+
obtain ⟨y, rfl⟩ := x.mk_surjective
147+
simpa using ConcreteCategory.congr_hom hl y)
148+
149+
/-- `CohomologyClass K L m` identifies to the cohomology of the complex `HomComplex K L`
150+
in degree `m`. -/
151+
@[simps!]
152+
noncomputable def leftHomologyData :
153+
((HomComplex K L).sc n).LeftHomologyData :=
154+
leftHomologyData' K L _ n _ (by simp) (by simp)
155+
156+
/-- The homology of `HomComplex K L` in degree `n` identifies to `CohomologyClass K L n`. -/
157+
noncomputable def homologyAddEquiv :
158+
(HomComplex K L).homology n ≃+ CohomologyClass K L n :=
159+
(leftHomologyData K L n).homologyIso.addCommGroupIsoToAddEquiv
160+
161+
end HomComplex
162+
163+
end CochainComplex

Mathlib/Algebra/Order/Monoid/Unbundled/Basic.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ variable [LE α]
6868
theorem mul_le_mul_right [MulLeftMono α] {b c : α} (bc : b ≤ c) (a : α) : a * b ≤ a * c :=
6969
CovariantClass.elim _ bc
7070

71+
@[deprecated (since := "2025-11-27")]
72+
alias mul_le_mul_left' := mul_le_mul_right
73+
7174
@[to_additive le_of_add_le_add_left]
7275
theorem le_of_mul_le_mul_left' [MulLeftReflectLE α] {a b c : α}
7376
(bc : a * b ≤ a * c) :
@@ -78,6 +81,9 @@ theorem le_of_mul_le_mul_left' [MulLeftReflectLE α] {a b c : α}
7881
theorem mul_le_mul_left [i : MulRightMono α] {b c : α} (bc : b ≤ c) (a : α) : b * a ≤ c * a :=
7982
i.elim a bc
8083

84+
@[deprecated (since := "2025-11-27")]
85+
alias mul_le_mul_right' := mul_le_mul_left
86+
8187
@[to_additive le_of_add_le_add_right]
8288
theorem le_of_mul_le_mul_right' [i : MulRightReflectLE α] {a b c : α}
8389
(bc : b * a ≤ c * a) :

Mathlib/Algebra/Polynomial/Bivariate.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ lemma equivMvPolynomial_symm_X_1 : (equivMvPolynomial R).symm (.X 1) = X := by
293293
lemma equivMvPolynomial_symm_C (a : R) : (equivMvPolynomial R).symm (.C a) = C (C a) := by
294294
simp [equivMvPolynomial]
295295

296-
lemma Polynomial.Bivariate.pderiv_zero_equivMvPolynomial {R : Type*} [CommRing R] (p : R[X][Y]) :
296+
lemma pderiv_zero_equivMvPolynomial {R : Type*} [CommRing R] (p : R[X][Y]) :
297297
(equivMvPolynomial R p).pderiv 0 = equivMvPolynomial R
298298
(PolynomialModule.equivPolynomialSelf (derivative'.mapCoeffs p)) := by
299299
induction p using Polynomial.induction_on' with
@@ -305,7 +305,7 @@ lemma Polynomial.Bivariate.pderiv_zero_equivMvPolynomial {R : Type*} [CommRing R
305305
simp_rw [← Polynomial.C_mul_X_pow_eq_monomial]
306306
simp [map_nsmul]
307307

308-
lemma Polynomial.Bivariate.pderiv_one_equivMvPolynomial (p : R[X][Y]) :
308+
lemma pderiv_one_equivMvPolynomial (p : R[X][Y]) :
309309
(equivMvPolynomial R p).pderiv 1 = equivMvPolynomial R (derivative p) := by
310310
induction p using Polynomial.induction_on' with
311311
| add p q _ _ => aesop

Mathlib/Algebra/Polynomial/Coeff.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ theorem coeff_C_mul_X_pow (x : R) (k n : ℕ) :
148148
theorem coeff_C_mul_X (x : R) (n : ℕ) : coeff (C x * X : R[X]) n = if n = 1 then x else 0 := by
149149
rw [← pow_one X, coeff_C_mul_X_pow]
150150

151-
@[simp]
151+
@[simp, grind =]
152152
theorem coeff_C_mul (p : R[X]) : coeff (C a * p) n = a * coeff p n := by
153153
rcases p with ⟨p⟩
154154
simp_rw [← monomial_zero_left, ← ofFinsupp_single, ← ofFinsupp_mul, coeff]
@@ -182,7 +182,7 @@ theorem coeff_mul_C (p : R[X]) (n : ℕ) (a : R) : coeff (p * C a) n = coeff p n
182182
@[simp] lemma coeff_intCast_mul [Ring S] {p : S[X]} {a : ℤ} {k : ℕ} :
183183
coeff ((a : S[X]) * p) k = a * coeff p k := coeff_C_mul _
184184

185-
@[simp]
185+
@[simp, grind =]
186186
theorem coeff_X_pow (k n : ℕ) : coeff (X ^ k : R[X]) n = if n = k then 1 else 0 := by
187187
simp only [one_mul, map_one, ← coeff_C_mul_X_pow]
188188

@@ -225,7 +225,7 @@ end Fewnomials
225225
theorem coeff_mul_X_pow (p : R[X]) (n d : ℕ) :
226226
coeff (p * Polynomial.X ^ n) (d + n) = coeff p d := by
227227
rw [coeff_mul, Finset.sum_eq_single (d, n), coeff_X_pow, if_pos rfl, mul_one]
228-
all_goals grind [mem_antidiagonal, coeff_X_pow, mul_zero]
228+
all_goals grind [mem_antidiagonal, mul_zero]
229229

230230
@[simp]
231231
theorem coeff_X_pow_mul (p : R[X]) (n d : ℕ) :

Mathlib/Algebra/Polynomial/Reverse.lean

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def revAt (N : ℕ) : Function.Embedding ℕ ℕ where
5858
theorem revAtFun_eq (N i : ℕ) : revAtFun N i = revAt N i :=
5959
rfl
6060

61-
@[simp]
61+
@[simp, grind =]
6262
theorem revAt_invol {N i : ℕ} : (revAt N) (revAt N i) = i :=
6363
revAtFun_invol
6464

@@ -93,7 +93,7 @@ theorem reflect_support (N : ℕ) (f : R[X]) :
9393
ext1
9494
simp only [reflect, support_ofFinsupp, support_embDomain, Finset.mem_map, Finset.mem_image]
9595

96-
@[simp]
96+
@[simp, grind =]
9797
theorem coeff_reflect (N : ℕ) (f : R[X]) (i : ℕ) : coeff (reflect N f) i = f.coeff (revAt N i) := by
9898
rcases f with ⟨f⟩
9999
simp only [reflect, coeff]
@@ -122,14 +122,8 @@ theorem reflect_C_mul (f : R[X]) (r : R) (N : ℕ) : reflect N (C r * f) = C r *
122122

123123
theorem reflect_C_mul_X_pow (N n : ℕ) {c : R} : reflect N (C c * X ^ n) = C c * X ^ revAt N n := by
124124
ext
125-
rw [reflect_C_mul, coeff_C_mul, coeff_C_mul, coeff_X_pow, coeff_reflect]
126-
split_ifs with h
127-
· rw [h, revAt_invol, coeff_X_pow_self]
128-
· rw [notMem_support_iff.mp]
129-
intro a
130-
rw [← one_mul (X ^ n), ← C_1] at a
131-
apply h
132-
rw [← mem_support_C_mul_X_pow a, revAt_invol]
125+
grind
126+
133127

134128
@[simp]
135129
theorem reflect_C (r : R) (N : ℕ) : reflect N (C r) = C r * X ^ N := by

Mathlib/Algebra/Ring/Subring/Basic.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,19 @@ theorem ofLeftInverse_symm_apply {g : S → R} {f : R →+* S} (h : Function.Lef
925925
def subringMap (e : R ≃+* S) : s ≃+* s.map e.toRingHom :=
926926
e.subsemiringMap s.toSubsemiring
927927

928+
/-- A ring isomorphism `e : R ≃+* S` descends to subrings `s' ≃+* s` provided
929+
`x ∈ s' ↔ e x ∈ s`. -/
930+
@[simps!]
931+
def restrict {R : Type u} {S : Type v} [NonAssocSemiring R] [NonAssocSemiring S]
932+
{σR : Type*} {σS : Type*} [SetLike σR R] [SetLike σS S] [SubsemiringClass σR R]
933+
[SubsemiringClass σS S] (e : R ≃+* S) (s' : σR) (s : σS) (h : ∀ x, x ∈ s' ↔ e x ∈ s) :
934+
s' ≃+* s where
935+
__ := RingHom.restrict e _ _ fun _ ↦ (h _).1
936+
invFun := RingHom.restrict e.symm _ _ fun y hy ↦ by
937+
obtain ⟨x, rfl⟩ := e.surjective y; simp [(h _).2 hy]
938+
left_inv y := by simp [← Subtype.val_inj]
939+
right_inv x := by simp [← Subtype.val_inj]
940+
928941
end RingEquiv
929942

930943
namespace Subring

0 commit comments

Comments
 (0)