Greg's Hugin scripting
Greg's diary
Photo index
Greg's home page
Network link stats
Greg's other links
Copyright information
Groogle
http://dunham.org/grog/wip/wip.png
Work in progress

This is a case study to match the Hugin workflow page.

pto_gen, from command line

The first step reads the source files sufficiently to generate a project file:

=== grog@eureka (/dev/pts/9) ~/Photos/20180616 464 -> pto_gen C/e-from-house-?.tiff
Generating pto file...
Reading /Photos/grog/20180616/C/e-from-house-0.tiff...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Reading /Photos/grog/20180616/C/e-from-house-1.tiff...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Reading /Photos/grog/20180616/C/e-from-house-2.tiff...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Reading /Photos/grog/20180616/C/e-from-house-3.tiff...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.

Assigned 3 lenses.
Project contains more than one lens, but you requested to assign
stacks. This is not supported. Therefore stacks will not be
assigned.


Written output to /Photos/grog/20180616/C/e-from-house-0-e-from-house-3.pto

The error messages make no sense, and are probably a harmless bug.

After running pto_gen, the project file contains:

# hugin project file
#hugin_ptoversion 2
p f2 w3000 h1500 v360  E11.9366 R0 n"TIFF_m c:LZW r:CROP"
m g1 i0 f0 m2 p0.00784314

# image lines
#-hugin  cropFactor=2.00308
i w5182 h3886 f3 v94.4078430468941 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y0 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-0.tiff"
#-hugin  cropFactor=2.0030840065487
i w5183 h3887 f3 v94.4065199475212 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y0 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-1.tiff"
#-hugin  cropFactor=2.0030840065487
i w5183 h3887 f3 v=1 Ra=1 Rb=1 Rc=1 Rd=1 Re=1 Eev11.9366378213403 Er0.992 Eb1.00436681222707 r0 p0 y0 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a=1 b=1 c=1 d=1 e=1 g=1 t=1 Va=1 Vb=1 Vc=1 Vd=1 Vx=1 Vy=1  Vm5 n"e-from-house-2.tiff"
#-hugin  cropFactor=2.0030840065487
i w5182 h3887 f3 v94.4025515132322 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y0 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-3.tiff"


# specify variables that should be optimized
v

A number of commented-out parameters at the end have been omitted.

The meaning of this file is:

p (panorama) line

p f2 w3000 h1500 v360 E11.9366 R0 n"TIFF_m c:LZW r:CROP"

m (mode) line

m g1 i0 f0 m2 p0.00784314

i (image) lines

These are, not surprisingly, all similar. The first is almost enough:

i w5182 h3886 f3 v94.4078430468941 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y0 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-0.tiff"

Here's the Exif data for this image:

=== grog@eureka (/dev/pts/9) ~/Photos/20180616/C 501 -> exifx e-from-house-0.tiff
File e-from-house-0.tiff
Date taken:     Saturday, 16 June 2018, 12:30:07
Exposure:       1/250 sec, f/5.6 (EV 12.9), 24/200 ISO
Camera:         Olympus OM-D E-M1 Mark II
Lens:           Olympus M.Zuiko Digital ED 8m f/1.8 Fisheye PRO
Focal length:   8.0 mm (full frame equivalent: 16 mm)
Focus:          MF 5.185 m (0.67 m - infinity)
Field of view:  94.4 horizontal, 78.2 vertical, 107.0 diagonal
Meter mode:     Center-weighted average Manual
Stabilization:  Off
Size:           5182 x 3886 pixels

The fields of view are incorrect, what you would expect of a rectilinear lens of that focal length. In fact, the horizontal field of view is 123.9°. They're calculated in this output, so not of importance.

Somewhere here I'm missing lens information. I could have sworn I saw it before, but it's not in nona.txt and it's not in the project file.

Read images into GUI

Reading the images into the GUI does a little more than just run pto_gen. In fact, running ktrace suggests that it's all done internally. The result of reading in the files and saving a project file shows some differences (e-from-house-0-e-from-house-3-GUI.pto):

p line

-p f2 w3000 h1500 v360  E11.9366 R0 n"TIFF_m c:LZW r:CROP"
+p f2 w3000 h670 v318  E11.9366 R0 n"TIFF_m c:LZW r:CROP"

