MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  ncvspi Structured version   Visualization version   GIF version

Theorem ncvspi 25482
Description: The norm of a vector plus the imaginary scalar product of another. (Contributed by NM, 2-Feb-2007.) (Revised by AV, 8-Oct-2021.)
Hypotheses
Ref Expression
ncvsprp.v 𝑉 = (Base‘𝑊)
ncvsprp.n 𝑁 = (norm‘𝑊)
ncvsprp.s · = ( ·𝑠 ‘𝑊)
ncvsdif.p + = (+g‘𝑊)
ncvspi.f 𝐹 = (Scalar‘𝑊)
ncvspi.k 𝐾 = (Base‘𝐹)
Assertion
Ref Expression
ncvspi ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) = (𝑁‘(𝐵 + ( -i · 𝐴))))

Proof of Theorem ncvspi
StepHypRef Expression
1 elin 4093 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) ↔ (𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec))
2 nvcnlm 25020 . . . . . . . . 9 (𝑊 ∈ NrmVec → 𝑊 ∈ NrmMod)
3 nlmngp 25001 . . . . . . . . 9 (𝑊 ∈ NrmMod → 𝑊 ∈ NrmGrp)
42, 3syl 18 . . . . . . . 8 (𝑊 ∈ NrmVec → 𝑊 ∈ NrmGrp)
54adantr 486 . . . . . . 7 ((𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec) → 𝑊 ∈ NrmGrp)
61, 5sylbi 220 . . . . . 6 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ NrmGrp)
763ad2ant1 1151 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ NrmGrp)
8 nvclmod 25022 . . . . . . . . . 10 (𝑊 ∈ NrmVec → 𝑊 ∈ LMod)
9 lmodgrp 21147 . . . . . . . . . 10 (𝑊 ∈ LMod → 𝑊 ∈ Grp)
108, 9syl 18 . . . . . . . . 9 (𝑊 ∈ NrmVec → 𝑊 ∈ Grp)
1110adantr 486 . . . . . . . 8 ((𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec) → 𝑊 ∈ Grp)
121, 11sylbi 220 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ Grp)
13123ad2ant1 1151 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ Grp)
14 simp2l 1218 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝐴 ∈ 𝑉)
15 id 23 . . . . . . . . . 10 (𝑊 ∈ ℂVec → 𝑊 ∈ ℂVec)
1615cvsclm 25452 . . . . . . . . 9 (𝑊 ∈ ℂVec → 𝑊 ∈ ℂMod)
171, 16simplbiim 514 . . . . . . . 8 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ ℂMod)
18173ad2ant1 1151 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ ℂMod)
19 simp3 1156 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → i ∈ 𝐾)
20 simp2r 1219 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝐵 ∈ 𝑉)
21 ncvsprp.v . . . . . . . 8 𝑉 = (Base‘𝑊)
22 ncvspi.f . . . . . . . 8 𝐹 = (Scalar‘𝑊)
23 ncvsprp.s . . . . . . . 8 · = ( ·𝑠 ‘𝑊)
24 ncvspi.k . . . . . . . 8 𝐾 = (Base‘𝐹)
2521, 22, 23, 24clmvscl 25414 . . . . . . 7 ((𝑊 ∈ ℂMod ∧ i ∈ 𝐾 ∧ 𝐵 ∈ 𝑉) → (i · 𝐵) ∈ 𝑉)
2618, 19, 20, 25syl3anc 1398 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (i · 𝐵) ∈ 𝑉)
27 ncvsdif.p . . . . . . 7 + = (+g‘𝑊)
2821, 27grpcl 19157 . . . . . 6 ((𝑊 ∈ Grp ∧ 𝐴 ∈ 𝑉 ∧ (i · 𝐵) ∈ 𝑉) → (𝐴 + (i · 𝐵)) ∈ 𝑉)
2913, 14, 26, 28syl3anc 1398 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝐴 + (i · 𝐵)) ∈ 𝑉)
30 ncvsprp.n . . . . . 6 𝑁 = (norm‘𝑊)
3121, 30nmcl 24940 . . . . 5 ((𝑊 ∈ NrmGrp ∧ (𝐴 + (i · 𝐵)) ∈ 𝑉) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℝ)
327, 29, 31syl2anc 596 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℝ)
3332recnd 11340 . . 3 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℂ)
3433mullidd 11330 . 2 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐴 + (i · 𝐵))))
35 ax-icn 11262 . . . . . 6 i ∈ ℂ
3635absnegi 15573 . . . . 5 (abs‘ -i) = (abs‘i)
37 absi 15458 . . . . 5 (abs‘i) = 1
3836, 37eqtri 2783 . . . 4 (abs‘ -i) = 1
3938oveq1i 7430 . . 3 ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))) = (1 · (𝑁‘(𝐴 + (i · 𝐵))))
40 simp1 1154 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ (NrmVec ∩ ℂVec))
4122, 24clmneg 25407 . . . . . . . . . . 11 ((𝑊 ∈ ℂMod ∧ i ∈ 𝐾) → -i = ((invg‘𝐹)‘i))
4216, 41sylan 592 . . . . . . . . . 10 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → -i = ((invg‘𝐹)‘i))
4322clmfgrp 25397 . . . . . . . . . . . 12 (𝑊 ∈ ℂMod → 𝐹 ∈ Grp)
4416, 43syl 18 . . . . . . . . . . 11 (𝑊 ∈ ℂVec → 𝐹 ∈ Grp)
45 eqid 2760 . . . . . . . . . . . 12 (invg‘𝐹) = (invg‘𝐹)
4624, 45grpinvcl 19203 . . . . . . . . . . 11 ((𝐹 ∈ Grp ∧ i ∈ 𝐾) → ((invg‘𝐹)‘i) ∈ 𝐾)
4744, 46sylan 592 . . . . . . . . . 10 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → ((invg‘𝐹)‘i) ∈ 𝐾)
4842, 47eqeltrd 2860 . . . . . . . . 9 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → -i ∈ 𝐾)
4948ex 418 . . . . . . . 8 (𝑊 ∈ ℂVec → (i ∈ 𝐾 → -i ∈ 𝐾))
501, 49simplbiim 514 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) → (i ∈ 𝐾 → -i ∈ 𝐾))
5150imp 412 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ i ∈ 𝐾) → -i ∈ 𝐾)
52513adant2 1149 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → -i ∈ 𝐾)
5321, 30, 23, 22, 24ncvsprp 25478 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ -i ∈ 𝐾 ∧ (𝐴 + (i · 𝐵)) ∈ 𝑉) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))))
5440, 52, 29, 53syl3anc 1398 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))))
5521, 22, 23, 24, 27clmvsdi 25418 . . . . . . 7 ((𝑊 ∈ ℂMod ∧ ( -i ∈ 𝐾 ∧ 𝐴 ∈ 𝑉 ∧ (i · 𝐵) ∈ 𝑉)) → ( -i · (𝐴 + (i · 𝐵))) = (( -i · 𝐴) + ( -i · (i · 𝐵))))
5618, 52, 14, 26, 55syl13anc 1399 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (𝐴 + (i · 𝐵))) = (( -i · 𝐴) + ( -i · (i · 𝐵))))
5735, 35mulneg1i 11765 . . . . . . . . . 10 ( -i · i) = -(i · i)
58 ixi 11948 . . . . . . . . . . . 12 (i · i) = -1
5958negeqi 11553 . . . . . . . . . . 11 -(i · i) = - -1
60 negneg1e1 12312 . . . . . . . . . . 11 - -1 = 1
6159, 60eqtri 2783 . . . . . . . . . 10 -(i · i) = 1
6257, 61eqtri 2783 . . . . . . . . 9 ( -i · i) = 1
6362oveq1i 7430 . . . . . . . 8 (( -i · i) · 𝐵) = (1 · 𝐵)
6421, 22, 23, 24clmvsass 25415 . . . . . . . . 9 ((𝑊 ∈ ℂMod ∧ ( -i ∈ 𝐾 ∧ i ∈ 𝐾 ∧ 𝐵 ∈ 𝑉)) → (( -i · i) · 𝐵) = ( -i · (i · 𝐵)))
6518, 52, 19, 20, 64syl13anc 1399 . . . . . . . 8 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · i) · 𝐵) = ( -i · (i · 𝐵)))
66 simpr 490 . . . . . . . . . . 11 ((𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) → 𝐵 ∈ 𝑉)
6717, 66anim12i 625 . . . . . . . . . 10 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉)) → (𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉))
68673adant3 1150 . . . . . . . . 9 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉))
6921, 23clmvs1 25419 . . . . . . . . 9 ((𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉) → (1 · 𝐵) = 𝐵)
7068, 69syl 18 . . . . . . . 8 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · 𝐵) = 𝐵)
7163, 65, 703eqtr3a 2819 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (i · 𝐵)) = 𝐵)
7271oveq2d 7436 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · 𝐴) + ( -i · (i · 𝐵))) = (( -i · 𝐴) + 𝐵))
73 clmabl 25395 . . . . . . . . . 10 (𝑊 ∈ ℂMod → 𝑊 ∈ Abel)
7416, 73syl 18 . . . . . . . . 9 (𝑊 ∈ ℂVec → 𝑊 ∈ Abel)
751, 74simplbiim 514 . . . . . . . 8 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ Abel)
76753ad2ant1 1151 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ Abel)
7721, 22, 23, 24clmvscl 25414 . . . . . . . 8 ((𝑊 ∈ ℂMod ∧ -i ∈ 𝐾 ∧ 𝐴 ∈ 𝑉) → ( -i · 𝐴) ∈ 𝑉)
7818, 52, 14, 77syl3anc 1398 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · 𝐴) ∈ 𝑉)
7921, 27ablcom 20018 . . . . . . 7 ((𝑊 ∈ Abel ∧ ( -i · 𝐴) ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) → (( -i · 𝐴) + 𝐵) = (𝐵 + ( -i · 𝐴)))
8076, 78, 20, 79syl3anc 1398 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · 𝐴) + 𝐵) = (𝐵 + ( -i · 𝐴)))
8156, 72, 803eqtrd 2799 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (𝐴 + (i · 𝐵))) = (𝐵 + ( -i · 𝐴)))
8281fveq2d 6889 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8354, 82eqtr3d 2797 . . 3 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8439, 83eqtr3id 2809 . 2 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8534, 84eqtr3d 2797 1 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
Colors of variables:    wff setvar class
This proof depends on syntax axioms:   → wi 4   ∧ wa 401   ∧ w3a 1103   = wceq 1569   ∈ wcel 2144   ∩ cin 4089  ‘cfv 6538  (class class class)co 7420  ℝcr 11202  1c1 11204  ici 11205   · cmul 11208   -cneg 11545  abscabs 15406  Basecbs 17392  +gcplusg 17433  Scalarcsca 17436   ·𝑠 cvsca 17437  Grpcgrp 19149  invgcminusg 19150  Abelcabl 20000  LModclmod 21140  normcnm 24900  NrmGrpcngp 24901  NrmModcnlm 24904  NrmVeccnvc 24905  ℂModcclm 25388  ℂVecccvs 25449
This proof depends on axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1827  ax-4 1841  ax-5 1942  ax-6 1999  ax-7 2040  ax-8 2146  ax-9 2154  ax-10 2177  ax-11 2193  ax-12 2212  ax-ext 2732  ax-sep 5248  ax-nul 5259  ax-pow 5326  ax-pr 5390  ax-un 7751  ax-cnex 11259  ax-resscn 11260  ax-1cn 11261  ax-icn 11262  ax-addcl 11263  ax-addrcl 11264  ax-mulcl 11265  ax-mulrcl 11266  ax-mulcom 11267  ax-addass 11268  ax-mulass 11269  ax-distr 11270  ax-i2m1 11271  ax-1ne0 11272  ax-1rid 11273  ax-rnegex 11274  ax-rrecex 11275  ax-cnre 11276  ax-pre-lttri 11277  ax-pre-lttrn 11278  ax-pre-ltadd 11279  ax-pre-mulgt0 11280  ax-pre-sup 11281  ax-addf 11282  ax-mulf 11283
This proof depends on definitions:  df-bi 210  df-an 402  df-or 862  df-3or 1104  df-3an 1105  df-tru 1572  df-fal 1582  df-ex 1812  df-nf 1816  df-sb 2099  df-mo 2564  df-eu 2594  df-clab 2739  df-cleq 2752  df-clel 2835  df-nfc 2909  df-ne 2956  df-nel 3062  df-ral 3077  df-rex 3087  df-rmo 3365  df-reu 3366  df-rab 3413  df-v 3452  df-sbc 3739  df-csb 3847  df-ss 3896  df-pss 4014  df-dif 4047  df-in 4091  df-un 4151  df-nul 4279  df-if 4482  df-pw 4558  df-sn 4585  df-pr 4587  df-tp 4589  df-op 4835  df-uni 4867  df-iun 4952  df-br 5103  df-opab 5167  df-mpt 5186  df-tr 5212  df-id 5545  df-eprel 5550  df-po 5558  df-so 5559  df-fr 5603  df-we 5605  df-xp 5656  df-rel 5657  df-cnv 5658  df-co 5659  df-dm 5660  df-rn 5661  df-res 5662  df-ima 5663  df-pred 6304  df-ord 6365  df-on 6366  df-lim 6367  df-suc 6368  df-iota 6494  df-fun 6540  df-fn 6541  df-f 6542  df-f1 6543  df-fo 6544  df-f1o 6545  df-fv 6546  df-riota 7377  df-ov 7423  df-oprab 7424  df-mpo 7425  df-om 7878  df-1st 8001  df-2nd 8002  df-frecs 8302  df-wrecs 8333  df-recs 8382  df-rdg 8421  df-1o 8479  df-er 8720  df-map 8852  df-en 8977  df-dom 8978  df-sdom 8979  df-fin 8980  df-sup 9437  df-inf 9438  df-pnf 11348  df-mnf 11349  df-xr 11350  df-ltxr 11351  df-le 11352  df-sub 11546  df-neg 11547  df-div 11977  df-nn 12339  df-2 12408  df-3 12409  df-4 12410  df-5 12411  df-6 12412  df-7 12413  df-8 12414  df-9 12415  df-n0 12610  df-z 12697  df-dec 12818  df-uz 12969  df-q 13079  df-rp 13124  df-xneg 13244  df-xadd 13245  df-xmul 13246  df-fz 13643  df-seq 14148  df-exp 14208  df-cj 15271  df-re 15272  df-im 15273  df-sqrt 15407  df-abs 15408  df-struct 17330  df-sets 17347  df-slot 17365  df-ndx 17377  df-base 17393  df-ress 17414  df-plusg 17446  df-mulr 17447  df-starv 17448  df-tset 17452  df-ple 17453  df-ds 17455  df-unif 17456  df-0g 17617  df-topgen 17619  df-mgm 18821  df-sgrp 18913  df-mnd 18929  df-grp 19152  df-minusg 19153  df-subg 19338  df-cmn 20001  df-abl 20002  df-mgp 20366  df-ur 20413  df-ring 20466  df-cring 20467  df-subrg 20827  df-lmod 21142  df-psmet 21675  df-xmet 21676  df-met 21677  df-bl 21678  df-mopn 21679  df-cnfld 21684  df-top 23217  df-topon 23234  df-topsp 23256  df-bases 23269  df-xms 24644  df-ms 24645  df-nm 24906  df-ngp 24907  df-nlm 24910  df-nvc 24911  df-clm 25389  df-cvs 25450
This theorem is used by: (None)
  Copyright terms: Public domain W3C validator