/-- The product of two smooth local homeomorphisms is smooth. -/
theorem contDiffGroupoid_prod {I : ModelWithCorners 𝕜 E H} {I' : ModelWithCorners 𝕜 E' H'}
    {e : PartialHomeomorph H H} {e' : PartialHomeomorph H' H'} (he : e ∈ contDiffGroupoid ⊤ I)
    (he' : e' ∈ contDiffGroupoid ⊤ I') : e.prod e' ∈ contDiffGroupoid ⊤ (I.prod I') := by
  cases' he with he he_symm
  cases' he' with he' he'_symm
  simp only at he he_symm he' he'_symm
  constructor <;> 

Proof state:
case intro.intro.left
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝³ : TopologicalSpace M
E' : Type u_5
H' : Type u_6
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : PartialHomeomorph H H
e' : PartialHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(PartialHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(PartialHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
⊢ Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑(ModelWithCorners.prod I I') ∘ f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
          (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' s ∩ range ↑(ModelWithCorners.prod I I')),
      comp :=
        (_ :
          ∀ {f g : ModelProd H H' → ModelProd H H'} {u v : Set (ModelProd H H')},
            ContDiffOn 𝕜 ⊤ (↑(ModelWithCorners.prod I I') ∘ f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' u ∩ range ↑(ModelWithCorners.prod I I')) →
              ContDiffOn 𝕜 ⊤ (↑(ModelWithCorners.prod I I') ∘ g ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                  (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' v ∩ range ↑(ModelWithCorners.prod I I')) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤
                            (↑(ModelWithCorners.prod I I') ∘ f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                            (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' s ∩
                              range ↑(ModelWithCorners.prod I I')))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ :
          ContDiffOn 𝕜 ⊤ (↑(ModelWithCorners.prod I I') ∘ id ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
            (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' univ ∩ range ↑(ModelWithCorners.prod I I'))),
      locality :=
        (_ :
          ∀ {f : ModelProd H H' → ModelProd H H'} {u : Set (ModelProd H H')},
            IsOpen u →
              (∀ x ∈ u,
                  ∃ v,
                    IsOpen v ∧
                      x ∈ v ∧
                        (fun f s =>
                            ContDiffOn 𝕜 ⊤
                              (↑(ModelWithCorners.prod I I') ∘
                                f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                              (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' s ∩
                                range ↑(ModelWithCorners.prod I I')))
                          f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤
                  (↑(ModelWithCorners.prod I I') ∘ f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                  (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' u ∩ range ↑(ModelWithCorners.prod I I'))),
      congr :=
        (_ :
          ∀ {f g : ModelProd H H' → ModelProd H H'} {u : Set (ModelProd H H')},
            IsOpen u →
              (∀ x ∈ u, g x = f x) →
                ContDiffOn 𝕜 ⊤
                    (↑(ModelWithCorners.prod I I') ∘ f ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' u ∩
                      range ↑(ModelWithCorners.prod I I')) →
                  ContDiffOn 𝕜 ⊤
                    (↑(ModelWithCorners.prod I I') ∘ g ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
                    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' u ∩
                      range ↑(ModelWithCorners.prod I I'))) }
    (↑(PartialHomeomorph.prod e e')) (PartialHomeomorph.prod e e').toPartialEquiv.source

Next tactic:
simp only [PartialEquiv.prod_source, PartialHomeomorph.prod_toPartialEquiv]