Here the horizontal and vertical sizes have been reduced, by different factors. Why?

i lines

-i w5182 h3886 f3 v94.4078430468941 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y0                 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-0.tiff"
+i w5182 h3886 f3 v94.4078430468941 Ra0 Rb0 Rc0 Rd0 Re0 Eev11.9366378213403 Er1 Eb1 r0 p0 y-106.208823427756 TrX0 TrY0 TrZ0 Tpy0 Tpp0 j0 a0 b0 c0 d0 e0 g0 t0 Va1 Vb0 Vc0 Vd0 Vx0 Vy0  Vm5 n"e-from-house-0.tiff"

Here the y parameter (yaw) has been set. The values for the four images are -106.208823427756, 35.4029411425853, 35.4029411425853 and 106.208823427756. That's not the correct relationship (they were taken at steps of 90°), so maybe it relates to where they appeared on the screen.

v lines

The big difference is in the v lines, which were not present in the pto_gen output:

# specify variables that should be optimized
v Ra0
v Rb0
v Rc0
v Rd0
v Re0
v Vb0
v Vc0
v Vd0
v Eev1
v r1
v p1
v y1
v Eev2
v r2
v p2
v y2
v Eev3
v r3
v p3
v y3
v

I haven't found documentation for these yet.

Running cpfind

=== grog@eureka (/dev/pts/27) /photowork/Hugin-build-eureka 46 -> cpfind -o foo e-from-house-0-e-from-house-3-GUI.pto
===== Mon 18 Jun 2018 17:48:36 AEST on eureka.lemis.com: cpfind -o foo e-from-house-0-e-from-house-3-GUI.pto
Hugin's cpfind 2018.0.0.5abfb4de7961
based on Pan-o-matic by Anael Orlinski

Project contains the following images:
Image 0
  Imagefile: 00
  Remapped : yes
Image 1
  Imagefile: 01
  Remapped : yes
Image 2
  Imagefile: 02
  Remapped : yes
Image 3
  Imagefile: 03
  Remapped : yes

--- Analyze Images ---
i0 : Analyzing image...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
i1 : Analyzing image...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
i2 : Analyzing image...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
i3 : Analyzing image...
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.
Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'.

--- Find pair-wise matches ---
i0 <> i1 : Found 24 matches
i0 <> i2 : Found 0 matches
i0 <> i3 : Found 22 matches
i1 <> i2 : Found 21 matches
i1 <> i3 : Found 0 matches
i2 <> i3 : Found 20 matches

--- Write Project output ---
Written output to foo

Detection took 24.37 seconds.
       24.44 real        23.69 user         0.72 sys
    738528  maximum resident set size
       523  average shared memory size
         7  average unshared data size
       143  average unshared stack size
    469930  page reclaims
         3  page faults
         0  swaps
         0  block input operations
         2  block output operations
         0  messages sent
         0  messages received
         0  signals received
        21  voluntary context switches
      3542  involuntary context switches
cpfind finished at Mon 18 Jun 2018 17:49:01 AEST
=== grog@eureka (/dev/pts/27) /photowork/Hugin-build-eureka 47 -> diff -wu
=== grog@eureka (/dev/pts/12) ~/public_html/photography/Hugin 21 -> mv e-from-house-0-e-from-house-3-cpfound.pto  e-from-house-0-e-from-house-3-GUI-cpfound.pto
=== grog@eureka (/dev/pts/12) ~/public_html/photography/Hugin 22 -> diff -wu e-from-house-0-e-from-house-3-GUI.pto  e-from-house-0-e-from-house-3-GUI-cpfound.pto
--- e-from-house-0-e-from-house-3-GUI.pto       2018-06-18 17:08:21.650912000 +1000
+++ e-from-house-0-e-from-house-3-GUI-cpfound.pto       2018-06-18 17:50:36.619027000 +1000
@@ -1,3 +1,5 @@
+# pto project file generated by Hugin's cpfind
+
 # hugin project file
 #hugin_ptoversion 2
 p f2 w3000 h670 v318  E11.9366 R0 n"TIFF_m c:LZW r:CROP"
@@ -39,6 +41,93 @@
 # control points
