summary refs log tree commit diff stats
path: root/pgp/allkeys.asc
blob: 93f1930e76a54a23a133bb450111305220494acf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGG7VT4BEADT8tkIEhY3u+Lh6z+hOudVMF6t0BxQ69WJyHNrf4oJp065qsW/
C6slGUjOWZolKTsFvXb+jH1v8Y2YnJxQRLzqeTittBUZnOTD5SfRg7LvyxMkEt1a
fO+Byw7VRmputupdF0alh4wZcFNG5n0s63HXVUv8jWj83mmHOsrwn/8mz/sM82i6
2q+nVMiX1r9HpY8gJKJaQI3wj2Ju2XKFdJiXdVff+cc1hZAzedva6H7sdyU2An87
FRG3wmF2ZoUgqc9L8D7WCZlClSsGAU91HEG2/P92ri6iZKqE95ZzehwKOYSUX789
vdCb/kQ3ie+Xt0pdLeWcY0nJIEbooocCM+nJ445T89ue7GipRdm9JRCx67iWI9Jp
KcYPPX4YWbDxLwHn8NNNc4d4RjALH96eJoQ4MajDd3TbUcWj72fi9sHtRupytVN6
5UVASooCTwVwVibJXRZRMRHVF883Ll46wlhiygMODeGgxIjWehC7zoSaM6AIdjZ9
mLhiZX5d2xBEleMinRlWZeQvI63eMMK8HakvJjZuzju8us9U9V3vQt7gJvC+eOBF
/RPiXu4ULkpRE8xJPcAecuSjISy7Ofj1lt1CLWb+kPjJRZ1hOsCIcQfy+33wL6ml
QLaPeaQIe9ORcC36gWEu2Nh6BaalkRTs+fKhVrKeDSEq9YdQXg5JKIZpqwARAQAB
iQTxBCABCALbFiEEWL15gSGHG3GHDCfZl4tYka0/WYYFAmIBcw3B/B0AUmVjZW50
bHksIHRoYW5rcyB0byBsYWJyYWRvciwgSSB1bmRlcnN0YW5kIHRoYXQgSSdtIHVz
aW5nIHRoZSB3cm9uZwpjb21tYW5kICh0c2lnbikgdG8gc2lnbiBrZXlzLiAgSSBz
aG91bGQgYmUgdXNpbmcgYHNpZ24nIGluc3RlYWQuCkF0IHRoZSBlYXJseSBzdGFn
ZSB3aGVyZSBJIG1pc3VuZGVyc3Rvb2QgdGhlIHRydXN0IGxldmVscywgSSd2ZSBn
aXZlbiBhCmhpZ2ggdHJ1c3QgbGV2ZWwgKDMpIHRvIHBlb3BsZSwgZ2l2aW5nIHRo
ZW0gdGhlIGFiaWxpdHkgdG8gc2lnbiBrZXlzIG9uCm15IGJlaGFsZiwgd2hpY2gg
d2FzIHVuaW50ZW5kZWQuCkkgcmV2b2tlZCBhbGwgdGhlIGtleXMsIHRoZW4gZm91
bmQgdGhhdCBJIGNvdWxkIG5vdCB0cnVzdCB0aGVtIGFnYWluLgpBdCB0aGlzIHBv
aW50IEkgY29uc2lkZXIgbXkgR1BHIGlkZW50aXR5IHRvIGJlIGJyb2tlbi4gIEkn
bGwgcHVibGlzaCBhCm5ldyBrZXkgb24gbXkgd2Vic2l0ZSBzb29uLgpUaGUgbW9y
YWwgb2YgdGhlIGxlc3NvbiBpcywgYmUgc3VyZSB0byByZWFkIHRoZSBtYW51YWxz
IGFuZApkb2N1bWVudGF0aW9uIGVzcGVjaWFsbHkgd2hlbiB5b3UncmUgZGVhbGlu
ZyB3aXRoIHRydXN0LCB2YWxpZGl0eSwgYW5kCnRoZSBsaWtlLiAgRG9uJ3QgbWFr
ZSB0aGUgc2FtZSBtaXN0YWtlLgpJJ2xsIGJlIHB1Ymxpc2hpbmcgYSBuZXcga2V5
IG9uIG15IHdlYnNpdGUgc29vbi4ACgkQl4tYka0/WYYp7hAAjk+27+n1wRNeE4qH
fITHDNjMq6Hj4OFqE+wHhkq3s6bqEDhuroDI0UbqpTm1BeIAAzya4/4UPRBULE5s
21zQVUbmnoh6kKDRwe0VmOaJ10/ezfsx/+JkfVtn4kmu2f/sXW4YDfFnIXXcXA6y
ydaXtcGbjwDrYpFcZl4GoSDP/Dg0sG6WBKHaFMVTNBYsO/oSVQE6zG8Kmr70XF3/
lD6bRWlMlMjQWlsN1zsLk0CuK+jnHgq2ZSWv1KEqRe3J5ckEnuMPHcyJ78/S5UNP
dXHVbRxOuB1ThaB7XEER65mynbMG7Mh+ObMVKWUn54m08cCB8gXXL92j+KNese+u
hnhUYGZc2UxOlbENaG7K+mVEgx+sTGvvF2eSGwY2Q7EibC1IWpgKM40M41tTcccY
4I8lpI0LOmSejh/4Z03Uq2UA6AJNbzDfzJ24KZfyJuD6ihw/iiSv4fNE9DStbKxc
I5RawbYQkdIT/p1ppnAEOqfGcS8ySvQydyYDM0gvqfYJXlct2jLvsmU0zHqjOV+c
/72ezs/eXqrG5UywG2FGpN/zanqfrCPck7gcBgiQqpwGSTWoc/jZ7rpFYu6LAhqD
MGaa4UzyZV82MtIm42mSQpFQkXgD/BEXo+xCVJuO43HnEbv5MmadKvsq8sGTpmPD
ZSpniv0yGZUbQogP7A2+57tTL2i0OEFuZHJldyBZdSAoQW5kcmV3IFl1J3MgTWFz
dGVyIEtleSkgPGFuZHJld0BhbmRyZXd5dS5vcmc+iQJOBBMBCAA4FiEEWL15gSGH
G3GHDCfZl4tYka0/WYYFAmG7VT4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
CgkQl4tYka0/WYa/bA//ZHNmM14kFU3+ho/clDCn5f9XtoJBrLJBd8GefedYyBbI
7Tbde+5Tk18DCBpsJbhMIEP9Vm5CHEUQzPcr+3c1APS3WbG6RYcGBEafbEEpRK0o
2rCJJEGcwx5SJlRY+cjCqLsdKmYzchZpzjNlHvXBUtmZjwxX/j9+PeJzySFCZdjB
nwNUE7KDNMm/yHs9+t+fQwBJkaEhRotAbRQYT03pLqzP40Fi2XfAesyXZPkxiMHX
s58ugAwaPuuLigAhrYcdrNAO4GFjAVJog4fypEP5ei4qzBH9OzBfDBBUnKXzFGW/
ycCa4Dd7wc9DxmL9PD2He2mdDnag7HyNSH9u3ZKOTzRjzRVA0ajdHCE8SEp3I7G/
kfZIfuLRN4Xp/HRayiDOWSq2jOFqr6irjoxdETm4b+hCbqv+Yih4AXVYV2kPn51V
aok1jqDu0WduQZObTnTcvYnPwr0S4MXHJeeWt9Y/xFwrP5TDlbDqY7M2iKVi2sAn
/vTeRJjZC9tIreV5vsv6o/5/3/GVNRMCmBlPauiVwLDA4rx86bA/9mlQlWBtlQnp
7RIjTTWPaCGoxm7eNB5RZUKCTx2Rttvgp39oQ0IRI46FTpe6RlKDV6mtX/+MVdga
QYGKN7MVNPOxZ2i3wb7r4M6TqoYxk5gNHiJ8rotY09VQCLZHKkIpwJFn+a5iyy6J
AjMEEAEIAB0WIQTtpwNgdZKk+9yap4PDKPavZmuxGAUCYebAnAAKCRDDKPavZmux
GMZBD/wKle/veuic1S3oNmnLHWoKNX3Sd5BG/NOse1w9zAdgrsGDtDtP+jEjQbTJ
GGKUpm28nSlxnTpTUlpECfE1L0kvQWvjvPHTQPb3KMZXQMm1Yuft6K7FwJoKsIOI
hqnpCf3vWCcYXMk7Loms7uIjmxnxD49dkKWae6IYGad6E1K2CDCq6l51YHUGF2xv
CgpkCGuBceh/C2qX1nYMt/OLBK8VYJZyQKP9lzZQKraWUmB8g0pZQBpJNYSn5lVk
NCf0xr0dWYdvxHEtBbaJPmpylok4ryROpJEcQIAnEuM2X589xyJDVneX9p7bLo3w
N6iwUFEfrIbZ/hj1747MZrpj5cIpE45110r4seYhr0AbInvfERcYEunBhMcrEsTE
4bBll1fwhy+OD4kmWUxvXsU538AzDjykckokZigpFbPQq3NSUAh2HoHNIdIw6HWv
VL5xUIaEasJDUGEo++NYnx2tMWCqytKxV10XhPJ1jRzzlQzIsOYDVPOmWTkiekTA
sdCmWU0Jg3w/IMDKYZD2jkUowzLRE8b3RSFCw1RsP40oeeuqo2eqsqOH2I3qoGaB
/6aDq4IaXIcb1D83JMN4EvC/guoLfz9v4uVZpiA1x8PkCqXqonAVggjDTrLJkt8x
uRU5BJumYCnMg+Z1eImJBUQ6yTImUUhA/DXHTWTSTaCGg0uCjLkCDQRhu1U+ARAA
0lCuXQGSagrjCjj2nf3vtZ+IVKgrIYEzF/qTS7sFAcOuyZH+NJgP2zY6qGC+SKfz
Mc2Fk8KHonH8keUDLsNwmlvC7clmQaL7XGuxD4232s9xdty2xLlWdpWh9PeHS58h
YYwSgfZYsh6zYhRISoqYkiPXf39NiZuJ/dtNCUGf8v0fvZavwgpu2PmpOdqPSexY
26KOhhw2GByR2SC51bBmIcKqzrtMDj6eiT8yap/YVQPIefRwpTkZEBkh1TEPKfNS
4KKr8RKzgoPeoECH6qoFIm2R4xnbHiJyvGRoVeQ7ASEfEhFqNi524T0o9q0/vb90
DsA+Sydu5gji3NBmdsPjOPN7sQXUQuL1YZZDP9SpYfhz+RPuWptG7d1E31CQDihD
j91nKSjHNQ5SXbjhISX4mga+8gskxbZ/NI3geXulPx/KhH+EG7ByPzAEsOpIbq0i
IXbaA1gyHmrLJz8fWCch/Wb1FjhwICWoVtA5wPFFxg8MS0AfANUK6qbrz2dUwJsn
Iy1qsMLo4fEj3hgSnkhSmAVxZ1fyC/XkUCmpHuOCGxS8FGWZdQGNHhAZpd363iT8
hWHwhqbck9EPAInLcC53ueCD3Cs3gzDU4y2E/OqLleAyWbHYe7xaEqk3ExYHFeLU
1D0yFjDnDEcp5N4l0qTacc+EHPgUZQuR+FVAkJXIoZsAEQEAAYkCNgQYAQgAIBYh
BFi9eYEhhxtxhwwn2ZeLWJGtP1mGBQJhu1U+AhsMAAoJEJeLWJGtP1mGDHsP/38z
wuu/SQB9AVcullTsDIg0a2fN+nuuBeiXUGxm6FYuA0zU1ZPTSDGKzg9tsj3NWaYS
xZHwdhflaqgmIdtVfq9paTBcoww8yb0oP8BEEsJL0FGwRA+QMsCMZ2HF0kgXYxhX
uWWLxXs1mMOWYkxnvSVEgP1ZucUpEriThON42YpTqHPJ0tkYfZBiwIP0yxVn/PX+
odSS5ZkV5LfsukkHhDPsbHQZNDQbXMtOTK+Cc4tWUcToIdi0/cxK4Y4V1yXt+Y9p
KWXid4aX8044CfIAaCooGgpjjZx5CDLIMrXueEp4vp64a0hi0mTtp5djev6gByW1
pBbbmvHFCyn6zwNUaBou0MhRe0iyGvp/7DrPLNm8pgRbQEY7EsSArhFPtVTByTTt
jWKgiFGNB1AmD+0xzrVXgDx+UyuwAx+sWqDfpN0Od0j8ZF9VF+tX9PN96Skvpqto
dyp/XjkDuqejFZZPjXnoneCPKDPVGUa8KxyErBzyyve3GXsJornIGT2Qgi39qjFV
MYKztTiOxmhCI16qsNcIhj0GZtRw1R+tnIhfkbTZ7qmeKb8J32R2OPMUDB7znOwD
MRLEv/MAczL7P6t2HJAu/2MIc7a17L+VE86Lw+ozUE5aAxifkoHiAPcotJvKJbFG
ULcVE7H1q32oX0itY4CHG9b1eMsvKOwQBFbb0aMYmQINBGIBdBUBEAC6AcI2wATR
dGclZThPaYZnosAX/LU9drTwUQwE+rxpSxvCLV41G3OTwa4Ub65hQn2LUrCDLmxq
AInEa3QYrbvbibV0QnAKmyETxnswEloLgBeHHQpWufvK7rM2L2As2yk4tO+i1+H0
1Hfh/uHICZEQg8rNY25KJhIYbja31ywyas461k7fEnE1ORVONzSZUYCBpLiwE6OT
A0kKuICVtheeLRV2BDT3NjF8zGjv3vLbvqDgblw0nReNBTBZ93II0PIpkeOzMKnQ
0y+oTHE1HWAf944MIMf5UphJzirIXM84mJaWQtaTJEURviEEoP9TZQmwth+3RdzB
RMnXE+L28YOkY09ioLXi1K1mKOr/bDr4rieLAS5FG/ClCbyxrVqGOjYxo2lsQ1KJ
dMrHBgdxnCS5XmFheg4SbeQVK7VvbbfZ9Plhn6DKuU2iDUTfnuhOdAX8Qc80YG8v
TxtFGR3bd7NNx8poKBoqxT9X0kmvtktZ6UkM3Uwx4hjAHp5D9KWy9bHViBkxafmM
QByaxKCOck30gCNC7iwOHvoRvPulHSLm6NV2DZngozugHd51nwhqcoCaUPTZhwv6
HcqZ89me40bB8G+3FLjpNOHXuLPg6GtHAre32dxdjIQ02RrzNN9g9vvpRrD3BvAE
612s/g9PS48wCP7tnyMRDEcWRR67lG8RiwARAQABtFdBbmRyZXcgWXUgKEFuZHJl
dyBZdSdzIEtleSAtIEFmdGVyIHRoZSBkZXN0cnVjdGlvbiBvZiBzaWduYXR1cmVz
KSA8YW5kcmV3QGFuZHJld3l1Lm9yZz6JAk4EEwEIADgWIQTJBqf3dNFMXM+JCQ4B
UAsRijeBJAUCYgF0FQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRABUAsR
ijeBJCG+D/9BiS1igSY6FCFh+1YlP90OcNmXFQfVIJ6fu3PKegQj97FlhVt0Cp6U
uVwok3uIEvq5Mgz5Po+DkuR3vQoX1O/QmiB8qUk217jLrajPMV1FtVLVKOpKDPr1
umvqfSc2hPgWRyaLoct0/Hkb3BoZJ0SYkwgADD5IePXqS7VBn32amR+ntQfSErd8
nst0Bl8wlX7n2+1AsNQes+daRSxw/KeCNKIWj5/5VAfCjflCIXEF6INQ6mfQkFfn
+ManhUmMl2mr4vpM7SVKalZ2qIpKLLnliE7kyRHQH6zQ5qYZfcmpWEfuxZCBr/H2
CCjFMyoQufZ1im2ERpFrOhcQCABgPsIxl/+tlMFwAmGw2MMdLQzbQXKRC6/C5kOR
/w+OEY1u5OADgxczSiNvJ2kwLElGQTw2po3aogGfxt9DO7/WbYcVqZBT+x2I6KHS
YN2C8ElRDflYZZpu6lDxLBjzw25CDVqF2aCKZC8gqMiSWMG+mxWqztMzF65Lu5qt
Dy0M+dtosi33KyFjRaAtjG45KQ5dyE/j++HP+xSihYxEqH0X3z2lMsR6pnIAQLXb
I/zfQt6SAkV9SayUv618Pvuzh/3hXqn8K3cvoWTPWDk9Jo5ezkdBKKwmVhUMEe4X
dQoEQUMNhaKVH9umrNyVNwlEBG47A10+iNMAXVy+1rQJ97vIjgFDt4kCNwQQAQgA
IRYhBFi9eYEhhxtxhwwn2ZeLWJGtP1mGBQJiAXRuAwUKeAAKCRCXi1iRrT9ZhlrP
D/97Q+IA5fNzhvy8HoW49zdsIDMsS4kqBxqxB9gcAijSnLNRHG8WUH+I7TKrwl1V
dx+lVq9ViVOZU9Ia/eCYPGRNeMAfUmFU5LbjlGdAr5XA52PmuRNEMzrhCB/V8NI/
kVF5qekrViK4mK5y7Knm1TyXc+MZ14nSoy6ILbctxRArYv77bdrvjFHoYQT9UYxd
kCwyr9T8imlDrsXQSsvfyXc7jfXg4gdLHWm1w2Mov6HfU3gM8UcOJRgYQW3wXgDm
EI/w2Luikgdqqs9utL4lt/hmAKTkknZB4YFaSv0s4lGchkPbOR9U98p9sYHsJTle
/jFwqZN4Kp+xLEcu26Dg0SIFIbZbG/wMq4Hhstip9sWfTGn1aNItQbotXX69WK9O
mP2cjBHhVgvF2PCR+KLHxsRheLJkI+c1AX46FyNLCbRkF0DQj/ZWRAcnZUNdU09I
ocwIc2y3RPx/VOKnqulojd6jv46nMJrZOw7ghl+3VTt6zwEMkUj2xA/7Wgp0WUit
3T0tRAG9sVri06WeiWLpd8zcE1LDrBd3EdfKYdO8clVWKaoD+Lb65iVrIqtrxF3/
uoytDxCLIOn4qwWeFiezDUUYoAQlmHxGAT+GQS3Oj1hXiaudHytwIbRsbWH1+ZtN
ibS/noCo4y8xQyzrKNaGcPN8ebQ578tmltEeKdtJg9RLPLkCDQRiAXQVARAA93U8
5T0KcDaadZVMSYVKzHYAwZjMC++/809oPqAf7QhGuFUG9qFmM2aGrI0IKnBkDAUS
Z1ePcz4CJ+cMO6QiMQCWecFF/hu01ptV1je+yJAUfG1XddUtNvM9GykSPvTkVTeV
+oKYJku7egMGHZ1vjDHO+Yh3BBxqKsh+50Kf9UfnEcqigInxE1rV1dgxnl3maUS2
j/iJRVQ/Piww6xO0IyhrVpWjJbzMu5uwovciB6aYe/w+ZXvu+61ENytLj0SGQYnE
59YzGji5Pp8n5e0hLm7u/incMDIUly43W8kX2TTohxojpzgbXkpNvqcbKO9sTYl3
p345sROJBbikjcpKhVFlKOBFoNoXy7lHkce+mj3YM0ijAKl61FEgPiAHueEdiRVy
+XmFS7PpSzH2C/4YC1OeuG6tr11YzaVLnpBOQ/WA8a6KPAbv6ZPgs6jGjlGgUowR
PRZzhTIn1Mes7wr+CbhBCBndwkUzywhM0dc88+stMMEirK1IieN/Y75K6Rt5A85S
6jqxTigJXFaQJ2Z/9DKypKulHX9cgqC1ZSMz8DWYdcpezE1Up84o+ZWDr678Fze1
70+yfoAJcjIsv/K0hVlTy4zfHxSejCTGo7IywJs4HI/bB60rKFKUL8gSZK6wlADa
Lrc5XSFI+pkRn/lRd3xWish/jNJlgHgFEACi/CUAEQEAAYkCNgQYAQgAIBYhBMkG
p/d00Uxcz4kJDgFQCxGKN4EkBQJiAXQVAhsMAAoJEAFQCxGKN4EkFSwQALaKzPLQ
8M68fe3XfaIbWhHQ5dinpsuCxdvzrWpdcaUgsoIpprlFLZbGwDyx/7R/TJOHzBo5
qKRAnyUI+ZFowpHQpsPNyVS6/UVIXoM4HCUqwMWixIZSb7tYuUgWU7e+Q6UfQrRP
DvaPCRYu0lkYkWnrPWbkHI0xfbtbhT5/pe00beRgvbM9zX3eo0UiZnsdULBrvr3D
ikKskGRNEMfoRJ2M1gtpk0AlfkmDrCPPVR2I9gMeUHaiLt3hWAJJ56fCQlB1w+Np
ExFaSoadqhuavsuTb08PAWRQK//BMcG6Gg8EYVq7ogx+T2IhvZezbQzuWAe/vEXq
a9I0f2QstfmHkEU2cxbvyIGS/ue4/wSUmBy/r6zosZETQBhMiZrNe2Zo1rS/RHGx
3zBfnrapYfXFkuwP1qG7G+aHWSEuo6oP+xMMlidQdE6yPLAZl7kN3bh8rQy/RUug
D29y3a4Ru2ERIOpOik/o6/VRiMkxucvuWeyfTQ7Gn0jXZFzc8ImKCV2CGRNiPKXq
tP6rSJYZIbp46xB39ZYvEuLBgruo4Vno947TFadVXJucflF1wqcIw2NkvE5/v75N
cHw5DpYAYcU1aq3I/gIMC4c1jU/+vVtyG1ng7LoJrD4SDYlgDgH9khfHvlYr5vgZ
9x9pZw0NkQ689BuDHnFe6IXAF9aY+dVF1RX9mDMEYhDIRhYJKwYBBAHaRw8BAQdA
Yso15k3B3hCW3x/37ZDgK8fumjMmbsBkPF6KkPj+7Nq0MkFuZHJldyBZdSAoQW5k
cmV3J3MgRUNDIEtleSkgPGFuZHJld0BhbmRyZXd5dS5vcmc+iJYEExYIAD4WIQSs
8o3AoujXZEazOi1UVBIWajcYmwUCYhDIRgIbAwUJEswDAAULCQgHAgYVCgkICwIE
FgIDAQIeAQIXgAAKCRBUVBIWajcYm9U3AP9FsCDfSWYWLmHo3YGa0qraMeKnQS/6
vInk4ziUjUDtHAD+OrlDl4FOyVcWDaVxpEnf34GZvBboxhxHWx2Jh0odXA2JAjcE
EAEKACEWIQTJBqf3dNFMXM+JCQ4BUAsRijeBJAUCYhDI1AMFCngACgkQAVALEYo3
gSQTDA/9Glf4QjQrxMSvzKn0ktqhBOXAKGqixgvwNHJQuiL1hDOjsihaPl73LkCb
0rA0mj7g0JUoliLJ7tpNfB3ScvCO9YHVKgHm+Vdamh9jERhvaTTfhQp/1cH+lqU2
ildbOJlxGyMVboVEAjc51BB7DYNQFSVRRm7tRNvnV8+0d8N/ykXmXaSvadvZ2Q2H
vwl0XkOK0fXQUzM0gurB0bQUvx/VVZwOx+3TajI6VoTfAAoxmq3xAVd+nAv7cwXK
XNMshGCy0zGJ7gm/dr7SxwkdZ/EBvnKOejByMUctAv32onDfgNUZVZHP4/PhRhqz
DsvhmOal4pGUHeqj2XN1TX/uNIxybW5gTvfi4gOS6Y9ORU/CcPvOG0phQHX2zhF0
7ti4aj21JMOJnmBXL73MxsoP7RdyNcj1XGMmN42F8CqND/xHXeyYB3FGz2vkWEp+
lNcDJ5xwAfcEaJjsmX00u7suFqt6SGnKscFIz8Xwl0FtRYJ+mxs+BccmKl3+U18M
IXKDoYZng3NSQ6p3f6ukk8Qj8SyFtOiBLULGLEy9vgP1HmpiSsJHVjSy7cLNt+kZ
fNY8Qq4xc+1BbuLrT1Z+e0aoQyf2E88UdngbvZ5dmFV3C9VqUTXq0lXAfnxqs906
UtAZkdTm0W2aldwppDQV3VbW0pHDwoD0IrWwEizFNO04Ig20hfGJAjMEEAEKAB0W
IQQC94VDJ3NK3nDFoLcCqOsMDIxDVQUCYhI8EwAKCRACqOsMDIxDVbqQD/sE2eGC
MDHUgW9/VY3M08hR5tp8Orf1K11fMvqjEU3MWxd19OP8oQSEkHwaQ0rRYc2/oepL
4vBHQmagoDidBhWeR1maHvNvb/8d3uKGYpXHiXpNWhlsJh+eE6XGnvp34ISPnL1j
1XtwkU/ZwC1EPUC7kVr46xLuAMMEmemhkNnAOtLGMcpKjB5Hk7rzF2MLlyn9uDYL
Pd0XdPX0kZ7OObxdhcc3GR1KJw2doaWYR6sHTPgQO0E6lUkV84rIy4wkLtQi7biZ
LgfTpSPLn4aRxkkBJL6KeVs2Vt3h18LdW7FbZ11lZVrLpfe2IPJcUrZewO3INoAW
mcE4nYn1f5fGQQP6EcIVvFf7N7+po2c2BW++whZr3Fmn3ECy8Pqf8imxMM8WTZlH
mmmD0R5KN/dR30SMtJYXZP7UTAKQnKrK8Z1WzyYnqppqarZdMruksKedoos3Um7j
5BczYITvwLbDmvu1X/z4kdTRqtcSntpeWbgo+HAKlfJsCd2j+km0mGvJlDGcGYkw
M5aGyFHnJyhE7JXnR4FIuYuNwTFme4UXTWmlKfevjtRjbytMesJKnOQ6uqmYqyPv
Uw8jD2XJkKVofq4Kh8cEysl0wHpgwyyEZQW6D4G7mX40zd+ufZk1ZogpkLFo8BJ2
irXr2Kkhpw9Qw9idRJmHh1nK4VXXn1EkCdIr54kCMwQQAQoAHRYhBO2nA2B1kqT7
3Jqng8Mo9q9ma7EYBQJiEVCVAAoJEMMo9q9ma7EYLN8P/159yxrZW1Lq8Algln4w
TtJAymieDm7rbF/2YVIYu08zIO0uSzVNo23yaVNbtU8lg3GN8BvEQ5m2PUFnZsrP
w6LpmY39/DIFDe0VqWUWaP2EImc3BuaibqVJPl6qAXLfBkpvv8HKcPhYTary9+MO
RKfQQB+LHmcRSt1C+b6U+YhpDGfp+vpb1DQcByFWF2tVtWxvkM2+4o2Qen7zN87H
hpJSbedfebn/bh+RGQ4LDozkea+rMe4p60/vy51FnNyY3zZX6IiMsa4lMn1RZp45
zh3eZHafgE1e03ugRjcKqupRn6vMHqZSM1TROzqwSMWhwkATuXGBE9ZHRbPz/hBB
2Kg4yo7BhMEozWq/mYtnMp2dZjHKyWifAebLbo7RBmVUgmcCBPxh4abVhoAdiNex
x+o3GnO0URKBtDs5n3o2giRdquAqOjpAsjVQwWnSQRj0TTzYjWh2pIw0cK/Qku5p
WpnbMuL8yf9n4XdSxSiTsYvpCGvqHeTvah4TPnRjgSJMUvq4mYgsMFm0keDrq2df
YQMAQMcrYnxS42AxkJqq4mWCcWw2Gp1He3VQHUqMXPuGmG1JJXQGnyJN1xs+uCLv
FMzyJ/ZrqOURH3erIzT34Zan0E3+stY1fwlVVqG8CdmqE0IEc+Inx0C42jKhW1nq
acuiokvhLUCLHO7fecV5+KaZtB1SdW54aSBZdSA8cnVueGlAYW5kcmV3eXUub3Jn
PoiWBBMWCAA+FiEErPKNwKLo12RGszotVFQSFmo3GJsFAmTEksUCGwMFCRLMAwAF
CwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQVFQSFmo3GJtqhAEA1Tf1TOuP62di
D0AGGBZKA2QSavCv/FsfLgSaRKigg7ABAIyGTlXnxouMyVFkrIsly/hOVfJqrDu9
ApWFXFEj+c4AiQIzBBABCgAdFiEEyQan93TRTFzPiQkOAVALEYo3gSQFAmTEkx4A
CgkQAVALEYo3gST9+w//dy6ii0dJPtNwi2evJVjUeutopbuefoVRlGEk8iVQT/dc
PYnH8NMoAXK1L+Ul44BXbiplakZXpqaWLUrDIRzAdTPWZ5+Uv5eL/b2990Gyhbpe
CoY8jjKX2nReDQWk5KPhCklwb0em6RftD/SsSY218XmzysUjdSEIo6eJw+VS5sv4
3jWDK1HNK8QmLrtgzSF2kLJzQPyjK4dETkMAiUtCLPJOSUs/Pml+N8tT/sV4ax90
OR5b2NlZm21pScKhomHr7K0ML5uYP+zHeVrc5dPZq6Ayun8EzrjSWqR01UGCOYFx
SfssyZfansz/kXD/9QOp4H8Z5/TjpzjQHn+cQTkbGUJNR96HYP6gSp8QkCSYXupj
bNNLMbJG+uBWWjSPyyLzxtuyNWLBVoV05Ywg3UxRQ8Up8GM0a1fWVEQ5y1yJVHhe
FVMnvGSCeSXZxkpbo5sfcmMI6SxQntkndiu/C57E9wZD5AkAmwM0eNycDyEBKa8l
q562G/9c9Sx2i0NNL+x5c1er4ScdFvruHDBMLWlyvQl3/1CwlaTH6HPfTBV1RXU/
wVIUE03NiKOn0VFx+UjKbYuIO6Ak6gw61Uoqhjgiaq+sf2pFbuLQ2EWSU2lX4ePY
kzQaQz/nlLg31RlsSnAoJ01EQieBM/oxDb6GqChaNtrQO0soehfnLuO+S/TMS1O0
H1J1bnhpIFl1IDxoYXJyaWV0QGFuZHJld3l1Lm9yZz6IlgQTFggAPhYhBKzyjcCi
6NdkRrM6LVRUEhZqNxibBQJkxJLzAhsDBQkSzAMABQsJCAcCBhUKCQgLAgQWAgMB
Ah4BAheAAAoJEFRUEhZqNxib0B4BAKlsDhWYp5QMrXfbSIiZDfNtk0IzrfVz8yuJ
FV44NnHhAQCKXHIQ3PS+Zp+vMdd1JhZ/i6OXvuKDAgd/GxbX6+1zDYkCMwQQAQoA
HRYhBMkGp/d00Uxcz4kJDgFQCxGKN4EkBQJkxJMiAAoJEAFQCxGKN4Eku80QAItR
JL67RBwe1jx5s+ZN0PYhRR0oV5+rnbiKsX4YLBin93Eg+Kg3xkQx7mpzdCpGF+OF
yOygq9Gpqd9bPuaVYolY/8/LKo7fsiLnQWpGL9ExfffulEqDVjOhv77bZMViyV8b
rjgRw1Wyt+MPfWCKuNzCUNznFWx/WLTC2emf1CECDLYH3E5aTNhKGZ16mYP9NHJX
mW/TpT1NywHEoRO1MJXRYWrBD0uj93kyOLMNCeA/GY2IIVMTRcVpajMNabVd9UW2
IlKKmgq/jUODRHmLeVKk19l8K6AfpOZlas3HRzOHuV7Laaz1FEr7PG7J7O5PLaWS
JhGFjXE/M26HQrhCpMdpj1F78d2j7sOD479lUe8eH6Byaj5CNLMFbWYIBIvLz7oq
fYEdJyzVI6O24PMueok7yvoKHCIHuzZH839pKFVF+yV0Nz0VoaIi5F7gWldv8wjU
mYa29V9zuePCNYI1aO2C9E88Hedj+q92IiV/tCYHhEhECmK44D4WCvaB08yYFap9
6/H3TwYGPc8ijiaWiNJlETzFvBBumxS6uY7MmT4Jh91VeqYbOKEgZZiAJlfr7/sJ
vNayjuJzgsM4B49ryqZ1sgUowrSqWqGpGGIsMGIBV2c5WfuvBT4amHaN6Rj8zMdA
3jYlvzjZ9V6N+TZJ4W+KJTPmSk9D7U88KZZWx+OyuDgEYhDIRhIKKwYBBAGXVQEF
AQEHQHwZrWJH8SCWhgDURogT0SGNWomUjyiklgZHQPhoj0lUAwEIB4h+BBgWCAAm
FiEErPKNwKLo12RGszotVFQSFmo3GJsFAmIQyEYCGwwFCRLMAwAACgkQVFQSFmo3
GJt6wQEAmVP7XurY2IOhP946jev+rbnEyaNBgk1z3qQ3xjYVDq0BAML/zuvafhhA
P55oPfI++dCz+o14GopAM1tJHAM83PQGuDMEZLy+nhYJKwYBBAHaRw8BAQdATKJP
CzrTTc4i+Ip/1rnXKW2cl0EhD/FFGiEASA1UugmIfgQYFggAJhYhBKzyjcCi6Ndk
RrM6LVRUEhZqNxibBQJkvL6eAhsgBQkQ6s+AAAoJEFRUEhZqNxibFfoBAM06uGH2
A27o58zclevLYO2b5lJyVH01ejLe/rJWpsILAP9BDQKxhnuBG6TDkqdGXvRgUf08
I6INgsCWxjrP9ccvA5kBDQRYCtDUAQgAvLDGbSV1fZqprU9PX3hU0n2oUEIiScVl
G6/LA5vtt9Xuk6M5mSZYwcYYZOsGIbe0hAwMQYo6HdRm6RrVSnOGBWWG96BXqfM6
8DjxKt4OMu1fa65tSf0lBpqoZWn10AMBGNLVCmaLnaOHrOYlpltVz/icCt/Yuwql
SPe1BDODSbquHdC+elUeuwP2magX6/DidGMXdZpHdiZwUVnCAbf+s4eWg0IaYN4k
WuUCJ6q9yjbCRlzvSgtztFtjwTbLkHIEnFX3Yn2tTk97A7nxIWBJ/tAgkgaCn5Mh
MMgGrcM+j5fgMoUr2oviWZUEphpselQIQQDSkp2JtlvXvyOOJZJx6wARAQABtBNz
ci5odCA8YWRtaW5Ac3IuaHQ+iQE3BBMBCAAhBQJYCtDUAhsDBQsJCAcCBhUICQoL
AgQWAgMBAh4BAheAAAoJEGWXBNGjipOuhlwH/05kv+ZVPiRAszXk70b1gWLuWoZp
dG4lI5ImxZhI+lHrg7y5+Rt1DwcUSI01RFz1SFYLo0M+ZJH5vmd8S7LWweX6NZxV
8IpAe+/i5FjE6VwpMiKjkvAgcbKAICGWpqf3fyuWMxJdqh9I2uZVyP845JspOY4Y
+l2hg2SfxsppPOulJCMFMke8/sLfFUMqb57fJv+i8k2Xztxm8u+FwGk9F0KCH15R
665hQykupiMcyitl94jFSn65J4Ruk8RTRpO7/cWR/sGPNmij4jtuqiDRxi3sOewl
rAywXrrK5fdegVI5I7ZhXxOGVx0HfkIqXcxTOm/1SFCm+82/xgc5sVkRPxu0SHNy
Lmh0IG91dGdvaW5nIChHZW5lcmFsIHB1cnBvc2Ugb3V0Z29pbmcgc3IuaHQgYWRk
cmVzcykgPG91dGdvaW5nQHNyLmh0PokBTgQTAQgAOBYhBER7aeSzS+kLyCmg6WWX
BNGjipOuBQJcK3iMAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEGWXBNGj
ipOuLOwH/0RzuIcUIq8ePltSqnt3+gJ/SnKxUNYQ1M1g5uSimRO0c7Q9f/QaBVyu
FDsjwdRfjYNIApJyyOuSEkrIgvQm0tGnTn+ZwDuXFG8Er9gNQ/04M51X9XWb3QUN
WLgsled1Fxa8mSeHezYD0Dzq82kBO60LrW5P8JTUip+7d65CY1WkjwKH3YxtBwm9
lHP6BUgjRummN0qgb8q9MrOewq3YSqoNg1UHLGZPHpUhELuAyBWZucbDO8MTee6g
N17IZt+O7eLVh/iKU4vbKoyAQmvkxMuX64ZII/8pCJfQCqyFrNuyhLwqIF8umosG
0EvCvfjKeHfEypr9dpzu/QjOY+7xS2u0RnNyLmh0IHRvZG8gKEFkZHJlc3MgZm9y
IGF1dG9tYXRlZCBlbWFpbHMgZnJvbSB0b2RvLnNyLmh0KSA8dG9kb0Bzci5odD6J
AU4EEwEIADgWIQREe2nks0vpC8gpoOlllwTRo4qTrgUCXCt4oQIbAwULCQgHAgYV
CgkICwIEFgIDAQIeAQIXgAAKCRBllwTRo4qTrnsTB/4wXJEWU0lU/QnIhcwLJbLq
kUXoSeE2nuRFuF+TriRp5hVQ2/p59U9eCPiPhoQN1EWLgntaRBYiX4N+vKV6hg24
f/SUps1nfT2bRhpSOiQKUJT2MWqX5L91K17RdE+0Y9Mk04H+r5I0mh3adOWwr2rU
zu1AA9NbPf0wh5aHjzMZMfXuASn4Ttsv2lXjRVvRAEihuOqv9nOVMlBI6FQmAlde
C97zHG1zTtIUDnmOqFkA9uObXzUT1DDbpgn3RPhRfD1mBpIcqT3/TrOBX7B0LI9d
m4twjRGu8K1bjMEVN6k1qpHPtHPxzFOO9QyIemB+3cRYC06g7We0qqBbn5sCfqk0
tExzci5odCBidWlsZHMgKEFkZHJlc3MgZm9yIGF1dG9tYXRlZCBlbWFpbHMgZnJv
bSBidWlsZHMuc3IuaHQpIDxidWlsZHNAc3IuaHQ+iQFOBBMBCAA4FiEERHtp5LNL
6QvIKaDpZZcE0aOKk64FAlwreLICGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
CgkQZZcE0aOKk6486Af6AghQBgIa0CQAwx+wC2Heiu5EILR4zhPvrtmQI227uQgY
CHGqOVCntLd7vMVQyhNIMv79mP78rtVWnGl1ob1ednZvmAOlGDA85ck54EOs1z9j
Jpjl2JvaO4ZLPNwHI/M8lcbbqEokxHFwcchm3BWuEzfKbbohCRCp0Z6Yuu8TK54m
l3wUwBOAQ4A96qX0Xc4d2Gvv6anf3+slgqJPK0Hh3p56m8q3Uq485cK6cB4+t2k6
dArGy47L+yU6KPACKBqMhoF2jI9ffdQyRRNpMZnd2khVRDxh9m4C5NtcGnY0jAX1
YFkMv3dIQaVNIe+/nohpDVrJkFxNE6zSrPemEj5LVLRDc3IuaHQgZ2l0IChBZGRy
ZXNzIGZvciBhdXRvbWF0ZWQgZW1haWxzIGZyb20gZ2l0LnNyLmh0KSA8Z2l0QHNy
Lmh0PokBTgQTAQgAOBYhBER7aeSzS+kLyCmg6WWXBNGjipOuBQJcK3jDAhsDBQsJ
CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEGWXBNGjipOuwn4IAJZH9cclSxQTQv1M
mmKuomKLXFUPaFvNjnS2dNDXJF5ZYsb5nHfbPpecZipbhjzor2Nv7TNqJ4MX3t6K
z66+PySEFwHmSHKu87s/DiQyP3nzxQvsfwTG9nm9G6QxmpnEzKegIiRmXeHxdiHA
RnFlKRUm2l88vHxP3YlRCJPe9BxksQfDXIQO02NQCsxrcuasuJbJXxnO3gPRvGX6
DUPejBiRSD72OI0+C+9bR/m2qkTd//ActJpsSwolvK0A1RoHD4nGRDVloqAiGC5Y
+04sakyy7SvJwi0PGsvLnP/WJPsISQ2ofrfMAQLiIwsrGv5WT3MaFnpA8meqSxsi
Nk/0EUm0RnNyLmh0IG1ldGEgKEFkZHJlc3MgZm9yIGF1dG9tYXRlZCBlbWFpbHMg
ZnJvbSBtZXRhLnNyLmh0KSA8bWV0YUBzci5odD6JAU4EEwEIADgWIQREe2nks0vp
C8gpoOlllwTRo4qTrgUCXCt41QIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
CRBllwTRo4qTrkvQB/0VYpnyN+briOMxrub+E/xTTu7kry4irRuuImKEAgSUjsNM
Mf61P8FnxGecPMD2QU3XBVQf6hFQpBPLyEpryu9Hy4gbTiqvLZmb4BXfX+1fS1lA
8qIeMTkoRTPpz1qSVmsHiiv7X3JVwFODSH4LRRJ/l7kqq7bd1ZkFnmIkfPk6EW95
XDvAsS1vwBWa1c0Wbl/Z0DMgq+piul8YPHNewl0hyUUnxRL0cxEu6v7KUiU9usZW
mPF9VfNhhUaQT3XiFRBHf+r2z6jSepMmYqGAfz8hJE8TC4e7ETPJdsSmHKi4Fu71
ylti/Nr5hXc3TwkDIMcVoXVIWFg/USHaE/5/AhB1tFJzci5odCBkaXNwYXRjaCAo
QWRkcmVzcyBmb3IgYXV0b21hdGVkIGVtYWlscyBmcm9tIGRpc3BhdGNoLnNyLmh0
KSA8ZGlzcGF0Y2hAc3IuaHQ+iQFOBBMBCAA4FiEERHtp5LNL6QvIKaDpZZcE0aOK
k64FAlwreOoCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQZZcE0aOKk67q
BAf/VCWqTXLPYHIt+1yQhBwfxtPvRy+5XBo2wUnzIQNgQroq30t5N+O1IPoS85Xd
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
v/xlVuJOctm0EN/lcCgGVCAu
=eJK7
-----END PGP PUBLIC KEY BLOCK-----
ef='#n4002'>4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324
/*
 * $LynxId: HTML.c,v 1.154 2012/02/10 01:26:31 tom Exp $
 *
 *		Structured stream to Rich hypertext converter
 *		============================================
 *
 *	This generates a hypertext object.  It converts from the
 *	structured stream interface of HTML events into the style-
 *	oriented interface of the HText.h interface.  This module is
 *	only used in clients and should not be linked into servers.
 *
 *	Override this module if making a new GUI browser.
 *
 *   Being Overidden
 *
 */

#define HTSTREAM_INTERNAL 1

#include <HTUtils.h>

#define Lynx_HTML_Handler
#include <HTChunk.h>
#include <HText.h>
#include <HTStyle.h>
#include <HTML.h>

#include <HTCJK.h>
#include <HTAtom.h>
#include <HTAnchor.h>
#include <HTMLGen.h>
#include <HTParse.h>
#include <HTList.h>
#include <UCMap.h>
#include <UCDefs.h>
#include <UCAux.h>

#include <LYGlobalDefs.h>
#include <LYCharUtils.h>
#include <LYCharSets.h>

#include <HTAlert.h>
#include <HTForms.h>
#include <HTNestedList.h>
#include <GridText.h>
#include <LYStrings.h>
#include <LYUtils.h>
#include <LYMap.h>
#include <LYList.h>
#include <LYBookmark.h>
#include <LYHistory.h>

#ifdef VMS
#include <LYCurses.h>
#endif /* VMS */

#ifdef USE_PRETTYSRC
#include <LYPrettySrc.h>
#endif

#ifdef USE_COLOR_STYLE
#include <SGML.h>
#include <AttrList.h>
#include <LYHash.h>
#include <LYStyle.h>
#undef SELECTED_STYLES
#define pHText_changeStyle(X,Y,Z) {}

#if OMIT_SCN_KEEPING
# define HCODE_TO_STACK_OFF(x) /*(CSHASHSIZE+1)*/ 88888		/*special value. */
#else
# define HCODE_TO_STACK_OFF(x) x	/*pass computed value */
#endif

#endif /* USE_COLOR_STYLE */

#ifdef USE_SOURCE_CACHE
#include <HTAccess.h>
#endif

#include <LYCurses.h>
#include <LYJustify.h>

#include <LYexit.h>
#include <LYLeaks.h>

#define STACKLEVEL(me) ((me->stack + MAX_NESTING - 1) - me->sp)

#define DFT_TEXTAREA_COLS 60
#define DFT_TEXTAREA_ROWS 4

#define MAX_TEXTAREA_COLS LYcolLimit
#define MAX_TEXTAREA_ROWS (3 * LYlines)

#define LimitValue(name, value) \
 	if (name > value) { \
		CTRACE((tfp, "Limited " #name " to %d, was %d\n", \
			value, name)); \
		name = value; \
	}

struct _HTStream {
    const HTStreamClass *isa;
#ifdef USE_SOURCE_CACHE
    HTParentAnchor *anchor;
    FILE *fp;
    char *filename;
    HTChunk *chunk;
    HTChunk *last_chunk;	/* the last chunk in a chain! */
    const HTStreamClass *actions;
    HTStream *target;
    int status;
#else
    /* .... */
#endif
};

static HTStyleSheet *styleSheet = NULL;		/* Application-wide */

/*	Module-wide style cache
*/
static HTStyle *styles[HTML_ELEMENTS + LYNX_HTML_EXTRA_ELEMENTS];

					   /* adding 24 nested list styles  */
					   /* and 3 header alignment styles */
					   /* and 3 div alignment styles    */
static HTStyle *default_style = NULL;

const char *LYToolbarName = "LynxPseudoToolbar";

/* used to turn off a style if the HTML author forgot to
static int i_prior_style = -1;
 */

/*
 *	Private function....
 */
static int HTML_end_element(HTStructured * me, int element_number,
			    char **include);

static int HTML_start_element(HTStructured * me, int element_number,
			      const BOOL *present,
			      const char **value,
			      int tag_charset,
			      char **include);

/*
 * If we have verbose_img set, display labels for images.
 */
#define VERBOSE_IMG(value,src_type,string) \
      ((verbose_img) ? (newtitle = MakeNewTitle(value,src_type)): string)

static char *MakeNewTitle(const char **value, int src_type);
static char *MakeNewImageValue(const char **value);
static char *MakeNewMapValue(const char **value, const char *mapstr);

/*	Set an internal flag that the next call to a stack-affecting method
 *	is only internal and the stack manipulation should be skipped. - kw
 */
#define SET_SKIP_STACK(el_num) if (HTML_dtd.tags[el_num].contents != SGML_EMPTY) \
						{ me->skip_stack++; }

void strtolower(char *i)
{
    if (!i)
	return;
    while (*i) {
	*i = (char) TOLOWER(*i);
	i++;
    }
}

/*		Flattening the style structure
 *		------------------------------
 *
 * On the NeXT, and on any read-only browser, it is simpler for the text to
 * have a sequence of styles, rather than a nested tree of styles.  In this
 * case we have to flatten the structure as it arrives from SGML tags into a
 * sequence of styles.
 */

/*
 *  If style really needs to be set, call this.
 */
void actually_set_style(HTStructured * me)
{
    if (!me->text) {		/* First time through */
	LYGetChartransInfo(me);
	UCSetTransParams(&me->T,
			 me->UCLYhndl, me->UCI,
			 HTAnchor_getUCLYhndl(me->node_anchor,
					      UCT_STAGE_HTEXT),
			 HTAnchor_getUCInfoStage(me->node_anchor,
						 UCT_STAGE_HTEXT));
	me->text = HText_new2(me->node_anchor, me->target);
	HText_beginAppend(me->text);
	HText_setStyle(me->text, me->new_style);
	me->in_word = NO;
	LYCheckForContentBase(me);
    } else {
	HText_setStyle(me->text, me->new_style);
    }

    me->old_style = me->new_style;
    me->style_change = NO;
}

/*
 *  If you THINK you need to change style, call this.
 */
static void change_paragraph_style(HTStructured * me, HTStyle *style)
{
    if (me->new_style != style) {
	me->style_change = YES;
	me->new_style = style;
    }
    me->in_word = NO;
}

/*
 * Return true if we should write a message (to LYNXMESSAGES, or the trace
 * file) telling about some bad HTML that we've found.
 */
BOOL LYBadHTML(HTStructured * me)
{
    BOOL code = FALSE;

    switch ((enumBadHtml) cfg_bad_html) {
    case BAD_HTML_IGNORE:
	break;
    case BAD_HTML_TRACE:
	code = TRUE;
	break;
    case BAD_HTML_MESSAGE:
	code = TRUE;
	break;
    case BAD_HTML_WARN:
	/*
	 * If we're already tracing, do not add a warning.
	 */
	if (!TRACE && !me->inBadHTML) {
	    HTUserMsg(BAD_HTML_USE_TRACE);
	    me->inBadHTML = TRUE;
	}
	code = TRACE;
	break;
    }
    return code;
}

/*
 * Handle the formatted message.
 */
void LYShowBadHTML(const char *message)
{
    switch ((enumBadHtml) cfg_bad_html) {
    case BAD_HTML_IGNORE:
	break;
    case BAD_HTML_TRACE:
	CTRACE((tfp, "%s", message));
	break;
    case BAD_HTML_MESSAGE:
	CTRACE((tfp, "%s", message));
	LYstore_message(message);
	break;
    case BAD_HTML_WARN:
	CTRACE((tfp, "%s", message));
	break;
    }
}

/*_________________________________________________________________________
 *
 *			A C T I O N	R O U T I N E S
 */

/* FIXME:  this should be amended to do the substitution only when not in a
 * multibyte stream.
 */
#ifdef EXP_JAPANESE_SPACES
#define FIX_JAPANESE_SPACES \
	(HTCJK == CHINESE || HTCJK == JAPANESE || HTCJK == TAIPEI)
	/* don't replace '\n' with ' ' if Chinese or Japanese - HN
	 */
#else
#define FIX_JAPANESE_SPACES 0
#endif

/*	Character handling
 *	------------------
 */
void HTML_put_character(HTStructured * me, int c)
{
    unsigned uc = UCH(c);

    /*
     * Ignore all non-MAP content when just scanning a document for MAPs.  - FM
     */
    if (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT)
	return;

    c = (int) uc;

    /*
     * Do EOL conversion if needed.  - FM
     *
     * Convert EOL styles:
     *   macintosh:  cr    --> lf
     *   ascii:      cr-lf --> lf
     *   unix:       lf    --> lf
     */
    if ((me->lastraw == '\r') && c == '\n') {
	me->lastraw = -1;
	return;
    }
    me->lastraw = c;
    if (c == '\r') {
	c = '\n';
	uc = UCH(c);
    }

    /*
     * Handle SGML_LITTERAL tags that have HTChunk elements.  - FM
     */
    switch (me->sp[0].tag_number) {

    case HTML_COMMENT:
	return;			/* Do Nothing */

    case HTML_TITLE:
	if (c == LY_SOFT_HYPHEN)
	    return;
	if (c != '\n' && c != '\t' && c != '\r') {
	    HTChunkPutc(&me->title, uc);
	} else if (FIX_JAPANESE_SPACES) {
	    if (c == '\t') {
		HTChunkPutc(&me->title, ' ');
	    } else {
		return;
	    }
	} else {
	    HTChunkPutc(&me->title, ' ');
	}
	return;

    case HTML_STYLE:
	HTChunkPutc(&me->style_block, uc);
	return;

    case HTML_SCRIPT:
	HTChunkPutc(&me->script, uc);
	return;

    case HTML_OBJECT:
	HTChunkPutc(&me->object, uc);
	return;

    case HTML_TEXTAREA:
	HTChunkPutc(&me->textarea, uc);
	return;

    case HTML_SELECT:
    case HTML_OPTION:
	HTChunkPutc(&me->option, uc);
	return;

    case HTML_MATH:
	HTChunkPutc(&me->math, uc);
	return;

    default:
	if (me->inSELECT) {
	    /*
	     * If we are within a SELECT not caught by the cases above -
	     * HTML_SELECT or HTML_OPTION may not be the last element pushed on
	     * the style stack if there were invalid markup tags within a
	     * SELECT element.  For error recovery, treat text as part of the
	     * OPTION text, it is probably meant to show up as user-visible
	     * text.  Having A as an open element while in SELECT is really
	     * sick, don't make anchor text part of the option text in that
	     * case since the option text will probably just be discarded.  -
	     * kw
	     */
	    if (me->sp[0].tag_number == HTML_A)
		break;
	    HTChunkPutc(&me->option, uc);
	    return;
	}
	break;
    }				/* end first switch */

    /*
     * Handle all other tag content.  - FM
     */
    switch (me->sp[0].tag_number) {

    case HTML_PRE:		/* Formatted text */
	/*
	 * We guarantee that the style is up-to-date in begin_litteral. But we
	 * still want to strip \r's.
	 */
	if (c != '\r' &&
	    !(c == '\n' && me->inLABEL && !me->inP) &&
	    !(c == '\n' && !me->inPRE)) {
	    me->inP = TRUE;
	    me->inLABEL = FALSE;
	    HText_appendCharacter(me->text, c);
	}
	me->inPRE = TRUE;
	break;

    case HTML_LISTING:		/* Literal text */
    case HTML_XMP:
    case HTML_PLAINTEXT:
	/*
	 * We guarantee that the style is up-to-date in begin_litteral.  But we
	 * still want to strip \r's.
	 */
	if (c != '\r') {
	    me->inP = TRUE;
	    me->inLABEL = FALSE;
	    HText_appendCharacter(me->text, c);
	}
	break;

    default:
	/*
	 * Free format text.
	 */
	if (me->sp->style->id == ST_Preformatted) {
	    if (c != '\r' &&
		!(c == '\n' && me->inLABEL && !me->inP) &&
		!(c == '\n' && !me->inPRE)) {
		me->inP = TRUE;
		me->inLABEL = FALSE;
		HText_appendCharacter(me->text, c);
	    }
	    me->inPRE = TRUE;

	} else if (me->sp->style->id == ST_Listing ||
		   me->sp->style->id == ST_Example) {
	    if (c != '\r') {
		me->inP = TRUE;
		me->inLABEL = FALSE;
		HText_appendCharacter(me->text, c);
	    }

	} else {
	    if (me->style_change) {
		if ((c == '\n') || (c == ' '))
		    return;	/* Ignore it */
		UPDATE_STYLE;
	    }
	    if (c == '\n') {
		if (!FIX_JAPANESE_SPACES) {
		    if (me->in_word) {
			if (HText_getLastChar(me->text) != ' ') {
			    me->inP = TRUE;
			    me->inLABEL = FALSE;
			    HText_appendCharacter(me->text, ' ');
			}
			me->in_word = NO;
		    }
		}

	    } else if (c == ' ' || c == '\t') {
		if (HText_getLastChar(me->text) != ' ') {
		    me->inP = TRUE;
		    me->inLABEL = FALSE;
		    HText_appendCharacter(me->text, ' ');
		}

	    } else if (c == '\r') {
		/* ignore */

	    } else {
		me->inP = TRUE;
		me->inLABEL = FALSE;
		HText_appendCharacter(me->text, c);
		me->in_word = YES;
	    }
	}
    }				/* end second switch */

    if (c == '\n' || c == '\t') {
	HText_setLastChar(me->text, ' ');	/* set it to a generic separator */

	/*
	 * \r's are ignored.  In order to keep collapsing spaces correctly we
	 * must default back to the previous separator if there was one.
	 */
    } else if (c == '\r' && HText_getLastChar(me->text) == ' ') {
	HText_setLastChar(me->text, ' ');	/* set it to a generic separator */
    } else {
	HText_setLastChar(me->text, c);
    }
}

/*	String handling
 *	---------------
 *
 *	This is written separately from put_character because the loop can
 *	in some cases be promoted to a higher function call level for speed.
 */
void HTML_put_string(HTStructured * me, const char *s)
{
#ifdef USE_PRETTYSRC
    char *translated_string = NULL;
#endif

    if (s == NULL || (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT))
	return;
#ifdef USE_PRETTYSRC
    if (psrc_convert_string) {
	StrAllocCopy(translated_string, s);
	TRANSLATE_AND_UNESCAPE_ENTITIES(&translated_string, TRUE, FALSE);
	s = (const char *) translated_string;
    }
#endif

    switch (me->sp[0].tag_number) {

    case HTML_COMMENT:
	break;			/* Do Nothing */

    case HTML_TITLE:
	HTChunkPuts(&me->title, s);
	break;

    case HTML_STYLE:
	HTChunkPuts(&me->style_block, s);
	break;

    case HTML_SCRIPT:
	HTChunkPuts(&me->script, s);
	break;

    case HTML_PRE:		/* Formatted text */
    case HTML_LISTING:		/* Literal text */
    case HTML_XMP:
    case HTML_PLAINTEXT:
	/*
	 * We guarantee that the style is up-to-date in begin_litteral
	 */
	HText_appendText(me->text, s);
	break;

    case HTML_OBJECT:
	HTChunkPuts(&me->object, s);
	break;

    case HTML_TEXTAREA:
	HTChunkPuts(&me->textarea, s);
	break;

    case HTML_SELECT:
    case HTML_OPTION:
	HTChunkPuts(&me->option, s);
	break;

    case HTML_MATH:
	HTChunkPuts(&me->math, s);
	break;

    default:			/* Free format text? */
	if (!me->sp->style->freeFormat) {
	    /*
	     * If we are within a preformatted text style not caught by the
	     * cases above (HTML_PRE or similar may not be the last element
	     * pushed on the style stack).  - kw
	     */
#ifdef USE_PRETTYSRC
	    if (psrc_view) {
		/*
		 * We do this so that a raw '\r' in the string will not be
		 * interpreted as an internal request to break a line - passing
		 * '\r' to HText_appendText is treated by it as a request to
		 * insert a blank line - VH
		 */
		for (; *s; ++s)
		    HTML_put_character(me, *s);
	    } else
#endif
		HText_appendText(me->text, s);
	    break;
	} else {
	    const char *p = s;
	    char c;

	    if (me->style_change) {
		for (; *p && ((*p == '\n') || (*p == '\r') ||
			      (*p == ' ') || (*p == '\t')); p++) ;	/* Ignore leaders */
		if (!*p)
		    break;
		UPDATE_STYLE;
	    }
	    for (; *p; p++) {
		if (*p == 13 && p[1] != 10) {
		    /*
		     * Treat any '\r' which is not followed by '\n' as '\n', to
		     * account for macintosh lineend in ALT attributes etc.  -
		     * kw
		     */
		    c = '\n';
		} else {
		    c = *p;
		}
		if (me->style_change) {
		    if ((c == '\n') || (c == ' ') || (c == '\t'))
			continue;	/* Ignore it */
		    UPDATE_STYLE;
		}
		if (c == '\n') {
		    if (!FIX_JAPANESE_SPACES) {
			if (me->in_word) {
			    if (HText_getLastChar(me->text) != ' ')
				HText_appendCharacter(me->text, ' ');
			    me->in_word = NO;
			}
		    }

		} else if (c == ' ' || c == '\t') {
		    if (HText_getLastChar(me->text) != ' ')
			HText_appendCharacter(me->text, ' ');

		} else if (c == '\r') {
		    /* ignore */
		} else {
		    HText_appendCharacter(me->text, c);
		    me->in_word = YES;
		}

		/* set the Last Character */
		if (c == '\n' || c == '\t') {
		    /* set it to a generic separator */
		    HText_setLastChar(me->text, ' ');
		} else if (c == '\r' &&
			   HText_getLastChar(me->text) == ' ') {
		    /*
		     * \r's are ignored.  In order to keep collapsing spaces
		     * correctly, we must default back to the previous
		     * separator, if there was one.  So we set LastChar to a
		     * generic separator.
		     */
		    HText_setLastChar(me->text, ' ');
		} else {
		    HText_setLastChar(me->text, c);
		}

	    }			/* for */
	}
    }				/* end switch */
#ifdef USE_PRETTYSRC
    if (psrc_convert_string) {
	psrc_convert_string = FALSE;
	FREE(translated_string);
    }
#endif
}

/*	Buffer write
 *	------------
 */
void HTML_write(HTStructured * me, const char *s, int l)
{
    const char *p;
    const char *e = s + l;

    if (LYMapsOnly && me->sp[0].tag_number != HTML_OBJECT)
	return;

    for (p = s; p < e; p++)
	HTML_put_character(me, *p);
}

/*
 *  "Internal links" are hyperlinks whose source and destination are
 *  within the same document, and for which the destination is given
 *  as a URL Reference with an empty URL, but possibly with a non-empty
 *  #fragment.	(This terminology re URL-Reference vs. URL follows the
 *  Fielding URL syntax and semantics drafts).
 *  Differences:
 *  (1) The document's base (in whatever way it is given) is not used for
 *	resolving internal link references.
 *  (2) Activating an internal link should not result in a new retrieval
 *	of a copy of the document.
 *  (3) Internal links are the only way to refer with a hyperlink to a document
 *	(or a location in it) which is only known as the result of a POST
 *	request (doesn't have a URL from which the document can be retrieved
 *	with GET), and can only be used from within that document.
 *
 * *If DONT_TRACK_INTERNAL_LINKS is not defined, we keep track of whether a
 *  link destination was given as an internal link.  This information is
 *  recorded in the type of the link between anchor objects, and is available
 *  to the HText object and the mainloop from there.  URL References to
 *  internal destinations are still resolved into an absolute form before
 *  being passed on, but using the current stream's retrieval address instead
 *  of the base URL.
 *  Examples:  (replace [...] to have a valid absolute URL)
 *  In document retrieved from [...]/mypath/mydoc.htm w/ base [...]/otherpath/
 *  a. HREF="[...]/mypath/mydoc.htm"	  -> [...]/mypath/mydoc.htm
 *  b. HREF="[...]/mypath/mydoc.htm#frag" -> [...]/mypath/mydoc.htm#frag
 *  c. HREF="mydoc.htm"			  -> [...]/otherpath/mydoc.htm
 *  d. HREF="mydoc.htm#frag"		  -> [...]/otherpath/mydoc.htm#frag
 *  e. HREF=""		      -> [...]/mypath/mydoc.htm      (marked internal)
 *  f. HREF="#frag"	      -> [...]/mypath/mydoc.htm#frag (marked internal)
 *
 * *If DONT_TRACK_INTERNAL_LINKS is defined, URL-less URL-References are
 *  resolved differently from URL-References with a non-empty URL (using the
 *  current stream's retrieval address instead of the base), but we make no
 *  further distinction.  Resolution is then as in the examples above, execept
 *  that there is no "(marked internal)".
 *
 * *Note that this doesn't apply to form ACTIONs (always resolved using base,
 *  never marked internal).  Also other references encountered or generated
 *  are not marked internal, whether they have a URL or not, if in a given
 *  context an internal link makes no sense (e.g., IMG SRC=).
 */

/* A flag is used to keep track of whether an "URL reference" encountered
   had a real "URL" or not.  In the latter case, it will be marked as
   "internal".	The flag is set before we start messing around with the
   string (resolution of relative URLs etc.).  This variable only used
   locally here, don't confuse with LYinternal_flag which is for
   overriding non-caching similar to LYoverride_no_cache. - kw */
#define CHECK_FOR_INTERN(flag,s) \
   	flag = (BOOLEAN) ((s && (*s=='#' || *s=='\0')) ? TRUE : FALSE)

/* Last argument to pass to HTAnchor_findChildAndLink() calls,
   just an abbreviation. - kw */
#define INTERN_LT (HTLinkType *)(intern_flag ? HTInternalLink : NULL)

#ifdef USE_COLOR_STYLE
static char *Style_className = 0;
static char *Style_className_end = 0;
static size_t Style_className_len = 0;
static int hcode;

#ifdef LY_FIND_LEAKS
static void free_Style_className(void)
{
    FREE(Style_className);
}
#endif

static void addClassName(const char *prefix,
			 const char *actual,
			 size_t length)
{
    size_t offset = strlen(prefix);
    size_t have = (unsigned) (Style_className_end - Style_className);
    size_t need = (offset + length + 1);

    if ((have + need) >= Style_className_len) {
	Style_className_len += 1024 + 2 * (have + need);
	if (Style_className == 0) {
	    Style_className = typeMallocn(char, Style_className_len);
	} else {
	    Style_className = typeRealloc(char, Style_className, Style_className_len);
	}
	if (Style_className == NULL)
	    outofmem(__FILE__, "addClassName");
	assert(Style_className != NULL);
	Style_className_end = Style_className + have;
    }
    if (offset)
	strcpy(Style_className_end, prefix);
    if (length)
	memcpy(Style_className_end + offset, actual, length);
    Style_className_end[offset + length] = '\0';
    strtolower(Style_className_end);

    Style_className_end += (offset + length);
}
#else
#define addClassName(prefix, actual, length)	/* nothing */
#endif

#ifdef USE_PRETTYSRC

static void HTMLSRC_apply_markup(HTStructured * context, HTlexeme lexeme, int start,
				 int tag_charset)
{
    HT_tagspec *ts = *((start ? lexeme_start : lexeme_end) + lexeme);

    while (ts) {
#ifdef USE_COLOR_STYLE
	if (ts->start) {
	    current_tag_style = ts->style;
	    force_current_tag_style = TRUE;
	    forced_classname = ts->class_name;
	    force_classname = TRUE;
	}
#endif
	CTRACE((tfp, ts->start ? "SRCSTART %d\n" : "SRCSTOP %d\n", (int) lexeme));
	if (ts->start)
	    HTML_start_element(context,
			       (int) ts->element,
			       ts->present,
			       (const char **) ts->value,
			       tag_charset,
			       NULL);
	else
	    HTML_end_element(context,
			     (int) ts->element,
			     NULL);
	ts = ts->next;
    }
}

#  define START TRUE
#  define STOP FALSE

#  define PSRCSTART(x)	HTMLSRC_apply_markup(me,HTL_##x,START,tag_charset)
#  define PSRCSTOP(x)  HTMLSRC_apply_markup(me,HTL_##x,STOP,tag_charset)

#  define PUTC(x) HTML_put_character(me,x)
#  define PUTS(x) HTML_put_string(me,x)

#endif /* USE_PRETTYSRC */

static void LYStartArea(HTStructured * obj, const char *href,
			const char *alt,
			const char *title,
			int tag_charset)
{
    BOOL new_present[HTML_AREA_ATTRIBUTES];
    const char *new_value[HTML_AREA_ATTRIBUTES];
    int i;

    for (i = 0; i < HTML_AREA_ATTRIBUTES; i++)
	new_present[i] = NO;

    if (alt) {
	new_present[HTML_AREA_ALT] = YES;
	new_value[HTML_AREA_ALT] = (const char *) alt;
    }
    if (non_empty(title)) {
	new_present[HTML_AREA_TITLE] = YES;
	new_value[HTML_AREA_TITLE] = (const char *) title;
    }
    if (href) {
	new_present[HTML_AREA_HREF] = YES;
	new_value[HTML_AREA_HREF] = (const char *) href;
    }

    (*obj->isa->start_element) (obj, HTML_AREA, new_present, new_value,
				tag_charset, 0);
}

static void LYHandleFIG(HTStructured * me, const BOOL *present,
			const char **value,
			int isobject,
			int imagemap,
			const char *id,
			const char *src,
			int convert,
			int start,
			BOOL *intern_flag GCC_UNUSED)
{
    if (start == TRUE) {
	me->inFIG = TRUE;
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, NULL);
	}
	if (!isobject) {
	    LYEnsureDoubleSpace(me);
	    LYResetParagraphAlignment(me);
	    me->inFIGwithP = TRUE;
	} else {
	    me->inFIGwithP = FALSE;
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	}
	if (non_empty(id)) {
	    if (present && convert) {
		CHECK_ID(HTML_FIG_ID);
	    } else
		LYHandleID(me, id);
	}
	me->in_word = NO;
	me->inP = FALSE;

	if (clickable_images && non_empty(src)) {
	    char *href = NULL;

	    StrAllocCopy(href, src);
	    CHECK_FOR_INTERN(*intern_flag, href);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);
	    if (*href) {
		me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							 NULL,	/* Tag */
							 href,	/* Addresss */
							 INTERN_LT);	/* Type */
		HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		HTML_put_string(me, (isobject
				     ? (imagemap
					? "(IMAGE)"
					: "(OBJECT)")
				     : "[FIGURE]"));
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		HText_endAnchor(me->text, 0);
		HTML_put_character(me, '-');
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
	    }
	    FREE(href);
	}
    } else {			/* handle end tag */
	if (me->inFIGwithP) {
	    LYEnsureDoubleSpace(me);
	} else {
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	}
	LYResetParagraphAlignment(me);
	me->inFIGwithP = FALSE;
	me->inFIG = FALSE;
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	if (me->List_Nesting_Level >= 0) {
	    UPDATE_STYLE;
	    HText_NegateLineOne(me->text);
	}
    }
}

static void clear_objectdata(HTStructured * me)
{
    if (me) {
	HTChunkClear(&me->object);
	me->object_started = FALSE;
	me->object_declare = FALSE;
	me->object_shapes = FALSE;
	me->object_ismap = FALSE;
	FREE(me->object_usemap);
	FREE(me->object_id);
	FREE(me->object_title);
	FREE(me->object_data);
	FREE(me->object_type);
	FREE(me->object_classid);
	FREE(me->object_codebase);
	FREE(me->object_codetype);
	FREE(me->object_name);
    }
}

#define HTParseALL(pp,pconst)  \
	{ char* free_me = *pp; \
	  *pp = HTParse(*pp, pconst, PARSE_ALL); \
	  FREE(free_me);       \
	}

/*	Start Element
 *	-------------
 */
static int HTML_start_element(HTStructured * me, int element_number,
			      const BOOL *present,
			      const char **value,
			      int tag_charset,
			      char **include)
{
    char *alt_string = NULL;
    char *id_string = NULL;
    char *newtitle = NULL;
    char **pdoctitle = NULL;
    char *href = NULL;
    char *map_href = NULL;
    char *title = NULL;
    char *I_value = NULL;
    char *I_name = NULL;
    char *temp = NULL;
    const char *Base = NULL;
    int dest_char_set = -1;
    HTParentAnchor *dest = NULL;	/* An anchor's destination */
    BOOL dest_ismap = FALSE;	/* Is dest an image map script? */
    HTChildAnchor *ID_A = NULL;	/* HTML_foo_ID anchor */
    int url_type = 0, i = 0;
    char *cp = NULL;
    HTMLElement ElementNumber = (HTMLElement) element_number;
    BOOL intern_flag = FALSE;
    short stbl_align = HT_ALIGN_NONE;
    int status = HT_OK;

#ifdef USE_COLOR_STYLE
    char *class_name;
    int class_used = 0;
#endif

#ifdef USE_PRETTYSRC
    if (psrc_view && !sgml_in_psrc_was_initialized) {
	if (!psrc_nested_call) {
	    HTTag *tag = &HTML_dtd.tags[element_number];
	    char buf[200];
	    const char *p;

	    if (psrc_first_tag) {
		psrc_first_tag = FALSE;
		/* perform the special actions on the begining of the document.
		   It's assumed that all lynx modules start generating html
		   from tag (ie not a text) so we are able to trap this moment
		   and initialize.
		 */
		psrc_nested_call = TRUE;
		HTML_start_element(me, HTML_BODY, NULL, NULL, tag_charset, NULL);
		HTML_start_element(me, HTML_PRE, NULL, NULL, tag_charset, NULL);
		PSRCSTART(entire);
		psrc_nested_call = FALSE;
	    }

	    psrc_nested_call = TRUE;
	    /*write markup for tags and exit */
	    PSRCSTART(abracket);
	    PUTC('<');
	    PSRCSTOP(abracket);
	    PSRCSTART(tag);
	    if (tagname_transform != 0)
		PUTS(tag->name);
	    else {
		LYStrNCpy(buf, tag->name, sizeof(buf) - 1);
		LYLowerCase(buf);
		PUTS(buf);
	    }
	    if (present) {
		for (i = 0; i < tag->number_of_attributes; i++)
		    if (present[i]) {
			PUTC(' ');
			PSRCSTART(attrib);
			if (attrname_transform != 0)
			    PUTS(tag->attributes[i].name);
			else {
			    LYStrNCpy(buf,
				      tag->attributes[i].name,
				      sizeof(buf) - 1);
			    LYLowerCase(buf);
			    PUTS(buf);
			}
			if (value[i]) {
			    char q = '"';

			    /*0 in dquotes, 1 - in quotes, 2 mixed */
			    char kind = (char) (!strchr(value[i], '"') ?
						0 :
						!strchr(value[i], '\'') ?
						q = '\'', 1 :
						2);

			    PUTC('=');
			    PSRCSTOP(attrib);
			    PSRCSTART(attrval);
			    PUTC(q);
			    /*is it special ? */
			    if (tag->attributes[i].type == HTMLA_ANAME) {
				HTStartAnchor(me, value[i], NULL);
				HTML_end_element(me, HTML_A, NULL);
			    } else if (tag->attributes[i].type == HTMLA_HREF) {
				PSRCSTART(href);
				HTStartAnchor(me, NULL, value[i]);
			    }
			    if (kind != 2)
				PUTS(value[i]);
			    else
				for (p = value[i]; *p; p++)
				    if (*p != '"')
					PUTC(*p);
				    else
					PUTS("&#34;");
			    /*is it special ? */
			    if (tag->attributes[i].type == HTMLA_HREF) {
				HTML_end_element(me, HTML_A, NULL);
				PSRCSTOP(href);
			    }
			    PUTC(q);
			    PSRCSTOP(attrval);
			}	/* if value */
		    }		/* if present[i] */
	    }			/* if present */
	    PSRCSTOP(tag);
	    PSRCSTART(abracket);
	    PUTC('>');
	    PSRCSTOP(abracket);
	    psrc_nested_call = FALSE;
	    return HT_OK;
	}			/*if (!psrc_nested_call) */
	/*fall through */
    }
#endif /* USE_PRETTYSRC */

    if (LYMapsOnly) {
	if (!(ElementNumber == HTML_MAP || ElementNumber == HTML_AREA ||
	      ElementNumber == HTML_BASE || ElementNumber == HTML_OBJECT ||
	      ElementNumber == HTML_A)) {
	    return HT_OK;
	}
    } else if (!me->text) {
	UPDATE_STYLE;
    } {
	/*  me->tag_charset  is charset for attribute values.  */
	int j = ((tag_charset < 0) ? me->UCLYhndl : tag_charset);

	if ((me->tag_charset != j) || (j < 0 /* for trace entry */ )) {
	    CTRACE((tfp, "me->tag_charset: %d -> %d", me->tag_charset, j));
	    CTRACE((tfp, " (me->UCLYhndl: %d, tag_charset: %d)\n",
		    me->UCLYhndl, tag_charset));
	    me->tag_charset = j;
	}
    }

/* this should be done differently */
#if defined(USE_COLOR_STYLE)

    addClassName(";",
		 HTML_dtd.tags[element_number].name,
		 (size_t) HTML_dtd.tags[element_number].name_len);

    class_name = (force_classname ? forced_classname : class_string);
    force_classname = FALSE;

    if (force_current_tag_style == FALSE) {
	current_tag_style = (class_name[0]
			     ? -1
			     : cached_tag_styles[element_number]);
    } else {
	force_current_tag_style = FALSE;
    }

    CTRACE2(TRACE_STYLE, (tfp, "CSS.elt:<%s>\n", HTML_dtd.tags[element_number].name));

    if (current_tag_style == -1) {	/* Append class_name */
	hcode = hash_code_lowercase_on_fly(HTML_dtd.tags[element_number].name);
	if (class_name[0]) {
	    int ohcode = hcode;

	    hcode = hash_code_aggregate_char('.', hcode);
	    hcode = hash_code_aggregate_lower_str(class_name, hcode);
	    if (!hashStyles[hcode].name) {	/* None such -> classless version */
		hcode = ohcode;
		CTRACE2(TRACE_STYLE,
			(tfp,
			 "STYLE.start_element: <%s> (class <%s> not configured), hcode=%d.\n",
			 HTML_dtd.tags[element_number].name, class_name, hcode));
	    } else {
		addClassName(".", class_name, strlen(class_name));

		CTRACE2(TRACE_STYLE,
			(tfp, "STYLE.start_element: <%s>.<%s>, hcode=%d.\n",
			 HTML_dtd.tags[element_number].name, class_name, hcode));
		class_used = 1;
	    }
	}

	class_string[0] = '\0';

    } else {			/* (current_tag_style!=-1)  */
	if (class_name[0]) {
	    addClassName(".", class_name, strlen(class_name));
	    class_string[0] = '\0';
	}
	hcode = current_tag_style;
	CTRACE2(TRACE_STYLE,
		(tfp, "STYLE.start_element: <%s>, hcode=%d.\n",
		 HTML_dtd.tags[element_number].name, hcode));
	current_tag_style = -1;
    }

#if !OMIT_SCN_KEEPING		/* Can be done in other cases too... */
    if (!class_used && ElementNumber == HTML_INPUT) {	/* For some other too? */
	const char *type = "";
	int ohcode = hcode;

	if (present && present[HTML_INPUT_TYPE] && value[HTML_INPUT_TYPE])
	    type = value[HTML_INPUT_TYPE];

	hcode = hash_code_aggregate_lower_str(".type.", hcode);
	hcode = hash_code_aggregate_lower_str(type, hcode);
	if (!hashStyles[hcode].name) {	/* None such -> classless version */
	    hcode = ohcode;
	    CTRACE2(TRACE_STYLE,
		    (tfp, "STYLE.start_element: type <%s> not configured.\n",
		     type));
	} else {
	    addClassName(".type.", type, strlen(type));

	    CTRACE2(TRACE_STYLE,
		    (tfp, "STYLE.start_element: <%s>.type.<%s>, hcode=%d.\n",
		     HTML_dtd.tags[element_number].name, type, hcode));
	}
    }
#endif /* !OMIT_SCN_KEEPING */

    HText_characterStyle(me->text, hcode, STACK_ON);
#endif /* USE_COLOR_STYLE */

    /*
     * Handle the start tag.  - FM
     */
    switch (ElementNumber) {

    case HTML_HTML:
	break;

    case HTML_HEAD:
	break;

    case HTML_BASE:
	if (present && present[HTML_BASE_HREF] && !local_host_only &&
	    non_empty(value[HTML_BASE_HREF])) {
	    char *base = NULL;
	    const char *related = NULL;

	    StrAllocCopy(base, value[HTML_BASE_HREF]);
	    CTRACE((tfp, "*HTML_BASE: initial href=`%s'\n", NonNull(base)));

	    if (!(url_type = LYLegitimizeHREF(me, &base, TRUE, TRUE))) {
		CTRACE((tfp, "HTML: BASE '%s' is not an absolute URL.\n",
			NonNull(base)));
		if (me->inBadBASE == FALSE)
		    HTAlert(BASE_NOT_ABSOLUTE);
		me->inBadBASE = TRUE;
	    }

	    if (url_type == LYNXIMGMAP_URL_TYPE) {
		/*
		 * These have a non-standard form, basically strip the prefix
		 * or the code below would insert a nonsense host into the
		 * pseudo URL.  These should never occur where they would be
		 * used for resolution of relative URLs anyway.  We can also
		 * strip the #map part.  - kw
		 */
		temp = base;
		base = HTParse(base + 11, "", PARSE_ALL_WITHOUT_ANCHOR);
		FREE(temp);
	    }

	    /*
	     * Get parent's address for defaulted fields.
	     */
	    related = me->node_anchor->address;

	    /*
	     * Create the access field.
	     */
	    temp = HTParse(base, related, PARSE_ACCESS + PARSE_PUNCTUATION);
	    StrAllocCopy(me->base_href, temp);
	    FREE(temp);

	    /*
	     * Create the host[:port] field.
	     */
	    temp = HTParse(base, "", PARSE_HOST + PARSE_PUNCTUATION);
	    if (!StrNCmp(temp, "//", 2)) {
		StrAllocCat(me->base_href, temp);
		if (!strcmp(me->base_href, "file://")) {
		    StrAllocCat(me->base_href, "localhost");
		}
	    } else {
		if (isFILE_URL(me->base_href)) {
		    StrAllocCat(me->base_href, "//localhost");
		} else if (strcmp(me->base_href, STR_NEWS_URL)) {
		    FREE(temp);
		    StrAllocCat(me->base_href, (temp = HTParse(related, "",
							       PARSE_HOST + PARSE_PUNCTUATION)));
		}
	    }
	    FREE(temp);

	    /*
	     * Create the path field.
	     */
	    temp = HTParse(base, "", PARSE_PATH + PARSE_PUNCTUATION);
	    if (*temp != '\0') {
		char *p = strchr(temp, '?');

		if (p)
		    *p = '\0';
		p = strrchr(temp, '/');
		if (p)
		    *(p + 1) = '\0';	/* strip after the last slash */

		StrAllocCat(me->base_href, temp);
	    } else if (!strcmp(me->base_href, STR_NEWS_URL)) {
		StrAllocCat(me->base_href, "*");
	    } else if (isNEWS_URL(me->base_href) ||
		       isNNTP_URL(me->base_href) ||
		       isSNEWS_URL(me->base_href)) {
		StrAllocCat(me->base_href, "/*");
	    } else {
		StrAllocCat(me->base_href, "/");
	    }
	    FREE(temp);
	    FREE(base);

	    me->inBASE = TRUE;
	    me->node_anchor->inBASE = TRUE;
	    StrAllocCopy(me->node_anchor->content_base, me->base_href);
	    /* me->base_href is a valid URL */

	    CTRACE((tfp, "*HTML_BASE: final href=`%s'\n", me->base_href));
	}
	break;

    case HTML_META:
	if (present)
	    LYHandleMETA(me, present, value, include);
	break;

    case HTML_TITLE:
	HTChunkClear(&me->title);
	break;

    case HTML_LINK:
	intern_flag = FALSE;
	if (present && present[HTML_LINK_HREF]) {
	    CHECK_FOR_INTERN(intern_flag, value[HTML_LINK_HREF]);
	    /*
	     * Prepare to do housekeeping on the reference.  - FM
	     */
	    if (isEmpty(value[HTML_LINK_HREF])) {
		Base = (me->inBASE)
		    ? me->base_href
		    : me->node_anchor->address;
		StrAllocCopy(href, Base);
	    } else {
		StrAllocCopy(href, value[HTML_LINK_HREF]);
		(void) LYLegitimizeHREF(me, &href, TRUE, TRUE);

		Base = (me->inBASE && *href != '\0' && *href != '#')
		    ? me->base_href
		    : me->node_anchor->address;
		HTParseALL(&href, Base);
	    }

	    /*
	     * Handle links with a REV attribute.  - FM
	     * Handle REV="made" or REV="owner".  - LM & FM
	     * Handle REL="author" -TD
	     */
	    if (present &&
		((present[HTML_LINK_REV] &&
		  value[HTML_LINK_REV] &&
		  (!strcasecomp("made", value[HTML_LINK_REV]) ||
		   !strcasecomp("owner", value[HTML_LINK_REV]))) ||
		 (present[HTML_LINK_REL] &&
		  value[HTML_LINK_REL] &&
		  (!strcasecomp("author", value[HTML_LINK_REL]))))) {
		/*
		 * Load the owner element.  - FM
		 */
		HTAnchor_setOwner(me->node_anchor, href);
		CTRACE((tfp, "HTML: DOC OWNER '%s' found\n", href));
		FREE(href);

		/*
		 * Load the RevTitle element if a TITLE attribute and value
		 * are present.  - FM
		 */
		if (present && present[HTML_LINK_TITLE] &&
		    value[HTML_LINK_TITLE] &&
		    *value[HTML_LINK_TITLE] != '\0') {
		    StrAllocCopy(title, value[HTML_LINK_TITLE]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
		    LYTrimHead(title);
		    LYTrimTail(title);
		    if (*title != '\0')
			HTAnchor_setRevTitle(me->node_anchor, title);
		    FREE(title);
		}
		break;
	    }

	    /*
	     * Handle REL links.  - FM
	     */

	    if (present &&
		present[HTML_LINK_REL] && value[HTML_LINK_REL]) {
		/*
		 * Ignore style sheets, for now.  - FM
		 *
		 * lss and css have different syntax - lynx shouldn't try to
		 * parse them now (it tries to parse them as lss, so it exits
		 * with error message on the 1st non-empty line) - VH
		 */
#ifndef USE_COLOR_STYLE
		if (!strcasecomp(value[HTML_LINK_REL], "StyleSheet") ||
		    !strcasecomp(value[HTML_LINK_REL], "Style")) {
		    CTRACE2(TRACE_STYLE,
			    (tfp, "HTML: StyleSheet link found.\n"));
		    CTRACE2(TRACE_STYLE,
			    (tfp, "        StyleSheets not yet implemented.\n"));
		    FREE(href);
		    break;
		}
#endif /* ! USE_COLOR_STYLE */

		/*
		 * Ignore anything not registered in the 28-Mar-95 IETF HTML
		 * 3.0 draft and W3C HTML 3.2 draft, or not appropriate for
		 * Lynx banner links in the expired Maloney and Quin relrev
		 * draft.  We'll make this more efficient when the situation
		 * stabilizes, and for now, we'll treat "Banner" as another
		 * toolbar element.  - FM
		 */
		if (!strcasecomp(value[HTML_LINK_REL], "Home") ||
		    !strcasecomp(value[HTML_LINK_REL], "ToC") ||
		    !strcasecomp(value[HTML_LINK_REL], "Contents") ||
		    !strcasecomp(value[HTML_LINK_REL], "Index") ||
		    !strcasecomp(value[HTML_LINK_REL], "Glossary") ||
		    !strcasecomp(value[HTML_LINK_REL], "Copyright") ||
		    !strcasecomp(value[HTML_LINK_REL], "Help") ||
		    !strcasecomp(value[HTML_LINK_REL], "Search") ||
		    !strcasecomp(value[HTML_LINK_REL], "Bookmark") ||
		    !strcasecomp(value[HTML_LINK_REL], "Banner") ||
		    !strcasecomp(value[HTML_LINK_REL], "Top") ||
		    !strcasecomp(value[HTML_LINK_REL], "Origin") ||
		    !strcasecomp(value[HTML_LINK_REL], "Navigator") ||
		    !strcasecomp(value[HTML_LINK_REL], "Disclaimer") ||
		    !strcasecomp(value[HTML_LINK_REL], "Author") ||
		    !strcasecomp(value[HTML_LINK_REL], "Editor") ||
		    !strcasecomp(value[HTML_LINK_REL], "Publisher") ||
		    !strcasecomp(value[HTML_LINK_REL], "Trademark") ||
		    !strcasecomp(value[HTML_LINK_REL], "Hotlist") ||
		    !strcasecomp(value[HTML_LINK_REL], "Begin") ||
		    !strcasecomp(value[HTML_LINK_REL], "First") ||
		    !strcasecomp(value[HTML_LINK_REL], "End") ||
		    !strcasecomp(value[HTML_LINK_REL], "Last") ||
		    !strcasecomp(value[HTML_LINK_REL], "Documentation") ||
		    !strcasecomp(value[HTML_LINK_REL], "Biblioentry") ||
		    !strcasecomp(value[HTML_LINK_REL], "Bibliography") ||
		    !strcasecomp(value[HTML_LINK_REL], "Start") ||
		    !strcasecomp(value[HTML_LINK_REL], "Appendix")) {
		    StrAllocCopy(title, value[HTML_LINK_REL]);
		    pdoctitle = &title;		/* for setting HTAnchor's title */
		} else if (!strcasecomp(value[HTML_LINK_REL], "Up") ||
			   !strcasecomp(value[HTML_LINK_REL], "Next") ||
			   !strcasecomp(value[HTML_LINK_REL], "Previous") ||
			   !strcasecomp(value[HTML_LINK_REL], "Prev") ||
			   !strcasecomp(value[HTML_LINK_REL], "Child") ||
			   !strcasecomp(value[HTML_LINK_REL], "Sibling") ||
			   !strcasecomp(value[HTML_LINK_REL], "Parent") ||
			   !strcasecomp(value[HTML_LINK_REL], "Meta") ||
			   !strcasecomp(value[HTML_LINK_REL], "URC") ||
			   !strcasecomp(value[HTML_LINK_REL], "Pointer") ||
			   !strcasecomp(value[HTML_LINK_REL], "Translation") ||
			   !strcasecomp(value[HTML_LINK_REL], "Definition") ||
			   !strcasecomp(value[HTML_LINK_REL], "Alternate") ||
			   !strcasecomp(value[HTML_LINK_REL], "Section") ||
			   !strcasecomp(value[HTML_LINK_REL], "Subsection") ||
			   !strcasecomp(value[HTML_LINK_REL], "Chapter")) {
		    StrAllocCopy(title, value[HTML_LINK_REL]);
		    /* not setting target HTAnchor's title, for these
		       links of highly relative character.  Instead,
		       try to remember the REL attribute as a property
		       of the link (but not the destination), in the
		       (otherwise underused) link type in a special format;
		       the LIST page generation code may later use it. - kw */
		    if (!intern_flag) {
			StrAllocCopy(temp, "RelTitle: ");
			StrAllocCat(temp, value[HTML_LINK_REL]);
		    }
#ifndef DISABLE_BIBP
		} else if (!strcasecomp(value[HTML_LINK_REL], "citehost")) {
		    /*  Citehost determination for bibp links. - RDC */
		    HTAnchor_setCitehost(me->node_anchor, href);
		    CTRACE((tfp, "HTML: citehost '%s' found\n", href));
		    FREE(href);
		    break;
#endif
		} else {
		    CTRACE((tfp, "HTML: LINK with REL=\"%s\" ignored.\n",
			    value[HTML_LINK_REL]));
		    FREE(href);
		    break;
		}
	    }
	} else if (present &&
		   present[HTML_LINK_REL] && value[HTML_LINK_REL]) {
	    /*
	     * If no HREF was specified, handle special REL links with
	     * self-designated HREFs.  - FM
	     */
	    if (!strcasecomp(value[HTML_LINK_REL], "Home")) {
		StrAllocCopy(href, LynxHome);
	    } else if (!strcasecomp(value[HTML_LINK_REL], "Help")) {
		StrAllocCopy(href, helpfile);
	    } else if (!strcasecomp(value[HTML_LINK_REL], "Index")) {
		StrAllocCopy(href, indexfile);
	    } else {
		CTRACE((tfp,
			"HTML: LINK with REL=\"%s\" and no HREF ignored.\n",
			value[HTML_LINK_REL]));
		break;
	    }
	    StrAllocCopy(title, value[HTML_LINK_REL]);
	    pdoctitle = &title;
	}
	if (href) {
	    /*
	     * Create a title (link name) from the TITLE value, if present, or
	     * default to the REL value that was loaded into title.  - FM
	     */
	    if (present && present[HTML_LINK_TITLE] &&
		non_empty(value[HTML_LINK_TITLE])) {
		StrAllocCopy(title, value[HTML_LINK_TITLE]);
		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
		LYTrimHead(title);
		LYTrimTail(title);
		pdoctitle = &title;
		FREE(temp);	/* forget about recording RelTitle - kw */
	    }
	    if (isEmpty(title)) {
		FREE(href);
		FREE(title);
		break;
	    }

	    if (me->inA) {
		/*
		 * Ugh!  The LINK tag, which is a HEAD element, is in an
		 * Anchor, which is BODY element.  All we can do is close the
		 * Anchor and cross our fingers.  - FM
		 */
		SET_SKIP_STACK(HTML_A);
		HTML_end_element(me, HTML_A, include);
	    }

	    /*
	     * Create anchors for the links that simulate a toolbar.  - FM
	     */
	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     href,	/* Addresss */
						     (temp
						      ? (HTLinkType *)
						      HTAtom_for(temp)
						      : INTERN_LT));	/* Type */
	    FREE(temp);
	    if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
		 )) != NULL) {
		if (pdoctitle && !HTAnchor_title(dest))
		    HTAnchor_setTitle(dest, *pdoctitle);

		/* Don't allow CHARSET attribute to change *this* document's
		   charset assumption. - kw */
		if (dest == me->node_anchor)
		    dest = NULL;
		if (present[HTML_LINK_CHARSET] &&
		    non_empty(value[HTML_LINK_CHARSET])) {
		    dest_char_set = UCGetLYhndl_byMIME(value[HTML_LINK_CHARSET]);
		    if (dest_char_set < 0)
			dest_char_set = UCLYhndl_for_unrec;
		}
		if (dest && dest_char_set >= 0)
		    HTAnchor_setUCInfoStage(dest, dest_char_set,
					    UCT_STAGE_PARSER,
					    UCT_SETBY_LINK);
	    }
	    UPDATE_STYLE;
	    if (!HText_hasToolbar(me->text) &&
		(ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						  LYToolbarName,	/* Tag */
						  NULL,		/* Addresss */
						  (HTLinkType *) 0))) {		/* Type */
		HText_appendCharacter(me->text, '#');
		HText_setLastChar(me->text, ' ');	/* absorb white space */
		HText_beginAnchor(me->text, me->inUnderline, ID_A);
		HText_endAnchor(me->text, 0);
		HText_setToolbar(me->text);
	    } else {
		/*
		 * Add collapsible space to separate link from previous
		 * generated links.  - kw
		 */
		HTML_put_character(me, ' ');
	    }
	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
#ifdef USE_COLOR_STYLE
	    if (present && present[HTML_LINK_CLASS] &&
		non_empty(value[HTML_LINK_CLASS])) {
		char *tmp = 0;

		HTSprintf0(&tmp, "link.%s.%s", value[HTML_LINK_CLASS], title);
		CTRACE2(TRACE_STYLE,
			(tfp, "STYLE.link: using style <%s>\n", tmp));

		HText_characterStyle(me->text, hash_code(tmp), STACK_ON);
		HTML_put_string(me, title);
		HTML_put_string(me, " (");
		HTML_put_string(me, value[HTML_LINK_CLASS]);
		HTML_put_string(me, ")");
		HText_characterStyle(me->text, hash_code(tmp), STACK_OFF);
		FREE(tmp);
	    } else
#endif
		HTML_put_string(me, title);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
	    HText_endAnchor(me->text, 0);
	}
	FREE(href);
	FREE(title);
	break;

    case HTML_ISINDEX:
	if (((present)) &&
	    ((present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF]) ||
	     (present[HTML_ISINDEX_ACTION] && value[HTML_ISINDEX_ACTION]))) {
	    /*
	     * Lynx was supporting ACTION, which never made it into the HTML
	     * 2.0 specs.  HTML 3.0 uses HREF, so we'll use that too, but allow
	     * use of ACTION as an alternate until people have fully switched
	     * over.  - FM
	     */
	    if (present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF])
		StrAllocCopy(href, value[HTML_ISINDEX_HREF]);
	    else
		StrAllocCopy(href, value[HTML_ISINDEX_ACTION]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);

	    Base = (me->inBASE && *href != '\0' && *href != '#')
		? me->base_href
		: me->node_anchor->address;
	    HTParseALL(&href, Base);
	    HTAnchor_setIndex(me->node_anchor, href);
	    FREE(href);

	} else {
	    Base = (me->inBASE) ?
		me->base_href : me->node_anchor->address;
	    HTAnchor_setIndex(me->node_anchor, Base);
	}
	/*
	 * Support HTML 3.0 PROMPT attribute.  - FM
	 */
	if (present &&
	    present[HTML_ISINDEX_PROMPT] &&
	    non_empty(value[HTML_ISINDEX_PROMPT])) {
	    StrAllocCopy(temp, value[HTML_ISINDEX_PROMPT]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&temp, TRUE, FALSE);
	    LYTrimHead(temp);
	    LYTrimTail(temp);
	    if (*temp != '\0') {
		StrAllocCat(temp, " ");
		HTAnchor_setPrompt(me->node_anchor, temp);
	    } else {
		HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);
	    }
	    FREE(temp);
	} else {
	    HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);
	}
	break;

    case HTML_NEXTID:
	break;

    case HTML_STYLE:
	/*
	 * We're getting it as Literal text, which, for now, we'll just ignore. 
	 * - FM
	 */
	HTChunkClear(&me->style_block);
	break;

    case HTML_SCRIPT:
	/*
	 * We're getting it as Literal text, which, for now, we'll just ignore. 
	 * - FM
	 */
	HTChunkClear(&me->script);
	break;

    case HTML_BODY:
	CHECK_ID(HTML_BODY_ID);
	if (HText_hasToolbar(me->text))
	    HText_appendParagraph(me->text);
	break;

    case HTML_FRAMESET:
	break;

    case HTML_FRAME:
	if (present && present[HTML_FRAME_NAME] &&
	    non_empty(value[HTML_FRAME_NAME])) {
	    StrAllocCopy(id_string, value[HTML_FRAME_NAME]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);
	    LYTrimHead(id_string);
	    LYTrimTail(id_string);
	}
	if (present && present[HTML_FRAME_SRC] &&
	    non_empty(value[HTML_FRAME_SRC])) {
	    StrAllocCopy(href, value[HTML_FRAME_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);

	    if (me->inA) {
		SET_SKIP_STACK(HTML_A);
		HTML_end_element(me, HTML_A, include);
	    }
	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     href,	/* Addresss */
						     (HTLinkType *) 0);		/* Type */
	    CAN_JUSTIFY_PUSH(FALSE);
	    LYEnsureSingleSpace(me);
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    HTML_put_string(me, "FRAME:");
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    HTML_put_character(me, ' ');

	    me->in_word = NO;
	    CHECK_ID(HTML_FRAME_ID);
	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    HTML_put_string(me, (id_string ? id_string : href));
	    FREE(href);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
	    HText_endAnchor(me->text, 0);
	    LYEnsureSingleSpace(me);
	    CAN_JUSTIFY_POP;
	} else {
	    CHECK_ID(HTML_FRAME_ID);
	}
	FREE(id_string);
	break;

    case HTML_NOFRAMES:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	break;

    case HTML_IFRAME:
	if (present && present[HTML_IFRAME_NAME] &&
	    non_empty(value[HTML_IFRAME_NAME])) {
	    StrAllocCopy(id_string, value[HTML_IFRAME_NAME]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);
	    LYTrimHead(id_string);
	    LYTrimTail(id_string);
	}
	if (present && present[HTML_IFRAME_SRC] &&
	    non_empty(value[HTML_IFRAME_SRC])) {
	    StrAllocCopy(href, value[HTML_IFRAME_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);

	    if (me->inA)
		HTML_end_element(me, HTML_A, include);

	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     href,	/* Addresss */
						     (HTLinkType *) 0);		/* Type */
	    LYEnsureDoubleSpace(me);
	    CAN_JUSTIFY_PUSH_F
		LYResetParagraphAlignment(me);
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    HTML_put_string(me, "IFRAME:");
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    HTML_put_character(me, ' ');

	    me->in_word = NO;
	    CHECK_ID(HTML_IFRAME_ID);
	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    HTML_put_string(me, (id_string ? id_string : href));
	    FREE(href);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
	    HText_endAnchor(me->text, 0);
	    LYEnsureSingleSpace(me);
	    CAN_JUSTIFY_POP;
	} else {
	    CHECK_ID(HTML_IFRAME_ID);
	}
	FREE(id_string);
	break;

    case HTML_BANNER:
    case HTML_MARQUEE:
	change_paragraph_style(me, styles[HTML_BANNER]);
	UPDATE_STYLE;
	if (me->sp->tag_number == (int) ElementNumber)
	    LYEnsureDoubleSpace(me);
	/*
	 * Treat this as a toolbar if we don't have one yet, and we are in the
	 * first half of the first page.  - FM
	 */
	if ((!HText_hasToolbar(me->text) &&
	     HText_getLines(me->text) < (display_lines / 2)) &&
	    (ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
					      LYToolbarName,	/* Tag */
					      NULL,	/* Addresss */
					      (HTLinkType *) 0))) {	/* Type */
	    HText_beginAnchor(me->text, me->inUnderline, ID_A);
	    HText_endAnchor(me->text, 0);
	    HText_setToolbar(me->text);
	}
	CHECK_ID(HTML_GEN_ID);
	break;

    case HTML_CENTER:
    case HTML_DIV:
	if (me->Division_Level < (MAX_NESTING - 1)) {
	    me->Division_Level++;
	} else {
	    CTRACE((tfp,
		    "HTML: ****** Maximum nesting of %d divisions exceeded!\n",
		    MAX_NESTING));
	}
	if (me->inP)
	    LYEnsureSingleSpace(me);	/* always at least break line - kw */
	if (ElementNumber == HTML_CENTER) {
	    me->DivisionAlignments[me->Division_Level] = HT_CENTER;
	    change_paragraph_style(me, styles[HTML_DCENTER]);
	    UPDATE_STYLE;
	    me->current_default_alignment = styles[HTML_DCENTER]->alignment;
	} else if (me->List_Nesting_Level >= 0 &&
		   !(present && present[HTML_DIV_ALIGN] &&
		     value[HTML_DIV_ALIGN] &&
		     (!strcasecomp(value[HTML_DIV_ALIGN], "center") ||
		      !strcasecomp(value[HTML_DIV_ALIGN], "right")))) {
	    if (present && present[HTML_DIV_ALIGN])
		me->current_default_alignment = HT_LEFT;
	    else if (me->Division_Level == 0)
		me->current_default_alignment = HT_LEFT;
	    else if (me->sp[0].tag_number == HTML_UL ||
		     me->sp[0].tag_number == HTML_OL ||
		     me->sp[0].tag_number == HTML_MENU ||
		     me->sp[0].tag_number == HTML_DIR ||
		     me->sp[0].tag_number == HTML_LI ||
		     me->sp[0].tag_number == HTML_LH ||
		     me->sp[0].tag_number == HTML_DD)
		me->current_default_alignment = HT_LEFT;
	    LYHandlePlike(me, present, value, include, HTML_DIV_ALIGN, TRUE);
	    me->DivisionAlignments[me->Division_Level] = (short)
		me->current_default_alignment;
	} else if (present && present[HTML_DIV_ALIGN] &&
		   non_empty(value[HTML_DIV_ALIGN])) {
	    if (!strcasecomp(value[HTML_DIV_ALIGN], "center")) {
		me->DivisionAlignments[me->Division_Level] = HT_CENTER;
		change_paragraph_style(me, styles[HTML_DCENTER]);
		UPDATE_STYLE;
		me->current_default_alignment = styles[HTML_DCENTER]->alignment;
	    } else if (!strcasecomp(value[HTML_DIV_ALIGN], "right")) {
		me->DivisionAlignments[me->Division_Level] = HT_RIGHT;
		change_paragraph_style(me, styles[HTML_DRIGHT]);
		UPDATE_STYLE;
		me->current_default_alignment = styles[HTML_DRIGHT]->alignment;
	    } else {
		me->DivisionAlignments[me->Division_Level] = HT_LEFT;
		change_paragraph_style(me, styles[HTML_DLEFT]);
		UPDATE_STYLE;
		me->current_default_alignment = styles[HTML_DLEFT]->alignment;
	    }
	} else {
	    me->DivisionAlignments[me->Division_Level] = HT_LEFT;
	    change_paragraph_style(me, styles[HTML_DLEFT]);
	    UPDATE_STYLE;
	    me->current_default_alignment = styles[HTML_DLEFT]->alignment;
	}
	CHECK_ID(HTML_DIV_ID);
	break;

    case HTML_H1:
    case HTML_H2:
    case HTML_H3:
    case HTML_H4:
    case HTML_H5:
    case HTML_H6:
	/*
	 * Close the previous style if not done by HTML doc.  Added to get rid
	 * of core dumps in BAD HTML on the net.
	 *              GAB 07-07-94
	 * But then again, these are actually allowed to nest.  I guess I have
	 * to depend on the HTML writers correct style.
	 *              GAB 07-12-94
	 if (i_prior_style != -1) {
	 HTML_end_element(me, i_prior_style);
	 }
	 i_prior_style = ElementNumber;
	 */

	/*
	 * Check whether we have an H# in a list, and if so, treat it as an LH. 
	 * - FM
	 */
	if ((me->List_Nesting_Level >= 0) &&
	    (me->sp[0].tag_number == HTML_UL ||
	     me->sp[0].tag_number == HTML_OL ||
	     me->sp[0].tag_number == HTML_MENU ||
	     me->sp[0].tag_number == HTML_DIR ||
	     me->sp[0].tag_number == HTML_LI)) {
	    if (HTML_dtd.tags[HTML_LH].contents == SGML_EMPTY) {
		ElementNumber = HTML_LH;
	    } else {
		me->new_style = me->sp[0].style;
		ElementNumber = (HTMLElement) me->sp[0].tag_number;
		UPDATE_STYLE;
	    }
	    /*
	     * Some authors use H# headers as a substitute for FONT, so check
	     * if this one immediately followed an LI.  If so, both me->inP and
	     * me->in_word will be FALSE (though the line might not be empty
	     * due to a bullet and/or nbsp) and we can assume it is just for a
	     * FONT change.  We thus will not create another line break nor add
	     * to the current left indentation.  - FM
	     */
	    if (!(me->inP == FALSE && me->in_word == NO)) {
		HText_appendParagraph(me->text);
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HText_setLastChar(me->text, ' ');
		me->in_word = NO;
		me->inP = FALSE;
	    }
	    CHECK_ID(HTML_H_ID);
	    break;
	}

	if (present && present[HTML_H_ALIGN] &&
	    non_empty(value[HTML_H_ALIGN])) {
	    if (!strcasecomp(value[HTML_H_ALIGN], "center"))
		change_paragraph_style(me, styles[HTML_HCENTER]);
	    else if (!strcasecomp(value[HTML_H_ALIGN], "right"))
		change_paragraph_style(me, styles[HTML_HRIGHT]);
	    else if (!strcasecomp(value[HTML_H_ALIGN], "left") ||
		     !strcasecomp(value[HTML_H_ALIGN], "justify"))
		change_paragraph_style(me, styles[HTML_HLEFT]);
	    else
		change_paragraph_style(me, styles[ElementNumber]);
	} else if (me->Division_Level >= 0) {
	    if (me->DivisionAlignments[me->Division_Level] == HT_CENTER) {
		change_paragraph_style(me, styles[HTML_HCENTER]);
	    } else if (me->DivisionAlignments[me->Division_Level] == HT_LEFT) {
		change_paragraph_style(me, styles[HTML_HLEFT]);
	    } else if (me->DivisionAlignments[me->Division_Level] == HT_RIGHT) {
		change_paragraph_style(me, styles[HTML_HRIGHT]);
	    }
	} else {
	    change_paragraph_style(me, styles[ElementNumber]);
	}
	UPDATE_STYLE;
	CHECK_ID(HTML_H_ID);

	if ((bold_headers == TRUE ||
	     (ElementNumber == HTML_H1 && bold_H1 == TRUE)) &&
	    (styles[ElementNumber]->font & HT_BOLD)) {
	    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    }
	    me->inBoldH = TRUE;
	}
	break;

    case HTML_P:
	LYHandlePlike(me, present, value, include, HTML_P_ALIGN, TRUE);
	CHECK_ID(HTML_P_ID);
	break;

    case HTML_BR:
	UPDATE_STYLE;
	CHECK_ID(HTML_GEN_ID);
	/* Add a \r (new line) if these three conditions are true:
	 *   1. We are not collapsing BR's, and
	 *   2. The previous line has text on it, or
	 *   3. This line has text on it.
	 * Otherwise, don't do anything. -DH 980814, TD 980827
	 */
	if ((LYCollapseBRs == FALSE &&
	     !HText_PreviousLineEmpty(me->text, FALSE)) ||
	    !HText_LastLineEmpty(me->text, FALSE)) {
	    HText_setLastChar(me->text, ' ');	/* absorb white space */
	    HText_appendCharacter(me->text, '\r');
	}
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_WBR:
	UPDATE_STYLE;
	CHECK_ID(HTML_GEN_ID);
	HText_setBreakPoint(me->text);
	break;

    case HTML_HY:
    case HTML_SHY:
	UPDATE_STYLE;
	CHECK_ID(HTML_GEN_ID);
	HText_appendCharacter(me->text, LY_SOFT_HYPHEN);
	break;

    case HTML_HR:
	{
	    int width;

	    /*
	     * Start a new line only if we had printable characters following
	     * the previous newline, or remove the previous line if both it and
	     * the last line are blank.  - FM
	     */
	    UPDATE_STYLE;
	    if (!HText_LastLineEmpty(me->text, FALSE)) {
		HText_setLastChar(me->text, ' ');	/* absorb white space */
		HText_appendCharacter(me->text, '\r');
	    } else if (HText_PreviousLineEmpty(me->text, FALSE)) {
		HText_RemovePreviousLine(me->text);
	    }
	    me->in_word = NO;
	    me->inP = FALSE;

	    /*
	     * Add an ID link if needed.  - FM
	     */
	    CHECK_ID(HTML_HR_ID);

	    /*
	     * Center lines within the current margins, if a right or left
	     * ALIGNment is not specified.  If WIDTH="#%" is given and not
	     * garbage, use that to calculate the width, otherwise use the
	     * default width.  - FM
	     */
	    if (present && present[HTML_HR_ALIGN] && value[HTML_HR_ALIGN]) {
		if (!strcasecomp(value[HTML_HR_ALIGN], "right")) {
		    me->sp->style->alignment = HT_RIGHT;
		} else if (!strcasecomp(value[HTML_HR_ALIGN], "left")) {
		    me->sp->style->alignment = HT_LEFT;
		} else {
		    me->sp->style->alignment = HT_CENTER;
		}
	    } else {
		me->sp->style->alignment = HT_CENTER;
	    }
	    width = LYcolLimit -
		me->new_style->leftIndent - me->new_style->rightIndent;
	    if (present && present[HTML_HR_WIDTH] && value[HTML_HR_WIDTH] &&
		isdigit(UCH(*value[HTML_HR_WIDTH])) &&
		value[HTML_HR_WIDTH][strlen(value[HTML_HR_WIDTH]) - 1] == '%') {
		char *percent = NULL;
		int Percent, Width;

		StrAllocCopy(percent, value[HTML_HR_WIDTH]);
		percent[strlen(percent) - 1] = '\0';
		Percent = atoi(percent);
		if (Percent > 100 || Percent < 1)
		    width -= 5;
		else {
		    Width = (width * Percent) / 100;
		    if (Width < 1)
			width = 1;
		    else
			width = Width;
		}
		FREE(percent);
	    } else {
		width -= 5;
	    }
	    for (i = 0; i < width; i++)
		HTML_put_character(me, '_');
	    HText_appendCharacter(me->text, '\r');
	    me->in_word = NO;
	    me->inP = FALSE;

	    /*
	     * Reset the alignment appropriately for the division and/or block. 
	     * - FM
	     */
	    if (me->List_Nesting_Level < 0 &&
		me->Division_Level >= 0) {
		me->sp->style->alignment =
		    me->DivisionAlignments[me->Division_Level];
	    } else if (me->sp->style->id == ST_HeadingCenter ||
		       me->sp->style->id == ST_Heading1) {
		me->sp->style->alignment = HT_CENTER;
	    } else if (me->sp->style->id == ST_HeadingRight) {
		me->sp->style->alignment = HT_RIGHT;
	    } else {
		me->sp->style->alignment = HT_LEFT;
	    }

	    /*
	     * Add a blank line and set the second line indentation for lists
	     * and addresses, or a paragraph separator for other blocks.  - FM
	     */
	    if (me->List_Nesting_Level >= 0 ||
		me->sp[0].tag_number == HTML_ADDRESS) {
		HText_setLastChar(me->text, ' ');	/* absorb white space */
		HText_appendCharacter(me->text, '\r');
	    } else {
		HText_appendParagraph(me->text);
	    }
	}
	break;

    case HTML_TAB:
	if (!present) {		/* Bad tag.  Must have at least one attribute. - FM */
	    CTRACE((tfp, "HTML: TAB tag has no attributes.  Ignored.\n"));
	    break;
	}
	/*
	 * If page author is using TAB within a TABLE, it's probably formatted
	 * specifically to work well for Lynx without simple table tracking
	 * code.  Cancel tracking, it would only make things worse.  - kw
	 */
	HText_cancelStbl(me->text);
	UPDATE_STYLE;

	CANT_JUSTIFY_THIS_LINE;
	if (present[HTML_TAB_ALIGN] && value[HTML_TAB_ALIGN] &&
	    (strcasecomp(value[HTML_TAB_ALIGN], "left") ||
	     !(present[HTML_TAB_TO] || present[HTML_TAB_INDENT]))) {
	    /*
	     * Just ensure a collapsible space, until we have the ALIGN and DP
	     * attributes implemented.  - FM
	     */
	    HTML_put_character(me, ' ');
	    CTRACE((tfp,
		    "HTML: ALIGN not 'left'.  Using space instead of TAB.\n"));

	} else if (!LYoverride_default_alignment(me) &&
		   me->current_default_alignment != HT_LEFT) {
	    /*
	     * Just ensure a collapsible space, until we can replace
	     * HText_getCurrentColumn() in GridText.c with code which doesn't
	     * require that the alignment be HT_LEFT.  - FM
	     */
	    HTML_put_character(me, ' ');
	    CTRACE((tfp, "HTML: Not HT_LEFT.  Using space instead of TAB.\n"));

	} else if ((present[HTML_TAB_TO] &&
		    non_empty(value[HTML_TAB_TO])) ||
		   (present[HTML_TAB_INDENT] &&
		    value[HTML_TAB_INDENT] &&
		    isdigit(UCH(*value[HTML_TAB_INDENT])))) {
	    int column, target = -1;
	    int enval = 2;

	    column = HText_getCurrentColumn(me->text);
	    if (present[HTML_TAB_TO] &&
		non_empty(value[HTML_TAB_TO])) {
		/*
		 * TO has priority over INDENT if both are present.  - FM
		 */
		StrAllocCopy(temp, value[HTML_TAB_TO]);
		TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
		if (*temp) {
		    target = HText_getTabIDColumn(me->text, temp);
		}
	    } else if (isEmpty(temp) && present[HTML_TAB_INDENT] &&
		       value[HTML_TAB_INDENT] &&
		       isdigit(UCH(*value[HTML_TAB_INDENT]))) {
		/*
		 * The INDENT value is in "en" (enval per column) units.
		 * Divide it by enval, rounding odd values up.  - FM
		 */
		target =
		    (int) (((1.0 * atoi(value[HTML_TAB_INDENT])) / enval) + (0.5));
	    }
	    FREE(temp);
	    /*
	     * If we are being directed to a column too far to the left or
	     * right, just add a collapsible space, otherwise, add the
	     * appropriate number of spaces.  - FM
	     */

	    if (target < column ||
		target > HText_getMaximumColumn(me->text)) {
		HTML_put_character(me, ' ');
		CTRACE((tfp,
			"HTML: Column out of bounds.  Using space instead of TAB.\n"));
	    } else {
		for (i = column; i < target; i++)
		    HText_appendCharacter(me->text, ' ');
		HText_setLastChar(me->text, ' ');	/* absorb white space */
	    }
	}
	me->in_word = NO;

	/*
	 * If we have an ID attribute, save it together with the value of the
	 * column we've reached.  - FM
	 */
	if (present[HTML_TAB_ID] &&
	    non_empty(value[HTML_TAB_ID])) {
	    StrAllocCopy(temp, value[HTML_TAB_ID]);
	    TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
	    if (*temp)
		HText_setTabID(me->text, temp);
	    FREE(temp);
	}
	break;

    case HTML_BASEFONT:
	break;

    case HTML_FONT:

	/*
	 * FONT *may* have been declared SGML_EMPTY in HTMLDTD.c, and
	 * SGML_character() in SGML.c *may* check for a FONT end tag to call
	 * HTML_end_element() directly (with a check in that to bypass
	 * decrementing of the HTML parser's stack).  Or this may have been
	 * really a </FONT> end tag, for which some incarnations of SGML.c
	 * would fake a <FONT> start tag instead.  - fm & kw
	 *
	 * But if we have an open FONT, DON'T close that one now, since FONT
	 * tags can be legally nested AFAIK, and Lynx currently doesn't do
	 * anything with them anyway...  - kw
	 */
#ifdef NOTUSED_FOTEMODS
	if (me->inFONT == TRUE)
	    HTML_end_element(me, HTML_FONT, &include);
#endif /* NOTUSED_FOTEMODS */

	/*
	 * Set flag to know we are in a FONT container, and add code to do
	 * something about it, someday.  - FM
	 */
	me->inFONT = TRUE;
	break;

    case HTML_B:		/* Physical character highlighting */
    case HTML_BLINK:
    case HTML_I:
    case HTML_U:

    case HTML_CITE:		/* Logical character highlighting */
    case HTML_EM:
    case HTML_STRONG:
	UPDATE_STYLE;
	me->Underline_Level++;
	CHECK_ID(HTML_GEN_ID);
	/*
	 * Ignore this if inside of a bold anchor or header.  Can't display
	 * both underline and bold at same time.
	 */
	if (me->inBoldA == TRUE || me->inBoldH == TRUE) {
	    CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
	    break;
	}
	if (me->inUnderline == FALSE) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    me->inUnderline = TRUE;
	    CTRACE((tfp, "Beginning underline\n"));
	} else {
	    CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
	}
	break;

    case HTML_ABBR:		/* Miscellaneous character containers */
    case HTML_ACRONYM:
    case HTML_AU:
    case HTML_AUTHOR:
    case HTML_BIG:
    case HTML_CODE:
    case HTML_DFN:
    case HTML_KBD:
    case HTML_SAMP:
    case HTML_SMALL:
    case HTML_TT:
    case HTML_VAR:
	CHECK_ID(HTML_GEN_ID);
	break;			/* ignore */

    case HTML_SUP:
	HText_appendCharacter(me->text, '^');
	CHECK_ID(HTML_GEN_ID);
	break;

    case HTML_SUB:
	HText_appendCharacter(me->text, '[');
	CHECK_ID(HTML_GEN_ID);
	break;

    case HTML_DEL:
    case HTML_S:
    case HTML_STRIKE:
	CHECK_ID(HTML_GEN_ID);
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, "[DEL:");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	me->in_word = NO;
	break;

    case HTML_INS:
	CHECK_ID(HTML_GEN_ID);
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, "[INS:");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	me->in_word = NO;
	break;

    case HTML_Q:
	CHECK_ID(HTML_GEN_ID);
	/*
	 * Should check LANG and/or DIR attributes, and the
	 * me->node_anchor->charset and/or yet to be added structure elements,
	 * to determine whether we should use chevrons, but for now we'll
	 * always use double- or single-quotes.  - FM
	 */
	if (!(me->Quote_Level & 1))
	    HTML_put_character(me, '"');
	else
	    HTML_put_character(me, '`');
	me->Quote_Level++;
	break;

    case HTML_PRE:		/* Formatted text */
	/*
	 * Set our inPRE flag to FALSE so that a newline immediately following
	 * the PRE start tag will be ignored.  HTML_put_character() will set it
	 * to TRUE when the first character within the PRE block is received. 
	 * - FM
	 */
	me->inPRE = FALSE;
	/* FALLTHRU */
    case HTML_LISTING:		/* Literal text */
	/* FALLTHRU */
    case HTML_XMP:
	/* FALLTHRU */
    case HTML_PLAINTEXT:
	change_paragraph_style(me, styles[ElementNumber]);
	UPDATE_STYLE;
	CHECK_ID(HTML_GEN_ID);
	if (me->comment_end)
	    HText_appendText(me->text, me->comment_end);
	break;

    case HTML_BLOCKQUOTE:
    case HTML_BQ:
	change_paragraph_style(me, styles[ElementNumber]);
	UPDATE_STYLE;
	if (me->sp->tag_number == (int) ElementNumber)
	    LYEnsureDoubleSpace(me);
	CHECK_ID(HTML_BQ_ID);
	break;

    case HTML_NOTE:
	change_paragraph_style(me, styles[ElementNumber]);
	UPDATE_STYLE;
	if (me->sp->tag_number == (int) ElementNumber)
	    LYEnsureDoubleSpace(me);
	CHECK_ID(HTML_NOTE_ID);
	{
	    char *note = NULL;

	    /*
	     * Indicate the type of NOTE.
	     */
	    if (present && present[HTML_NOTE_CLASS] &&
		value[HTML_NOTE_CLASS] &&
		(!strcasecomp(value[HTML_NOTE_CLASS], "CAUTION") ||
		 !strcasecomp(value[HTML_NOTE_CLASS], "WARNING"))) {
		StrAllocCopy(note, value[HTML_NOTE_CLASS]);
		LYUpperCase(note);
		StrAllocCat(note, ":");
	    } else if (present && present[HTML_NOTE_ROLE] &&
		       value[HTML_NOTE_ROLE] &&
		       (!strcasecomp(value[HTML_NOTE_ROLE], "CAUTION") ||
			!strcasecomp(value[HTML_NOTE_ROLE], "WARNING"))) {
		StrAllocCopy(note, value[HTML_NOTE_ROLE]);
		LYUpperCase(note);
		StrAllocCat(note, ":");
	    } else {
		StrAllocCopy(note, "NOTE:");
	    }
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    HTML_put_string(me, note);
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    HTML_put_character(me, ' ');
	    CAN_JUSTIFY_START;
	    FREE(note);
	}
	CAN_JUSTIFY_START;
	me->inLABEL = TRUE;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_ADDRESS:
	change_paragraph_style(me, styles[ElementNumber]);
	UPDATE_STYLE;
	if (me->sp->tag_number == (int) ElementNumber)
	    LYEnsureDoubleSpace(me);
	CHECK_ID(HTML_ADDRESS_ID);
	break;

    case HTML_DL:
	me->List_Nesting_Level++;	/* increment the List nesting level */
	if (me->List_Nesting_Level <= 0) {
	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]
				   ? styles[HTML_DLC] : styles[HTML_DL]);

	} else if (me->List_Nesting_Level >= 6) {
	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]
				   ? styles[HTML_DLC6] : styles[HTML_DL6]);

	} else {
	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]
				   ? styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]
				   : styles[(HTML_DL1 - 1) + me->List_Nesting_Level]);
	}
	UPDATE_STYLE;		/* update to the new style */
	CHECK_ID(HTML_DL_ID);

	break;

    case HTML_DLC:
	me->List_Nesting_Level++;	/* increment the List nesting level */
	if (me->List_Nesting_Level <= 0) {
	    change_paragraph_style(me, styles[HTML_DLC]);

	} else if (me->List_Nesting_Level >= 6) {
	    change_paragraph_style(me, styles[HTML_DLC6]);

	} else {
	    change_paragraph_style(me,
				   styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]);
	}
	UPDATE_STYLE;		/* update to the new style */
	CHECK_ID(HTML_DL_ID);
	break;

    case HTML_DT:
	CHECK_ID(HTML_GEN_ID);
	if (!me->style_change) {
	    BOOL in_line_1 = HText_inLineOne(me->text);
	    HTCoord saved_spaceBefore = me->sp->style->spaceBefore;
	    HTCoord saved_spaceAfter = me->sp->style->spaceAfter;

	    /*
	     * If there are several DT elements and this is not the first, and
	     * the preceding DT element's first (and normally only) line has
	     * not yet been ended, suppress intervening blank line by
	     * temporarily modifying the paragraph style in place.  Ugly but
	     * there's ample precedence.  - kw
	     */
	    if (in_line_1) {
		me->sp->style->spaceBefore = 0;		/* temporary change */
		me->sp->style->spaceAfter = 0;	/* temporary change */
	    }
	    HText_appendParagraph(me->text);
	    me->sp->style->spaceBefore = saved_spaceBefore;	/* undo */
	    me->sp->style->spaceAfter = saved_spaceAfter;	/* undo */
	    me->in_word = NO;
	    me->sp->style->alignment = HT_LEFT;
	}
	me->inP = FALSE;
	break;

    case HTML_DD:
	CHECK_ID(HTML_GEN_ID);
	HText_setLastChar(me->text, ' ');	/* absorb white space */
	if (!me->style_change) {
	    if (!HText_LastLineEmpty(me->text, FALSE)) {
		HText_appendCharacter(me->text, '\r');
	    } else {
		HText_NegateLineOne(me->text);
	    }
	} else {
	    UPDATE_STYLE;
	    HText_appendCharacter(me->text, '\t');
	}
	me->sp->style->alignment = HT_LEFT;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_OL:
	/*
	 * Set the default TYPE.
	 */
	me->OL_Type[(me->List_Nesting_Level < 11 ?
		     me->List_Nesting_Level + 1 : 11)] = '1';

	/*
	 * Check whether we have a starting sequence number, or want to
	 * continue the numbering from a previous OL in this nest.  - FM
	 */
	if (present && (present[HTML_OL_SEQNUM] || present[HTML_OL_START])) {
	    int seqnum;

	    /*
	     * Give preference to the valid HTML 3.0 SEQNUM attribute name over
	     * the Netscape START attribute name (too bad the Netscape
	     * developers didn't read the HTML 3.0 specs before re-inventing
	     * the "wheel" as "we'll").  - FM
	     */
	    if (present[HTML_OL_SEQNUM] &&
		non_empty(value[HTML_OL_SEQNUM])) {
		seqnum = atoi(value[HTML_OL_SEQNUM]);
	    } else if (present[HTML_OL_START] &&
		       non_empty(value[HTML_OL_START])) {
		seqnum = atoi(value[HTML_OL_START]);
	    } else {
		seqnum = 1;
	    }

	    /*
	     * Don't allow negative numbers less than or equal to our flags, or
	     * numbers less than 1 if an Alphabetic or Roman TYPE.  - FM
	     */
	    if (present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {
		if (*value[HTML_OL_TYPE] == 'A') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'A';
		    if (seqnum < 1)
			seqnum = 1;
		} else if (*value[HTML_OL_TYPE] == 'a') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'a';
		    if (seqnum < 1)
			seqnum = 1;
		} else if (*value[HTML_OL_TYPE] == 'I') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'I';
		    if (seqnum < 1)
			seqnum = 1;
		} else if (*value[HTML_OL_TYPE] == 'i') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'i';
		    if (seqnum < 1)
			seqnum = 1;
		} else {
		    if (seqnum <= OL_VOID)
			seqnum = OL_VOID + 1;
		}
	    } else if (seqnum <= OL_VOID) {
		seqnum = OL_VOID + 1;
	    }

	    me->OL_Counter[(me->List_Nesting_Level < 11 ?
			    me->List_Nesting_Level + 1 : 11)] = seqnum;

	} else if (present && present[HTML_OL_CONTINUE]) {
	    me->OL_Counter[me->List_Nesting_Level < 11 ?
			   me->List_Nesting_Level + 1 : 11] = OL_CONTINUE;

	} else {
	    me->OL_Counter[(me->List_Nesting_Level < 11 ?
			    me->List_Nesting_Level + 1 : 11)] = 1;
	    if (present && present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {
		if (*value[HTML_OL_TYPE] == 'A') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'A';
		} else if (*value[HTML_OL_TYPE] == 'a') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'a';
		} else if (*value[HTML_OL_TYPE] == 'I') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'I';
		} else if (*value[HTML_OL_TYPE] == 'i') {
		    me->OL_Type[(me->List_Nesting_Level < 11 ?
				 me->List_Nesting_Level + 1 : 11)] = 'i';
		}
	    }
	}
	me->List_Nesting_Level++;

	if (me->List_Nesting_Level <= 0) {
	    change_paragraph_style(me, styles[ElementNumber]);

	} else if (me->List_Nesting_Level >= 6) {
	    change_paragraph_style(me, styles[HTML_OL6]);

	} else {
	    change_paragraph_style(me,
				   styles[HTML_OL1 + me->List_Nesting_Level - 1]);
	}
	UPDATE_STYLE;		/* update to the new style */
	CHECK_ID(HTML_OL_ID);
	break;

    case HTML_UL:
	me->List_Nesting_Level++;

	if (me->List_Nesting_Level <= 0) {
	    if (!(present && present[HTML_UL_PLAIN]) &&
		!(present && present[HTML_UL_TYPE] &&
		  value[HTML_UL_TYPE] &&
		  0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
		change_paragraph_style(me, styles[ElementNumber]);
	    } else {
		change_paragraph_style(me, styles[HTML_DIR]);
		ElementNumber = HTML_DIR;
	    }

	} else if (me->List_Nesting_Level >= 6) {
	    if (!(present && present[HTML_UL_PLAIN]) &&
		!(present && present[HTML_UL_TYPE] &&
		  value[HTML_UL_TYPE] &&
		  0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
		change_paragraph_style(me, styles[HTML_OL6]);
	    } else {
		change_paragraph_style(me, styles[HTML_MENU6]);
		ElementNumber = HTML_DIR;
	    }

	} else {
	    if (!(present && present[HTML_UL_PLAIN]) &&
		!(present && present[HTML_UL_TYPE] &&
		  value[HTML_UL_TYPE] &&
		  0 == strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {
		change_paragraph_style(me,
				       styles[HTML_OL1 + me->List_Nesting_Level
					      - 1]);
	    } else {
		change_paragraph_style(me,
				       styles[HTML_MENU1 + me->List_Nesting_Level
					      - 1]);
		ElementNumber = HTML_DIR;
	    }
	}
	UPDATE_STYLE;		/* update to the new style */
	CHECK_ID(HTML_UL_ID);
	break;

    case HTML_MENU:
    case HTML_DIR:
	me->List_Nesting_Level++;

	if (me->List_Nesting_Level <= 0) {
	    change_paragraph_style(me, styles[ElementNumber]);

	} else if (me->List_Nesting_Level >= 6) {
	    change_paragraph_style(me, styles[HTML_MENU6]);

	} else {
	    change_paragraph_style(me,
				   styles[HTML_MENU1 + me->List_Nesting_Level
					  - 1]);
	}
	UPDATE_STYLE;		/* update to the new style */
	CHECK_ID(HTML_UL_ID);
	break;

    case HTML_LH:
	UPDATE_STYLE;		/* update to the new style */
	HText_appendParagraph(me->text);
	CHECK_ID(HTML_GEN_ID);
	HTML_put_character(me, HT_NON_BREAK_SPACE);
	HText_setLastChar(me->text, ' ');
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_LI:
	UPDATE_STYLE;		/* update to the new style */
	HText_appendParagraph(me->text);
	me->sp->style->alignment = HT_LEFT;
	CHECK_ID(HTML_LI_ID);
	{
	    int surrounding_tag_number = me->sp[0].tag_number;

	    /*
	     * No, a LI should never occur directly within another LI, but this
	     * may result from incomplete error recovery.  So check one more
	     * surrounding level in this case.  - kw
	     */
	    if (surrounding_tag_number == HTML_LI &&
		me->sp < (me->stack + MAX_NESTING - 1))
		surrounding_tag_number = me->sp[1].tag_number;
	    if (surrounding_tag_number == HTML_OL) {
		char number_string[20];
		int counter, seqnum;
		char seqtype;

		counter = me->List_Nesting_Level < 11 ?
		    me->List_Nesting_Level : 11;
		if (present && present[HTML_LI_TYPE] && value[HTML_LI_TYPE]) {
		    if (*value[HTML_LI_TYPE] == '1') {
			me->OL_Type[counter] = '1';
		    } else if (*value[HTML_LI_TYPE] == 'A') {
			me->OL_Type[counter] = 'A';
		    } else if (*value[HTML_LI_TYPE] == 'a') {
			me->OL_Type[counter] = 'a';
		    } else if (*value[HTML_LI_TYPE] == 'I') {
			me->OL_Type[counter] = 'I';
		    } else if (*value[HTML_LI_TYPE] == 'i') {
			me->OL_Type[counter] = 'i';
		    }
		}
		if (present && present[HTML_LI_VALUE] &&
		    ((value[HTML_LI_VALUE] != NULL) &&
		     (*value[HTML_LI_VALUE] != '\0')) &&
		    ((isdigit(UCH(*value[HTML_LI_VALUE]))) ||
		     (*value[HTML_LI_VALUE] == '-' &&
		      isdigit(UCH(*(value[HTML_LI_VALUE] + 1)))))) {
		    seqnum = atoi(value[HTML_LI_VALUE]);
		    if (seqnum <= OL_VOID)
			seqnum = OL_VOID + 1;
		    seqtype = me->OL_Type[counter];
		    if (seqtype != '1' && seqnum < 1)
			seqnum = 1;
		    me->OL_Counter[counter] = seqnum + 1;
		} else if (me->OL_Counter[counter] >= OL_VOID) {
		    seqnum = me->OL_Counter[counter]++;
		    seqtype = me->OL_Type[counter];
		    if (seqtype != '1' && seqnum < 1) {
			seqnum = 1;
			me->OL_Counter[counter] = seqnum + 1;
		    }
		} else {
		    seqnum = me->Last_OL_Count + 1;
		    seqtype = me->Last_OL_Type;
		    for (i = (counter - 1); i >= 0; i--) {
			if (me->OL_Counter[i] > OL_VOID) {
			    seqnum = me->OL_Counter[i]++;
			    seqtype = me->OL_Type[i];
			    i = 0;
			}
		    }
		}
		if (seqtype == 'A') {
		    strcpy(number_string, LYUppercaseA_OL_String(seqnum));
		} else if (seqtype == 'a') {
		    strcpy(number_string, LYLowercaseA_OL_String(seqnum));
		} else if (seqtype == 'I') {
		    strcpy(number_string, LYUppercaseI_OL_String(seqnum));
		} else if (seqtype == 'i') {
		    strcpy(number_string, LYLowercaseI_OL_String(seqnum));
		} else {
		    sprintf(number_string, "%2d.", seqnum);
		}
		me->Last_OL_Count = seqnum;
		me->Last_OL_Type = seqtype;
		/*
		 * Hack, because there is no append string!
		 */
		for (i = 0; number_string[i] != '\0'; i++)
		    if (number_string[i] == ' ')
			HTML_put_character(me, HT_NON_BREAK_SPACE);
		    else
			HTML_put_character(me, number_string[i]);

		/*
		 * Use HTML_put_character so that any other spaces coming
		 * through will be collapsed.  We'll use nbsp, so it won't
		 * break at the spacing character if there are no spaces in the
		 * subsequent text up to the right margin, but will declare it
		 * as a normal space to ensure collapsing if a normal space
		 * does immediately follow it.  - FM
		 */
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HText_setLastChar(me->text, ' ');
	    } else if (surrounding_tag_number == HTML_UL) {
		/*
		 * Hack, because there is no append string!
		 */
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		switch (me->List_Nesting_Level % 7) {
		case 0:
		    HTML_put_character(me, '*');
		    break;
		case 1:
		    HTML_put_character(me, '+');
		    break;
		case 2:
		    HTML_put_character(me, 'o');
		    break;
		case 3:
		    HTML_put_character(me, '#');
		    break;
		case 4:
		    HTML_put_character(me, '@');
		    break;
		case 5:
		    HTML_put_character(me, '-');
		    break;
		case 6:
		    HTML_put_character(me, '=');
		    break;

		}
		/*
		 * Keep using HTML_put_character so that any other spaces
		 * coming through will be collapsed.  We use nbsp, so we won't
		 * wrap at the spacing character if there are no spaces in the
		 * subsequent text up to the right margin, but will declare it
		 * as a normal space to ensure collapsing if a normal space
		 * does immediately follow it.  - FM
		 */
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HText_setLastChar(me->text, ' ');
	    } else {
		/*
		 * Hack, because there is no append string!
		 */
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HTML_put_character(me, HT_NON_BREAK_SPACE);
		HText_setLastChar(me->text, ' ');
	    }
	}
	CAN_JUSTIFY_START;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_SPAN:
	CHECK_ID(HTML_GEN_ID);
	/*
	 * Should check LANG and/or DIR attributes, and the
	 * me->node_anchor->charset and/or yet to be added structure elements,
	 * and do something here.  - FM
	 */
	break;

    case HTML_BDO:
	CHECK_ID(HTML_GEN_ID);
	/*
	 * Should check DIR (and LANG) attributes, and the
	 * me->node_anchor->charset and/or yet to be added structure elements,
	 * and do something here.  - FM
	 */
	break;

    case HTML_SPOT:
	CHECK_ID(HTML_GEN_ID);
	break;

    case HTML_FN:
	change_paragraph_style(me, styles[ElementNumber]);
	UPDATE_STYLE;
	if (me->sp->tag_number == (int) ElementNumber)
	    LYEnsureDoubleSpace(me);
	CHECK_ID(HTML_GEN_ID);
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, "FOOTNOTE:");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	CAN_JUSTIFY_START
	    me->inLABEL = TRUE;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_A:
	/*
	 * If we are looking for client-side image maps, then handle an A
	 * within a MAP that has a COORDS attribute as an AREA tag. 
	 * Unfortunately we lose the anchor text this way for the LYNXIMGMAP,
	 * we would have to do much more parsing to collect it.  After
	 * potentially handling the A as AREA, always return immediately if
	 * only looking for image maps, without pushing anything on the style
	 * stack.  - kw
	 */
	if (me->map_address && present && present[HTML_A_COORDS])
	    LYStartArea(me,
			present[HTML_A_HREF] ? value[HTML_A_HREF] : NULL,
			NULL,
			present[HTML_A_TITLE] ? value[HTML_A_TITLE] : NULL,
			tag_charset);
	if (LYMapsOnly) {
	    return HT_OK;
	}
	/*
	 * A may have been declared SGML_EMPTY in HTMLDTD.c, and
	 * SGML_character() in SGML.c may check for an A end tag to call
	 * HTML_end_element() directly (with a check in that to bypass
	 * decrementing of the HTML parser's stack), so if we have an open A,
	 * close that one now.  - FM & kw
	 */
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	/*
	 * Set to know we are in an anchor.
	 */
	me->inA = TRUE;

	/*
	 * Load id_string if we have an ID or NAME.  - FM
	 */
	if (present && present[HTML_A_ID] &&
	    non_empty(value[HTML_A_ID])) {
	    StrAllocCopy(id_string, value[HTML_A_ID]);
	} else if (present && present[HTML_A_NAME] &&
		   non_empty(value[HTML_A_NAME])) {
	    StrAllocCopy(id_string, value[HTML_A_NAME]);
	}
	if (id_string)
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);

	/*
	 * Handle the reference.  - FM
	 */
	if (present && present[HTML_A_HREF]) {
	    /*
	     * Set to know we are making the content bold.
	     */
	    me->inBoldA = TRUE;

	    if (isEmpty(value[HTML_A_HREF]))
		StrAllocCopy(href, "#");
	    else
		StrAllocCopy(href, value[HTML_A_HREF]);
	    CHECK_FOR_INTERN(intern_flag, href);	/* '#' */

	    if (intern_flag) { /*** FAST WAY: ***/
		TRANSLATE_AND_UNESCAPE_TO_STD(&href);

	    } else {
		url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);

		/*
		 * Deal with our ftp gateway kludge.  - FM
		 */
		if (!url_type && !StrNCmp(href, "/foo/..", 7) &&
		    (isFTP_URL(me->node_anchor->address) ||
		     isFILE_URL(me->node_anchor->address))) {
		    for (i = 0; (href[i] = href[i + 7]) != 0; i++) ;
		}
	    }

	    if (present[HTML_A_ISMAP])	/*??? */
		intern_flag = FALSE;
	} else {
	    if (bold_name_anchors == TRUE) {
		me->inBoldA = TRUE;
	    }
	}

	if (present && present[HTML_A_TYPE] && value[HTML_A_TYPE]) {
	    StrAllocCopy(temp, value[HTML_A_TYPE]);
	    if (!intern_flag &&
		!strcasecomp(value[HTML_A_TYPE], HTAtom_name(HTInternalLink)) &&
		!LYIsUIPage3(me->node_anchor->address, UIP_LIST_PAGE, 0) &&
		!LYIsUIPage3(me->node_anchor->address, UIP_ADDRLIST_PAGE, 0) &&
		!isLYNXIMGMAP(me->node_anchor->address)) {
		/* Some kind of spoof?
		 * Found TYPE="internal link" but not in a valid context
		 * where we have written it. - kw
		 */
		CTRACE((tfp, "HTML: Found invalid HREF=\"%s\" TYPE=\"%s\"!\n",
			href, temp));
		FREE(temp);
	    }
	}

	me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						 id_string,	/* Tag */
						 href,	/* Address */
						 (temp
						  ? (HTLinkType *)
						  HTAtom_for(temp)
						  : INTERN_LT));	/* Type */
	FREE(temp);
	FREE(id_string);

	if (me->CurrentA && present) {
	    if (present[HTML_A_TITLE] &&
		non_empty(value[HTML_A_TITLE])) {
		StrAllocCopy(title, value[HTML_A_TITLE]);
		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
		LYTrimHead(title);
		LYTrimTail(title);
		if (*title == '\0') {
		    FREE(title);
		}
	    }
	    if (present[HTML_A_ISMAP])
		dest_ismap = TRUE;
	    if (present[HTML_A_CHARSET] &&
		non_empty(value[HTML_A_CHARSET])) {
		/*
		 * Set up to load the anchor's chartrans structures
		 * appropriately for the current display character set if it
		 * can handle what's claimed.  - FM
		 */
		StrAllocCopy(temp, value[HTML_A_CHARSET]);
		TRANSLATE_AND_UNESCAPE_TO_STD(&temp);
		dest_char_set = UCGetLYhndl_byMIME(temp);
		if (dest_char_set < 0) {
		    dest_char_set = UCLYhndl_for_unrec;
		}
	    }
	    if (title != NULL || dest_ismap == TRUE || dest_char_set >= 0) {
		dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
		    );
	    }
	    if (dest && title != NULL && HTAnchor_title(dest) == NULL)
		HTAnchor_setTitle(dest, title);
	    if (dest && dest_ismap)
		dest->isISMAPScript = TRUE;
	    /* Don't allow CHARSET attribute to change *this* document's
	       charset assumption. - kw */
	    if (dest && dest != me->node_anchor && dest_char_set >= 0) {
		/*
		 * Load the anchor's chartrans structures.  This should be done
		 * more intelligently when setting up the structured object,
		 * but it gets the job done for now.  - FM
		 */
		HTAnchor_setUCInfoStage(dest, dest_char_set,
					UCT_STAGE_MIME,
					UCT_SETBY_DEFAULT);
		HTAnchor_setUCInfoStage(dest, dest_char_set,
					UCT_STAGE_PARSER,
					UCT_SETBY_LINK);
	    }
	    FREE(temp);
	    dest = NULL;
	    FREE(title);
	}
	me->CurrentANum = HText_beginAnchor(me->text,
					    me->inUnderline, me->CurrentA);
	if (me->inBoldA == TRUE && me->inBoldH == FALSE)
	    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
#if defined(NOTUSED_FOTEMODS)
	/*
	 * Close an HREF-less NAMED-ed now if we aren't making their content
	 * bold, and let the check in HTML_end_element() deal with any dangling
	 * end tag this creates.  - FM
	 */
	if (href == NULL && me->inBoldA == FALSE) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
#else
	/*Close an HREF-less NAMED-ed now if force_empty_hrefless_a was
	   requested - VH */
	if (href == NULL && force_empty_hrefless_a) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
#endif
	FREE(href);
	break;

    case HTML_IMG:		/* Images */
	/*
	 * If we're in an anchor, get the destination, and if it's a clickable
	 * image for the current anchor, set our flags for faking a 0,0
	 * coordinate pair, which typically returns the image's default.  - FM
	 */
	if (me->inA && me->CurrentA) {
	    if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
		 )) != NULL) {
		if (dest->isISMAPScript == TRUE) {
		    dest_ismap = TRUE;
		    CTRACE((tfp, "HTML: '%s' is an ISMAP script\n",
			    dest->address));
		} else if (present && present[HTML_IMG_ISMAP]) {
		    dest_ismap = TRUE;
		    dest->isISMAPScript = TRUE;
		    CTRACE((tfp, "HTML: Designating '%s' as an ISMAP script\n",
			    dest->address));
		}
	    }
	}

	intern_flag = FALSE;	/* unless set below - kw */
	/*
	 * If there's a USEMAP, resolve it.  - FM
	 */
	if (present && present[HTML_IMG_USEMAP] &&
	    non_empty(value[HTML_IMG_USEMAP])) {
	    StrAllocCopy(map_href, value[HTML_IMG_USEMAP]);
	    CHECK_FOR_INTERN(intern_flag, map_href);
	    (void) LYLegitimizeHREF(me, &map_href, TRUE, TRUE);
	    /*
	     * If map_href ended up zero-length or otherwise doesn't have a
	     * hash, it can't be valid, so ignore it.  - FM
	     */
	    if (findPoundSelector(map_href) == NULL) {
		FREE(map_href);
	    }
	}

	/*
	 * Handle a MAP reference if we have one at this point.  - FM
	 */
	if (map_href) {
	    /*
	     * If the MAP reference doesn't yet begin with a scheme, check
	     * whether a base tag is in effect.  - FM
	     */
	    /*
	     * If the USEMAP value is a lone fragment and LYSeekFragMAPinCur is
	     * set, we'll use the current document's URL for resolving. 
	     * Otherwise use the BASE.  - kw
	     */
	    Base = ((me->inBASE &&
		     !(*map_href == '#' && LYSeekFragMAPinCur == TRUE))
		    ? me->base_href
		    : me->node_anchor->address);
	    HTParseALL(&map_href, Base);

	    /*
	     * Prepend our client-side MAP access field.  - FM
	     */
	    StrAllocCopy(temp, STR_LYNXIMGMAP);
	    StrAllocCat(temp, map_href);
	    StrAllocCopy(map_href, temp);
	    FREE(temp);
	}

	/*
	 * Check whether we want to suppress the server-side ISMAP link if a
	 * client-side MAP is present.  - FM
	 */
	if (LYNoISMAPifUSEMAP && map_href && dest_ismap) {
	    dest_ismap = FALSE;
	    dest = NULL;
	}

	/*
	 * Check for a TITLE attribute.  - FM
	 */
	if (present && present[HTML_IMG_TITLE] &&
	    non_empty(value[HTML_IMG_TITLE])) {
	    StrAllocCopy(title, value[HTML_IMG_TITLE]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
	    LYTrimHead(title);
	    LYTrimTail(title);
	    if (*title == '\0') {
		FREE(title);
	    }
	}

	/*
	 * If there's an ALT string, use it, unless the ALT string is
	 * zero-length or just spaces and we are making all SRCs links or have
	 * a USEMAP link.  - FM
	 */
	if (((present) &&
	     (present[HTML_IMG_ALT] && value[HTML_IMG_ALT])) &&
	    (!clickable_images ||
	     ((clickable_images || map_href) &&
	      *value[HTML_IMG_ALT] != '\0'))) {
	    StrAllocCopy(alt_string, value[HTML_IMG_ALT]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
					    me->UsePlainSpace, me->HiddenValue);
	    /*
	     * If it's all spaces and we are making SRC or USEMAP links, treat
	     * it as zero-length.  - FM
	     */
	    if (clickable_images || map_href) {
		LYTrimHead(alt_string);
		LYTrimTail(alt_string);
		if (*alt_string == '\0') {
		    if (map_href) {
			StrAllocCopy(alt_string, (title ? title :
						  (temp = MakeNewMapValue(value,
									  "USEMAP"))));
			FREE(temp);
		    } else if (dest_ismap) {
			StrAllocCopy(alt_string, (title ? title :
						  (temp = MakeNewMapValue(value,
									  "ISMAP"))));
			FREE(temp);

		    } else if (me->inA == TRUE && dest) {
			StrAllocCopy(alt_string, (title ?
						  title :
						  VERBOSE_IMG(value, HTML_IMG_SRC,
							      "[LINK]")));

		    } else {
			StrAllocCopy(alt_string,
				     (title ? title :
				      ((present &&
					present[HTML_IMG_ISOBJECT]) ?
				       "(OBJECT)" :
				       VERBOSE_IMG(value, HTML_IMG_SRC,
						   "[INLINE]"))));
		    }
		}
	    }

	} else if (map_href) {
	    StrAllocCopy(alt_string, (title ? title :
				      (temp = MakeNewMapValue(value, "USEMAP"))));
	    FREE(temp);

	} else if ((dest_ismap == TRUE) ||
		   (me->inA && present && present[HTML_IMG_ISMAP])) {
	    StrAllocCopy(alt_string, (title ? title :
				      (temp = MakeNewMapValue(value, "ISMAP"))));
	    FREE(temp);

	} else if (me->inA == TRUE && dest) {
	    StrAllocCopy(alt_string, (title ?
				      title :
				      VERBOSE_IMG(value, HTML_IMG_SRC,
						  "[LINK]")));

	} else {
	    if (pseudo_inline_alts || clickable_images)
		StrAllocCopy(alt_string, (title ? title :
					  ((present &&
					    present[HTML_IMG_ISOBJECT]) ?
					   "(OBJECT)" :
					   VERBOSE_IMG(value, HTML_IMG_SRC,
						       "[INLINE]"))));
	    else
		StrAllocCopy(alt_string, NonNull(title));
	}
	if (*alt_string == '\0' && map_href) {
	    StrAllocCopy(alt_string, (temp = MakeNewMapValue(value, "USEMAP")));
	    FREE(temp);
	}

	CTRACE((tfp, "HTML IMG: USEMAP=%d ISMAP=%d ANCHOR=%d PARA=%d\n",
		map_href ? 1 : 0,
		(dest_ismap == TRUE) ? 1 : 0,
		me->inA, me->inP));

	/*
	 * Check for an ID attribute.  - FM
	 */
	if (present && present[HTML_IMG_ID] &&
	    non_empty(value[HTML_IMG_ID])) {
	    StrAllocCopy(id_string, value[HTML_IMG_ID]);
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
	    if (*id_string == '\0') {
		FREE(id_string);
	    }
	}

	/*
	 * Create links to the SRC for all images, if desired.  - FM
	 */
	if (clickable_images &&
	    present && present[HTML_IMG_SRC] &&
	    non_empty(value[HTML_IMG_SRC])) {
	    StrAllocCopy(href, value[HTML_IMG_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);

	    /*
	     * If it's an ISMAP and/or USEMAP, or graphic for an anchor, end
	     * that anchor and start one for the SRC.  - FM
	     */
	    if (me->inA) {
		/*
		 * If we have a USEMAP, end this anchor and start a new one for
		 * the client-side MAP.  - FM
		 */
		if (map_href) {
		    if (dest_ismap) {
			HTML_put_character(me, ' ');
			me->in_word = NO;
			HTML_put_string(me,
					(temp = MakeNewMapValue(value, "ISMAP")));
			FREE(temp);
		    } else if (dest) {
			HTML_put_character(me, ' ');
			me->in_word = NO;
			HTML_put_string(me, "[LINK]");
		    }
		    if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    }
		    me->inBoldA = FALSE;
		    HText_endAnchor(me->text, me->CurrentANum);
		    me->CurrentANum = 0;
		    if (dest_ismap || dest)
			HTML_put_character(me, '-');
		    if (id_string) {
			if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							      id_string,	/* Tag */
							      NULL,	/* Addresss */
							      0)) != NULL) {	/* Type */
			    HText_beginAnchor(me->text, me->inUnderline, ID_A);
			    HText_endAnchor(me->text, 0);
			}
		    }
		    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							     NULL,	/* Tag */
							     map_href,	/* Addresss */
							     INTERN_LT);	/* Type */
		    if (me->CurrentA && title) {
			if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
			     )) != NULL) {
			    if (!HTAnchor_title(dest))
				HTAnchor_setTitle(dest, title);
			}
		    }
		    me->CurrentANum = HText_beginAnchor(me->text,
							me->inUnderline,
							me->CurrentA);
		    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
			HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		    }
		    me->inBoldA = TRUE;
		} else {
		    HTML_put_character(me, ' ');	/* space char may be ignored */
		    me->in_word = NO;
		}
		HTML_put_string(me, alt_string);
		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		}
		me->inBoldA = FALSE;
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
		HTML_put_character(me, '-');
		FREE(newtitle);
		StrAllocCopy(alt_string,
			     ((present &&
			       present[HTML_IMG_ISOBJECT]) ?
			      ((map_href || dest_ismap) ?
			       "(IMAGE)" : "(OBJECT)") :
			      VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));
		if (id_string && !map_href) {
		    if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							  id_string,	/* Tag */
							  NULL,		/* Addresss */
							  0)) != NULL) {	/* Type */
			HText_beginAnchor(me->text, me->inUnderline, ID_A);
			HText_endAnchor(me->text, 0);
		    }
		}
	    } else if (map_href) {
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
		if (id_string) {
		    if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							  id_string,	/* Tag */
							  NULL,		/* Addresss */
							  0)) != NULL) {	/* Type */
			HText_beginAnchor(me->text, me->inUnderline, ID_A);
			HText_endAnchor(me->text, 0);
		    }
		}
		me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							 NULL,	/* Tag */
							 map_href,	/* Addresss */
							 INTERN_LT);	/* Type */
		if (me->CurrentA && title) {
		    if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
			 )) != NULL) {
			if (!HTAnchor_title(dest))
			    HTAnchor_setTitle(dest, title);
		    }
		}
		me->CurrentANum = HText_beginAnchor(me->text,
						    me->inUnderline,
						    me->CurrentA);
		if (me->inBoldA == FALSE && me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		me->inBoldA = TRUE;
		HTML_put_string(me, alt_string);
		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		}
		me->inBoldA = FALSE;
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
		HTML_put_character(me, '-');
		FREE(newtitle);
		StrAllocCopy(alt_string,
			     ((present &&
			       present[HTML_IMG_ISOBJECT]) ?
			      "(IMAGE)" :
			      VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));
	    } else {
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
		if (id_string) {
		    if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							  id_string,	/* Tag */
							  NULL,		/* Addresss */
							  0)) != NULL) {	/* Type */
			HText_beginAnchor(me->text, me->inUnderline, ID_A);
			HText_endAnchor(me->text, 0);
		    }
		}
	    }

	    /*
	     * Create the link to the SRC.  - FM
	     */
	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     href,	/* Addresss */
						     (HTLinkType *) 0);		/* Type */
	    FREE(href);
	    me->CurrentANum = HText_beginAnchor(me->text,
						me->inUnderline,
						me->CurrentA);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    HTML_put_string(me, alt_string);
	    if (!me->inA) {
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
	    } else {
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
		me->inBoldA = TRUE;
	    }
	} else if (map_href) {
	    if (me->inA) {
		/*
		 * We're in an anchor and have a USEMAP, so end the anchor and
		 * start a new one for the client-side MAP.  - FM
		 */
		if (dest_ismap) {
		    HTML_put_character(me, ' ');	/* space char may be ignored */
		    me->in_word = NO;
		    HTML_put_string(me, (temp = MakeNewMapValue(value, "ISMAP")));
		    FREE(temp);
		} else if (dest) {
		    HTML_put_character(me, ' ');	/* space char may be ignored */
		    me->in_word = NO;
		    HTML_put_string(me, "[LINK]");
		}
		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		}
		me->inBoldA = FALSE;
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
		if (dest_ismap || dest) {
		    HTML_put_character(me, '-');
		}
	    } else {
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    }
	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     map_href,	/* Addresss */
						     INTERN_LT);	/* Type */
	    if (me->CurrentA && title) {
		if ((dest = HTAnchor_parent(HTAnchor_followLink(me->CurrentA)
		     )) != NULL) {
		    if (!HTAnchor_title(dest))
			HTAnchor_setTitle(dest, title);
		}
	    }
	    me->CurrentANum = HText_beginAnchor(me->text,
						me->inUnderline,
						me->CurrentA);
	    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    }
	    me->inBoldA = TRUE;
	    HTML_put_string(me, alt_string);
	    if (!me->inA) {
		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		}
		me->inBoldA = FALSE;
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
	    }
	} else {
	    /*
	     * Just put in the ALT or pseudo-ALT string for the current anchor
	     * or inline, with an ID link if indicated.  - FM
	     */
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	    me->in_word = NO;
	    if (id_string) {
		if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						      id_string,	/* Tag */
						      NULL,	/* Addresss */
						      (HTLinkType *) 0)) != NULL) {	/* Type */
		    HText_beginAnchor(me->text, me->inUnderline, ID_A);
		    HText_endAnchor(me->text, 0);
		}
	    }
	    HTML_put_string(me, alt_string);
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	    me->in_word = NO;
	}
	FREE(map_href);
	FREE(alt_string);
	FREE(id_string);
	FREE(title);
	FREE(newtitle);
	dest = NULL;
	break;

    case HTML_MAP:
	/*
	 * Load id_string if we have a NAME or ID.  - FM
	 */
	if (present && present[HTML_MAP_NAME] &&
	    non_empty(value[HTML_MAP_NAME])) {
	    StrAllocCopy(id_string, value[HTML_MAP_NAME]);
	} else if (present && present[HTML_MAP_ID] &&
		   non_empty(value[HTML_MAP_ID])) {
	    StrAllocCopy(id_string, value[HTML_MAP_ID]);
	}
	if (id_string) {
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
	    if (*id_string == '\0') {
		FREE(id_string);
	    }
	}

	/*
	 * Generate a target anchor in this place in the containing document. 
	 * MAP can now contain block markup, if it doesn't contain any AREAs
	 * (or A anchors with COORDS converted to AREAs) the current location
	 * can be used as a fallback for following a USEMAP link.  - kw
	 */
	if (!LYMapsOnly)
	    LYHandleID(me, id_string);

	/*
	 * Load map_address.  - FM
	 */
	if (id_string) {
	    /*
	     * The MAP must be in the current stream, even if it had a BASE
	     * tag, so we'll use its address here, but still use the BASE, if
	     * present, when resolving the AREA elements in it's content,
	     * unless the AREA's HREF is a lone fragment and
	     * LYSeekFragAREAinCur is set.  - FM && KW
	     */
	    StrAllocCopy(me->map_address, me->node_anchor->address);
	    if ((cp = strchr(me->map_address, '#')) != NULL)
		*cp = '\0';
	    StrAllocCat(me->map_address, "#");
	    StrAllocCat(me->map_address, id_string);
	    FREE(id_string);
	    if (present && present[HTML_MAP_TITLE] &&
		non_empty(value[HTML_MAP_TITLE])) {
		StrAllocCopy(title, value[HTML_MAP_TITLE]);
		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
		LYTrimHead(title);
		LYTrimTail(title);
		if (*title == '\0') {
		    FREE(title);
		}
	    }
	    LYAddImageMap(me->map_address, title, me->node_anchor);
	    FREE(title);
	}
	break;

    case HTML_AREA:
	if (me->map_address &&
	    present && present[HTML_AREA_HREF] &&
	    non_empty(value[HTML_AREA_HREF])) {
	    /*
	     * Resolve the HREF.  - FM
	     */
	    StrAllocCopy(href, value[HTML_AREA_HREF]);
	    CHECK_FOR_INTERN(intern_flag, href);
	    (void) LYLegitimizeHREF(me, &href, TRUE, TRUE);

	    /*
	     * Check whether a BASE tag is in effect, and use it for resolving,
	     * even though we used this stream's address for locating the MAP
	     * itself, unless the HREF is a lone fragment and
	     * LYSeekFragAREAinCur is set.  - FM
	     */
	    Base = (((me->inBASE && *href != '\0') &&
		     !(*href == '#' && LYSeekFragAREAinCur == TRUE))
		    ? me->base_href
		    : me->node_anchor->address);
	    HTParseALL(&href, Base);

	    /*
	     * Check for an ALT.  - FM
	     */
	    if (present[HTML_AREA_ALT] &&
		non_empty(value[HTML_AREA_ALT])) {
		StrAllocCopy(alt_string, value[HTML_AREA_ALT]);
	    } else if (present[HTML_AREA_TITLE] &&
		       non_empty(value[HTML_AREA_TITLE])) {
		/*
		 * Use the TITLE as an ALT.  - FM
		 */
		StrAllocCopy(alt_string, value[HTML_AREA_TITLE]);
	    }
	    if (alt_string != NULL) {
		TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
						me->UsePlainSpace,
						me->HiddenValue);
		/*
		 * Make sure it's not just space(s).  - FM
		 */
		LYTrimHead(alt_string);
		LYTrimTail(alt_string);
		if (*alt_string == '\0') {
		    StrAllocCopy(alt_string, href);
		}
	    } else {
		/*
		 * Use the HREF as an ALT.  - FM
		 */
		StrAllocCopy(alt_string, href);
	    }

	    LYAddMapElement(me->map_address, href, alt_string,
			    me->node_anchor, intern_flag);
	    FREE(href);
	    FREE(alt_string);
	}
	break;

    case HTML_PARAM:
	/*
	 * We may need to look at this someday to deal with MAPs, OBJECTs or
	 * APPLETs optimally, but just ignore it for now.  - FM
	 */
	break;

    case HTML_BODYTEXT:
	CHECK_ID(HTML_BODYTEXT_ID);
	/*
	 * We may need to look at this someday to deal with OBJECTs optimally,
	 * but just ignore it for now.  - FM
	 */
	break;

    case HTML_TEXTFLOW:
	CHECK_ID(HTML_BODYTEXT_ID);
	/*
	 * We may need to look at this someday to deal with APPLETs optimally,
	 * but just ignore it for now.  - FM
	 */
	break;

    case HTML_FIG:
	if (present)
	    LYHandleFIG(me, present, value,
			present[HTML_FIG_ISOBJECT],
			present[HTML_FIG_IMAGEMAP],
			present[HTML_FIG_ID] ? value[HTML_FIG_ID] : NULL,
			present[HTML_FIG_SRC] ? value[HTML_FIG_SRC] : NULL,
			YES, TRUE, &intern_flag);
	else
	    LYHandleFIG(me, NULL, NULL,
			0,
			0,
			NULL,
			NULL, YES, TRUE, &intern_flag);
	break;

    case HTML_OBJECT:
	if (!me->object_started) {
	    /*
	     * This is an outer OBJECT start tag, i.e., not a nested OBJECT, so
	     * save its relevant attributes.  - FM
	     */
	    if (present) {
		if (present[HTML_OBJECT_DECLARE])
		    me->object_declare = TRUE;
		if (present[HTML_OBJECT_SHAPES])
		    me->object_shapes = TRUE;
		if (present[HTML_OBJECT_ISMAP])
		    me->object_ismap = TRUE;
		if (present[HTML_OBJECT_USEMAP] &&
		    non_empty(value[HTML_OBJECT_USEMAP])) {
		    StrAllocCopy(me->object_usemap, value[HTML_OBJECT_USEMAP]);
		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_usemap);
		    if (*me->object_usemap == '\0') {
			FREE(me->object_usemap);
		    }
		}
		if (present[HTML_OBJECT_ID] &&
		    non_empty(value[HTML_OBJECT_ID])) {
		    StrAllocCopy(me->object_id, value[HTML_OBJECT_ID]);
		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_id);
		    if (*me->object_id == '\0') {
			FREE(me->object_id);
		    }
		}
		if (present[HTML_OBJECT_TITLE] &&
		    non_empty(value[HTML_OBJECT_TITLE])) {
		    StrAllocCopy(me->object_title, value[HTML_OBJECT_TITLE]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_title, TRUE, FALSE);
		    LYTrimHead(me->object_title);
		    LYTrimTail(me->object_title);
		    if (me->object_title == '\0') {
			FREE(me->object_title);
		    }
		}
		if (present[HTML_OBJECT_DATA] &&
		    non_empty(value[HTML_OBJECT_DATA])) {
		    StrAllocCopy(me->object_data, value[HTML_OBJECT_DATA]);
		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_data);
		    if (*me->object_data == '\0') {
			FREE(me->object_data);
		    }
		}
		if (present[HTML_OBJECT_TYPE] &&
		    non_empty(value[HTML_OBJECT_TYPE])) {
		    StrAllocCopy(me->object_type, value[HTML_OBJECT_TYPE]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_type, TRUE, FALSE);
		    LYTrimHead(me->object_type);
		    LYTrimTail(me->object_type);
		    if (me->object_type == '\0') {
			FREE(me->object_type);
		    }
		}
		if (present[HTML_OBJECT_CLASSID] &&
		    non_empty(value[HTML_OBJECT_CLASSID])) {
		    StrAllocCopy(me->object_classid,
				 value[HTML_OBJECT_CLASSID]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_classid, TRUE, FALSE);
		    LYTrimHead(me->object_classid);
		    LYTrimTail(me->object_classid);
		    if (me->object_classid == '\0') {
			FREE(me->object_classid);
		    }
		}
		if (present[HTML_OBJECT_CODEBASE] &&
		    non_empty(value[HTML_OBJECT_CODEBASE])) {
		    StrAllocCopy(me->object_codebase,
				 value[HTML_OBJECT_CODEBASE]);
		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_codebase);
		    if (*me->object_codebase == '\0') {
			FREE(me->object_codebase);
		    }
		}
		if (present[HTML_OBJECT_CODETYPE] &&
		    non_empty(value[HTML_OBJECT_CODETYPE])) {
		    StrAllocCopy(me->object_codetype,
				 value[HTML_OBJECT_CODETYPE]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_codetype,
						    TRUE,
						    FALSE);
		    LYTrimHead(me->object_codetype);
		    LYTrimTail(me->object_codetype);
		    if (me->object_codetype == '\0') {
			FREE(me->object_codetype);
		    }
		}
		if (present[HTML_OBJECT_NAME] &&
		    non_empty(value[HTML_OBJECT_NAME])) {
		    StrAllocCopy(me->object_name, value[HTML_OBJECT_NAME]);
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_name, TRUE, FALSE);
		    LYTrimHead(me->object_name);
		    LYTrimTail(me->object_name);
		    if (me->object_name == '\0') {
			FREE(me->object_name);
		    }
		}
	    }
	    /*
	     * If we can determine now that we are not going to do anything
	     * special to the OBJECT element's SGML contents, like skipping it
	     * completely or collecting it up in order to add something after
	     * it, then generate any output that should be emitted in the place
	     * of the OBJECT start tag NOW, then don't initialize special
	     * handling but return, letting our SGML parser know that further
	     * content is to be parsed normally not literally.  We could defer
	     * this until we have collected the contents and then recycle the
	     * contents (as was previously always done), but that has a higher
	     * chance of completely losing content in case of nesting errors in
	     * the input, incomplete transmissions, etc.  - kw
	     */
	    if ((!present ||
		 (me->object_declare == FALSE && me->object_name == NULL &&
		  me->object_shapes == FALSE && me->object_usemap == NULL))) {
		if (!LYMapsOnly) {
		    if (!clickable_images || me->object_data == NULL ||
			!(me->object_data != NULL &&
			  me->object_classid == NULL &&
			  me->object_codebase == NULL &&
			  me->object_codetype == NULL))
			FREE(me->object_data);
		    if (me->object_data) {
			HTStartAnchor5(me,
				       (me->object_id
					? value[HTML_OBJECT_ID]
					: NULL),
				       value[HTML_OBJECT_DATA],
				       value[HTML_OBJECT_TYPE],
				       tag_charset);
			if ((me->object_type != NULL) &&
			    !strncasecomp(me->object_type, "image/", 6))
			    HTML_put_string(me, "(IMAGE)");
			else
			    HTML_put_string(me, "(OBJECT)");
			HTML_end_element(me, HTML_A, NULL);
		    } else if (me->object_id)
			LYHandleID(me, me->object_id);
		}
		clear_objectdata(me);
		/*
		 * We do NOT want the HTML_put_* functions that are going to be
		 * called for the OBJECT's character content to add to the
		 * chunk, so we don't push on the stack.  Instead we keep a
		 * counter for open OBJECT tags that are treated this way, so
		 * HTML_end_element can skip handling the corresponding end tag
		 * that is going to arrive unexpectedly as far as our stack is
		 * concerned.
		 */
		status = HT_PARSER_OTHER_CONTENT;
		if (me->sp[0].tag_number == HTML_FIG &&
		    me->objects_figged_open > 0) {
		    ElementNumber = (HTMLElement) HTML_OBJECT_M;
		} else {
		    me->objects_mixed_open++;
		    SET_SKIP_STACK(HTML_OBJECT);
		}
	    } else if (me->object_declare == FALSE && me->object_name == NULL &&
		       me->object_shapes == TRUE) {
		LYHandleFIG(me, present, value,
			    1,
			    1 || me->object_ismap,
			    me->object_id,
			    ((me->object_data && !me->object_classid)
			     ? value[HTML_OBJECT_DATA]
			     : NULL),
			    NO, TRUE, &intern_flag);
		clear_objectdata(me);
		status = HT_PARSER_OTHER_CONTENT;
		me->objects_figged_open++;
		ElementNumber = HTML_FIG;

	    } else {
		/*
		 * Set flag that we are accumulating OBJECT content.  - FM
		 */
		me->object_started = TRUE;
	    }
	}
	break;

    case HTML_OVERLAY:
	if (clickable_images && me->inFIG &&
	    present && present[HTML_OVERLAY_SRC] &&
	    non_empty(value[HTML_OVERLAY_SRC])) {
	    StrAllocCopy(href, value[HTML_OVERLAY_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);
	    if (*href) {

		if (me->inA) {
		    SET_SKIP_STACK(HTML_A);
		    HTML_end_element(me, HTML_A, include);
		}
		me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							 NULL,	/* Tag */
							 href,	/* Addresss */
							 (HTLinkType *) 0);	/* Type */
		HTML_put_character(me, ' ');
		HText_appendCharacter(me->text, '+');
		me->CurrentANum = HText_beginAnchor(me->text,
						    me->inUnderline,
						    me->CurrentA);
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		HTML_put_string(me, "[OVERLAY]");
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		HText_endAnchor(me->text, me->CurrentANum);
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    }
	    FREE(href);
	}
	break;

    case HTML_APPLET:
	me->inAPPLET = TRUE;
	me->inAPPLETwithP = FALSE;
	HTML_put_character(me, ' ');	/* space char may be ignored */
	/*
	 * Load id_string if we have an ID or NAME.  - FM
	 */
	if (present && present[HTML_APPLET_ID] &&
	    non_empty(value[HTML_APPLET_ID])) {
	    StrAllocCopy(id_string, value[HTML_APPLET_ID]);
	} else if (present && present[HTML_APPLET_NAME] &&
		   non_empty(value[HTML_APPLET_NAME])) {
	    StrAllocCopy(id_string, value[HTML_APPLET_NAME]);
	}
	if (id_string) {
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
	    LYHandleID(me, id_string);
	    FREE(id_string);
	}
	me->in_word = NO;

	/*
	 * If there's an ALT string, use it, unless the ALT string is
	 * zero-length and we are making all sources links.  - FM
	 */
	if (present && present[HTML_APPLET_ALT] && value[HTML_APPLET_ALT] &&
	    (!clickable_images ||
	     (clickable_images && *value[HTML_APPLET_ALT] != '\0'))) {
	    StrAllocCopy(alt_string, value[HTML_APPLET_ALT]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
					    me->UsePlainSpace, me->HiddenValue);
	    /*
	     * If it's all spaces and we are making sources links, treat it as
	     * zero-length.  - FM
	     */
	    if (clickable_images) {
		LYTrimHead(alt_string);
		LYTrimTail(alt_string);
		if (*alt_string == '\0') {
		    StrAllocCopy(alt_string, "[APPLET]");
		}
	    }

	} else {
	    if (clickable_images)
		StrAllocCopy(alt_string, "[APPLET]");
	    else
		StrAllocCopy(alt_string, "");
	}

	/*
	 * If we're making all sources links, get the source.  - FM
	 */
	if (clickable_images && present && present[HTML_APPLET_CODE] &&
	    non_empty(value[HTML_APPLET_CODE])) {
	    char *base = NULL;

	    Base = (me->inBASE)
		? me->base_href
		: me->node_anchor->address;
	    /*
	     * Check for a CODEBASE attribute.  - FM
	     */
	    if (present[HTML_APPLET_CODEBASE] &&
		non_empty(value[HTML_APPLET_CODEBASE])) {
		StrAllocCopy(base, value[HTML_APPLET_CODEBASE]);
		LYRemoveBlanks(base);
		TRANSLATE_AND_UNESCAPE_TO_STD(&base);
		/*
		 * Force it to be a directory.  - FM
		 */
		if (*base == '\0')
		    StrAllocCopy(base, "/");
		LYAddHtmlSep(&base);
		LYLegitimizeHREF(me, &base, TRUE, FALSE);

		HTParseALL(&base, Base);
	    }

	    StrAllocCopy(href, value[HTML_APPLET_CODE]);
	    LYLegitimizeHREF(me, &href, TRUE, FALSE);
	    HTParseALL(&href, (base ? base : Base));
	    FREE(base);

	    if (*href) {
		if (me->inA) {
		    if (me->inBoldA == TRUE && me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    HText_endAnchor(me->text, me->CurrentANum);
		    HTML_put_character(me, '-');
		}
		me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							 NULL,	/* Tag */
							 href,	/* Addresss */
							 (HTLinkType *) 0);	/* Type */
		me->CurrentANum = HText_beginAnchor(me->text,
						    me->inUnderline,
						    me->CurrentA);
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		HTML_put_string(me, alt_string);
		if (me->inA == FALSE) {
		    if (me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    HText_endAnchor(me->text, me->CurrentANum);
		    me->CurrentANum = 0;
		}
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
	    }
	    FREE(href);
	} else if (*alt_string) {
	    /*
	     * Just put up the ALT string, if non-zero.  - FM
	     */
	    HTML_put_string(me, alt_string);
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	    me->in_word = NO;
	}
	FREE(alt_string);
	FREE(id_string);
	break;

    case HTML_BGSOUND:
	/*
	 * If we're making all sources links, get the source.  - FM
	 */
	if (clickable_images && present && present[HTML_BGSOUND_SRC] &&
	    non_empty(value[HTML_BGSOUND_SRC])) {
	    StrAllocCopy(href, value[HTML_BGSOUND_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);
	    if (*href == '\0') {
		FREE(href);
		break;
	    }

	    if (me->inA) {
		if (me->inBoldA == TRUE && me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		HText_endAnchor(me->text, me->CurrentANum);
		HTML_put_character(me, '-');
	    } else {
		HTML_put_character(me, ' ');	/* space char may be ignored */
		me->in_word = NO;
	    }
	    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						     NULL,	/* Tag */
						     href,	/* Addresss */
						     (HTLinkType *) 0);		/* Type */
	    me->CurrentANum = HText_beginAnchor(me->text,
						me->inUnderline,
						me->CurrentA);
	    if (me->inBoldH == FALSE)
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
	    HTML_put_string(me, "[BGSOUND]");
	    if (me->inA == FALSE) {
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		HText_endAnchor(me->text, me->CurrentANum);
		me->CurrentANum = 0;
	    }
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	    me->in_word = NO;
	    FREE(href);
	}
	break;

    case HTML_EMBED:
	if (pseudo_inline_alts || clickable_images)
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	/*
	 * Load id_string if we have an ID or NAME.  - FM
	 */
	if (present && present[HTML_EMBED_ID] &&
	    non_empty(value[HTML_EMBED_ID])) {
	    StrAllocCopy(id_string, value[HTML_EMBED_ID]);
	} else if (present && present[HTML_EMBED_NAME] &&
		   non_empty(value[HTML_EMBED_NAME])) {
	    StrAllocCopy(id_string, value[HTML_EMBED_NAME]);
	}
	if (id_string) {
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
	    LYHandleID(me, id_string);
	    FREE(id_string);
	}
	if (pseudo_inline_alts || clickable_images)
	    me->in_word = NO;

	/*
	 * If there's an ALT string, use it, unless the ALT string is
	 * zero-length and we are making all sources links.  - FM
	 */
	if (present && present[HTML_EMBED_ALT] && value[HTML_EMBED_ALT] &&
	    (!clickable_images ||
	     (clickable_images && *value[HTML_EMBED_ALT] != '\0'))) {
	    StrAllocCopy(alt_string, value[HTML_EMBED_ALT]);
	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,
					    me->UsePlainSpace, me->HiddenValue);
	    /*
	     * If it's all spaces and we are making sources links, treat it as
	     * zero-length.  - FM
	     */
	    if (clickable_images) {
		LYTrimHead(alt_string);
		LYTrimTail(alt_string);
		if (*alt_string == '\0') {
		    StrAllocCopy(alt_string, "[EMBED]");
		}
	    }
	} else {
	    if (pseudo_inline_alts || clickable_images)
		StrAllocCopy(alt_string, "[EMBED]");
	    else
		StrAllocCopy(alt_string, "");
	}

	/*
	 * If we're making all sources links, get the source.  - FM
	 */
	if (clickable_images && present && present[HTML_EMBED_SRC] &&
	    non_empty(value[HTML_EMBED_SRC])) {
	    StrAllocCopy(href, value[HTML_EMBED_SRC]);
	    LYLegitimizeHREF(me, &href, TRUE, TRUE);
	    if (*href) {
		if (me->inA) {
		    if (me->inBoldA == TRUE && me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    HText_endAnchor(me->text, me->CurrentANum);
		    HTML_put_character(me, '-');
		}
		me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							 NULL,	/* Tag */
							 href,	/* Addresss */
							 (HTLinkType *) 0);	/* Type */
		me->CurrentANum = HText_beginAnchor(me->text,
						    me->inUnderline,
						    me->CurrentA);
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		HTML_put_string(me, alt_string);
		if (me->inBoldH == FALSE)
		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		if (me->inA == FALSE) {
		    if (me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    HText_endAnchor(me->text, me->CurrentANum);
		    me->CurrentANum = 0;
		}
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    }
	    FREE(href);
	} else if (*alt_string) {
	    /*
	     * Just put up the ALT string, if non-zero.  - FM
	     */
	    HTML_put_string(me, alt_string);
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	    me->in_word = NO;
	}
	FREE(alt_string);
	FREE(id_string);
	break;

    case HTML_CREDIT:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	me->inCREDIT = TRUE;
	CHECK_ID(HTML_GEN_ID);
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, "CREDIT:");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	CAN_JUSTIFY_START;

	if (me->inFIG)
	    /*
	     * Assume all text in the FIG container is intended to be
	     * paragraphed.  - FM
	     */
	    me->inFIGwithP = TRUE;

	if (me->inAPPLET)
	    /*
	     * Assume all text in the APPLET container is intended to be
	     * paragraphed.  - FM
	     */
	    me->inAPPLETwithP = TRUE;

	me->inLABEL = TRUE;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_CAPTION:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	me->inCAPTION = TRUE;
	CHECK_ID(HTML_CAPTION_ID);
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, "CAPTION:");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	CAN_JUSTIFY_START;

	if (me->inFIG)
	    /*
	     * Assume all text in the FIG container is intended to be
	     * paragraphed.  - FM
	     */
	    me->inFIGwithP = TRUE;

	if (me->inAPPLET)
	    /*
	     * Assume all text in the APPLET container is intended to be
	     * paragraphed.  - FM
	     */
	    me->inAPPLETwithP = TRUE;

	me->inLABEL = TRUE;
	me->in_word = NO;
	me->inP = FALSE;
	break;

    case HTML_FORM:
	{
	    char *action = NULL;
	    char *method = NULL;
	    char *enctype = NULL;
	    const char *accept_cs = NULL;

	    HTChildAnchor *source;
	    HTAnchor *link_dest;

	    /*
	     * FORM may have been declared SGML_EMPTY in HTMLDTD.c, and
	     * SGML_character() in SGML.c may check for a FORM end tag to call
	     * HTML_end_element() directly (with a check in that to bypass
	     * decrementing of the HTML parser's stack), so if we have an open
	     * FORM, close that one now.  - FM
	     */
	    if (me->inFORM) {
		CTRACE((tfp, "HTML: Missing FORM end tag.  Faking it!\n"));
		SET_SKIP_STACK(HTML_FORM);
		HTML_end_element(me, HTML_FORM, include);
	    }

	    /*
	     * Set to know we are in a new form.
	     */
	    me->inFORM = TRUE;
	    EMIT_IFDEF_USE_JUSTIFY_ELTS(form_in_htext = TRUE);

	    if (present && present[HTML_FORM_ACCEPT_CHARSET]) {
		accept_cs = (value[HTML_FORM_ACCEPT_CHARSET]
			     ? value[HTML_FORM_ACCEPT_CHARSET]
			     : "UNKNOWN");
	    }

	    Base = (me->inBASE)
		? me->base_href
		: me->node_anchor->address;

	    if (present && present[HTML_FORM_ACTION] &&
		value[HTML_FORM_ACTION]) {

		StrAllocCopy(action, value[HTML_FORM_ACTION]);
		LYLegitimizeHREF(me, &action, TRUE, TRUE);

		/*
		 * Check whether a base tag is in effect.  Note that actions
		 * always are resolved w.r.t.  to the base, even if the action
		 * is empty.  - FM
		 */
		HTParseALL(&action, Base);

	    } else {
		StrAllocCopy(action, Base);
	    }

	    source = HTAnchor_findChildAndLink(me->node_anchor,
					       NULL,
					       action,
					       (HTLinkType *) 0);
	    if ((link_dest = HTAnchor_followLink(source)) != NULL) {
		/*
		 * Memory leak fixed.  05-28-94 Lynx 2-3-1 Garrett Arch Blythe
		 */
		char *cp_freeme = HTAnchor_address(link_dest);

		if (cp_freeme != NULL) {
		    StrAllocCopy(action, cp_freeme);
		    FREE(cp_freeme);
		} else {
		    StrAllocCopy(action, "");
		}
	    }

	    if (present && present[HTML_FORM_METHOD])
		StrAllocCopy(method, (value[HTML_FORM_METHOD]
				      ? value[HTML_FORM_METHOD]
				      : "GET"));

	    if (present && present[HTML_FORM_ENCTYPE] &&
		non_empty(value[HTML_FORM_ENCTYPE])) {
		StrAllocCopy(enctype, value[HTML_FORM_ENCTYPE]);
		LYLowerCase(enctype);
	    }

	    if (present) {
		/*
		 * Check for a TITLE attribute, and if none is present, check
		 * for a SUBJECT attribute as a synonym.  - FM
		 */
		if (present[HTML_FORM_TITLE] &&
		    non_empty(value[HTML_FORM_TITLE])) {
		    StrAllocCopy(title, value[HTML_FORM_TITLE]);
		} else if (present[HTML_FORM_SUBJECT] &&
			   non_empty(value[HTML_FORM_SUBJECT])) {
		    StrAllocCopy(title, value[HTML_FORM_SUBJECT]);
		}
		if (non_empty(title)) {
		    TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);
		    LYTrimHead(title);
		    LYTrimTail(title);
		    if (*title == '\0') {
			FREE(title);
		    }
		}
	    }

	    HText_beginForm(action, method, enctype, title, accept_cs);

	    FREE(action);
	    FREE(method);
	    FREE(enctype);
	    FREE(title);
	}
	CHECK_ID(HTML_FORM_ID);
	break;

    case HTML_FIELDSET:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	CHECK_ID(HTML_GEN_ID);
	break;

    case HTML_LEGEND:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	CHECK_ID(HTML_CAPTION_ID);
	break;

    case HTML_LABEL:
	CHECK_ID(HTML_LABEL_ID);
	break;

    case HTML_KEYGEN:
	CHECK_ID(HTML_KEYGEN_ID);
	break;

    case HTML_BUTTON:
	{
	    InputFieldData I;
	    int chars;

	    /* init */
	    memset(&I, 0, sizeof(I));
	    I.name_cs = ATTR_CS_IN;
	    I.value_cs = ATTR_CS_IN;

	    UPDATE_STYLE;
	    if (present &&
		present[HTML_BUTTON_TYPE] &&
		value[HTML_BUTTON_TYPE]) {
		if (!strcasecomp(value[HTML_BUTTON_TYPE], "submit") ||
		    !strcasecomp(value[HTML_BUTTON_TYPE], "reset")) {
		    /*
		     * It's a button for submitting or resetting a form.  - FM
		     */
		    I.type = value[HTML_BUTTON_TYPE];
		} else {
		    /*
		     * Ugh, it's a button for a script.  - FM
		     */
		    I.type = value[HTML_BUTTON_TYPE];
		}
	    } else {
		/* default, if no type given, is a submit button */
		I.type = "submit";
	    }

	    /*
	     * Before any input field, add a collapsible space if we're not in
	     * a PRE block, to promote a wrap there for any long values that
	     * would extend past the right margin from our current position in
	     * the line.  If we are in a PRE block, start a new line if the
	     * last line already is within 6 characters of the wrap point for
	     * PRE blocks.  - FM
	     */
	    if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&
		me->sp->style->freeFormat) {
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    } else if (HText_LastLineSize(me->text, FALSE) > (LYcolLimit - 6)) {
		HTML_put_character(me, '\n');
		me->in_word = NO;
	    }
	    HTML_put_character(me, '(');

	    if (!(present && present[HTML_BUTTON_NAME] &&
		  value[HTML_BUTTON_NAME])) {
		I.name = "";
	    } else if (strchr(value[HTML_BUTTON_NAME], '&') == NULL) {
		I.name = value[HTML_BUTTON_NAME];
	    } else {
		StrAllocCopy(I_name, value[HTML_BUTTON_NAME]);
		UNESCAPE_FIELDNAME_TO_STD(&I_name);
		I.name = I_name;
	    }

	    if (present && present[HTML_BUTTON_VALUE] &&
		non_empty(value[HTML_BUTTON_VALUE])) {
		/*
		 * Convert any HTML entities or decimal escaping.  - FM
		 */
		StrAllocCopy(I_value, value[HTML_BUTTON_VALUE]);
		me->UsePlainSpace = TRUE;
		TRANSLATE_AND_UNESCAPE_ENTITIES(&I_value, TRUE, me->HiddenValue);
		me->UsePlainSpace = FALSE;
		I.value = I_value;
		/*
		 * Convert any newlines or tabs to spaces, and trim any lead or
		 * trailing spaces.  - FM
		 */
		LYReduceBlanks(I.value);
	    } else if (!strcasecomp(I.type, "button")) {
		if (non_empty(I.name)) {
		    StrAllocCopy(I.value, I.name);
		} else {
		    StrAllocCopy(I.value, "BUTTON");
		}
	    } else if (I.value == 0) {
		StrAllocCopy(I.value, "BUTTON");
	    }

	    if (present && present[HTML_BUTTON_READONLY])
		I.readonly = YES;

	    if (present && present[HTML_BUTTON_DISABLED])
		I.disabled = YES;

	    if (present && present[HTML_BUTTON_CLASS] &&	/* Not yet used. */
		non_empty(value[HTML_BUTTON_CLASS]))
		I.iclass = value[HTML_BUTTON_CLASS];

	    if (present && present[HTML_BUTTON_ID] &&
		non_empty(value[HTML_BUTTON_ID])) {
		I.id = value[HTML_BUTTON_ID];
		CHECK_ID(HTML_BUTTON_ID);
	    }

	    if (present && present[HTML_BUTTON_LANG] &&		/* Not yet used. */
		non_empty(value[HTML_BUTTON_LANG]))
		I.lang = value[HTML_BUTTON_LANG];

	    chars = HText_beginInput(me->text, me->inUnderline, &I);
	    /*
	     * Submit and reset buttons have values which don't change, so
	     * HText_beginInput() sets I.value to the string which should be
	     * displayed, and we'll enter that instead of underscore
	     * placeholders into the HText structure to see it instead of
	     * underscores when dumping or printing.  We also won't worry about
	     * a wrap in PRE blocks, because the line editor never is invoked
	     * for submit or reset buttons.  - LE & FM
	     */
	    if (me->sp[0].tag_number == HTML_PRE ||
		!me->sp->style->freeFormat) {
		/*
		 * We have a submit or reset button in a PRE block, so output
		 * the entire value from the markup.  If it extends to the
		 * right margin, it will wrap there, and only the portion
		 * before that wrap will be hightlighted on screen display
		 * (Yuk!) but we may as well show the rest of the full value on
		 * the next or more lines.  - FM
		 */
		while (I.value[i])
		    HTML_put_character(me, I.value[i++]);
	    } else {
		/*
		 * The submit or reset button is not in a PRE block.  Note that
		 * if a wrap occurs before outputting the entire value, the
		 * wrapped portion will not be highlighted or clearly indicated
		 * as part of the link for submission or reset (Yuk!).  We'll
		 * replace any spaces in the submit or reset button value with
		 * nbsp, to promote a wrap at the space we ensured would be
		 * present before the start of the string, as when we use all
		 * underscores instead of the INPUT's actual value, but we
		 * could still get a wrap at the right margin, instead, if the
		 * value is greater than a line width for the current style. 
		 * Also, if chars somehow ended up longer than the length of
		 * the actual value (shouldn't have), we'll continue padding
		 * with nbsp up to the length of chars.  - FM
		 */
		for (i = 0; I.value[i]; i++) {
		    HTML_put_character(me,
				       (char) ((I.value[i] == ' ')
					       ? HT_NON_BREAK_SPACE
					       : I.value[i]));
		}
		while (i++ < chars) {
		    HTML_put_character(me, HT_NON_BREAK_SPACE);
		}
	    }
	    HTML_put_character(me, ')');
	    if (me->sp[0].tag_number != HTML_PRE &&
		me->sp->style->freeFormat) {
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    }
	    FREE(I_value);
	    FREE(I_name);
	}
	break;

    case HTML_INPUT:
	{
	    InputFieldData I;
	    int chars;
	    BOOL UseALTasVALUE = FALSE;
	    BOOL HaveSRClink = FALSE;
	    char *ImageSrc = NULL;
	    BOOL IsSubmitOrReset = FALSE;
	    HTkcode kcode = NOKANJI;
	    HTkcode specified_kcode = NOKANJI;

	    /* init */
	    memset(&I, 0, sizeof(I));
	    I.name_cs = ATTR_CS_IN;
	    I.value_cs = ATTR_CS_IN;

	    UPDATE_STYLE;

	    /*
	     * Before any input field, add a collapsible space if we're not in
	     * a PRE block, to promote a wrap there for any long values that
	     * would extend past the right margin from our current position in
	     * the line.  If we are in a PRE block, start a new line if the
	     * last line already is within 6 characters of the wrap point for
	     * PRE blocks.  - FM
	     */
	    if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&
		me->sp->style->freeFormat) {
		HTML_put_character(me, ' ');
		me->in_word = NO;
	    } else if (HText_LastLineSize(me->text, FALSE) > (LYcolLimit - 6)) {
		HTML_put_character(me, '\n');
		me->in_word = NO;
	    }

	    /*
	     * Get the TYPE and make sure we can handle it.  - FM
	     */
	    if (present && present[HTML_INPUT_TYPE] &&
		non_empty(value[HTML_INPUT_TYPE])) {
		const char *not_impl = NULL;
		char *usingval = NULL;

		I.type = value[HTML_INPUT_TYPE];

		if (!strcasecomp(I.type, "range")) {
		    if (present[HTML_INPUT_MIN] &&
			non_empty(value[HTML_INPUT_MIN]))
			I.min = value[HTML_INPUT_MIN];
		    if (present[HTML_INPUT_MAX] &&
			non_empty(value[HTML_INPUT_MAX]))
			I.max = value[HTML_INPUT_MAX];
		    /*
		     * Not yet implemented.
		     */
#ifdef NOTDEFINED
		    not_impl = "[RANGE Input]";
		    if (me->inFORM)
			HText_DisableCurrentForm();
#endif /* NOTDEFINED */
		    CTRACE((tfp, "HTML: Ignoring TYPE=\"range\"\n"));
		    break;

		} else if (!strcasecomp(I.type, "file")) {
		    if (present[HTML_INPUT_ACCEPT] &&
			non_empty(value[HTML_INPUT_ACCEPT]))
			I.accept = value[HTML_INPUT_ACCEPT];
#ifndef USE_FILE_UPLOAD
		    not_impl = "[FILE Input]";
		    CTRACE((tfp, "Attempting to fake as: %s\n", I.type));
#ifdef NOTDEFINED
		    if (me->inFORM)
			HText_DisableCurrentForm();
#endif /* NOTDEFINED */
		    CTRACE((tfp, "HTML: Ignoring TYPE=\"file\"\n"));
#endif /* USE_FILE_UPLOAD */

		} else if (!strcasecomp(I.type, "button")) {
		    /*
		     * Ugh, a button for a script.
		     */
		    not_impl = "[BUTTON Input]";
		}
		if (not_impl != NULL) {
		    if (me->inUnderline == FALSE) {
			HText_appendCharacter(me->text,
					      LY_UNDERLINE_START_CHAR);
		    }
		    HTML_put_string(me, not_impl);
		    if (usingval != NULL) {
			HTML_put_string(me, usingval);
			FREE(usingval);
		    } else {
			HTML_put_string(me, " (not implemented)");
		    }
		    if (me->inUnderline == FALSE) {
			HText_appendCharacter(me->text,
					      LY_UNDERLINE_END_CHAR);
		    }
		}
	    }

	    CTRACE((tfp, "Ok, we're trying type=[%s]\n", NONNULL(I.type)));

	    /*
	     * Check for an unclosed TEXTAREA.
	     */
	    if (me->inTEXTAREA) {
		if (LYBadHTML(me)) {
		    LYShowBadHTML("Bad HTML: Missing TEXTAREA end tag.\n");
		}
	    }

	    /*
	     * Check for an unclosed SELECT, try to close it if found.
	     */
	    if (me->inSELECT) {
		CTRACE((tfp, "HTML: Missing SELECT end tag, faking it...\n"));
		if (me->sp->tag_number != HTML_SELECT) {
		    SET_SKIP_STACK(HTML_SELECT);
		}
		HTML_end_element(me, HTML_SELECT, include);
	    }

	    /*
	     * Handle the INPUT as for a FORM.  - FM
	     */
	    if (!(present && present[HTML_INPUT_NAME] &&
		  non_empty(value[HTML_INPUT_NAME]))) {
		I.name = "";
	    } else if (strchr(value[HTML_INPUT_NAME], '&') == NULL) {
		I.name = value[HTML_INPUT_NAME];
	    } else {
		StrAllocCopy(I_name, value[HTML_INPUT_NAME]);
		UNESCAPE_FIELDNAME_TO_STD(&I_name);
		I.name = I_name;
	    }

	    if ((present && present[HTML_INPUT_ALT] &&
		 non_empty(value[HTML_INPUT_ALT]) &&
		 I.type && !strcasecomp(I.type, "image")) &&
		!(present && present[HTML_INPUT_VALUE] &&
		  non_empty(value[HTML_INPUT_VALUE]))) {
		/*
		 * This is a TYPE="image" using an ALT rather than VALUE
		 * attribute to indicate the link string for text clients or
		 * GUIs with image loading off, so set the flag to use that as
		 * if it were a VALUE attribute.  - FM
		 */
		UseALTasVALUE = TRUE;
	    }
	    if (verbose_img && !clickable_images &&
		present && present[HTML_INPUT_SRC] &&
		non_empty(value[HTML_INPUT_SRC]) &&
		I.type && !strcasecomp(I.type, "image")) {
		ImageSrc = MakeNewImageValue(value);
	    } else if (clickable_images == TRUE &&
		       present && present[HTML_INPUT_SRC] &&
		       non_empty(value[HTML_INPUT_SRC]) &&
		       I.type && !strcasecomp(I.type, "image")) {
		StrAllocCopy(href, value[HTML_INPUT_SRC]);
		/*
		 * We have a TYPE="image" with a non-zero-length SRC attribute
		 * and want clickable images.  Make the SRC's value a link if
		 * it's still not zero-length legitimizing it.  - FM
		 */
		LYLegitimizeHREF(me, &href, TRUE, TRUE);
		if (*href) {

		    if (me->inA) {
			SET_SKIP_STACK(HTML_A);
			HTML_end_element(me, HTML_A, include);
		    }
		    me->CurrentA = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							     NULL,	/* Tag */
							     href,	/* Addresss */
							     (HTLinkType *) 0);		/* Type */
		    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);
		    if (me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		    HTML_put_string(me, VERBOSE_IMG(value,
						    HTML_INPUT_SRC,
						    "[IMAGE]"));
		    FREE(newtitle);
		    if (me->inBoldH == FALSE)
			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
		    HText_endAnchor(me->text, 0);
		    HTML_put_character(me, '-');
		    HaveSRClink = TRUE;
		}
		FREE(href);
	    }
	    CTRACE((tfp, "2.Ok, we're trying type=[%s] (present=%p)\n",
		    NONNULL(I.type),
		    present));
	    /* text+file don't go in here */
	    if ((UseALTasVALUE == TRUE) ||
		(present && present[HTML_INPUT_VALUE] &&
		 value[HTML_INPUT_VALUE] &&
		 (*value[HTML_INPUT_VALUE] ||
		  (I.type && (!strcasecomp(I.type, "checkbox") ||
			      !strcasecomp(I.type, "radio")))))) {

		/*
		 * Convert any HTML entities or decimal escaping.  - FM
		 */
		int CurrentCharSet = current_char_set;
		BOOL CurrentEightBitRaw = HTPassEightBitRaw;
		BOOLEAN CurrentUseDefaultRawMode = LYUseDefaultRawMode;
		HTCJKlang CurrentHTCJK = HTCJK;

		if (I.type && !strcasecomp(I.type, "hidden")) {
		    me->HiddenValue = TRUE;
		    current_char_set = LATIN1;	/* Default ISO-Latin1 */
		    LYUseDefaultRawMode = TRUE;
		    HTMLSetCharacterHandling(current_char_set);
		}

		CTRACE((tfp, "3.Ok, we're trying type=[%s]\n", NONNULL(I.type)));
		if (!I.type)
		    me->UsePlainSpace = TRUE;
		else if (!strcasecomp(I.type, "text") ||
#ifdef USE_FILE_UPLOAD
			 !strcasecomp(I.type, "file") ||
#endif
			 !strcasecomp(I.type, "submit") ||
			 !strcasecomp(I.type, "image") ||
			 !strcasecomp(I.type, "reset")) {
		    CTRACE((tfp, "normal field type: %s\n", NONNULL(I.type)));
		    me->UsePlainSpace = TRUE;
		}

		StrAllocCopy(I_value,
			     ((UseALTasVALUE == TRUE)
			      ? value[HTML_INPUT_ALT]
			      : value[HTML_INPUT_VALUE]));
		if (me->UsePlainSpace && !me->HiddenValue) {
		    I.value_cs = current_char_set;
		}
		CTRACE((tfp, "4.Ok, we're trying type=[%s]\n", NONNULL(I.type)));
		TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
						 ATTR_CS_IN,
						 I.value_cs,
						 (BOOL) (me->UsePlainSpace &&
							 !me->HiddenValue),
						 me->UsePlainSpace,
						 me->HiddenValue);
		I.value = I_value;
		if (me->UsePlainSpace == TRUE) {
		    /*
		     * Convert any newlines or tabs to spaces, and trim any
		     * lead or trailing spaces.  - FM
		     */
		    LYReduceBlanks(I.value);
		}
		me->UsePlainSpace = FALSE;

		if (I.type && !strcasecomp(I.type, "hidden")) {
		    me->HiddenValue = FALSE;
		    current_char_set = CurrentCharSet;
		    LYUseDefaultRawMode = CurrentUseDefaultRawMode;
		    HTMLSetCharacterHandling(current_char_set);
		    HTPassEightBitRaw = CurrentEightBitRaw;
		    HTCJK = CurrentHTCJK;
		}
	    } else if (HaveSRClink == TRUE) {
		/*
		 * We put up an [IMAGE] link and '-' for a TYPE="image" and
		 * didn't get a VALUE or ALT string, so fake a "Submit" value. 
		 * If we didn't put up a link, then HText_beginInput() will use
		 * "[IMAGE]-Submit".  - FM
		 */
		StrAllocCopy(I_value, "Submit");
		I.value = I_value;
	    } else if (ImageSrc) {
		/* [IMAGE]-Submit with verbose images and not clickable images.
		 * Use ImageSrc if no other alt or value is supplied. --LE
		 */
		I.value = ImageSrc;
	    }
	    if (present && present[HTML_INPUT_READONLY])
		I.readonly = YES;
	    if (present && present[HTML_INPUT_CHECKED])
		I.checked = YES;
	    if (present && present[HTML_INPUT_SIZE] &&
		non_empty(value[HTML_INPUT_SIZE]))
		I.size = atoi(value[HTML_INPUT_SIZE]);
	    LimitValue(I.size, MAX_LINE);
	    if (present && present[HTML_INPUT_MAXLENGTH] &&
		non_empty(value[HTML_INPUT_MAXLENGTH]))
		I.maxlength = value[HTML_INPUT_MAXLENGTH];
	    if (present && present[HTML_INPUT_DISABLED])
		I.disabled = YES;

	    if (present && present[HTML_INPUT_ACCEPT_CHARSET]) {	/* Not yet used. */
		I.accept_cs = (value[HTML_INPUT_ACCEPT_CHARSET]
			       ? value[HTML_INPUT_ACCEPT_CHARSET]
			       : "UNKNOWN");
	    }
	    if (present && present[HTML_INPUT_ALIGN] &&		/* Not yet used. */
		non_empty(value[HTML_INPUT_ALIGN]))
		I.align = value[HTML_INPUT_ALIGN];
	    if (present && present[HTML_INPUT_CLASS] &&		/* Not yet used. */
		non_empty(value[HTML_INPUT_CLASS]))
		I.iclass = value[HTML_INPUT_CLASS];
	    if (present && present[HTML_INPUT_ERROR] &&		/* Not yet used. */
		non_empty(value[HTML_INPUT_ERROR]))
		I.error = value[HTML_INPUT_ERROR];
	    if (present && present[HTML_INPUT_HEIGHT] &&	/* Not yet used. */
		non_empty(value[HTML_INPUT_HEIGHT]))
		I.height = value[HTML_INPUT_HEIGHT];
	    if (present && present[HTML_INPUT_WIDTH] &&		/* Not yet used. */
		non_empty(value[HTML_INPUT_WIDTH]))
		I.width = value[HTML_INPUT_WIDTH];
	    if (present && present[HTML_INPUT_ID] &&
		non_empty(value[HTML_INPUT_ID])) {
		I.id = value[HTML_INPUT_ID];
		CHECK_ID(HTML_INPUT_ID);
	    }
	    if (present && present[HTML_INPUT_LANG] &&	/* Not yet used. */
		non_empty(value[HTML_INPUT_LANG]))
		I.lang = value[HTML_INPUT_LANG];
	    if (present && present[HTML_INPUT_MD] &&	/* Not yet used. */
		non_empty(value[HTML_INPUT_MD]))
		I.md = value[HTML_INPUT_MD];

	    chars = HText_beginInput(me->text, me->inUnderline, &I);
	    CTRACE((tfp,
		    "I.%s have %d chars, or something\n",
		    NONNULL(I.type),
		    chars));
	    /*
	     * Submit and reset buttons have values which don't change, so
	     * HText_beginInput() sets I.value to the string which should be
	     * displayed, and we'll enter that instead of underscore
	     * placeholders into the HText structure to see it instead of
	     * underscores when dumping or printing.  We also won't worry about
	     * a wrap in PRE blocks, because the line editor never is invoked
	     * for submit or reset buttons.  - LE & FM
	     */
	    if (I.type &&
		(!strcasecomp(I.type, "submit") ||
		 !strcasecomp(I.type, "reset") ||
		 !strcasecomp(I.type, "image")))
		IsSubmitOrReset = TRUE;

	    if (I.type && chars == 3 &&
		!strcasecomp(I.type, "radio")) {
		/*
		 * Put a (_) placeholder, and one space (collapsible) before
		 * the label that is expected to follow.  - FM
		 */
		HTML_put_string(me, "(_)");
		HText_endInput(me->text);
		chars = 0;
		me->in_word = YES;
		if (me->sp[0].tag_number != HTML_PRE &&
		    me->sp->style->freeFormat) {
		    HTML_put_character(me, ' ');
		    me->in_word = NO;
		}
	    } else if (I.type && chars == 3 &&
		       !strcasecomp(I.type, "checkbox")) {
		/*
		 * Put a [_] placeholder, and one space (collapsible) before
		 * the label that is expected to follow.  - FM
		 */
		HTML_put_string(me, "[_]");
		HText_endInput(me->text);
		chars = 0;
		me->in_word = YES;
		if (me->sp[0].tag_number != HTML_PRE &&
		    me->sp->style->freeFormat) {
		    HTML_put_character(me, ' ');
		    me->in_word = NO;
		}
	    } else if ((me->sp[0].tag_number == HTML_PRE ||
			!me->sp->style->freeFormat)
		       && chars > 6 &&
		       IsSubmitOrReset == FALSE) {
		/*
		 * This is not a submit or reset button, and we are in a PRE
		 * block with a field intended to exceed 6 character widths. 
		 * The code inadequately handles INPUT fields in PRE tags if
		 * wraps occur (at the right margin) for the underscore
		 * placeholders.  We'll put up a minimum of 6 underscores,
		 * since we should have wrapped artificially, above, if the
		 * INPUT begins within 6 columns of the right margin, and if
		 * any more would exceed the wrap column, we'll ignore them. 
		 * Note that if we somehow get tripped up and a wrap still does
		 * occur before all 6 of the underscores are output, the
		 * wrapped ones won't be treated as part of the editing window,
		 * nor be highlighted when not editing (Yuk!).  - FM
		 */
		for (i = 0; i < 6; i++) {
		    HTML_put_character(me, '_');
		    chars--;
		}
	    }
	    CTRACE((tfp, "I.%s, %d\n", NONNULL(I.type), IsSubmitOrReset));
	    if (IsSubmitOrReset == FALSE) {
		/*
		 * This is not a submit or reset button, so output the rest of
		 * the underscore placeholders, if any more are needed.  - FM
		 */
		if (chars > 0) {
		    for (; chars > 0; chars--)
			HTML_put_character(me, '_');
		    HText_endInput(me->text);
		}
	    } else {
		if (HTCJK == JAPANESE) {
		    kcode = HText_getKcode(me->text);
		    HText_updateKcode(me->text, kanji_code);
		    specified_kcode = HText_getSpecifiedKcode(me->text);
		    HText_updateSpecifiedKcode(me->text, kanji_code);
		}
		if (me->sp[0].tag_number == HTML_PRE ||
		    !me->sp->style->freeFormat) {
		    /*
		     * We have a submit or reset button in a PRE block, so
		     * output the entire value from the markup.  If it extends
		     * to the right margin, it will wrap there, and only the
		     * portion before that wrap will be hightlighted on screen
		     * display (Yuk!) but we may as well show the rest of the
		     * full value on the next or more lines.  - FM
		     */
		    while (I.value[i])
			HTML_put_character(me, I.value[i++]);
		} else {
		    /*
		     * The submit or reset button is not in a PRE block.  Note
		     * that if a wrap occurs before outputting the entire
		     * value, the wrapped portion will not be highlighted or
		     * clearly indicated as part of the link for submission or
		     * reset (Yuk!).  We'll replace any spaces in the submit or
		     * reset button value with nbsp, to promote a wrap at the
		     * space we ensured would be present before the start of
		     * the string, as when we use all underscores instead of
		     * the INPUT's actual value, but we could still get a wrap
		     * at the right margin, instead, if the value is greater
		     * than a line width for the current style.  Also, if chars
		     * somehow ended up longer than the length of the actual
		     * value (shouldn't have), we'll continue padding with nbsp
		     * up to the length of chars.  - FM
		     */
		    for (i = 0; I.value[i]; i++)
			HTML_put_character(me,
					   (char) (I.value[i] == ' '
						   ? HT_NON_BREAK_SPACE
						   : I.value[i]));
		    while (i++ < chars)
			HTML_put_character(me, HT_NON_BREAK_SPACE);
		}
		if (HTCJK == JAPANESE) {
		    HText_updateKcode(me->text, kcode);
		    HText_updateSpecifiedKcode(me->text, specified_kcode);
		}
	    }
	    if (chars != 0) {
		HText_endInput(me->text);
	    }
	    FREE(ImageSrc);
	    FREE(I_value);
	    FREE(I_name);
	}
	break;

    case HTML_TEXTAREA:
	/*
	 * Set to know we are in a textarea.
	 */
	me->inTEXTAREA = TRUE;

	/*
	 * Get ready for the value.
	 */
	HTChunkClear(&me->textarea);
	if (present && present[HTML_TEXTAREA_NAME] &&
	    value[HTML_TEXTAREA_NAME]) {
	    StrAllocCopy(me->textarea_name, value[HTML_TEXTAREA_NAME]);
	    me->textarea_name_cs = ATTR_CS_IN;
	    if (strchr(value[HTML_TEXTAREA_NAME], '&') != NULL) {
		UNESCAPE_FIELDNAME_TO_STD(&me->textarea_name);
	    }
	} else {
	    StrAllocCopy(me->textarea_name, "");
	}

	if (present && present[HTML_TEXTAREA_ACCEPT_CHARSET]) {
	    if (value[HTML_TEXTAREA_ACCEPT_CHARSET]) {
		StrAllocCopy(me->textarea_accept_cs, value[HTML_TEXTAREA_ACCEPT_CHARSET]);
		TRANSLATE_AND_UNESCAPE_TO_STD(&me->textarea_accept_cs);
	    } else {
		StrAllocCopy(me->textarea_accept_cs, "UNKNOWN");
	    }
	} else {
	    FREE(me->textarea_accept_cs);
	}

	if (present && present[HTML_TEXTAREA_COLS] &&
	    value[HTML_TEXTAREA_COLS] &&
	    isdigit(UCH(*value[HTML_TEXTAREA_COLS]))) {
	    me->textarea_cols = atoi(value[HTML_TEXTAREA_COLS]);
	} else {
	    int width;

	    width = LYcolLimit -
		me->new_style->leftIndent - me->new_style->rightIndent;
	    if (dump_output_immediately)	/* don't waste too much for this */
		width = HTMIN(width, DFT_TEXTAREA_COLS);
	    if (width > 1 && (width - 1) * 6 < MAX_LINE - 3 -
		me->new_style->leftIndent - me->new_style->rightIndent)
		me->textarea_cols = width;
	    else
		me->textarea_cols = DFT_TEXTAREA_COLS;
	}
	LimitValue(me->textarea_cols, MAX_TEXTAREA_COLS);

	if (present && present[HTML_TEXTAREA_ROWS] &&
	    value[HTML_TEXTAREA_ROWS] &&
	    isdigit(UCH(*value[HTML_TEXTAREA_ROWS]))) {
	    me->textarea_rows = atoi(value[HTML_TEXTAREA_ROWS]);
	} else {
	    me->textarea_rows = DFT_TEXTAREA_ROWS;
	}
	LimitValue(me->textarea_rows, MAX_TEXTAREA_ROWS);

	/*
	 * Lynx treats disabled and readonly textarea's the same -
	 * unmodifiable in either case.
	 */
	me->textarea_readonly = NO;
	if (present && present[HTML_TEXTAREA_READONLY])
	    me->textarea_readonly = YES;

	me->textarea_disabled = NO;
	if (present && present[HTML_TEXTAREA_DISABLED])
	    me->textarea_disabled = YES;

	if (present && present[HTML_TEXTAREA_ID]
	    && non_empty(value[HTML_TEXTAREA_ID])) {
	    StrAllocCopy(id_string, value[HTML_TEXTAREA_ID]);
	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);
	    if ((id_string != '\0') &&
		(ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
						  id_string,	/* Tag */
						  NULL,		/* Addresss */
						  (HTLinkType *) 0))) {		/* Type */
		HText_beginAnchor(me->text, me->inUnderline, ID_A);
		HText_endAnchor(me->text, 0);
		StrAllocCopy(me->textarea_id, id_string);
	    } else {
		FREE(me->textarea_id);
	    }
	    FREE(id_string);
	} else {
	    FREE(me->textarea_id);
	}
	break;

    case HTML_SELECT:
	/*
	 * Check for an already open SELECT block.  - FM
	 */
	if (me->inSELECT) {
	    if (LYBadHTML(me)) {
		LYShowBadHTML("Bad HTML: SELECT start tag in SELECT element.  Faking SELECT end tag. *****\n");
	    }
	    if (me->sp->tag_number != HTML_SELECT) {
		SET_SKIP_STACK(HTML_SELECT);
	    }
	    HTML_end_element(me, HTML_SELECT, include);
	}

	/*
	 * Start a new SELECT block. - FM
	 */
	LYHandleSELECT(me,
		       present, (const char **) value,
		       include,
		       TRUE);
	break;

    case HTML_OPTION:
	{
	    /*
	     * An option is a special case of an input field.
	     */
	    InputFieldData I;

	    /*
	     * Make sure we're in a select tag.
	     */
	    if (!me->inSELECT) {
		if (LYBadHTML(me)) {
		    LYShowBadHTML("Bad HTML: OPTION tag not within SELECT tag\n");
		}

		/*
		 * Too likely to cause a crash, so we'll ignore it.  - FM
		 */
		break;
	    }

	    if (!me->first_option) {
		/*
		 * Finish the data off.
		 */
		HTChunkTerminate(&me->option);

		/*
		 * Finish the previous option @@@@@
		 */
		HText_setLastOptionValue(me->text,
					 me->option.data,
					 me->LastOptionValue,
					 MIDDLE_ORDER,
					 me->LastOptionChecked,
					 me->UCLYhndl,
					 ATTR_CS_IN);
	    }

	    /*
	     * If it's not a multiple option list and select popups are
	     * enabled, then don't use the checkbox/button method, and don't
	     * put anything on the screen yet.
	     */
	    if (me->first_option ||
		HTCurSelectGroupType == F_CHECKBOX_TYPE ||
		LYSelectPopups == FALSE) {
		if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||
		    LYSelectPopups == FALSE) {
		    /*
		     * Start a newline before each option.
		     */
		    LYEnsureSingleSpace(me);
		} else {
		    /*
		     * Add option list designation character.
		     */
		    HText_appendCharacter(me->text, '[');
		    me->in_word = YES;
		}

		/*
		 * Inititialize.
		 */
		memset(&I, 0, sizeof(I));
		I.name_cs = -1;
		I.value_cs = current_char_set;

		I.type = "OPTION";

		if ((present && present[HTML_OPTION_SELECTED]) ||
		    (me->first_option && LYSelectPopups == FALSE &&
		     HTCurSelectGroupType == F_RADIO_TYPE))
		    I.checked = YES;

		if (present && present[HTML_OPTION_VALUE] &&
		    value[HTML_OPTION_VALUE]) {
		    /*
		     * Convert any HTML entities or decimal escaping.  - FM
		     */
		    StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);
		    me->HiddenValue = TRUE;
		    TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
						     ATTR_CS_IN,
						     ATTR_CS_IN,
						     NO,
						     me->UsePlainSpace, me->HiddenValue);
		    I.value_cs = ATTR_CS_IN;
		    me->HiddenValue = FALSE;

		    I.value = I_value;
		}

		if (me->select_disabled ||
		    (0 && present && present[HTML_OPTION_DISABLED])) {
		    /* 2009/5/25 - suppress check for "disabled" attribute
		     * for Debian #525934 -TD
		     */
		    I.disabled = YES;
		}

		if (present && present[HTML_OPTION_ID]
		    && non_empty(value[HTML_OPTION_ID])) {
		    if ((ID_A = HTAnchor_findChildAndLink(me->node_anchor,	/* Parent */
							  value[HTML_OPTION_ID],	/* Tag */
							  NULL,		/* Addresss */
							  0)) != NULL) {	/* Type */
			HText_beginAnchor(me->text, me->inUnderline, ID_A);
			HText_endAnchor(me->text, 0);
			I.id = value[HTML_OPTION_ID];
		    }
		}

		HText_beginInput(me->text, me->inUnderline, &I);

		if (HTCurSelectGroupType == F_CHECKBOX_TYPE) {
		    /*
		     * Put a "[_]" placeholder, and one space (collapsible)
		     * before the label that is expected to follow.  - FM
		     */
		    HText_appendCharacter(me->text, '[');
		    HText_appendCharacter(me->text, '_');
		    HText_appendCharacter(me->text, ']');
		    HText_appendCharacter(me->text, ' ');
		    HText_setLastChar(me->text, ' ');	/* absorb white space */
		    me->in_word = NO;
		} else if (LYSelectPopups == FALSE) {
		    /*
		     * Put a "(_)" placeholder, and one space (collapsible)
		     * before the label that is expected to follow.  - FM
		     */
		    HText_appendCharacter(me->text, '(');
		    HText_appendCharacter(me->text, '_');
		    HText_appendCharacter(me->text, ')');
		    HText_appendCharacter(me->text, ' ');
		    HText_setLastChar(me->text, ' ');	/* absorb white space */
		    me->in_word = NO;
		}
	    }

	    /*
	     * Get ready for the next value.
	     */
	    HTChunkClear(&me->option);
	    if ((present && present[HTML_OPTION_SELECTED]) ||
		(me->first_option && LYSelectPopups == FALSE &&
		 HTCurSelectGroupType == F_RADIO_TYPE))
		me->LastOptionChecked = TRUE;
	    else
		me->LastOptionChecked = FALSE;
	    me->first_option = FALSE;

	    if (present && present[HTML_OPTION_VALUE] &&
		value[HTML_OPTION_VALUE]) {
		if (!I_value) {
		    /*
		     * Convert any HTML entities or decimal escaping.  - FM
		     */
		    StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);
		    me->HiddenValue = TRUE;
		    TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,
						     ATTR_CS_IN,
						     ATTR_CS_IN,
						     NO,
						     me->UsePlainSpace, me->HiddenValue);
		    me->HiddenValue = FALSE;
		}
		StrAllocCopy(me->LastOptionValue, I_value);
	    } else {
		StrAllocCopy(me->LastOptionValue, me->option.data);
	    }

	    /*
	     * If this is a popup option, print its option for use in selecting
	     * option by number.  - LE
	     */
	    if (HTCurSelectGroupType == F_RADIO_TYPE &&
		LYSelectPopups &&
		fields_are_numbered()) {
		char marker[8];
		int opnum = HText_getOptionNum(me->text);

		if (opnum > 0 && opnum < 100000) {
		    sprintf(marker, "(%d)", opnum);
		    HTML_put_string(me, marker);
		    for (i = (int) strlen(marker); i < 5; ++i) {
			HTML_put_character(me, '_');
		    }
		}
	    }
	    FREE(I_value);
	}
	break;

    case HTML_TABLE:
	/*
	 * Not fully implemented.  Just treat as a division with respect to any
	 * ALIGN attribute, with a default of HT_LEFT, or leave as a PRE block
	 * if we are presently in one.  - FM
	 *
	 * Also notify simple table tracking code unless in a preformatted
	 * section, or (currently) non-left alignment.
	 *
	 * If page author is using a TABLE within PRE, it's probably formatted
	 * specifically to work well for Lynx without simple table tracking
	 * code.  Cancel tracking, it would only make things worse.  - kw
	 */
#ifdef EXP_NESTED_TABLES
	if (!nested_tables)
#endif
	    HText_cancelStbl(me->text);

	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	if (me->Underline_Level > 0) {
	    SET_SKIP_STACK(HTML_U);
	    HTML_end_element(me, HTML_U, include);
	}
	me->inTABLE = TRUE;
	if (me->sp->style->id == ST_Preformatted) {
	    UPDATE_STYLE;
	    CHECK_ID(HTML_TABLE_ID);
	    break;
	}
	if (me->Division_Level < (MAX_NESTING - 1)) {
	    me->Division_Level++;
	} else {
	    CTRACE((tfp,
		    "HTML: ****** Maximum nesting of %d divisions/tables exceeded!\n",
		    MAX_NESTING));
	}
	if (present && present[HTML_TABLE_ALIGN] &&
	    non_empty(value[HTML_TABLE_ALIGN])) {
	    if (!strcasecomp(value[HTML_TABLE_ALIGN], "center")) {
		if (no_table_center) {
		    me->DivisionAlignments[me->Division_Level] = HT_LEFT;
		    change_paragraph_style(me, styles[HTML_DLEFT]);
		    UPDATE_STYLE;
		    me->current_default_alignment =
			styles[HTML_DLEFT]->alignment;
		} else {
		    me->DivisionAlignments[me->Division_Level] = HT_CENTER;
		    change_paragraph_style(me, styles[HTML_DCENTER]);
		    UPDATE_STYLE;
		    me->current_default_alignment =
			styles[HTML_DCENTER]->alignment;
		}

		stbl_align = HT_CENTER;

	    } else if (!strcasecomp(value[HTML_TABLE_ALIGN], "right")) {
		me->DivisionAlignments[me->Division_Level] = HT_RIGHT;
		change_paragraph_style(me, styles[HTML_DRIGHT]);
		UPDATE_STYLE;
		me->current_default_alignment = styles[HTML_DRIGHT]->alignment;
		stbl_align = HT_RIGHT;
	    } else {
		me->DivisionAlignments[me->Division_Level] = HT_LEFT;
		change_paragraph_style(me, styles[HTML_DLEFT]);
		UPDATE_STYLE;
		me->current_default_alignment = styles[HTML_DLEFT]->alignment;
		if (!strcasecomp(value[HTML_TABLE_ALIGN], "left") ||
		    !strcasecomp(value[HTML_TABLE_ALIGN], "justify"))
		    stbl_align = HT_LEFT;
	    }
	} else {
	    me->DivisionAlignments[me->Division_Level] = HT_LEFT;
	    change_paragraph_style(me, styles[HTML_DLEFT]);
	    UPDATE_STYLE;
	    me->current_default_alignment = styles[HTML_DLEFT]->alignment;
	    /* stbl_align remains HT_ALIGN_NONE */
	}
	CHECK_ID(HTML_TABLE_ID);
	HText_startStblTABLE(me->text, stbl_align);
	break;

    case HTML_TR:
	/*
	 * Not fully implemented.  Just start a new row, if needed, act on an
	 * ALIGN attribute if present, and check for an ID link.  - FM
	 * Also notify simple table tracking code.  - kw
	 */
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	if (me->Underline_Level > 0) {
	    SET_SKIP_STACK(HTML_U);
	    HTML_end_element(me, HTML_U, include);
	}
	UPDATE_STYLE;
	if (!HText_LastLineEmpty(me->text, FALSE)) {
	    HText_setLastChar(me->text, ' ');	/* absorb white space */
	    HText_appendCharacter(me->text, '\r');
	}
	me->in_word = NO;

	if (me->sp->style->id == ST_Preformatted) {
	    CHECK_ID(HTML_TR_ID);
	    me->inP = FALSE;
/*	    HText_cancelStbl(me->text);  seems unnecessary here - kw */
	    break;
	}
	if (LYoverride_default_alignment(me)) {
	    me->sp->style->alignment = styles[me->sp[0].tag_number]->alignment;
	} else if (me->List_Nesting_Level >= 0 ||
		   ((me->Division_Level < 0) &&
		    (me->sp->style->id == ST_Normal ||
		     me->sp->style->id == ST_Preformatted))) {
	    me->sp->style->alignment = HT_LEFT;
	} else {
	    me->sp->style->alignment = (short) me->current_default_alignment;
	}
	if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) {
	    if (!strcasecomp(value[HTML_TR_ALIGN], "center") &&
		!(me->List_Nesting_Level >= 0 && !me->inP)) {
		if (no_table_center)
		    me->sp->style->alignment = HT_LEFT;
		else
		    me->sp->style->alignment = HT_CENTER;
		stbl_align = HT_CENTER;
	    } else if (!strcasecomp(value[HTML_TR_ALIGN], "right") &&
		       !(me->List_Nesting_Level >= 0 && !me->inP)) {
		me->sp->style->alignment = HT_RIGHT;
		stbl_align = HT_RIGHT;
	    } else if (!strcasecomp(value[HTML_TR_ALIGN], "left") ||
		       !strcasecomp(value[HTML_TR_ALIGN], "justify")) {
		me->sp->style->alignment = HT_LEFT;
		stbl_align = HT_LEFT;
	    }
	}

	CHECK_ID(HTML_TR_ID);
	me->inP = FALSE;
	HText_startStblTR(me->text, stbl_align);
	break;

    case HTML_THEAD:
    case HTML_TFOOT:
    case HTML_TBODY:
	HText_endStblTR(me->text);
	/*
	 * Not fully implemented.  Just check for an ID link.  - FM
	 */
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	if (me->Underline_Level > 0) {
	    SET_SKIP_STACK(HTML_U);
	    HTML_end_element(me, HTML_U, include);
	}
	UPDATE_STYLE;
	if (me->inTABLE) {
	    if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) {
		if (!strcasecomp(value[HTML_TR_ALIGN], "center")) {
		    stbl_align = HT_CENTER;
		} else if (!strcasecomp(value[HTML_TR_ALIGN], "right")) {
		    stbl_align = HT_RIGHT;
		} else if (!strcasecomp(value[HTML_TR_ALIGN], "left") ||
			   !strcasecomp(value[HTML_TR_ALIGN], "justify")) {
		    stbl_align = HT_LEFT;
		}
	    }
	    HText_startStblRowGroup(me->text, stbl_align);
	}
	CHECK_ID(HTML_TR_ID);
	break;

    case HTML_COL:
    case HTML_COLGROUP:
	/*
	 * Not fully implemented.  Just check for an ID link.  - FM
	 */
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	if (me->Underline_Level > 0) {
	    SET_SKIP_STACK(HTML_U);
	    HTML_end_element(me, HTML_U, include);
	}
	UPDATE_STYLE;
	if (me->inTABLE) {
	    int span = 1;

	    if (present && present[HTML_COL_SPAN] &&
		value[HTML_COL_SPAN] &&
		isdigit(UCH(*value[HTML_COL_SPAN])))
		span = atoi(value[HTML_COL_SPAN]);
	    if (present && present[HTML_COL_ALIGN] && value[HTML_COL_ALIGN]) {
		if (!strcasecomp(value[HTML_COL_ALIGN], "center")) {
		    stbl_align = HT_CENTER;
		} else if (!strcasecomp(value[HTML_COL_ALIGN], "right")) {
		    stbl_align = HT_RIGHT;
		} else if (!strcasecomp(value[HTML_COL_ALIGN], "left") ||
			   !strcasecomp(value[HTML_COL_ALIGN], "justify")) {
		    stbl_align = HT_LEFT;
		}
	    }
	    HText_startStblCOL(me->text, span, stbl_align,
			       (BOOL) (ElementNumber == HTML_COLGROUP));
	}
	CHECK_ID(HTML_COL_ID);
	break;

    case HTML_TH:
    case HTML_TD:
	if (me->inA) {
	    SET_SKIP_STACK(HTML_A);
	    HTML_end_element(me, HTML_A, include);
	}
	if (me->Underline_Level > 0) {
	    SET_SKIP_STACK(HTML_U);
	    HTML_end_element(me, HTML_U, include);
	}
	UPDATE_STYLE;
	CHECK_ID(HTML_TD_ID);
	/*
	 * Not fully implemented.  Just add a collapsible space and break - FM
	 * Also notify simple table tracking code.  - kw
	 */
	HTML_put_character(me, ' ');
	{
	    int colspan = 1, rowspan = 1;

	    if (present && present[HTML_TD_COLSPAN] &&
		value[HTML_TD_COLSPAN] &&
		isdigit(UCH(*value[HTML_TD_COLSPAN])))
		colspan = atoi(value[HTML_TD_COLSPAN]);
	    if (present && present[HTML_TD_ROWSPAN] &&
		value[HTML_TD_ROWSPAN] &&
		isdigit(UCH(*value[HTML_TD_ROWSPAN])))
		rowspan = atoi(value[HTML_TD_ROWSPAN]);
	    if (present && present[HTML_TD_ALIGN] && value[HTML_TD_ALIGN]) {
		if (!strcasecomp(value[HTML_TD_ALIGN], "center")) {
		    stbl_align = HT_CENTER;
		} else if (!strcasecomp(value[HTML_TD_ALIGN], "right")) {
		    stbl_align = HT_RIGHT;
		} else if (!strcasecomp(value[HTML_TD_ALIGN], "left") ||
			   !strcasecomp(value[HTML_TD_ALIGN], "justify")) {
		    stbl_align = HT_LEFT;
		}
	    }
	    HText_startStblTD(me->text, colspan, rowspan, stbl_align,
			      (BOOL) (ElementNumber == HTML_TH));
	}
	me->in_word = NO;
	break;

    case HTML_MATH:
	/*
	 * We're getting it as Literal text, which, until we can process it,
	 * we'll display as is, within brackets to alert the user.  - FM
	 */
	HTChunkClear(&me->math);
	CHECK_ID(HTML_GEN_ID);
	break;

    default:
	break;

    }				/* end switch */

    if (ElementNumber >= HTML_ELEMENTS ||
	HTML_dtd.tags[ElementNumber].contents != SGML_EMPTY) {
	if (me->skip_stack > 0) {
	    CTRACE((tfp,
		    "HTML:begin_element: internal call (level %d), leaving on stack - `%s'\n",
		    me->skip_stack, NONNULL(GetHTStyleName(me->sp->style))));
	    me->skip_stack--;
	    return status;
	}
	if (me->sp == me->stack) {
	    if (me->stack_overrun == FALSE) {
		HTAlert(HTML_STACK_OVERRUN);
		CTRACE((tfp,
			"HTML: ****** Maximum nesting of %d tags exceeded!\n",
			MAX_NESTING));
		me->stack_overrun = TRUE;
	    }
	    return HT_ERROR;
	}

	CTRACE((tfp,
		"HTML:begin_element[%d]: adding style to stack - %s (%s)\n",
		(int) STACKLEVEL(me),
		NONNULL(GetHTStyleName(me->new_style)),
		HTML_dtd.tags[ElementNumber].name));
	(me->sp)--;
	me->sp[0].style = me->new_style;	/* Stack new style */
	me->sp[0].tag_number = ElementNumber;
#ifdef USE_JUSTIFY_ELTS
	if (wait_for_this_stacked_elt < 0 &&
	    HTML_dtd.tags[ElementNumber].can_justify == FALSE)
	    wait_for_this_stacked_elt = (int) (me->stack - me->sp) + MAX_NESTING;
#endif
    }
#ifdef USE_JUSTIFY_ELTS
    if (in_DT && ElementNumber == HTML_DD)
	in_DT = FALSE;
    else if (ElementNumber == HTML_DT)
	in_DT = TRUE;
#endif

#if defined(USE_COLOR_STYLE)
/* end really empty tags straight away */

    if (ReallyEmptyTagNum(element_number)) {
	CTRACE2(TRACE_STYLE,
		(tfp, "STYLE.begin_element:ending \"EMPTY\" element style\n"));
	HText_characterStyle(me->text, HCODE_TO_STACK_OFF(hcode), STACK_OFF);

#  if !OMIT_SCN_KEEPING
	FastTrimColorClass(HTML_dtd.tags[element_number].name,
			   HTML_dtd.tags[element_number].name_len,
			   Style_className,
			   &Style_className_end, &hcode);
#  endif
    }
#endif /* USE_COLOR_STYLE */
    return status;
}

/*		End Element
 *		-----------
 *
 *	When we end an element, the style must be returned to that
 *	in effect before that element.	Note that anchors (etc?)
 *	don't have an associated style, so that we must scan down the
 *	stack for an element with a defined style. (In fact, the styles
 *	should be linked to the whole stack not just the top one.)
 *	TBL 921119
 *
 *	We don't turn on "CAREFUL" check because the parser produces
 *	(internal code errors apart) good nesting.  The parser checks
 *	incoming code errors, not this module.
 */
static int HTML_end_element(HTStructured * me, int element_number,
			    char **include)
{
    static char empty[1];

    int i = 0;
    int status = HT_OK;
    char *temp = NULL, *cp = NULL;
    BOOL BreakFlag = FALSE;
    BOOL intern_flag = FALSE;

#ifdef USE_COLOR_STYLE
    BOOL skip_stack_requested = FALSE;
#endif
    EMIT_IFDEF_USE_JUSTIFY_ELTS(BOOL reached_awaited_stacked_elt = FALSE);

#ifdef USE_PRETTYSRC
    if (psrc_view && !sgml_in_psrc_was_initialized) {
	if (!psrc_nested_call) {
	    HTTag *tag = &HTML_dtd.tags[element_number];
	    char buf[200];
	    int tag_charset = 0;

	    psrc_nested_call = TRUE;
	    PSRCSTART(abracket);
	    PUTS("</");
	    PSRCSTOP(abracket);
	    PSRCSTART(tag);
	    if (tagname_transform != 0)
		PUTS(tag->name);
	    else {
		LYStrNCpy(buf, tag->name, sizeof(buf) - 1);
		LYLowerCase(buf);
		PUTS(buf);
	    }
	    PSRCSTOP(tag);
	    PSRCSTART(abracket);
	    PUTC('>');
	    PSRCSTOP(abracket);
	    psrc_nested_call = FALSE;
	    return HT_OK;
	}
	/*fall through */
    }
#endif

    if ((me->sp >= (me->stack + MAX_NESTING - 1) ||
	 element_number != me->sp[0].tag_number) &&
	HTML_dtd.tags[element_number].contents != SGML_EMPTY) {
	CTRACE((tfp,
		"HTML: end of element %s when expecting end of %s\n",
		HTML_dtd.tags[element_number].name,
		(me->sp == me->stack + MAX_NESTING - 1) ? "none" :
		(me->sp->tag_number < 0) ? "*invalid tag*" :
		(me->sp->tag_number >= HTML_ELEMENTS) ? "special tag" :
		HTML_dtd.tags[me->sp->tag_number].name));
#ifdef CAREFUL			/* parser assumed to produce good nesting */
	/* panic */
#endif /* CAREFUL */
    }

    /*
     * If we're seeking MAPs, skip everything that's not a MAP or AREA tag.  -
     * FM
     */
    if (LYMapsOnly) {
	if (!(element_number == HTML_MAP || element_number == HTML_AREA ||
	      element_number == HTML_OBJECT)) {
	    return HT_OK;
	}
    }

    /*
     * Pop state off stack if we didn't declare the element SGML_EMPTY in
     * HTMLDTD.c.  - FM & KW
     */
    if (HTML_dtd.tags[element_number].contents != SGML_EMPTY) {
#ifdef USE_COLOR_STYLE
	skip_stack_requested = (BOOL) (me->skip_stack > 0);
#endif
	if ((element_number != me->sp[0].tag_number) &&
	    me->skip_stack <= 0 &&
	    HTML_dtd.tags[HTML_LH].contents != SGML_EMPTY &&
	    (me->sp[0].tag_number == HTML_UL ||
	     me->sp[0].tag_number == HTML_OL ||
	     me->sp[0].tag_number == HTML_MENU ||
	     me->sp[0].tag_number == HTML_DIR ||
	     me->sp[0].tag_number == HTML_LI) &&
	    (element_number == HTML_H1 ||
	     element_number == HTML_H2 ||
	     element_number == HTML_H3 ||
	     element_number == HTML_H4 ||
	     element_number == HTML_H5 ||
	     element_number == HTML_H6)) {
	    /*
	     * Set the break flag if we're popping a dummy HTML_LH substituted
	     * for an HTML_H# encountered in a list.
	     */
	    BreakFlag = TRUE;
	}
	if (me->skip_stack == 0 && element_number == HTML_OBJECT &&
	    me->sp[0].tag_number == HTML_OBJECT_M &&
	    (me->sp < (me->stack + MAX_NESTING - 1)))
	    me->sp[0].tag_number = HTML_OBJECT;
	if (me->skip_stack > 0) {
	    CTRACE2(TRACE_STYLE,
		    (tfp,
		     "HTML:end_element: Internal call (level %d), leaving on stack - %s\n",
		     me->skip_stack, NONNULL(GetHTStyleName(me->sp->style))));
	    me->skip_stack--;
	} else if (element_number == HTML_OBJECT &&
		   me->sp[0].tag_number != HTML_OBJECT &&
		   me->sp[0].tag_number != HTML_OBJECT_M &&
		   me->objects_mixed_open > 0 &&
		   !(me->objects_figged_open > 0 &&
		     me->sp[0].tag_number == HTML_FIG)) {
	    /*
	     * Ignore non-corresponding OBJECT tags that we didn't push because
	     * the SGML parser was supposed to go on parsing the contents
	     * non-literally.  - kw
	     */
	    CTRACE2(TRACE_STYLE,
		    (tfp, "HTML:end_element[%d]: %s (level %d), %s - %s\n",
		     (int) STACKLEVEL(me),
		     "Special OBJECT handling", me->objects_mixed_open,
		     "leaving on stack",
		     NONNULL(GetHTStyleName(me->sp->style))));
	    me->objects_mixed_open--;
	} else if (me->stack_overrun == TRUE &&
		   element_number != me->sp[0].tag_number) {
	    /*
	     * Ignore non-corresponding tags if we had a stack overrun.  This
	     * is not a completely fail-safe strategy for protection against
	     * any seriously adverse consequences of a stack overrun, and the
	     * rendering of the document will not be as intended, but we expect
	     * overruns to be rare, and this should offer reasonable protection
	     * against crashes if an overrun does occur.  - FM
	     */
	    return HT_OK;	/* let's pretend... */
	} else if (element_number == HTML_SELECT &&
		   me->sp[0].tag_number != HTML_SELECT) {
	    /*
	     * Ignore non-corresponding SELECT tags, since we probably popped
	     * it and closed the SELECT block to deal with markup which amounts
	     * to a nested SELECT, or an out of order FORM end tag.  - FM
	     */
	    return HT_OK;
	} else if ((element_number != me->sp[0].tag_number) &&
		   HTML_dtd.tags[HTML_LH].contents == SGML_EMPTY &&
		   (me->sp[0].tag_number == HTML_UL ||
		    me->sp[0].tag_number == HTML_OL ||
		    me->sp[0].tag_number == HTML_MENU ||
		    me->sp[0].tag_number == HTML_DIR ||
		    me->sp[0].tag_number == HTML_LI) &&
		   (element_number == HTML_H1 ||
		    element_number == HTML_H2 ||
		    element_number == HTML_H3 ||
		    element_number == HTML_H4 ||
		    element_number == HTML_H5 ||
		    element_number == HTML_H6)) {
	    /*
	     * It's an H# for which we substituted an HTML_LH, which we've
	     * declared as SGML_EMPTY, so just return.  - FM
	     */
	    return HT_OK;
	} else if (me->sp < (me->stack + MAX_NESTING - 1)) {
#ifdef USE_JUSTIFY_ELTS
	    if (wait_for_this_stacked_elt == me->stack - me->sp + MAX_NESTING)
		reached_awaited_stacked_elt = TRUE;
#endif
	    if (element_number == HTML_OBJECT) {
		if (me->sp[0].tag_number == HTML_FIG &&
		    me->objects_figged_open > 0) {
		    /*
		     * It's an OBJECT for which we substituted a FIG, so pop
		     * the FIG and pretend that's what we are being called for. 
		     * - kw
		     */
		    CTRACE2(TRACE_STYLE,
			    (tfp,
			     "HTML:end_element[%d]: %s (level %d), %s - %s\n",
			     (int) STACKLEVEL(me),
			     "Special OBJECT->FIG handling",
			     me->objects_figged_open,
			     "treating as end FIG",
			     NONNULL(GetHTStyleName(me->sp->style))));
		    me->objects_figged_open--;
		    element_number = HTML_FIG;
		}
	    }
	    (me->sp)++;
	    CTRACE2(TRACE_STYLE,
		    (tfp,
		     "HTML:end_element[%d]: Popped style off stack - %s\n",
		     (int) STACKLEVEL(me),
		     NONNULL(GetHTStyleName(me->sp->style))));
	} else {
	    CTRACE2(TRACE_STYLE, (tfp,
				  "Stack underflow error!  Tried to pop off more styles than exist in stack\n"));
	}
    }
    if (BreakFlag == TRUE) {
#ifdef USE_JUSTIFY_ELTS
	if (reached_awaited_stacked_elt)
	    wait_for_this_stacked_elt = -1;
#endif
	return HT_OK;		/* let's pretend... */
    }

    /*
     * Check for unclosed TEXTAREA.  - FM
     */
    if (me->inTEXTAREA && element_number != HTML_TEXTAREA) {
	if (LYBadHTML(me)) {
	    LYShowBadHTML("Bad HTML: Missing TEXTAREA end tag\n");
	}
    }

    if (!me->text && !LYMapsOnly) {
	UPDATE_STYLE;
    }

    /*
     * Handle the end tag.  - FM
     */
    switch (element_number) {

    case HTML_HTML:
	if (me->inA || me->inSELECT || me->inTEXTAREA) {
	    if (LYBadHTML(me)) {
		char *msg = NULL;

		HTSprintf0(&msg,
			   "Bad HTML: %s%s%s%s%s not closed before HTML end tag *****\n",
			   me->inSELECT ? "SELECT" : "",
			   (me->inSELECT && me->inTEXTAREA) ? ", " : "",
			   me->inTEXTAREA ? "TEXTAREA" : "",
			   (((me->inSELECT || me->inTEXTAREA) && me->inA)
			    ? ", "
			    : ""),
			   me->inA ? "A" : "");
		LYShowBadHTML(msg);
		FREE(msg);
	    }
	}
	break;

    case HTML_HEAD:
	if (me->inBASE &&
	    (LYIsUIPage3(me->node_anchor->address, UIP_LIST_PAGE, 0) ||
	     LYIsUIPage3(me->node_anchor->address, UIP_ADDRLIST_PAGE, 0))) {
	    /* If we are parsing the List Page, and have a BASE after we are
	     * done with the HEAD element, propagate it back to the node_anchor
	     * object.  The base should have been inserted by showlist() to
	     * record what document the List Page is about, and other functions
	     * may later look for it in the anchor.  - kw
	     */
	    StrAllocCopy(me->node_anchor->content_base, me->base_href);
	}
	if (HText_hasToolbar(me->text))
	    HText_appendParagraph(me->text);
	break;

    case HTML_TITLE:
	HTChunkTerminate(&me->title);
	HTAnchor_setTitle(me->node_anchor, me->title.data);
	HTChunkClear(&me->title);
	/*
	 * Check if it's a bookmark file, and if so, and multiple bookmark
	 * support is on, or it's off but this isn't the default bookmark file
	 * (e.g., because it was on before, and this is another bookmark file
	 * that has been retrieved as a previous document), insert the current
	 * description string and filepath for it.  We pass the strings back to
	 * the SGML parser so that any 8 bit or multibyte/CJK characters will
	 * be handled by the parser's state and charset routines.  - FM
	 */
	if (non_empty(me->node_anchor->bookmark)) {
	    if ((LYMultiBookmarks != MBM_OFF) ||
		(non_empty(bookmark_page) &&
		 strcmp(me->node_anchor->bookmark, bookmark_page))) {
		if (!include)
		    include = &me->xinclude;
		for (i = 0; i <= MBM_V_MAXFILES; i++) {
		    if (MBM_A_subbookmark[i] &&
			!strcmp(MBM_A_subbookmark[i],
				me->node_anchor->bookmark)) {
			StrAllocCat(*include, "<H2><EM>");
			StrAllocCat(*include, gettext("Description:"));
			StrAllocCat(*include, "</EM> ");
			StrAllocCopy(temp,
				     ((MBM_A_subdescript[i] &&
				       *MBM_A_subdescript[i]) ?
				      MBM_A_subdescript[i] : gettext("(none)")));
			LYEntify(&temp, TRUE);
			StrAllocCat(*include, temp);
			StrAllocCat(*include, "<BR><EM>&nbsp;&nbsp;&nbsp;");
			StrAllocCat(*include, gettext("Filepath:"));
			StrAllocCat(*include, "</EM> ");
			StrAllocCopy(temp,
				     ((MBM_A_subbookmark[i] &&
				       *MBM_A_subbookmark[i])
				      ? MBM_A_subbookmark[i]
				      : gettext("(unknown)")));
			LYEntify(&temp, TRUE);
			StrAllocCat(*include, temp);
			FREE(temp);
			StrAllocCat(*include, "</H2>");
			break;
		    }
		}
	    }
	}
	break;

    case HTML_STYLE:
	/*
	 * We're getting it as Literal text, which, for now, we'll just ignore. 
	 * - FM
	 */
	HTChunkTerminate(&me->style_block);
	CTRACE2(TRACE_STYLE,
		(tfp, "HTML: STYLE content =\n%s\n",
		 me->style_block.data));
	HTChunkClear(&me->style_block);
	break;

    case HTML_SCRIPT:
	/*
	 * We're getting it as Literal text, which, for now, we'll just ignore. 
	 * - FM
	 */
	HTChunkTerminate(&me->script);
	CTRACE((tfp, "HTML: SCRIPT content =\n%s\n",
		me->script.data));
	HTChunkClear(&me->script);
	break;

    case HTML_BODY:
	if (me->inA || me->inSELECT || me->inTEXTAREA) {
	    if (LYBadHTML(me)) {
		char *msg = NULL;

		HTSprintf0(&msg,
			   "Bad HTML: %s%s%s%s%s not closed before BODY end tag *****\n",
			   me->inSELECT ? "SELECT" : "",
			   (me->inSELECT && me->inTEXTAREA) ? ", " : "",
			   me->inTEXTAREA ? "TEXTAREA" : "",
			   (((me->inSELECT || me->inTEXTAREA) && me->inA)
			    ? ", "
			    : ""),
			   me->inA ? "A" : "");
		LYShowBadHTML(msg);
		FREE(msg);
	    }
	}
	break;

    case HTML_FRAMESET:
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_NOFRAMES:
    case HTML_IFRAME:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_BANNER:
    case HTML_MARQUEE:
    case HTML_BLOCKQUOTE:
    case HTML_BQ:
    case HTML_ADDRESS:
	/*
	 * Set flag to know that style has ended.  Fall through.
	 i_prior_style = -1;
	 */
	change_paragraph_style(me, me->sp->style);
	UPDATE_STYLE;
	if (me->sp->tag_number == element_number)
	    LYEnsureDoubleSpace(me);
	if (me->List_Nesting_Level >= 0)
	    HText_NegateLineOne(me->text);
	break;

    case HTML_CENTER:
    case HTML_DIV:
	if (me->Division_Level >= 0)
	    me->Division_Level--;
	if (me->Division_Level >= 0) {
	    if (me->sp->style->alignment !=
		me->DivisionAlignments[me->Division_Level]) {
		if (me->inP)
		    LYEnsureSingleSpace(me);
		me->sp->style->alignment =
		    me->DivisionAlignments[me->Division_Level];
	    }
	}
	change_paragraph_style(me, me->sp->style);
	if (me->style_change) {
	    actually_set_style(me);
	    if (me->List_Nesting_Level >= 0)
		HText_NegateLineOne(me->text);
	} else if (me->inP)
	    LYEnsureSingleSpace(me);
	me->current_default_alignment = me->sp->style->alignment;
	break;

    case HTML_H1:		/* header styles */
    case HTML_H2:
    case HTML_H3:
    case HTML_H4:
    case HTML_H5:
    case HTML_H6:
	if (me->Division_Level >= 0) {
	    me->sp->style->alignment =
		me->DivisionAlignments[me->Division_Level];
	} else if (me->sp->style->id == ST_HeadingCenter ||
		   me->sp->style->id == ST_Heading1) {
	    me->sp->style->alignment = HT_CENTER;
	} else if (me->sp->style->id == ST_HeadingRight) {
	    me->sp->style->alignment = HT_RIGHT;
	} else {
	    me->sp->style->alignment = HT_LEFT;
	}
	change_paragraph_style(me, me->sp->style);
	UPDATE_STYLE;
	if (styles[element_number]->font & HT_BOLD) {
	    if (me->inBoldA == FALSE && me->inBoldH == TRUE) {
		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
	    }
	    me->inBoldH = FALSE;
	}
	if (me->List_Nesting_Level >= 0)
	    HText_NegateLineOne(me->text);
	if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    me->inUnderline = TRUE;
	}
	break;

    case HTML_P:
	LYHandlePlike(me,
		      (const BOOL *) 0, (const char **) 0,
		      include, 0,
		      FALSE);
	break;

    case HTML_FONT:
	me->inFONT = FALSE;
	break;

    case HTML_B:		/* Physical character highlighting */
    case HTML_BLINK:
    case HTML_I:
    case HTML_U:

    case HTML_CITE:		/* Logical character highlighting */
    case HTML_EM:
    case HTML_STRONG:
	/*
	 * Ignore any emphasis end tags if the Underline_Level is not set.  -
	 * FM
	 */
	if (me->Underline_Level <= 0)
	    break;

	/*
	 * Adjust the Underline level counter, and turn off underlining if
	 * appropriate.  - FM
	 */
	me->Underline_Level--;
	if (me->inUnderline && me->Underline_Level < 1) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    me->inUnderline = FALSE;
	    CTRACE((tfp, "Ending underline\n"));
	} else {
	    CTRACE((tfp, "Underline Level is %d\n", me->Underline_Level));
	}
	break;

    case HTML_ABBR:		/* Miscellaneous character containers */
    case HTML_ACRONYM:
    case HTML_AU:
    case HTML_AUTHOR:
    case HTML_BIG:
    case HTML_CODE:
    case HTML_DFN:
    case HTML_KBD:
    case HTML_SAMP:
    case HTML_SMALL:
    case HTML_SUP:
    case HTML_TT:
    case HTML_VAR:
	break;

    case HTML_SUB:
	HText_appendCharacter(me->text, ']');
	break;

    case HTML_DEL:
    case HTML_S:
    case HTML_STRIKE:
	HTML_put_character(me, ' ');
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, ":DEL]");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	me->in_word = NO;
	break;

    case HTML_INS:
	HTML_put_character(me, ' ');
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	HTML_put_string(me, ":INS]");
	if (me->inUnderline == FALSE)
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	HTML_put_character(me, ' ');
	me->in_word = NO;
	break;

    case HTML_Q:
	if (me->Quote_Level > 0)
	    me->Quote_Level--;
	/*
	 * Should check LANG and/or DIR attributes, and the
	 * me->node_anchor->charset and/or yet to be added structure elements,
	 * to determine whether we should use chevrons, but for now we'll
	 * always use double- or single-quotes.  - FM
	 */
	if (!(me->Quote_Level & 1))
	    HTML_put_character(me, '"');
	else
	    HTML_put_character(me, '\'');
	break;

    case HTML_PRE:		/* Formatted text */
	/*
	 * Set to know that we are no longer in a PRE block.
	 */
	HText_appendCharacter(me->text, '\n');
	me->inPRE = FALSE;
	/* FALLTHRU */
    case HTML_LISTING:		/* Literal text */
	/* FALLTHRU */
    case HTML_XMP:
	/* FALLTHRU */
    case HTML_PLAINTEXT:
	if (me->comment_start)
	    HText_appendText(me->text, me->comment_start);
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	if (me->List_Nesting_Level >= 0) {
	    UPDATE_STYLE;
	    HText_NegateLineOne(me->text);
	}
	break;

    case HTML_NOTE:
    case HTML_FN:
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	UPDATE_STYLE;
	if (me->sp->tag_number == element_number)
	    LYEnsureDoubleSpace(me);
	if (me->List_Nesting_Level >= 0)
	    HText_NegateLineOne(me->text);
	me->inLABEL = FALSE;
	break;

    case HTML_OL:
	me->OL_Counter[me->List_Nesting_Level < 11 ?
		       me->List_Nesting_Level : 11] = OL_VOID;
	/* FALLTHRU */
    case HTML_DL:
	/* FALLTHRU */
    case HTML_UL:
	/* FALLTHRU */
    case HTML_MENU:
	/* FALLTHRU */
    case HTML_DIR:
	me->List_Nesting_Level--;
	CTRACE((tfp, "HTML_end_element: Reducing List Nesting Level to %d\n",
		me->List_Nesting_Level));
#ifdef USE_JUSTIFY_ELTS
	if (element_number == HTML_DL)
	    in_DT = FALSE;	/*close the term that was without definition. */
#endif
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	UPDATE_STYLE;
	if (me->List_Nesting_Level >= 0)
	    LYEnsureSingleSpace(me);
	break;

    case HTML_SPAN:
	/*
	 * Should undo anything we did based on LANG and/or DIR attributes, and
	 * the me->node_anchor->charset and/or yet to be added structure
	 * elements.  - FM
	 */
	break;

    case HTML_BDO:
	/*
	 * Should undo anything we did based on DIR (and/or LANG) attributes,
	 * and the me->node_anchor->charset and/or yet to be added structure
	 * elements.  - FM
	 */
	break;

    case HTML_A:
	/*
	 * Ignore any spurious A end tags.  - FM
	 */
	if (me->inA == FALSE)
	    break;
	/*
	 * Set to know that we are no longer in an anchor.
	 */
	me->inA = FALSE;
#ifdef MARK_HIDDEN_LINKS
	if (non_empty(hidden_link_marker) &&
	    HText_isAnchorBlank(me->text, me->CurrentANum)) {
	    HText_appendText(me->text, hidden_link_marker);
	}
#endif
	UPDATE_STYLE;
	if (me->inBoldA == TRUE && me->inBoldH == FALSE)
	    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
	HText_endAnchor(me->text, me->CurrentANum);
	me->CurrentANum = 0;
	me->inBoldA = FALSE;
	if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    me->inUnderline = TRUE;
	}
	break;

    case HTML_MAP:
	FREE(me->map_address);
	break;

    case HTML_BODYTEXT:
	/*
	 * We may need to look at this someday to deal with OBJECTs optimally,
	 * but just ignore it for now.  - FM
	 */
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_TEXTFLOW:
	/*
	 * We may need to look at this someday to deal with APPLETs optimally,
	 * but just ignore it for now.  - FM
	 */
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_FIG:
	LYHandleFIG(me, NULL, NULL,
		    0,
		    0,
		    NULL,
		    NULL, NO, FALSE, &intern_flag);
	break;

    case HTML_OBJECT:
	/*
	 * Finish the data off.
	 */
	{
	    int s = 0, e = 0;
	    char *start = NULL, *first_end = NULL, *last_end = NULL;
	    char *first_map = NULL, *last_map = NULL;
	    BOOL have_param = FALSE;
	    char *data = NULL;

	    HTChunkTerminate(&me->object);
	    data = me->object.data;
	    while ((cp = strchr(data, '<')) != NULL) {
		/*
		 * Look for nested OBJECTs.  This procedure could get tripped
		 * up if invalid comments are present in the content, or if an
		 * OBJECT end tag is present in a quoted attribute.  - FM
		 */
		if (!StrNCmp(cp, "<!--", 4)) {
		    data = LYFindEndOfComment(cp);
		    cp = data;
		} else if (s == 0 && !strncasecomp(cp, "<PARAM", 6) &&
			   !IsNmChar(cp[6])) {
		    have_param = TRUE;
		} else if (!strncasecomp(cp, "<OBJECT", 7) &&
			   !IsNmChar(cp[7])) {
		    if (s == 0)
			start = cp;
		    s++;
		} else if (!strncasecomp(cp, "</OBJECT", 8) &&
			   !IsNmChar(cp[8])) {
		    if (e == 0)
			first_end = cp;
		    last_end = cp;
		    e++;
		} else if (!strncasecomp(cp, "<MAP", 4) &&
			   !IsNmChar(cp[4])) {
		    if (!first_map)
			first_map = cp;
		    last_map = cp;
		} else if (!strncasecomp(cp, "</MAP", 5) &&
			   !IsNmChar(cp[5])) {
		    last_map = cp;
		}
		data = ++cp;
	    }
	    if (s < e) {
		/*
		 * We had more end tags than start tags, so we have bad HTML or
		 * otherwise misparsed.  - FM
		 */
		if (LYBadHTML(me)) {
		    char *msg = NULL;

		    HTSprintf0(&msg,
			       "Bad HTML: Unmatched OBJECT start and end tags.  Discarding content:\n%s\n",
			       me->object.data);
		    LYShowBadHTML(msg);
		    FREE(msg);
		}
		goto End_Object;
	    }
	    if (s > e) {
		if (!me->object_declare && !me->object_name &&
		    !(me->object_shapes && !LYMapsOnly) &&
		    !(me->object_usemap != NULL && !LYMapsOnly) &&
		    !(clickable_images && !LYMapsOnly &&
		      me->object_data != NULL &&
		      !have_param &&
		      me->object_classid == NULL &&
		      me->object_codebase == NULL &&
		      me->object_codetype == NULL)) {
		    /*
		     * We have nested OBJECT tags, and not yet all of the end
		     * tags, but have a case where the content needs to be
		     * parsed again (not dropped) and where we don't want to
		     * output anything special at the point when we
		     * *do* have accumulated all the end tags.  So recycle
		     * the incomplete contents now, and signal the SGML parser
		     * that it should not regard the current OBJECT ended but
		     * should treat its contents as mixed.  Normally these
		     * cases would have already handled in the real
		     * start_element call, so this block may not be necessary. 
		     * - kw
		     */
		    CTRACE((tfp, "%s:\n%s\n",
			    "HTML: Nested OBJECT tags.  Recycling incomplete contents",
			    me->object.data));
		    status = HT_PARSER_OTHER_CONTENT;
		    me->object.size--;
		    HTChunkPuts(&me->object, "</OBJECT>");
		    if (!include)	/* error, should not happen */
			include = &me->xinclude;
		    StrnAllocCat(*include, me->object.data, me->object.size);
		    clear_objectdata(me);
		    /* an internal fake call to keep our stack happy: */
		    HTML_start_element(me, HTML_OBJECT, NULL, NULL,
				       me->tag_charset, include);
		    break;
		}
		/*
		 * We have nested OBJECT tags, and not yet all of the end tags,
		 * and we want the end tags.  So restore an end tag to the
		 * content, and signal to the SGML parser that it should resume
		 * the accumulation of OBJECT content (after calling back to
		 * start_element) in a way that is equivalent to passing it a
		 * dummy start tag.  - FM, kw
		 */
		CTRACE((tfp, "HTML: Nested OBJECT tags.  Recycling.\n"));
		status = HT_PARSER_REOPEN_ELT;
		me->object.size--;
		HTChunkPuts(&me->object, "</OBJECT>");
		if (!LYMapsOnly)
		    change_paragraph_style(me, me->sp->style);
		break;
	    }

	    /*
	     * OBJECT start and end tags are fully matched, assuming we weren't
	     * tripped up by comments or quoted attributes.  - FM
	     */
	    CTRACE((tfp, "HTML:OBJECT content:\n%s\n", me->object.data));

	    /*
	     * OBJECTs with DECLARE should be saved but not instantiated, and
	     * if nested, can have only other DECLAREd OBJECTs.  Until we have
	     * code to handle these, we'll just create an anchor for the ID, if
	     * present, and discard the content (sigh 8-).  - FM
	     */
	    if (me->object_declare == TRUE) {
		if (non_empty(me->object_id) && !LYMapsOnly)
		    LYHandleID(me, me->object_id);
		CTRACE((tfp, "HTML: DECLAREd OBJECT.  Ignoring!\n"));
		goto End_Object;
	    }

	    /*
	     * OBJECTs with NAME are for FORM submissions.  We'll just create
	     * an anchor for the ID, if present, and discard the content until
	     * we have code to handle these.  (sigh 8-).  - FM
	     */
	    if (me->object_name != NULL && !LYMapsOnly) {
		if (non_empty(me->object_id))
		    LYHandleID(me, me->object_id);
		CTRACE((tfp, "HTML: NAMEd OBJECT.  Ignoring!\n"));
		goto End_Object;
	    }

	    /*
	     * Deal with any nested OBJECTs by descending to the inner-most
	     * OBJECT.  - FM
	     */
	    if (s > 0) {
		if (start != NULL &&
		    first_end != NULL && first_end > start) {
		    /*
		     * Minumum requirements for the ad hoc parsing to have
		     * succeeded are met.  We'll hope that it did succeed.  -
		     * FM
		     */
		    if (LYMapsOnly) {
			/*
			 * Well we don't need to do this any more, nested
			 * objects should either not get here any more at all
			 * or can be handled fine by other code below.  Leave
			 * in place for now as a special case for LYMapsOnly. 
			 * - kw
			 */
			if (LYMapsOnly && (!last_map || last_map < first_end))
			    *first_end = '\0';
			else
			    e = 0;
			data = NULL;
			if (LYMapsOnly && (!first_map || first_map > start))
			    StrAllocCopy(data, start);
			else
			    StrAllocCopy(data, me->object.data);
			if (e > 0) {
			    for (i = e; i > 0; i--) {
				StrAllocCat(data, "</OBJECT>");
			    }
			}
			if (!include)	/* error, should not happen */
			    include = &me->xinclude;
			StrAllocCat(*include, data);
			CTRACE((tfp, "HTML: Recycling nested OBJECT%s.\n",
				(s > 1) ? "s" : ""));
			FREE(data);
			goto End_Object;
		    }
		} else {
		    if (LYBadHTML(me)) {
			LYShowBadHTML("Bad HTML: Unmatched OBJECT start and end tags.  Discarding content.\n");
		    }
		    goto End_Object;
		}
	    }

	    /*
	     * If its content has SHAPES, convert it to FIG.  - FM
	     *
	     * This is now handled in our start_element without using include
	     * if the SGML parser cooperates, so this block may be unnecessary. 
	     * - kw
	     */
	    if (me->object_shapes == TRUE && !LYMapsOnly) {
		CTRACE((tfp, "HTML: OBJECT has SHAPES.  Converting to FIG.\n"));
		if (!include)	/* error, should not happen */
		    include = &me->xinclude;
		StrAllocCat(*include, "<FIG ISOBJECT IMAGEMAP");
		if (me->object_ismap == TRUE)
		    StrAllocCat(*include, " IMAGEMAP");
		if (me->object_id != NULL) {
		    StrAllocCat(*include, " ID=\"");
		    StrAllocCat(*include, me->object_id);
		    StrAllocCat(*include, "\"");
		}
		if (me->object_data != NULL &&
		    me->object_classid == NULL) {
		    StrAllocCat(*include, " SRC=\"");
		    StrAllocCat(*include, me->object_data);
		    StrAllocCat(*include, "\"");
		}
		StrAllocCat(*include, ">");
		me->object.size--;
		HTChunkPuts(&me->object, "</FIG>");
		HTChunkTerminate(&me->object);
		StrAllocCat(*include, me->object.data);
		goto End_Object;
	    }

	    /*
	     * If it has a USEMAP attribute and didn't have SHAPES, convert it
	     * to IMG.  - FM
	     */
	    if (me->object_usemap != NULL && !LYMapsOnly) {
		CTRACE((tfp, "HTML: OBJECT has USEMAP.  Converting to IMG.\n"));

		if (!include)	/* error, should not happen */
		    include = &me->xinclude;
		StrAllocCat(*include, "<IMG ISOBJECT");
		if (me->object_id != NULL) {
		    /*
		     * Pass the ID.  - FM
		     */
		    StrAllocCat(*include, " ID=\"");
		    StrAllocCat(*include, me->object_id);
		    StrAllocCat(*include, "\"");
		}
		if (me->object_data != NULL &&
		    me->object_classid == NULL) {
		    /*
		     * We have DATA with no CLASSID, so let's hope it'
		     * equivalent to an SRC.  - FM
		     */
		    StrAllocCat(*include, " SRC=\"");
		    StrAllocCat(*include, me->object_data);
		    StrAllocCat(*include, "\"");
		}
		if (me->object_title != NULL) {
		    /*
		     * Use the TITLE for both the MAP and the IMGs ALT.  - FM
		     */
		    StrAllocCat(*include, " TITLE=\"");
		    StrAllocCat(*include, me->object_title);
		    StrAllocCat(*include, "\" ALT=\"");
		    StrAllocCat(*include, me->object_title);
		    StrAllocCat(*include, "\"");
		}
		/*
		 * Add the USEMAP, and an ISMAP if present.  - FM
		 */
		if (me->object_usemap != NULL) {
		    StrAllocCat(*include, " USEMAP=\"");
		    StrAllocCat(*include, me->object_usemap);
		    if (me->object_ismap == TRUE)
			StrAllocCat(*include, "\" ISMAP>");
		    else
			StrAllocCat(*include, "\">");
		} else {
		    StrAllocCat(*include, ">");
		}
		/*
		 * Add the content if it has <MAP, since that may be the MAP
		 * this usemap points to.  But if we have nested objects, try
		 * to eliminate portions that cannot contribute to the quest
		 * for MAP.  This is not perfect, we may get too much content;
		 * this seems preferable over losing too much.  - kw
		 */
		if (first_map) {
		    if (s == 0) {
			StrAllocCat(*include, me->object.data);
			CTRACE((tfp,
				"HTML: MAP found, recycling object contents.\n"));
			goto End_Object;
		    }
		    /* s > 0 and s == e */
		    data = NULL;
		    if (last_map < start) {
			*start = '\0';
			i = 0;
		    } else if (last_map < first_end) {
			*first_end = '\0';
			i = e;
		    } else if (last_map < last_end) {
			*last_end = '\0';
			i = 1;
		    } else {
			i = 0;
		    }
		    if (first_map > last_end) {
			/* fake empty object to keep stacks stack happy */
			StrAllocCopy(data, "<OBJECT><");
			StrAllocCat(data, last_end + 1);
			i = 0;
		    } else if (first_map > start) {
			StrAllocCopy(data, start);
		    } else {
			StrAllocCopy(data, me->object.data);
		    }
		    for (; i > 0; i--) {
			StrAllocCat(data, "</OBJECT>");
		    }
		    CTRACE((tfp, "%s:\n%s\n",
			    "HTML: MAP and nested OBJECT tags.  Recycling parts",
			    data));
		    StrAllocCat(*include, data);
		    FREE(data);
		}
		goto End_Object;
	    }

	    /*
	     * Add an ID link if needed.  - FM
	     */
	    if (non_empty(me->object_id) && !LYMapsOnly)
		LYHandleID(me, me->object_id);

	    /*
	     * Add the OBJECTs content if not empty.  - FM
	     */
	    if (me->object.size > 1) {
		if (!include)	/* error, should not happen */
		    include = &me->xinclude;
		StrAllocCat(*include, me->object.data);
	    }

	    /*
	     * Create a link to the DATA, if desired, and we can rule out that
	     * it involves scripting code.  This a risky thing to do, but we
	     * can toggle clickable_images mode off if it really screws things
	     * up, and so we may as well give it a try.  - FM
	     */
	    if (clickable_images) {
		if (!LYMapsOnly &&
		    me->object_data != NULL &&
		    !have_param &&
		    me->object_classid == NULL &&
		    me->object_codebase == NULL &&
		    me->object_codetype == NULL) {
		    /*
		     * We have a DATA value and no need for scripting code, so
		     * close the current Anchor, if one is open, and add an
		     * Anchor for this source.  If we also have a TYPE value,
		     * check whether it's an image or not, and set the link
		     * name accordingly.  - FM
		     */
		    if (!include)	/* error, should not happen */
			include = &me->xinclude;
		    if (me->inA)
			StrAllocCat(*include, "</A>");
		    StrAllocCat(*include, " -<A HREF=\"");
		    StrAllocCat(*include, me->object_data);
		    StrAllocCat(*include, "\">");
		    if ((me->object_type != NULL) &&
			!strncasecomp(me->object_type, "image/", 6)) {
			StrAllocCat(*include, "(IMAGE)");
		    } else {
			StrAllocCat(*include, "(OBJECT)");
		    }
		    StrAllocCat(*include, "</A> ");
		}
	    }
	}

	/*
	 * Re-intialize all of the OBJECT elements.  - FM
	 */
      End_Object:
	clear_objectdata(me);

	if (!LYMapsOnly)
	    change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_APPLET:
	if (me->inAPPLETwithP) {
	    LYEnsureDoubleSpace(me);
	} else {
	    HTML_put_character(me, ' ');	/* space char may be ignored */
	}
	LYResetParagraphAlignment(me);
	me->inAPPLETwithP = FALSE;
	me->inAPPLET = FALSE;
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_CAPTION:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	me->inCAPTION = FALSE;
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	me->inLABEL = FALSE;
	break;

    case HTML_CREDIT:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	me->inCREDIT = FALSE;
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	me->inLABEL = FALSE;
	break;

    case HTML_FORM:
	/*
	 * Check if we had a FORM start tag, and issue a message if not, but
	 * fall through to check for an open SELECT and ensure that the
	 * FORM-related globals in GridText.c are initialized.  - FM
	 */
	if (!me->inFORM) {
	    if (LYBadHTML(me)) {
		LYShowBadHTML("Bad HTML: Unmatched FORM end tag\n");
	    }
	}
	EMIT_IFDEF_USE_JUSTIFY_ELTS(form_in_htext = FALSE);

	/*
	 * Check if we still have a SELECT element open.  FORM may have been
	 * declared SGML_EMPTY in HTMLDTD.c, and in that case SGML_character()
	 * in SGML.c is not able to ensure correct nesting; or it may have
	 * failed to enforce valid nesting.  If a SELECT is open, issue a
	 * message, then call HTML_end_element() directly (with a check in that
	 * to bypass decrementing of the HTML parser's stack) to close the
	 * SELECT.  - kw
	 */
	if (me->inSELECT) {
	    if (LYBadHTML(me)) {
		LYShowBadHTML("Bad HTML: Open SELECT at FORM end. Faking SELECT end tag. *****\n");
	    }
	    if (me->sp->tag_number != HTML_SELECT) {
		SET_SKIP_STACK(HTML_SELECT);
	    }
	    HTML_end_element(me, HTML_SELECT, include);
	}

	/*
	 * Set to know that we are no longer in an form.
	 */
	me->inFORM = FALSE;

	HText_endForm(me->text);
	/*
	 * If we are in a list and are on the first line with no text following
	 * a bullet or number, don't force a newline.  This could happen if we
	 * were called from HTML_start_element() due to a missing FORM end tag. 
	 * - FM
	 */
	if (!(me->List_Nesting_Level >= 0 && !me->inP))
	    LYEnsureSingleSpace(me);
	break;

    case HTML_FIELDSET:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_LEGEND:
	LYEnsureDoubleSpace(me);
	LYResetParagraphAlignment(me);
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    case HTML_LABEL:
	break;

    case HTML_BUTTON:
	break;

    case HTML_TEXTAREA:
	{
	    InputFieldData I;
	    int chars;
	    char *data;

	    /*
	     * Make sure we had a textarea start tag.
	     */
	    if (!me->inTEXTAREA) {
		if (LYBadHTML(me)) {
		    LYShowBadHTML("Bad HTML: Unmatched TEXTAREA end tag\n");
		}
		break;
	    }

	    /*
	     * Set to know that we are no longer in a textarea tag.
	     */
	    me->inTEXTAREA = FALSE;

	    /*
	     * Initialize.
	     */
	    memset(&I, 0, sizeof(I));
	    I.value_cs = current_char_set;

	    UPDATE_STYLE;
	    /*
	     * Before any input field add a space if necessary.
	     */
	    HTML_put_character(me, ' ');
	    me->in_word = NO;
	    /*
	     * Add a return.
	     */
	    HText_appendCharacter(me->text, '\r');

	    /*
	     * Finish the data off.
	     */
	    HTChunkTerminate(&me->textarea);
	    FREE(temp);

	    I.type = "textarea";
	    I.size = me->textarea_cols;
	    I.name = me->textarea_name;
	    I.name_cs = me->textarea_name_cs;
	    I.accept_cs = me->textarea_accept_cs;
	    me->textarea_accept_cs = NULL;
	    I.disabled = me->textarea_disabled;
	    I.readonly = me->textarea_readonly;
	    I.id = me->textarea_id;

	    /*
	     * Transform the TEXTAREA content as needed, then parse it into
	     * individual lines to be handled as a series series of INPUT
	     * fields (ugh!).  Any raw 8-bit or multibyte characters already
	     * have been handled in relation to the display character set in
	     * SGML_character().
	     *
	     * If TEXTAREA is handled as SGML_LITTERAL (the old way), we need
	     * to SGML-unescape any character references and NCRs here. 
	     * Otherwise this will already have happened in the SGML.c parsing. 
	     * - kw
	     */
	    me->UsePlainSpace = TRUE;

	    if (HTML_dtd.tags[element_number].contents == SGML_LITTERAL) {
		TRANSLATE_AND_UNESCAPE_ENTITIES6(&me->textarea.data,
						 me->UCLYhndl,
						 current_char_set,
						 NO,
						 me->UsePlainSpace, me->HiddenValue);
	    } else {
		/*
		 * This shouldn't have anything to do, normally, but just in
		 * case...  There shouldn't be lynx special character codes in
		 * the chunk ("DTD" flag Tgf_nolyspcl tells SGML.c not to
		 * generate them).  If there were, we could set the last
		 * parameter ('Back') below to YES, which would take them out
		 * of the data.  The data may however contain non break space,
		 * soft hyphen, or en space etc., in the me->UCLYhndl character
		 * encoding.  If that's a problem, perhaps for the (line or
		 * other) editor, setting 'Back' to YES should also help to
		 * always convert them to plain spaces (or drop them).  - kw
		 */
		TRANSLATE_HTML7(&me->textarea.data,
				me->UCLYhndl,
				current_char_set,
				NO,
				me->UsePlainSpace, me->HiddenValue,
				NO);
	    }
	    data = me->textarea.data;

	    /*
	     * Trim any trailing newlines and skip any lead newlines.  - FM
	     */
	    if (*data != '\0') {
		cp = (data + strlen(data)) - 1;
		while (cp >= data && *cp == '\n') {
		    *cp-- = '\0';
		}
		while (*data == '\n') {
		    data++;
		}
	    }
	    /*
	     * Load the first text line, or set up for all blank rows.  - FM
	     */
	    if ((cp = strchr(data, '\n')) != NULL) {
		*cp = '\0';
		StrAllocCopy(temp, data);
		*cp = '\n';
		data = (cp + 1);
	    } else {
		if (*data != '\0') {
		    StrAllocCopy(temp, data);
		} else {
		    FREE(temp);
		}
		data = empty;
	    }
	    /*
	     * Display at least the requested number of text lines and/or blank
	     * rows.  - FM
	     */
	    for (i = 0; i < me->textarea_rows; i++) {
		int j;

		for (j = 0; temp && temp[j]; j++) {
		    if (temp[j] == '\r')
			temp[j] = (char) (temp[j + 1] ? ' ' : '\0');
		}
		I.value = temp;
		chars = HText_beginInput(me->text, me->inUnderline, &I);
		for (; chars > 0; chars--)
		    HTML_put_character(me, '_');
		HText_appendCharacter(me->text, '\r');
		if (*data != '\0') {
		    if (*data == '\n') {
			FREE(temp);
			data++;
		    } else if ((cp = strchr(data, '\n')) != NULL) {
			*cp = '\0';
			StrAllocCopy(temp, data);
			*cp = '\n';
			data = (cp + 1);
		    } else {
			StrAllocCopy(temp, data);
			data = empty;
		    }
		} else {
		    FREE(temp);
		}
	    }
	    /*
	     * Check for more data lines than the rows attribute.  We add them
	     * to the display, because we support only horizontal and not also
	     * vertical scrolling.  - FM
	     */
	    while (*data != '\0' || temp != NULL) {
		int j;

		for (j = 0; temp && temp[j]; j++) {
		    if (temp[j] == '\r')
			temp[j] = (char) (temp[j + 1] ? ' ' : '\0');
		}
		I.value = temp;
		(void) HText_beginInput(me->text, me->inUnderline, &I);
		for (chars = me->textarea_cols; chars > 0; chars--)
		    HTML_put_character(me, '_');
		HText_appendCharacter(me->text, '\r');
		if (*data == '\n') {
		    FREE(temp);
		    data++;
		} else if ((cp = strchr(data, '\n')) != NULL) {
		    *cp = '\0';
		    StrAllocCopy(temp, data);
		    *cp = '\n';
		    data = (cp + 1);
		} else if (*data != '\0') {
		    StrAllocCopy(temp, data);
		    data = empty;
		} else {
		    FREE(temp);
		}
	    }
	    FREE(temp);
	    cp = NULL;
	    me->UsePlainSpace = FALSE;

	    HTChunkClear(&me->textarea);
	    FREE(me->textarea_name);
	    me->textarea_name_cs = -1;
	    FREE(me->textarea_id);
	    break;
	}

    case HTML_SELECT:
	{
	    char *ptr = NULL;

	    /*
	     * Make sure we had a select start tag.
	     */
	    if (!me->inSELECT) {
		if (LYBadHTML(me)) {
		    LYShowBadHTML("Bad HTML: Unmatched SELECT end tag *****\n");
		}
		break;
	    }

	    /*
	     * Set to know that we are no longer in a select tag.
	     */
	    me->inSELECT = FALSE;

	    /*
	     * Clear the disable attribute.
	     */
	    me->select_disabled = FALSE;

	    /*
	     * Make sure we're in a form.
	     */
	    if (!me->inFORM) {
		if (LYBadHTML(me)) {
		    LYShowBadHTML("Bad HTML: SELECT end tag not within FORM element *****\n");
		}
		/*
		 * Hopefully won't crash, so we'll ignore it.  - kw
		 */
	    }

	    /*
	     * Finish the data off.
	     */
	    HTChunkTerminate(&me->option);
	    /*
	     * Finish the previous option.
	     */
	    if (!me->first_option)
		ptr = HText_setLastOptionValue(me->text,
					       me->option.data,
					       me->LastOptionValue,
					       LAST_ORDER,
					       me->LastOptionChecked,
					       me->UCLYhndl,
					       ATTR_CS_IN);
	    FREE(me->LastOptionValue);

	    me->LastOptionChecked = FALSE;

	    if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||
		LYSelectPopups == FALSE) {
		/*
		 * Start a newline after the last checkbox/button option.
		 */
		LYEnsureSingleSpace(me);
	    } else {
		/*
		 * Output popup box with the default option to screen, but use
		 * non-breaking spaces for output.
		 */
		if (ptr &&
		    (me->sp[0].tag_number == HTML_PRE || me->inPRE == TRUE ||
		     !me->sp->style->freeFormat) &&
		    strlen(ptr) > 6) {
		    /*
		     * The code inadequately handles OPTION fields in PRE tags. 
		     * We'll put up a minimum of 6 characters, and if any more
		     * would exceed the wrap column, we'll ignore them.
		     */
		    for (i = 0; i < 6; i++) {
			if (*ptr == ' ')
			    HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
			else
			    HText_appendCharacter(me->text, *ptr);
			ptr++;
		    }
		}
		for (; non_empty(ptr); ptr++) {
		    if (*ptr == ' ')
			HText_appendCharacter(me->text, HT_NON_BREAK_SPACE);
		    else {
			HTkcode kcode = NOKANJI;
			HTkcode specified_kcode = NOKANJI;

			if (HTCJK == JAPANESE) {
			    kcode = HText_getKcode(me->text);
			    HText_updateKcode(me->text, kanji_code);
			    specified_kcode = HText_getSpecifiedKcode(me->text);
			    HText_updateSpecifiedKcode(me->text, kanji_code);
			}
			HText_appendCharacter(me->text, *ptr);
			if (HTCJK == JAPANESE) {
			    HText_updateKcode(me->text, kcode);
			    HText_updateSpecifiedKcode(me->text, specified_kcode);
			}
		    }
		}
		/*
		 * Add end option character.
		 */
		if (!me->first_option) {
		    HText_appendCharacter(me->text, ']');
		    HText_endInput(me->text);
		    HText_setLastChar(me->text, ']');
		    me->in_word = YES;
		}
	    }
	    HTChunkClear(&me->option);

	    if (me->Underline_Level > 0 && me->inUnderline == FALSE) {
		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
		me->inUnderline = TRUE;
	    }
	    if (me->needBoldH == TRUE && me->inBoldH == FALSE) {
		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);
		me->inBoldH = TRUE;
		me->needBoldH = FALSE;
	    }
	}
	break;

    case HTML_TABLE:
#ifdef EXP_NESTED_TABLES
	if (!nested_tables)
#endif
	    me->inTABLE = FALSE;

	if (me->sp->style->id == ST_Preformatted) {
	    break;
	}
	if (me->Division_Level >= 0)
	    me->Division_Level--;
	if (me->Division_Level >= 0)
	    me->sp->style->alignment =
		me->DivisionAlignments[me->Division_Level];
	change_paragraph_style(me, me->sp->style);
	UPDATE_STYLE;

#ifdef EXP_NESTED_TABLES
	if (nested_tables) {
	    me->inTABLE = HText_endStblTABLE(me->text);
	} else {
	    HText_endStblTABLE(me->text);
	}
#else
	HText_endStblTABLE(me->text);
#endif

	me->current_default_alignment = me->sp->style->alignment;
	if (me->List_Nesting_Level >= 0)
	    HText_NegateLineOne(me->text);
	break;

/* These TABLE related elements may now not be SGML_EMPTY. - kw */
    case HTML_TR:
	HText_endStblTR(me->text);
	if (!HText_LastLineEmpty(me->text, FALSE)) {
	    HText_setLastChar(me->text, ' ');	/* absorb next white space */
	    HText_appendCharacter(me->text, '\r');
	}
	me->in_word = NO;
	break;

    case HTML_THEAD:
    case HTML_TFOOT:
    case HTML_TBODY:
	break;

    case HTML_COLGROUP:
	if (me->inTABLE)
	    HText_endStblCOLGROUP(me->text);
	break;

    case HTML_TH:
    case HTML_TD:
	HText_endStblTD(me->text);
	break;

/* More stuff that may now not be SGML_EMPTY any more: */
    case HTML_DT:
    case HTML_DD:
    case HTML_LH:
    case HTML_LI:
    case HTML_OVERLAY:
	break;

    case HTML_MATH:
	/*
	 * We're getting it as Literal text, which, until we can process it,
	 * we'll display as is, within brackets to alert the user.  - FM
	 */
	HTChunkPutc(&me->math, ' ');
	HTChunkTerminate(&me->math);
	if (me->math.size > 2) {
	    LYEnsureSingleSpace(me);
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    HTML_put_string(me, "[MATH:");
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    HTML_put_character(me, ' ');
	    HTML_put_string(me, me->math.data);
	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);
	    HTML_put_string(me, ":MATH]");
	    if (me->inUnderline == FALSE)
		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    LYEnsureSingleSpace(me);
	}
	HTChunkClear(&me->math);
	break;

    default:
	change_paragraph_style(me, me->sp->style);	/* Often won't really change */
	break;

    }				/* switch */

#ifdef USE_JUSTIFY_ELTS
    if (reached_awaited_stacked_elt)
	wait_for_this_stacked_elt = -1;
#endif

    if (me->xinclude) {
	HText_appendText(me->text, " *** LYNX ERROR ***\rUnparsed data:\r");
	HText_appendText(me->text, me->xinclude);
	FREE(me->xinclude);
    }
#ifdef USE_COLOR_STYLE
    if (!skip_stack_requested) {	/*don't emit stylechanges if skipped stack element - VH */
# if !OMIT_SCN_KEEPING
	FastTrimColorClass(HTML_dtd.tags[element_number].name,
			   HTML_dtd.tags[element_number].name_len,
			   Style_className,
			   &Style_className_end, &hcode);
#  endif

	if (!ReallyEmptyTagNum(element_number)) {
	    CTRACE2(TRACE_STYLE,
		    (tfp,
		     "STYLE.end_element: ending non-\"EMPTY\" style <%s...>\n",
		     HTML_dtd.tags[element_number].name));
	    HText_characterStyle(me->text, HCODE_TO_STACK_OFF(hcode), STACK_OFF);
	}
    }
#endif /* USE_COLOR_STYLE */
    return status;
}

/*		Expanding entities
 *		------------------
 */
/*	(In fact, they all shrink!)
*/
int HTML_put_entity(HTStructured * me, int entity_number)
{
    int nent = (int) HTML_dtd.number_of_entities;

    if (entity_number < nent) {
	HTML_put_string(me, p_entity_values[entity_number]);
	return HT_OK;
    }
    return HT_CANNOT_TRANSLATE;
}

/*	Free an HTML object
 *	-------------------
 *
 *	If the document is empty, the text object will not yet exist.
 *	So we could in fact abandon creating the document and return
 *	an error code.	In fact an empty document is an important type
 *	of document, so we don't.
 *
 *	If non-interactive, everything is freed off.   No: crashes -listrefs
 *	Otherwise, the interactive object is left.
 */
static void HTML_free(HTStructured * me)
{
    char *include = NULL;

    if (LYMapsOnly && !me->text) {
	/*
	 * We only handled MAP, AREA and BASE tags, and didn't create an HText
	 * structure for the document nor want one now, so just make sure we
	 * free anything that might have been allocated.  - FM
	 */
	FREE(me->base_href);
	FREE(me->map_address);
	clear_objectdata(me);
	FREE(me->xinclude);
	FREE(me);
	return;
    }

    UPDATE_STYLE;		/* Creates empty document here! */
    if (me->comment_end)
	HTML_put_string(me, me->comment_end);
    if (me->text) {
	/*
	 * Emphasis containers, A, FONT, and FORM may be declared SGML_EMPTY in
	 * HTMLDTD.c, and SGML_character() in SGML.c may check for their end
	 * tags to call HTML_end_element() directly (with a check in that to
	 * bypass decrementing of the HTML parser's stack).  So if we still
	 * have the emphasis (Underline) on, or any open A, FONT, or FORM
	 * containers, turn it off or close them now.  - FM & kw
	 *
	 * IF those tags are not declared SGML_EMPTY, but we let the SGML.c
	 * parser take care of correctly stacked ordering, and of correct
	 * wind-down on end-of-stream (in SGML_free SGML_abort), THEN these and
	 * other checks here in HTML.c should not be necessary.  Still it can't
	 * hurt to include them.  - kw
	 */
	if (me->inUnderline) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    me->inUnderline = FALSE;
	    me->Underline_Level = 0;
	    CTRACE((tfp, "HTML_free: Ending underline\n"));
	}
	if (me->inA) {
	    HTML_end_element(me, HTML_A, &include);
	    me->inA = FALSE;
	    CTRACE((tfp, "HTML_free: Ending HTML_A\n"));
	}
	if (me->inFONT) {
	    HTML_end_element(me, HTML_FONT, &include);
	    me->inFONT = FALSE;
	}
	if (me->inFORM) {
	    HTML_end_element(me, HTML_FORM, &include);
	    me->inFORM = FALSE;
	}
	if (me->option.size > 0) {
	    /*
	     * If we still have data in the me->option chunk after forcing a
	     * close of a still-open form, something must have gone very wrong. 
	     * - kw
	     */
	    if (LYBadHTML(me)) {
		LYShowBadHTML("Bad HTML: SELECT or OPTION not ended properly *****\n");
	    }
	    HTChunkTerminate(&me->option);
	    /*
	     * Output the left-over data as text, maybe it was invalid markup
	     * meant to be shown somewhere.  - kw
	     */
	    CTRACE((tfp, "HTML_free: ***** leftover option data: %s\n",
		    me->option.data));
	    HTML_put_string(me, me->option.data);
	    HTChunkClear(&me->option);
	}
	if (me->textarea.size > 0) {
	    /*
	     * If we still have data in the me->textarea chunk after forcing a
	     * close of a still-open form, something must have gone very wrong. 
	     * - kw
	     */
	    if (LYBadHTML(me)) {
		LYShowBadHTML("Bad HTML: TEXTAREA not used properly *****\n");
	    }
	    HTChunkTerminate(&me->textarea);
	    /*
	     * Output the left-over data as text, maybe it was invalid markup
	     * meant to be shown somewhere.  - kw
	     */
	    CTRACE((tfp, "HTML_free: ***** leftover textarea data: %s\n",
		    me->textarea.data));
	    HTML_put_string(me, me->textarea.data);
	    HTChunkClear(&me->textarea);
	}
	/*
	 * If we're interactive and have hidden links but no visible links, add
	 * a message informing the user about this and suggesting use of the
	 * 'l'ist command.  - FM
	 */
	if (!dump_output_immediately &&
	    HText_sourceAnchors(me->text) < 1 &&
	    HText_HiddenLinkCount(me->text) > 0) {
	    HTML_start_element(me, HTML_P, 0, 0, -1, &include);
	    HTML_put_character(me, '[');
	    HTML_start_element(me, HTML_EM, 0, 0, -1, &include);
	    HTML_put_string(me,
			    gettext("Document has only hidden links.  Use the 'l'ist command."));
	    HTML_end_element(me, HTML_EM, &include);
	    HTML_put_character(me, ']');
	    HTML_end_element(me, HTML_P, &include);
	}
	if (me->xinclude) {
	    HText_appendText(me->text, " *** LYNX ERROR ***\rUnparsed data:\r");
	    HText_appendText(me->text, me->xinclude);
	    FREE(me->xinclude);
	}

	/*
	 * Now call the cleanup function.  - FM
	 */
	HText_endAppend(me->text);
    }
    if (me->option.size > 0) {
	/*
	 * If we still have data in the me->option chunk after forcing a close
	 * of a still-open form, something must have gone very wrong.  - kw
	 */
	if (LYBadHTML(me)) {
	    LYShowBadHTML("Bad HTML: SELECT or OPTION not ended properly *****\n");
	}
	if (TRACE) {
	    HTChunkTerminate(&me->option);
	    CTRACE((tfp, "HTML_free: ***** leftover option data: %s\n",
		    me->option.data));
	}
	HTChunkClear(&me->option);
    }
    if (me->textarea.size > 0) {
	/*
	 * If we still have data in the me->textarea chunk after forcing a
	 * close of a still-open form, something must have gone very wrong.  -
	 * kw
	 */
	if (LYBadHTML(me)) {
	    LYShowBadHTML("Bad HTML: TEXTAREA not used properly *****\n");
	}
	if (TRACE) {
	    HTChunkTerminate(&me->textarea);
	    CTRACE((tfp, "HTML_free: ***** leftover textarea data: %s\n",
		    me->textarea.data));
	}
	HTChunkClear(&me->textarea);
    }

    if (me->target) {
	(*me->targetClass._free) (me->target);
    }
    if (me->sp && me->sp->style && GetHTStyleName(me->sp->style)) {
	if (me->sp->style->id == ST_DivCenter ||
	    me->sp->style->id == ST_HeadingCenter ||
	    me->sp->style->id == ST_Heading1) {
	    me->sp->style->alignment = HT_CENTER;
	} else if (me->sp->style->id == ST_DivRight ||
		   me->sp->style->id == ST_HeadingRight) {
	    me->sp->style->alignment = HT_RIGHT;
	} else {
	    me->sp->style->alignment = HT_LEFT;
	}
	styles[HTML_PRE]->alignment = HT_LEFT;
    }
    FREE(me->base_href);
    FREE(me->map_address);
    FREE(me->LastOptionValue);
    clear_objectdata(me);
    FREE(me);
}

static void HTML_abort(HTStructured * me, HTError e)
{
    char *include = NULL;

    if (me->text) {
	/*
	 * If we have emphasis on, or open A, FONT, or FORM containers, turn it
	 * off or close them now.  - FM
	 */
	if (me->inUnderline) {
	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);
	    me->inUnderline = FALSE;
	    me->Underline_Level = 0;
	}
	if (me->inA) {
	    HTML_end_element(me, HTML_A, &include);
	    me->inA = FALSE;
	}
	if (me->inFONT) {
	    HTML_end_element(me, HTML_FONT, &include);
	    me->inFONT = FALSE;
	}
	if (me->inFORM) {
	    HTML_end_element(me, HTML_FORM, &include);
	    me->inFORM = FALSE;
	}

	/*
	 * Now call the cleanup function.  - FM
	 */
	HText_endAppend(me->text);
    }

    if (me->option.size > 0) {
	/*
	 * If we still have data in the me->option chunk after forcing a close
	 * of a still-open form, something must have gone very wrong.  - kw
	 */
	if (TRACE) {
	    CTRACE((tfp,
		    "HTML_abort: SELECT or OPTION not ended properly *****\n"));
	    HTChunkTerminate(&me->option);
	    CTRACE((tfp, "HTML_abort: ***** leftover option data: %s\n",
		    me->option.data));
	}
	HTChunkClear(&me->option);
    }
    if (me->textarea.size > 0) {
	/*
	 * If we still have data in the me->textarea chunk after forcing a
	 * close of a still-open form, something must have gone very wrong.  -
	 * kw
	 */
	if (TRACE) {
	    CTRACE((tfp, "HTML_abort: TEXTAREA not used properly *****\n"));
	    HTChunkTerminate(&me->textarea);
	    CTRACE((tfp, "HTML_abort: ***** leftover textarea data: %s\n",
		    me->textarea.data));
	}
	HTChunkClear(&me->textarea);
    }

    if (me->target) {
	(*me->targetClass._abort) (me->target, e);
    }
    if (me->sp && me->sp->style && GetHTStyleName(me->sp->style)) {
	if (me->sp->style->id == ST_DivCenter ||
	    me->sp->style->id == ST_HeadingCenter ||
	    me->sp->style->id == ST_Heading1) {
	    me->sp->style->alignment = HT_CENTER;
	} else if (me->sp->style->id == ST_DivRight ||
		   me->sp->style->id == ST_HeadingRight) {
	    me->sp->style->alignment = HT_RIGHT;
	} else {
	    me->sp->style->alignment = HT_LEFT;
	}
	styles[HTML_PRE]->alignment = HT_LEFT;
    }
    FREE(me->base_href);
    FREE(me->map_address);
    FREE(me->textarea_name);
    FREE(me->textarea_accept_cs);
    FREE(me->textarea_id);
    FREE(me->LastOptionValue);
    FREE(me->xinclude);
    clear_objectdata(me);
    FREE(me);
}

/*	Get Styles from style sheet
 *	---------------------------
 */
static void get_styles(void)
{
    HTStyle **st = NULL;

    styleSheet = DefaultStyle(&st);	/* sets st[] array */

    default_style = st[ST_Normal];

    styles[HTML_H1] = st[ST_Heading1];
    styles[HTML_H2] = st[ST_Heading2];
    styles[HTML_H3] = st[ST_Heading3];
    styles[HTML_H4] = st[ST_Heading4];
    styles[HTML_H5] = st[ST_Heading5];
    styles[HTML_H6] = st[ST_Heading6];
    styles[HTML_HCENTER] = st[ST_HeadingCenter];
    styles[HTML_HLEFT] = st[ST_HeadingLeft];
    styles[HTML_HRIGHT] = st[ST_HeadingRight];

    styles[HTML_DCENTER] = st[ST_DivCenter];
    styles[HTML_DLEFT] = st[ST_DivLeft];
    styles[HTML_DRIGHT] = st[ST_DivRight];

    styles[HTML_DL] = st[ST_Glossary];
    /* nested list styles */
    styles[HTML_DL1] = st[ST_Glossary1];
    styles[HTML_DL2] = st[ST_Glossary2];
    styles[HTML_DL3] = st[ST_Glossary3];
    styles[HTML_DL4] = st[ST_Glossary4];
    styles[HTML_DL5] = st[ST_Glossary5];
    styles[HTML_DL6] = st[ST_Glossary6];

    styles[HTML_UL] =
	styles[HTML_OL] = st[ST_List];
    /* nested list styles */
    styles[HTML_OL1] = st[ST_List1];
    styles[HTML_OL2] = st[ST_List2];
    styles[HTML_OL3] = st[ST_List3];
    styles[HTML_OL4] = st[ST_List4];
    styles[HTML_OL5] = st[ST_List5];
    styles[HTML_OL6] = st[ST_List6];

    styles[HTML_MENU] =
	styles[HTML_DIR] = st[ST_Menu];
    /* nested list styles */
    styles[HTML_MENU1] = st[ST_Menu1];
    styles[HTML_MENU2] = st[ST_Menu2];
    styles[HTML_MENU3] = st[ST_Menu3];
    styles[HTML_MENU4] = st[ST_Menu4];
    styles[HTML_MENU5] = st[ST_Menu5];
    styles[HTML_MENU6] = st[ST_Menu6];

    styles[HTML_DLC] = st[ST_GlossaryCompact];
    /* nested list styles */
    styles[HTML_DLC1] = st[ST_GlossaryCompact1];
    styles[HTML_DLC2] = st[ST_GlossaryCompact2];
    styles[HTML_DLC3] = st[ST_GlossaryCompact3];
    styles[HTML_DLC4] = st[ST_GlossaryCompact4];
    styles[HTML_DLC5] = st[ST_GlossaryCompact5];
    styles[HTML_DLC6] = st[ST_GlossaryCompact6];

    styles[HTML_ADDRESS] = st[ST_Address];
    styles[HTML_BANNER] = st[ST_Banner];
    styles[HTML_BLOCKQUOTE] = st[ST_Blockquote];
    styles[HTML_BQ] = st[ST_Bq];
    styles[HTML_FN] = st[ST_Footnote];
    styles[HTML_NOTE] = st[ST_Note];
    styles[HTML_PLAINTEXT] =
	styles[HTML_XMP] = st[ST_Example];
    styles[HTML_PRE] = st[ST_Preformatted];
    styles[HTML_LISTING] = st[ST_Listing];
}

/*
 * If we're called from another module, make sure we've initialized styles
 * array first.
 */
HTStyle *LYstyles(int style_number)
{
    if (styles[style_number] == 0)
	get_styles();
    return styles[style_number];
}

/*				P U B L I C
*/

/*	Structured Object Class
 *	-----------------------
 */
const HTStructuredClass HTMLPresentation =	/* As opposed to print etc */
{
    "Lynx_HTML_Handler",
    HTML_free,
    HTML_abort,
    HTML_put_character, HTML_put_string, HTML_write,
    HTML_start_element, HTML_end_element,
    HTML_put_entity
};

/*		New Structured Text object
 *		--------------------------
 *
 *	The structured stream can generate either presentation,
 *	or plain text, or HTML.
 */
HTStructured *HTML_new(HTParentAnchor *anchor,
		       HTFormat format_out,
		       HTStream *stream)
{

    HTStructured *me;

    CTRACE((tfp, "start HTML_new\n"));

    if (format_out != WWW_PLAINTEXT && format_out != WWW_PRESENT) {
	HTStream *intermediate = HTStreamStack(WWW_HTML, format_out,
					       stream, anchor);

	if (intermediate)
	    return HTMLGenerator(intermediate);
	fprintf(stderr, "\n** Internal error: can't parse HTML to %s\n",
		HTAtom_name(format_out));
	exit_immediately(EXIT_FAILURE);
    }

    me = typecalloc(HTStructured);
    if (me == NULL)
	outofmem(__FILE__, "HTML_new");
    assert(me != NULL);

    /*
     * This used to call 'get_styles()' only on the first time through this
     * function.  However, if the user reloads a page with ^R, the styles[]
     * array is not necessarily the same as it was from 'get_styles()'.  So
     * we reinitialize the whole thing.
     */
    get_styles();

    me->isa = &HTMLPresentation;
    me->node_anchor = anchor;

    me->CurrentA = NULL;
    me->CurrentANum = 0;
    me->base_href = NULL;
    me->map_address = NULL;

    HTChunkInit(&me->title, 128);

    HTChunkInit(&me->object, 128);
    me->object_started = FALSE;
    me->object_declare = FALSE;
    me->object_shapes = FALSE;
    me->object_ismap = FALSE;
    me->object_id = NULL;
    me->object_title = NULL;
    me->object_data = NULL;
    me->object_type = NULL;
    me->object_classid = NULL;
    me->object_codebase = NULL;
    me->object_codetype = NULL;
    me->object_usemap = NULL;
    me->object_name = NULL;

    HTChunkInit(&me->option, 128);
    me->first_option = TRUE;
    me->LastOptionValue = NULL;
    me->LastOptionChecked = FALSE;
    me->select_disabled = FALSE;

    HTChunkInit(&me->textarea, 128);
    me->textarea_name = NULL;
    me->textarea_name_cs = -1;
    me->textarea_accept_cs = NULL;
    me->textarea_cols = 0;
    me->textarea_rows = 4;
    me->textarea_id = NULL;

    HTChunkInit(&me->math, 128);

    HTChunkInit(&me->style_block, 128);

    HTChunkInit(&me->script, 128);

    me->text = 0;
    me->style_change = YES;	/* Force check leading to text creation */
    me->new_style = default_style;
    me->old_style = 0;
    me->current_default_alignment = HT_LEFT;
    me->sp = (me->stack + MAX_NESTING - 1);
    me->skip_stack = 0;
    me->sp->tag_number = -1;	/* INVALID */
    me->sp->style = default_style;	/* INVALID */
    me->sp->style->alignment = HT_LEFT;
    me->stack_overrun = FALSE;

    me->Division_Level = -1;
    me->Underline_Level = 0;
    me->Quote_Level = 0;

    me->UsePlainSpace = FALSE;
    me->HiddenValue = FALSE;
    me->lastraw = -1;

    /*
     * Used for nested lists.  - FM
     */
    me->List_Nesting_Level = -1;	/* counter for list nesting level */
    LYZero_OL_Counter(me);	/* Initializes OL_Counter[] and OL_Type[] */
    me->Last_OL_Count = 0;	/* last count in ordered lists */
    me->Last_OL_Type = '1';	/* last type in ordered lists */

    me->inA = FALSE;
    me->inAPPLET = FALSE;
    me->inAPPLETwithP = FALSE;
    me->inBadBASE = FALSE;
    me->inBadHREF = FALSE;
    me->inBadHTML = FALSE;
    me->inBASE = FALSE;
    me->node_anchor->inBASE = FALSE;
    me->inBoldA = FALSE;
    me->inBoldH = FALSE;
    me->inCAPTION = FALSE;
    me->inCREDIT = FALSE;
    me->inFIG = FALSE;
    me->inFIGwithP = FALSE;
    me->inFONT = FALSE;
    me->inFORM = FALSE;
    me->inLABEL = FALSE;
    me->inP = FALSE;
    me->inPRE = FALSE;
    me->inSELECT = FALSE;
    me->inTABLE = FALSE;
    me->inUnderline = FALSE;

    me->needBoldH = FALSE;

    me->comment_start = NULL;
    me->comment_end = NULL;

#ifdef USE_COLOR_STYLE
#ifdef LY_FIND_LEAKS
    if (Style_className == 0) {
	atexit(free_Style_className);
    }
#endif
    addClassName("", "", (size_t) 0);
    class_string[0] = '\0';
#endif

    /*
     * Create a chartrans stage info structure for the anchor, if it does not
     * exist already (in which case the default MIME stage info will be loaded
     * as well), and load the HTML stage info into me->UCI and me->UCLYhndl.  -
     * FM
     */
    LYGetChartransInfo(me);
    UCTransParams_clear(&me->T);

    /*
     * Load the existing or default input charset info into the holding
     * elements.  We'll believe what is indicated for UCT_STAGE_PARSER.  - FM
     */
    me->inUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
					  UCT_STAGE_PARSER);
    if (me->inUCLYhndl < 0) {
	me->inUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
					      UCT_STAGE_MIME);
	me->inUCI = HTAnchor_getUCInfoStage(me->node_anchor,
					    UCT_STAGE_MIME);
    } else {
	me->inUCI = HTAnchor_getUCInfoStage(me->node_anchor,
					    UCT_STAGE_PARSER);
    }

    /*
     * Load the existing or default output charset info into the holding
     * elements, UCT_STAGE_STRUCTURED should be the same as UCT_STAGE_TEXT at
     * this point, but we could check, perhaps.  - FM
     */
    me->outUCI = HTAnchor_getUCInfoStage(me->node_anchor,
					 UCT_STAGE_STRUCTURED);
    me->outUCLYhndl = HTAnchor_getUCLYhndl(me->node_anchor,
					   UCT_STAGE_STRUCTURED);

    me->target = stream;
    if (stream)
	me->targetClass = *stream->isa;		/* Copy pointers */

    return (HTStructured *) me;
}

#ifdef USE_SOURCE_CACHE

/*
 * A flag set by a file write error.  Used for only generating an alert the
 * first time such an error happens, since Lynx should still be usable if the
 * temp space becomes full, and an alert each time a cache file cannot be
 * written would be annoying.  Reset when lynx.cfg is being reloaded (user may
 * change SOURCE_CACHE setting).  - kw
 */
BOOLEAN source_cache_file_error = FALSE;

/*
 * Pass-thru cache HTStream
 */

static void CacheThru_do_free(HTStream *me)
{
    if (me->anchor->source_cache_file) {
	CTRACE((tfp, "SourceCacheWriter: Removing previous file %s\n",
		me->anchor->source_cache_file));
	LYRemoveTemp(me->anchor->source_cache_file);
	FREE(me->anchor->source_cache_file);
    }
    if (me->anchor->source_cache_chunk) {
	CTRACE((tfp, "SourceCacheWriter: Removing previous memory chunk %p\n",
		(void *) me->anchor->source_cache_chunk));
	HTChunkFree(me->anchor->source_cache_chunk);
	me->anchor->source_cache_chunk = NULL;
    }
    if (me->fp) {
	fflush(me->fp);
	if (ferror(me->fp))
	    me->status = HT_ERROR;
	LYCloseTempFP(me->fp);
	if (me->status == HT_OK) {
	    char *cp_freeme = 0;

	    me->anchor->source_cache_file = me->filename;
	    CTRACE((tfp,
		    "SourceCacheWriter: Committing file %s for URL %s to anchor\n",
		    me->filename,
		    cp_freeme = HTAnchor_address((HTAnchor *) me->anchor)));
	    FREE(cp_freeme);
	} else {
	    if (source_cache_file_error == FALSE) {
		HTAlert(gettext("Source cache error - disk full?"));
		source_cache_file_error = TRUE;
	    }
	    LYRemoveTemp(me->filename);
	    me->anchor->source_cache_file = NULL;
	}
    } else if (me->status != HT_OK) {
	if (me->chunk) {
	    CTRACE((tfp, "SourceCacheWriter: memory chunk %p had errors.\n",
		    (void *) me->chunk));
	    HTChunkFree(me->chunk);
	    me->chunk = me->last_chunk = NULL;
	}
	HTAlert(gettext("Source cache error - not enough memory!"));
    }
    if (me->chunk) {
	char *cp_freeme = NULL;

	me->anchor->source_cache_chunk = me->chunk;
	CTRACE((tfp,
		"SourceCacheWriter: Committing memory chunk %p for URL %s to anchor\n",
		(void *) me->chunk,
		cp_freeme = HTAnchor_address((HTAnchor *) me->anchor)));
	FREE(cp_freeme);
    }
}

static void CacheThru_free(HTStream *me)
{
    CacheThru_do_free(me);
    (*me->actions->_free) (me->target);
    FREE(me);
}

static void CacheThru_abort(HTStream *me, HTError e)
{
    if (me->fp)
	LYCloseTempFP(me->fp);
    if (LYCacheSourceForAborted == SOURCE_CACHE_FOR_ABORTED_DROP) {
	if (me->filename) {
	    CTRACE((tfp, "SourceCacheWriter: Removing active file %s\n",
		    me->filename));
	    LYRemoveTemp(me->filename);
	    FREE(me->filename);
	}
	if (me->chunk) {
	    CTRACE((tfp,
		    "SourceCacheWriter: Removing active memory chunk %p\n",
		    (void *) me->chunk));
	    HTChunkFree(me->chunk);
	}
    } else {
	me->status = HT_OK;	/*fake it */
	CacheThru_do_free(me);
    }
    (*me->actions->_abort) (me->target, e);
    FREE(me);
}

/*
 * FIXME: never used!
 */
static void CacheThru_put_character(HTStream *me, int c_in)
{
    if (me->status == HT_OK) {
	if (me->fp) {
	    fputc(c_in, me->fp);
	} else if (me->chunk) {
	    me->last_chunk = HTChunkPutc2(me->last_chunk, c_in);
	    if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
		me->status = HT_ERROR;
	}
    }
    (*me->actions->put_character) (me->target, c_in);
}

/*
 * FIXME: never used!
 */
static void CacheThru_put_string(HTStream *me, const char *str)
{
    if (me->status == HT_OK) {
	if (me->fp) {
	    fputs(str, me->fp);
	} else if (me->chunk) {
	    me->last_chunk = HTChunkPuts2(me->last_chunk, str);
	    if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
		me->status = HT_ERROR;
	}
    }
    (*me->actions->put_string) (me->target, str);
}

static void CacheThru_write(HTStream *me, const char *str, int l)
{
    if (me->status == HT_OK && l != 0) {
	if (me->fp) {
	    if (fwrite(str, (size_t) 1, (size_t) l, me->fp) < (size_t) l
		|| ferror(me->fp)) {
		me->status = HT_ERROR;
	    }
	} else if (me->chunk) {
	    me->last_chunk = HTChunkPutb2(me->last_chunk, str, l);
	    if (me->last_chunk == NULL || me->last_chunk->allocated == 0)
		me->status = HT_ERROR;
	}
    }
    (*me->actions->put_block) (me->target, str, l);
}

static const HTStreamClass PassThruCache =
{
    "PassThruCache",
    CacheThru_free,
    CacheThru_abort,
    CacheThru_put_character,
    CacheThru_put_string,
    CacheThru_write
};

static HTStream *CacheThru_new(HTParentAnchor *anchor,
			       HTStream *target)
{
    char *cp_freeme = NULL;
    char filename[LY_MAXPATH];
    HTStream *stream = NULL;
    HTProtocol *p = (HTProtocol *) anchor->protocol;

    /*
     * Neatly and transparently vanish if source caching is disabled.
     */
    if (LYCacheSource == SOURCE_CACHE_NONE)
	return target;

#ifndef DEBUG_SOURCE_CACHE
    /*  Only remote HTML documents may benefit from HTreparse_document(),  */
    /*  oh, assume http protocol:                                          */
    if (strcmp(p->name, "http") != 0
	&& strcmp(p->name, "https") != 0) {
	CTRACE((tfp, "SourceCacheWriter: Protocol is \"%s\"; not cached\n", p->name));
	return target;
    }
#else
    /* all HTStreams will be cached */
#endif

    CTRACE((tfp, "start CacheThru_new\n"));

    stream = (HTStream *) malloc(sizeof(*stream));
    if (!stream)
	outofmem(__FILE__, "CacheThru_new");

    assert(stream != NULL);

    stream->isa = &PassThruCache;
    stream->anchor = anchor;
    stream->fp = NULL;
    stream->filename = NULL;
    stream->chunk = NULL;
    stream->target = target;
    stream->actions = target->isa;
    stream->status = HT_OK;

    if (LYCacheSource == SOURCE_CACHE_FILE) {

	if (anchor->source_cache_file) {
	    CTRACE((tfp,
		    "SourceCacheWriter: If successful, will replace source cache file %s\n",
		    anchor->source_cache_file));
	}

	/*
	 * We open the temp file in binary mode to make sure that
	 * end-of-line stuff and high-bit Latin-1 (or other) characters
	 * don't get munged; this way, the file should (knock on wood)
	 * contain exactly what came in from the network.
	 */
	if (!(stream->fp = LYOpenTemp(filename, HTML_SUFFIX, BIN_W))) {
	    CTRACE((tfp,
		    "SourceCacheWriter: Cannot open source cache file for URL %s\n",
		    cp_freeme = HTAnchor_address((HTAnchor *) anchor)));
	    FREE(stream);
	    FREE(cp_freeme);
	    return target;
	}

	StrAllocCopy(stream->filename, filename);

	CTRACE((tfp,
		"SourceCacheWriter: Caching source for URL %s in file %s\n",
		cp_freeme = HTAnchor_address((HTAnchor *) anchor),
		filename));
	FREE(cp_freeme);
    }

    if (LYCacheSource == SOURCE_CACHE_MEMORY) {
	if (anchor->source_cache_chunk) {
	    CTRACE((tfp,
		    "SourceCacheWriter: If successful, will replace memory chunk %p\n",
		    (void *) anchor->source_cache_chunk));
	}
	stream->chunk = stream->last_chunk = HTChunkCreateMayFail(4096, 1);
	if (!stream->chunk)	/* failed already? pretty bad... - kw */
	    stream->status = HT_ERROR;

	CTRACE((tfp,
		"SourceCacheWriter: Caching source for URL %s in memory chunk %p\n",
		cp_freeme = HTAnchor_address((HTAnchor *) anchor),
		(void *) stream->chunk));
	FREE(cp_freeme);
    }

    return stream;
}
#else
#define CacheThru_new(anchor, target) target
#endif

/*	HTConverter for HTML to plain text
 *	----------------------------------
 *
 *	This will convert from HTML to presentation or plain text.
 *
 *	It is registered in HTInit.c, but never actually used by lynx.
 *	- kw 1999-03-15
 */
HTStream *HTMLToPlain(HTPresentation *pres,
		      HTParentAnchor *anchor,
		      HTStream *sink)
{
    CTRACE((tfp, "HTMLToPlain calling CacheThru_new\n"));
    return CacheThru_new(anchor,
			 SGML_new(&HTML_dtd, anchor,
				  HTML_new(anchor, pres->rep_out, sink)));
}

/*	HTConverter for HTML source to plain text
 *	-----------------------------------------
 *
 *	This will preparse HTML and convert back to presentation or plain text.
 *
 *	It is registered in HTInit.c and used by lynx if invoked with
 *	-preparsed.  The stream generated here will be fed with HTML text,
 *	It feeds that to the SGML.c parser, which in turn feeds an HTMLGen.c
 *	structured stream for regenerating flat text; the latter should
 *	end up being handled as text/plain. - kw
 */
HTStream *HTMLParsedPresent(HTPresentation *pres,
			    HTParentAnchor *anchor,
			    HTStream *sink)
{
    HTStream *intermediate = sink;

    if (!intermediate) {
	/*
	 * Trick to prevent HTPlainPresent from translating again.  Temporarily
	 * change UCT_STAGE_PARSER setting in anchor while the HTPlain stream
	 * is initialized, so that HTPlain sees its input and output charsets
	 * as the same.  - kw
	 */
	int old_parser_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_PARSER);
	int structured_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_STRUCTURED);

	if (structured_cset < 0)
	    structured_cset = HTAnchor_getUCLYhndl(anchor, UCT_STAGE_HTEXT);
	if (structured_cset < 0)
	    structured_cset = current_char_set;
	HTAnchor_setUCInfoStage(anchor, structured_cset,
				UCT_STAGE_PARSER, UCT_SETBY_MIME);
	if (pres->rep_out == WWW_SOURCE) {
	    /*  same effect as
	       intermediate = HTPlainPresent(pres, anchor, NULL);
	       just written in a more general way:
	     */
	    intermediate = HTStreamStack(WWW_PLAINTEXT, WWW_PRESENT,
					 NULL, anchor);
	} else {
	    /*  this too should amount to calling HTPlainPresent: */
	    intermediate = HTStreamStack(WWW_PLAINTEXT, pres->rep_out,
					 NULL, anchor);
	}
	if (old_parser_cset != structured_cset) {
	    HTAnchor_resetUCInfoStage(anchor, old_parser_cset,
				      UCT_STAGE_PARSER, UCT_SETBY_NONE);
	    if (old_parser_cset >= 0) {
		HTAnchor_setUCInfoStage(anchor, old_parser_cset,
					UCT_STAGE_PARSER,
					UCT_SETBY_DEFAULT + 1);
	    }
	}
    }
    if (!intermediate)
	return NULL;
    CTRACE((tfp, "HTMLParsedPresent calling CacheThru_new\n"));
    return CacheThru_new(anchor,
			 SGML_new(&HTML_dtd, anchor,
				  HTMLGenerator(intermediate)));
}

/*	HTConverter for HTML to C code
 *	------------------------------
 *
 *	C code is like plain text but all non-preformatted code
 *	is commented out.
 *	This will convert from HTML to presentation or plain text.
 *
 *	It is registered in HTInit.c, but normally not used by lynx.
 *	- kw 1999-03-15
 */
HTStream *HTMLToC(HTPresentation *pres GCC_UNUSED,
		  HTParentAnchor *anchor,
		  HTStream *sink)
{
    HTStructured *html;

    if (sink)
	(*sink->isa->put_string) (sink, "/* ");		/* Before even title */
    html = HTML_new(anchor, WWW_PLAINTEXT, sink);
    html->comment_start = "/* ";
    html->comment_end = " */\n";	/* Must start in col 1 for cpp */
    if (!sink)
	HTML_put_string(html, html->comment_start);
    CTRACE((tfp, "HTMLToC calling CacheThru_new\n"));
    return CacheThru_new(anchor,
			 SGML_new(&HTML_dtd, anchor, html));
}

/*	Presenter for HTML
 *	------------------
 *
 *	This will convert from HTML to presentation or plain text.
 *
 * (Comment from original libwww:)
 *	Override this if you have a windows version
 */
#ifndef GUI
HTStream *HTMLPresent(HTPresentation *pres GCC_UNUSED,
		      HTParentAnchor *anchor,
		      HTStream *sink GCC_UNUSED)
{
    CTRACE((tfp, "HTMLPresent calling CacheThru_new\n"));
    return CacheThru_new(anchor,
			 SGML_new(&HTML_dtd, anchor,
				  HTML_new(anchor, WWW_PRESENT, NULL)));
}
#endif /* !GUI */

/* (Comments from original libwww:) */
/*	Record error message as a hypertext object
 *	------------------------------------------
 *
 *	The error message should be marked as an error so that
 *	it can be reloaded later.
 *	This implementation just throws up an error message
 *	and leaves the document unloaded.
 *	A smarter implementation would load an error document,
 *	marking at such so that it is retried on reload.
 *
 * On entry,
 *	sink	is a stream to the output device if any
 *	number	is the HTTP error number
 *	message is the human readable message.
 *
 * On exit,
 *	returns a negative number to indicate lack of success in the load.
 */
/* (We don't actually do any of that hypertext stuff for errors,
   the trivial implementation for lynx just generates a message
   and returns. - kw 1999-03-15)
*/
int HTLoadError(HTStream *sink GCC_UNUSED, int number,
		const char *message)
{
    HTAlert(message);		/* @@@@@@@@@@@@@@@@@@@ */
    return -number;
}

static char *MakeNewTitle(const char **value, int src_type)
{
    char *ptr;
    char *newtitle = NULL;

    StrAllocCopy(newtitle, "[");
    if (value != 0 && value[src_type] != 0) {
	ptr = strrchr(value[src_type], '/');
	if (!ptr) {
	    StrAllocCat(newtitle, value[src_type]);
	} else {
	    StrAllocCat(newtitle, ptr + 1);
	}
    } else {
	ptr = 0;
    }
#ifdef SH_EX			/* 1998/04/02 (Thu) 16:02:00 */

    /* for proxy server 1998/12/19 (Sat) 11:53:30 */
    if (AS_casecomp(newtitle + 1, "internal-gopher-menu") == 0) {
	StrAllocCopy(newtitle, "+");
    } else if (AS_casecomp(newtitle + 1, "internal-gopher-unknown") == 0) {
	StrAllocCopy(newtitle, " ");
    } else {
	/* normal title */
	ptr = strrchr(newtitle, '.');
	if (ptr) {
	    if (AS_casecomp(ptr, ".gif") == 0)
		*ptr = '\0';
	    else if (AS_casecomp(ptr, ".jpg") == 0)
		*ptr = '\0';
	    else if (AS_casecomp(ptr, ".jpeg") == 0)
		*ptr = '\0';
	}
	StrAllocCat(newtitle, "]");
    }
#else
    StrAllocCat(newtitle, "]");
#endif
    return newtitle;
}

static char *MakeNewImageValue(const char **value)
{
    char *ptr;
    char *newtitle = NULL;

    StrAllocCopy(newtitle, "[");
    ptr = (value[HTML_INPUT_SRC]
	   ? strrchr(value[HTML_INPUT_SRC], '/')
	   : 0);
    if (!ptr) {
	StrAllocCat(newtitle, value[HTML_INPUT_SRC]);
    } else {
	StrAllocCat(newtitle, ptr + 1);
    }
    StrAllocCat(newtitle, "]-Submit");
    return newtitle;
}

static char *MakeNewMapValue(const char **value, const char *mapstr)
{
    char *ptr;
    char *newtitle = NULL;

    StrAllocCopy(newtitle, "[");
    StrAllocCat(newtitle, mapstr);	/* ISMAP or USEMAP */
    if (verbose_img && non_empty(value[HTML_IMG_SRC])) {
	StrAllocCat(newtitle, ":");
	ptr = strrchr(value[HTML_IMG_SRC], '/');
	if (!ptr) {
	    StrAllocCat(newtitle, value[HTML_IMG_SRC]);
	} else {
	    StrAllocCat(newtitle, ptr + 1);
	}
    }
    StrAllocCat(newtitle, "]");
    return newtitle;
}