Definition cprod_by_def := subFinGroupType [group of setX H K / kerHK].
Definition cprod_by := locked_with cprod_by_key cprod_by_def.
Local Notation C := [set: FinGroup.arg_sort (FinGroup.base cprod_by)].
Definition in_cprod : gTH * gTK -> cprod_by :=
let: tt as k := cprod_by_key return _ -> locked_with k cprod_by_def in
subg _ \o coset kerHK.

(* Specifications: *)
Lemma in_cprodM : {in setX H K &, {morph in_cprod : u v / u * v}}.
Canonical in_cprod_morphism := Morphism in_cprodM.
Lemma ker_in_cprod : 'ker in_cprod = kerHK.
Lemma cpairg1_dom : H \subset 'dom (in_cprod \o @pairg1 gTH gTK).
Let injH := injm_cpairg1.
Lemma injm_cpair1g : 'injm cpair1g.
Let injK := injm_cpair1g.
Lemma im_cpair_cent : CK \subset 'C(CH).
Hint Resolve im_cpair_cent : core.
Lemma im_cpair : CH * CK = C.
Lemma im_cpair_cprod : CH \* CK = C. Proof. by rewrite cprodE ?im_cpair. Qed.
Lemma eq_cpairZ : {in 'Z(H), cpairg1 =1 cpair1g \o gz}.
Lemma setI_im_cpair : CH :&: CK = 'Z(CH).
Lemma cpair1g_center : cpair1g @* 'Z(K) = 'Z(C).
(* Uses gzZ. *)
Lemma cpair_center_id : 'Z(CH) = 'Z(CK).
(* Uses gzZ. *)
Lemma cpairg1_center : cpairg1 @* 'Z(H) = 'Z(C).
Definition xcprodm := cprodm im_cpair_cprod xcprodm_cent xcprodmI.