+c n0 N1 x233.017226234225 y1559.87063920502 X3881.07153951249 Y1589.38883768762 t0
+c n0 N1 x88.5697056454073 y1593.10113263011 X3721.39204694179 Y1616.42945631167 t0
+c n0 N1 x215.639039490516 y2024.05241892406 X3870.63309059454 Y2007.69652294849 t0
+c n0 N1 x303.073060835012 y2488.25753294075 X3889.61536536028 Y2432.74450291587 t0
+c n0 N1 x410.204466298861 y1517.42599260743 X4069.94995953936 Y1555.15073645191 t0
+c n0 N1 x566.780780295848 y1873.78523221732 X4255.61232827215 Y1892.89503297189 t0
+c n0 N1 x497.265793006729 y1959.90028441058 X4185.13936341212 Y1970.78641480074 t0
+c n0 N1 x401.813020236354 y2685.8562341111 X3934.75843005209 Y2626.74051942095 t0
+c n0 N1 x529.027750907144 y3012.50077317445 X3924.47362275134 Y2941.62887352438 t0
+c n0 N1 x667.595821974614 y1544.2121284568 X4343.78146914635 Y1575.66571019112 t0
+c n0 N1 x700.927950657793 y1683.37144461176 X4389.94089030844 Y1713.70976343762 t0
+c n0 N1 x840.623733311379 y2051.94771396466 X4514.18231772786 Y2084.70693880985 t0
+c n0 N1 x823.113272047803 y2384.26961002729 X4449.36405084369 Y2420.91568539153 t0
+c n0 N1 x624.988700609715 y3127.05842994667 X3960.4810453186 Y3066.85886543692 t0
+c n0 N1 x870.402338632492 y1176.86041592412 X4460.87980300432 Y1199.41263146444 t0
+c n0 N1 x924.590713751765 y1773.3456428134 X4616.22324118383 Y1812.26266928513 t0
+c n0 N1 x857.220511068565 y2073.73871284203 X4532.7041755166 Y2116.36510955778 t0
+c n0 N1 x941.775494229122 y2439.3993600813 X4548.94645361723 Y2495.46463688361 t0
+c n0 N1 x892.094959581674 y3083.7755043464 X4238.97591441032 Y3105.08699117255 t0
+c n0 N1 x1305.05265983711 y1414.40369650622 X4924.73048195035 Y1426.16948296794 t0
+c n0 N1 x1194.05876076401 y1772.95987322068 X4869.4014476518 Y1820.98219839881 t0
+c n0 N1 x1115.21529841912 y2091.17131040972 X4778.36532417947 Y2159.20374306582 t0
+c n0 N1 x1346.7044093055 y2718.82763229799 X4818.55106667993 Y2863.06032909624 t0
+c n0 N1 x1363.71902430957 y2740.7706961299 X4824.77275944057 Y2888.77149153194 t0
+c n0 N3 x3916.58915201129 y1640.21903494285 X261.800903887658 Y1620.92455259028 t0
+c n0 N3 x3780.91358240183 y2017.81136966219 X139.444576587797 Y2045.47049153359 t0
+c n0 N3 x3881.47443150903 y2192.65867729951 X250.913137354917 Y2231.11479188674 t0
+c n0 N3 x3660.0602221997 y2799.57015251937 X245.182180927196 Y2933.36966581426 t0
+c n0 N3 x4106.28252889035 y1556.13088164985 X444.596543491237 Y1525.05624700102 t0
+c n0 N3 x4197.44723048175 y1893.8246914097 X514.997202734456 Y1880.05618022131 t0
+c n0 N3 x4050.05472189456 y2148.57405973649 X395.451343738789 Y2162.05122832821 t0
+c n0 N3 x4204.18588704871 y2586.73992420739 X637.445690892146 Y2593.34067610883 t0
+c n0 N3 x4107.65117646858 y2890.25692150683 X665.986920095699 Y2914.65786914952 t0
+c n0 N3 x4490.92663924279 y1556.82018120604 X819.531058057042 Y1527.6290262389 t0
+c n0 N3 x4388.40584748069 y2119.03665508063 X713.925752329243 Y2094.68117883088 t0
+c n0 N3 x4403.9305670153 y2185.41055476194 X737.399006799398 Y2160.51357808313 t0
+c n0 N3 x4339.77865667825 y2643.37788912922 X783.558543100647 Y2622.25666059085 t0
+c n0 N3 x4377.67816776417 y3230.53396170309 X1092.20873756289 Y3155.47632399742 t0
+c n0 N3 x4586.87744993293 y1643.06569945874 X909.379033027755 Y1611.67361158284 t0
+c n0 N3 x4581.5073843659 y1944.17743536215 X896.157015359133 Y1905.7261064394 t0
+c n0 N3 x4611.21292287996 y2289.59420663999 X961.696368471372 Y2236.25613147282 t0
+c n0 N3 x4583.95714449798 y2542.99252558332 X992.000881153085 Y2479.68803248575 t0
+c n0 N3 x4871.94955921164 y1559.00413828883 X1225.16855421607 Y1532.81651856434 t0
+c n0 N3 x4994.43809821507 y2115.13995430057 X1347.7230181131 Y2033.73494043325 t0
+c n0 N3 x4920.41108813971 y2166.7142818192 X1272.84649690058 Y2084.53526733359 t0
+c n0 N3 x4915.33201599234 y2642.52812250449 X1370.63756414315 Y2509.53715953335 t0
+c n1 N2 x412.292765781747 y1327.55454398054 X4041.26435320461 Y1371.4128918251 t0
+c n1 N2 x146.946484608419 y1593.08082586573 X3785.34316643617 Y1619.41894363857 t0
+c n1 N2 x253.374942340198 y1753.18851311694 X3917.28750808415 Y1764.25073521539 t0
+c n1 N2 x195.38362483635 y2281.58712306822 X3813.31284009793 Y2231.67042256914 t0
+c n1 N2 x283.288369532396 y2654.07531582118 X3818.7422953577 Y2574.84642847243 t0
+c n1 N2 x486.144817785748 y1148.95419300732 X4075.72418879554 Y1203.39299478031 t0
+c n1 N2 x682.696165578102 y1703.09446745344 X4370.5862285211 Y1731.08860852635 t0
+c n1 N2 x661.013559005481 y1767.05284743264 X4351.5997460619 Y1794.50856894833 t0
+c n1 N2 x621.581240237529 y2331.09042636428 X4259.36100508661 Y2338.08079526872 t0
+c n1 N2 x422.899019052893 y2644.69214961533 X3969.5648401401 Y2593.91482015163 t0
+c n1 N2 x731.641164992656 y1704.09514334579 X4420.51556207383 Y1734.42511062964 t0
+c n1 N2 x929.679645070633 y1783.00549265409 X4617.6239908123 Y1821.93452925771 t0
+c n1 N2 x707.208160051749 y2358.38252505313 X4339.39291827343 Y2377.24248002643 t0
+c n1 N2 x752.469178165188 y2606.30453076216 X4316.30766090409 Y2623.15781745392 t0
+c n1 N2 x1046.39813817956 y1268.48098128538 X4668.07139839395 Y1283.3039972568 t0
+c n1 N2 x1069.97031254297 y1648.96025308778 X4745.96265265242 Y1685.73509253423 t0
+c n1 N2 x982.717277532174 y1741.14593434635 X4668.1416644682 Y1779.71114310272 t0
+c n1 N2 x1115.02439948685 y2415.72644216517 X4716.37457586336 Y2501.87197625457 t0
+c n1 N2 x1088.24917326905 y2507.9453523801 X4665.63993517188 Y2590.42579657716 t0
+c n1 N2 x1495.094883604 y1870.16411287166 X5132.68293236841 Y1949.90127629478 t0
+c n1 N2 x1245.96581092968 y2408.88622895708 X4837.83986283817 Y2512.22571940018 t0
+c n2 N3 x324.748341643082 y1462.53951801434 X3923.65578756242 Y1501.67727932688 t0
+c n2 N3 x400.292814281667 y1958.06747708608 X4014.0175587849 Y1958.06042695476 t0
+c n2 N3 x388.183476041456 y2290.43686673102 X3960.45160125931 Y2262.01600492168 t0
+c n2 N3 x404.908430398903 y2743.09364260275 X3853.52845559905 Y2671.44067141694 t0
+c n2 N3 x613.624688623794 y896.918671570474 X4100.35457158781 Y972.268668177813 t0
+c n2 N3 x644.491785137095 y1333.17363707207 X4247.70896635422 Y1375.88941115375 t0
+c n2 N3 x544.553117994438 y1960.38945825467 X4167.09279851956 Y1971.35174195668 t0
+c n2 N3 x507.22718296583 y2759.44489162104 X3955.32875387163 Y2708.12898557725 t0
+c n2 N3 x737.44859526616 y1277.15982487217 X4335.1130258291 Y1317.28325815755 t0
+c n2 N3 x905.198382041827 y1761.11041467501 X4533.36810090579 Y1793.1800217942 t0
+c n2 N3 x771.671742804245 y2033.81903470173 X4394.30290112427 Y2060.23633297969 t0
+c n2 N3 x729.952189769905 y2845.39495037642 X4145.39111886156 Y2836.47063913024 t0
+c n2 N3 x1030.16492707714 y855.115867727529 X4493.98174504496 Y882.888398802772 t0
+c n2 N3 x1230.46990810936 y1511.37718811478 X4824.5090264857 Y1540.60845444594 t0
+c n2 N3 x1098.4974911216 y1685.30071144209 X4717.40488627591 Y1723.62024411734 t0
+c n2 N3 x1027.30313401214 y2762.9542629528 X4461.47882431744 Y2825.4340064689 t0
+c n2 N3 x1371.67176675845 y1084.19441869875 X4853.49555314589 Y1066.2690413509 t0
+c n2 N3 x1234.94621265733 y1578.95983047346 X4837.28793591577 Y1610.57580726485 t0
+c n2 N3 x1435.10155022066 y1686.24292660815 X5024.57176482809 Y1732.07375046883 t0
+c n2 N3 x1248.59706854705 y2097.21388147262 X4841.04349257199 Y2173.14567788588 t0

 #hugin_optimizeReferenceImage 0
 #hugin_blender enblend

Describe CPs.

No wraparound.

PTO files: -rw-r--r-- 1 grog lemis 9,350 18 Jun 17:50 e-from-house-0-e-from-house-3-GUI-cpfound.pto -rw-r--r-- 1 grog wheel 2,121 18 Jun 17:08 e-from-house-0-e-from-house-3-GUI.pto -rwxr--r-- 1 grog lemis 9,336 18 Jun 18:02 e-from-house-0-e-from-house-3-Microsoft-cpfound.pto -rw-r--r-- 1 grog lemis 1,978 17 Jun 14:25 e-from-house-0-e-from-house-3.pto pto_gen 19 June Run GUI, cpfind: === grog@eureka (/dev/pts/28) /photowork/Hugin-build-eureka 92 -> ps aux|grep cpfind grog 69358 49.9 2.0 801448 671604 - RNs 12:22pm 0:06.34 cpfind --multirow -o /tmp/ap_res6w6ICm /tmp/ap_inprojv8AcxR grog 69360 0.0 0.0 18848 2388 28 S+ 12:22pm 0:00.00 grep cpfind Run manually: === grog@eureka (/dev/pts/28) /photowork/Hugin-build-eureka 95 -> cpfind --multirow -o /tmp/ap_res6w6ICm /tmp/ap_inprojv8AcxR Hugin's cpfind 2018.0.0.5abfb4de7961 based on Pan-o-matic by Anael Orlinski Project contains the following images: Image 0 Imagefile: /photowork/Hugin-build-eureka/00 Remapped : yes Image 1 Imagefile: /photowork/Hugin-build-eureka/01 Remapped : yes Image 2 Imagefile: /photowork/Hugin-build-eureka/02 Remapped : yes Image 3 Imagefile: /photowork/Hugin-build-eureka/03 Remapped : yes --- Analyze Images --- i0 : Analyzing image... Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. i1 : Analyzing image... Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. i2 : Analyzing image... Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. i3 : Analyzing image... Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. Warning: no TIFFTAG_SAMPLEFORMAT or TIFFTAG_DATATYPE, guessing pixeltype 'UINT16'. --- Find matches --- i0 <> i1 : Found 20 matches i1 <> i2 : Found 23 matches i2 <> i3 : Found 19 matches --- Find matches for overlapping images --- i0 <> i2 : Found 0 matches i1 <> i3 : Found 0 matches --- Write Project output --- Written output to /tmp/ap_res6w6ICm Detection took 23.404 seconds. --multirow
Greg's home page Greg's diary Greg's photos Copyright

Valid XHTML 1.0!

$Id: skel.php,v 1.7 2014/02/16 02:49:28 grog Exp $