[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
[0236]
[0237]
[0238]
[0239]
[0240]
[0241]
[0242]
[0243]
[0244]
[0245]
[0246]
[0247]
[0248]
[0249]
[0250]
[0251]
[0252]
[0253]
[0254]
[0255]
[0256]
[0257]
[0258]
[0259]
[0260]
[0261]
[0262]
[0263]
[0264]
[0265]
[0266]
[0267]
[0268]
[0269]
[0270]
[0271]
[0272]
[0273]
[0274]
[0275]
[0276]
[0277]
[0278]
[0279]
[0280]
[0281]
[0282]
[0283]
[0284]
[0285]
[0286]
[0287]
[0288]
[0289]
[0290]
[0291]
[0292]
[0293]
[0294]
[0295]
[0296]
[0297]
[0298]
[0299]
[0300]
[0301]
[0302]
[0303]
[0304]
[0305]
[0306]
[0307]
[0308]
[0309]
[0310]
[0311]
[0312]
[0313]
[0314]
[0315]
[0316]
[0317]
[0318]
[0319]
[0320]
[0321]
[0322]
[0323]
[0324]
[0325]
[0326]
[0327]
[0328]
[0329]
[0330]
[0331]
[0332]
[0333]
[0334]
[0335]
[0336]
[0337]
[0338]
[0339]
[0340]
[0341]
[0342]
[0343]
[0344]
[0345]
[0346]
[0347]
[0348]
[0349]
[0350]
[0351]
[0352]
[0353]
[0354]
[0355]
[0356]
[0357]
[0358]
[0359]
[0360]
[0361]
[0362]
[0363]
[0364]
[0365]
[0366]
[0367]
[0368]
[0369]
[0370]
[0371]
[0372]
[0373]
[0374]
[0375]
[0376]
[0377]
[0378]
[0379]
[0380]
[0381]
[0382]
[0383]
[0384]
[0385]
[0386]
[0387]
[0388]
[0389]
[0390]
[0391]
[0392]
[0393]
[0394]
[0395]
[0396]
[0397]
[0398]
[0399]
[0400]
[0401]
[0402]
[0403]
[0404]
[0405]
[0406]
[0407]
[0408]
[0409]
[0410]
[0411]
[0412]
[0413]
[0414]
[0415]
[0416]
[0417]
[0418]
[0419]
[0420]
[0421]
[0422]
[0423]
[0424]
[0425]
[0426]
[0427]
[0428]
[0429]
[0430]
[0431]
[0432]
[0433]
[0434]
[0435]
[0436]
[0437]
[0438]
[0439]
[0440]
[0441]
[0442]
[0443]
[0444]
[0445]
[0446]
[0447]
[0448]
[0449]
[0450]
[0451]
[0452]
[0453]
[0454]
[0455]
[0456]
[0457]
[0458]
[0459]
[0460]
[0461]
[0462]
[0463]
[0464]
[0465]
[0466]
[0467]
[0468]
[0469]
[0470]
[0471]
[0472]
[0473]
[0474]
[0475]
[0476]
[0477]
[0478]
[0479]
[0480]
[0481]
[0482]
[0483]
[0484]
[0485]
[0486]
[0487]
[0488]
[0489]
[0490]
[0491]
[0492]
[0493]
[0494]
[0495]
[0496]
[0497]
[0498]
[0499]
[0500]
[0501]
[0502]
[0503]
[0504]
[0505]
[0506]
[0507]
[0508]
[0509]
[0510]
[0511]
[0512]
[0513]
[0514]
[0515]
[0516]
[0517]
[0518]
[0519]
[0520]
[0521]
[0522]
[0523]
[0524]
[0525]
[0526]
[0527]
[0528]
[0529]
[0530]
[0531]
[0532]
[0533]
[0534]
[0535]
[0536]
[0537]
[0538]
[0539]
[0540]
[0541]
[0542]
[0543]
[0544]
[0545]
[0546]
[0547]
[0548]
[0549]
[0550]
[0551]
[0552]
[0553]
[0554]
[0555]
[0556]
[0557]
[0558]
[0559]
[0560]
[0561]
[0562]
[0563]
[0564]
[0565]
[0566]
[0567]
[0568]
[0569]
[0570]
[0571]
[0572]
[0573]
[0574]
[0575]
[0576]
[0577]
[0578]
[0579]
[0580]
[0581]
[0582]
[0583]
[0584]
[0585]
[0586]
[0587]
[0588]
[0589]
[0590]
[0591]
[0592]
[0593]
[0594]
[0595]
[0596]
[0597]
[0598]
[0599]
[0600]
[0601]
[0602]
[0603]
[0604]
[0605]
[0606]
[0607]
[0608]
[0609]
[0610]
[0611]
[0612]
[0613]
[0614]
[0615]
[0616]
[0617]
[0618]
[0619]
[0620]
[0621]
[0622]
[0623]
[0624]
[0625]
[0626]
[0627]
[0628]
[0629]
[0630]
[0631]
[0632]
[0633]
[0634]
[0635]
[0636]
[0637]
[0638]
[0639]
[0640]
[0641]
[0642]
[0643]
[0644]
[0645]
[0646]
[0647]
[0648]
[0649]
[0650]
[0651]
[0652]
[0653]
[0654]
[0655]
[0656]
[0657]
[0658]
[0659]
[0660]
[0661]
[0662]
[0663]
[0664]
[0665]
[0666]
[0667]
[0668]
[0669]
[0670]
[0671]
[0672]
[0673]
[0674]
[0675]
[0676]
[0677]
[0678]
[0679]
[0680]
[0681]
[0682]
[0683]
[0684]
[0685]
[0686]
[0687]
[0688]
[0689]
[0690]
[0691]
[0692]
[0693]
[0694]
[0695]
[0696]
[0697]
[0698]
[0699]
[0700]
[0701]
[0702]
[0703]
[0704]
[0705]
[0706]
[0707]
[0708]
[0709]
[0710]
[0711]
[0712]
[0713]
[0714]
[0715]
[0716]
[0717]
[0718]
[0719]
[0720]
[0721]
[0722]
[0723]
[0724]
[0725]
[0726]
[0727]
[0728]
[0729]
[0730]
[0731]
[0732]
[0733]
[0734]
[0735]
[0736]
[0737]
[0738]
[0739]
[0740]
[0741]
[0742]
[0743]
[0744]
[0745]
[0746]
[0747]
[0748]
[0749]
[0750]
[0751]
[0752]
[0753]
[0754]
[0755]
[0756]
[0757]
[0758]
[0759]
[0760]
[0761]
[0762]
[0763]
[0764]
[0765]
[0766]
[0767]
[0768]
[0769]
[0770]
[0771]
[0772]
[0773]
[0774]
[0775]
[0776]
[0777]
[0778]
[0779]
[0780]
[0781]
[0782]
[0783]
[0784]
[0785]
[0786]
[0787]
[0788]
[0789]
[0790]
[0791]
[0792]
[0793]
[0794]
[0795]
[0796]
[0797]
[0798]
[0799]
[0800]
[0801]
[0802]
[0803]
[0804]
[0805]
[0806]
[0807]
[0808]
[0809]
[0810]
[0811]
[0812]
[0813]
[0814]
[0815]
[0816]
[0817]
[0818]
[0819]
[0820]
[0821]
[0822]
[0823]
[0824]
[0825]
[0826]
[0827]
[0828]
[0829]
[0830]
[0831]
[0832]
[0833]
[0834]
[0835]
[0836]
[0837]
[0838]
[0839]
[0840]
[0841]
[0842]
[0843]
[0844]
[0845]
[0846]
[0847]
[0848]
[0849]
[0850]
[0851]
[0852]
[0853]
[0854]
[0855]
[0856]
[0857]
[0858]
[0859]
[0860]
[0861]
[0862]
[0863]
[0864]
[0865]
[0866]
[0867]
[0868]
[0869]
[0870]
[0871]
[0872]
[0873]
[0874]
[0875]
[0876]
[0877]
[0878]
[0879]
[0880]
[0881]
[0882]
[0883]
[0884]
[0885]
[0886]
[0887]
[0888]
[0889]
[0890]
[0891]
[0892]
[0893]
[0894]
[0895]
[0896]
[0897]
[0898]
[0899]
[0900]
[0901]
[0902]
[0903]
[0904]
[0905]
[0906]
[0907]
[0908]
[0909]
[0910]
[0911]
[0912]
[0913]
[0914]
[0915]
[0916]
[0917]
[0918]
[0919]
[0920]
[0921]
[0922]
[0923]
[0924]
[0925]
[0926]
[0927]
[0928]
[0929]
[0930]
[0931]
[0932]
[0933]
[0934]
[0935]
[0936]
[0937]
[0938]
[0939]
[0940]
[0941]
[0942]
[0943]
[0944]
[0945]
[0946]
[0947]
[0948]
[0949]
[0950]
[0951]
[0952]
[0953]
[0954]
[0955]
[0956]
[0957]
[0958]
[0959]
[0960]
[0961]
[0962]
[0963]
[0964]
[0965]
[0966]
[0967]
[0968]
[0969]
[0970]
[0971]
[0972]
[0973]
[0974]
[0975]
[0976]
[0977]
[0978]
[0979]
[0980]
[0981]
[0982]
[0983]
[0984]
[0985]
[0986]
[0987]
[0988]
[0989]
[0990]
[0991]
[0992]
[0993]
[0994]
[0995]
[0996]
[0997]
[0998]
[0999]
[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]
[1143]
[1144]
[1145]
[1146]
[1147]
[1148]
[1149]
[1150]
[1151]
[1152]
[1153]
[1154]
[1155]
[1156]
[1157]
[1158]
[1159]
[1160]
[1161]
[1162]
[1163]
[1164]
[1165]
[1166]
[1167]
[1168]
[1169]
[1170]
[1171]
[1172]
[1173]
[1174]
[1175]
[1176]
[1177]
[1178]
[1179]
[1180]
[1181]
[1182]
[1183]
[1184]
[1185]
[1186]
[1187]
[1188]
[1189]
[1190]
[1191]
[1192]
[1193]
[1194]
[1195]
[1196]
[1197]
[1198]
[1199]
[1200]
[1201]
[1202]
[1203]
[1204]
[1205]
[1206]
[1207]
[1208]
[1209]
[1210]
[1211]
[1212]
[1213]
[1214]
[1215]
[1216]
[1217]
[1218]
[1219]
[1220]
[1221]
[1222]
[1223]
[1224]
[1225]
[1226]
[1227]
[1228]
[1229]
[1230]
[1231]
[1232]
[1233]
[1234]
[1235]
[1236]
[1237]
[1238]
[1239]
[1240]
[1241]
[1242]
[1243]
[1244]
[1245]
[1246]
[1247]
[1248]
[1249]
[1250]
[1251]
[1252]
[1253]
[1254]
[1255]
[1256]
[1257]
[1258]
[1259]
[1260]
[1261]
[1262]
[1263]
[1264]
[1265]
[1266]
[1267]
[1268]
[1269]
[1270]
[1271]
[1272]
[1273]
[1274]
[1275]
[1276]
[1277]
[1278]
[1279]
[1280]
[1281]
[1282]
[1283]
[1284]
[1285]
[1286]
[1287]
[1288]
[1289]
[1290]
[1291]
[1292]
[1293]
[1294]
[1295]
[1296]
[1297]
[1298]
[1299]
[1300]
[1301]
[1302]
[1303]
[1304]
[1305]
[1306]
[1307]
[1308]
[1309]
[1310]
[1311]
[1312]
[1313]
[1314]
[1315]
[1316]
[1317]
[1318]
[1319]
[1320]
[1321]
[1322]
[1323]
[1324]
[1325]
[1326]
[1327]
[1328]
[1329]
[1330]
[1331]
[1332]
[1333]
[1334]
[1335]
[1336]
[1337]
[1338]
[1339]
[1340]
[1341]
[1342]
[1343]
[1344]
[1345]
[1346]
[1347]
[1348]
[1349]
[1350]
[1351]
[1352]
[1353]
[1354]
[1355]
[1356]
[1357]
[1358]
[1359]
[1360]
[1361]
[1362]
[1363]
[1364]
[1365]
[1366]
[1367]
[1368]
[1369]
[1370]
[1371]
[1372]
[1373]
[1374]
[1375]
[1376]
[1377]
[1378]
[1379]
[1380]
[1381]
[1382]
[1383]
[1384]
[1385]
[1386]
[1387]
[1388]
[1389]
[1390]
[1391]
[1392]
[1393]
[1394]
[1395]
[1396]
[1397]
[1398]
[1399]
[1400]
[1401]
[1402]
[1403]
[1404]
[1405]
[1406]
[1407]
[1408]
[1409]
[1410]
[1411]
[1412]
[1413]
[1414]
[1415]
[1416]
[1417]
[1418]
[1419]
[1420]
[1421]
[1422]
[1423]
[1424]
[1425]
[1426]
[1427]
[1428]
[1429]
[1430]
[1431]
[1432]
[1433]
[1434]
[1435]
[1436]
[1437]
[1438]
[1439]
[1440]
[1441]
[1442]
[1443]
[1444]
[1445]
[1446]
[1447]
[1448]
[1449]
[1450]
[1451]
[1452]
[1453]
[1454]
[1455]
[1456]
[1457]
[1458]
[1459]
[1460]
[1461]
[1462]
[1463]
[1464]
[1465]
[1466]
[1467]
[1468]
[1469]
[1470]
[1471]
[1472]
[1473]
[1474]
[1475]
[1476]
[1477]
[1478]
[1479]
[1480]
[1481]
[1482]
[1483]
[1484]
[1485]
[1486]
[1487]
[1488]
[1489]
[1490]
[1491]
[1492]
[1493]
[1494]
[1495]
[1496]
[1497]
[1498]
[1499]
[1500]
[1501]
[1502]
[1503]
[1504]
[1505]
[1506]
[1507]
[1508]
[1509]
[1510]
[1511]
[1512]
[1513]
[1514]
[1515]
[1516]
[1517]
[1518]
[1519]
[1520]
[1521]
[1522]
[1523]
[1524]
[1525]
[1526]
[1527]
[1528]
[1529]
[1530]
[1531]
[1532]
[1533]
[1534]
[1535]
[1536]
[1537]
[1538]
[1539]
[1540]
[1541]
[1542]
[1543]
[1544]
[1545]
[1546]
[1547]
[1548]
[1549]
[1550]
[1551]
[1552]
[1553]
[1554]
[1555]
[1556]
[1557]
[1558]
[1559]
[1560]
[1561]
[1562]
[1563]
[1564]
[1565]
[1566]
[1567]
[1568]
[1569]
[1570]
[1571]
[1572]
[1573]
[1574]
[1575]
[1576]
[1577]
[1578]
[1579]
[1580]
[1581]
[1582]
[1583]
[1584]
[1585]
[1586]
[1587]
[1588]
[1589]
[1590]
[1591]
[1592]
[1593]
[1594]
[1595]
[1596]
[1597]
[1598]
[1599]
[1600]
[1601]
[1602]
[1603]
[1604]
[1605]
[1606]
[1607]
[1608]
[1609]
[1610]
[1611]
[1612]
[1613]
[1614]
[1615]
[1616]
[1617]
[1618]
[1619]
[1620]
[1621]
[1622]
[1623]
[1624]
[1625]
[1626]
[1627]
[1628]
[1629]
[1630]
[1631]
[1632]
[1633]
[1634]
[1635]
[1636]
[1637]
[1638]
[1639]
[1640]
[1641]
[1642]
[1643]
[1644]
[1645]
[1646]
[1647]
[1648]
[1649]
[1650]
[1651]
[1652]
[1653]
[1654]
[1655]
[1656]
[1657]
[1658]
[1659]
[1660]
[1661]
[1662]
[1663]
[1664]
[1665]
[1666]
[1667]
[1668]
[1669]
[1670]
[1671]
[1672]
[1673]
[1674]
[1675]
[1676]
[1677]
[1678]
[1679]
[1680]
[1681]
[1682]
[1683]
[1684]
[1685]
[1686]
[1687]
[1688]
[1689]
[1690]
[1691]
[1692]
[1693]
[1694]
[1695]
[1696]
[1697]
[1698]
[1699]
[1700]
[1701]
[1702]
[1703]
[1704]
[1705]
[1706]
[1707]
[1708]
[1709]
[1710]
[1711]
[1712]
[1713]
[1714]
[1715]
[1716]
[1717]
[1718]
[1719]
[1720]
[1721]
[1722]
[1723]
[1724]
[1725]
[1726]
[1727]
[1728]
[1729]
[1730]
[1731]
[1732]
[1733]
[1734]
[1735]
[1736]
[1737]
[1738]
[1739]
[1740]
[1741]
[1742]
[1743]
[1744]
[1745]
[1746]
[1747]
[1748]
[1749]
[1750]
[1751]
[1752]
[1753]
[1754]
[1755]
[1756]
[1757]
[1758]
[1759]
[1760]
[1761]
[1762]
[1763]
[1764]
[1765]
[1766]
[1767]
[1768]
[1769]
[1770]
[1771]
[1772]
[1773]
[1774]
[1775]
[1776]
[1777]
[1778]
[1779]
[1780]
[1781]
[1782]
[1783]
[1784]
[1785]
[1786]
[1787]
[1788]
[1789]
[1790]
[1791]
[1792]
[1793]
[1794]
[1795]
[1796]
[1797]
[1798]
[1799]
[1800]
[1801]
[1802]
[1803]
[1804]
[1805]
[1806]
[1807]
[1808]
[1809]
[1810]
[1811]
[1812]
[1813]
[1814]
[1815]
[1816]
[1817]
[1818]
[1819]
[1820]
[1821]
[1822]
[1823]
[1824]
[1825]
[1826]
[1827]
[1828]
[1829]
[1830]
[1831]
[1832]
[1833]
[1834]
[1835]
[1836]
[1837]
[1838]
[1839]
[1840]
[1841]
[1842]
[1843]
[1844]
[1845]
[1846]
[1847]
[1848]
[1849]
[1850]
[1851]
[1852]
[1853]
[1854]
[1855]
[1856]
[1857]
[1858]
[1859]
[1860]
[1861]
[1862]
[1863]
[1864]
[1865]
[1866]
[1867]
[1868]
[1869]
[1870]
[1871]
[1872]
[1873]
[1874]
[1875]
[1876]
[1877]
[1878]
[1879]
[1880]
[1881]
[1882]
[1883]
[1884]
[1885]
[1886]
[1887]
[1888]
[1889]
[1890]
[1891]
[1892]
[1893]
[1894]
[1895]
[1896]
[1897]
[1898]
[1899]
[1900]
[1901]
[1902]
[1903]
[1904]
[1905]
[1906]
[1907]
[1908]
[1909]
[1910]
[1911]
[1912]
[1913]
[1914]
[1915]
[1916]
[1917]
[1918]
[1919]
[1920]
[1921]
[1922]
[1923]
[1924]
[1925]
[1926]
[1927]
[1928]
[1929]
[1930]
[1931]
[1932]
[1933]
[1934]
[1935]
[1936]
[1937]
[1938]
[1939]
[1940]
[1941]
[1942]
[1943]
[1944]
[1945]
[1946]
[1947]
[1948]
[1949]
[1950]
[1951]
[1952]
[1953]
[1954]
[1955]
[1956]
[1957]
[1958]
[1959]
[1960]
[1961]
[1962]
[1963]
[1964]
[1965]
[1966]
[1967]
[1968]
[1969]
[1970]
[1971]
[1972]
[1973]
[1974]
[1975]
[1976]
[1977]
[1978]
[1979]
[1980]
[1981]
[1982]
[1983]
[1984]
[1985]
[1986]
[1987]
[1988]
[1989]
[1990]
[1991]
[1992]
[1993]
[1994]
[1995]
[1996]
[1997]
[1998]
[1999]
[2000]
[2001]
[2002]
[2003]
[2004]
[2005]
[2006]
[2007]
[2008]
[2009]
[2010]
[2011]
[2012]
[2013]
[2014]
[2015]
[2016]
[2017]
[2018]
[2019]
[2020]
[2021]
[2022]
[2023]
[2024]
[2025]
[2026]
[2027]
[2028]
[2029]
[2030]
[2031]
[2032]
[2033]
[2034]
[2035]
[2036]
[2037]
[2038]
[2039]
[2040]
[2041]
[2042]
[2043]
[2044]
[2045]
[2046]
[2047]
[2048]
[2049]
[2050]
[2051]
[2052]
[2053]
[2054]
[2055]
[2056]
[2057]
[2058]
[2059]
[2060]
[2061]
[2062]
[2063]
[2064]
<!DOCTYPE html>
<!-- WASDOC AXP-2.0.0 (CGILIB AXP-1.9.9) -->
<!-- wasDOC Copyright (C) 2019,2020 Mark G.Daniel - Apache-2.0 licenced -->
<!--  3-NOV-2021 02:50 -->
<noscript>NOTE: SOME FUNCTIONALITY EMPLOYS JAVASCRIPT</noscript>
<div id="erreport1" style="display:none;"></div>
<script>
function errorReport(string) {
   for (var cnt = 1; cnt <= 2; cnt++) {
      var err = document.getElementById('erreport'+cnt);
      err.style.display = 'block';
      err.innerHTML += string;
   }
}
</script>
<style type="text/css">
html { font-family: arial, verdana, sans-serif; font-size:12pt; margin:1em; }
h1 { font-size:124%; font-style:bold;
     margin-top:1em; margin-bottom:0.5em; }
h2 { font-size:120%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.4em; }
h3 { font-size:116%; font-style:bold;
     margin-top:1.0em; margin-bottom:0.3em; }
h4 { font-size:112%; font-style:bold;
     margin-top:1.1em; margin-bottom:0.3em; }
h5 { font-size:112%; font-style:bold; 
     margin-top:1.1em; margin-bottom:0.3em; }
h6 { font-size:112%; font-style:bold; padding:0; margin:0; }

h1 .text { text-decoration:underline; }
h1 .numb { padding-right:0.8em; }
h1 .numb:empty { display:none; padding-right:0; }
h2 .numb { padding-right:0.8em; }
h2 .numb:empty { display:none; padding-right:0; }
h3 .numb { padding-right:0.8em; }
h3 .numb:empty { display:none; padding-right:0; }
h4 .numb { padding-right:0.8em; }
h4 .numb:empty { display:none; padding-right:0; }
h5 .numb { display:none; padding-right:0; }
h6 .numb { display:none; padding-right:0; }

kbd { font-family:monospace; }

noscript { font-size:1.2em; }

p { line-height:1.1em; margin-top:1em; margin-bottom:1em; }

.chunk { font-size:130%; text-decoration:underline; }
.head {}
.high {}
.bold { font-weight:bold; }
.center { text-align:center; }
.italic { font-style:italic; }
.left { text-align:left; }
.nowrap { white-space:nowrap; }
.prewrap { white-space:pre; }
.right { text-align:right; }
.strike { text-decoration:line-through; }
.under { text-decoration:underline; }

.backlight { background-color:#f2f2f2; }
.display0 { display:none; }

img { max-width:100%; }
.imglink { }

.link { }
.blank { }

.list { margin-bottom:1em; }
.list li { margin-top:0.5em; }
.list0 li { margin-top:0; }
.item {}

.tabl { border-collapse:collapse; text-align:left; margin:0.4em 2em 0.5em 2em; }
.tabu { border-collapse:collapse; text-align:right; margin:0.4em 2em 0.5em 2em; }

.tabr { vertical-align:top; }
.tabh { padding:0.2em 0 0 2em; margin:0; }
.tabd { padding:0.1em 0 0 2em; margin:0; }
.tabh:first-of-type, td:first-of-type { padding-left:0; }

.tabu .tabh,
.tabu .tabd { border:1px solid gray; padding:0.2em 0.3em 0.2em 0.3em; }
.tab0 { border:none; visibility:hidden; max-width:1em; 
        white-space:nowrap; overflow:hidden; }

.tabauto { margin-left:auto; margin-right:auto; }

.tabr:empty { height:0.2em; }
.tabu .tabh:empty, .tabu .tabd:empty { border:none; visibility:hidden; }

.error { font-size:110%; color:black; background-color:yellow;
         font-family:sans-serif; font-weight:bold; font-style:normal;
         width:95%; border:solid 1px gray; padding:0.5em 1em 0.5em 1em; }
.error::before { content:'\026a0\00a0'; }
.image { }
.page { width:98%; border:1px dashed gray; margin:1.5em 0 1.8em 0; }
.epage { width:98%; border:1px dashed black; margin:1.5em 0 1.8em 0; }
.monosp { font-family:monospace; }
.ppage { display:none; }
.simple { list-style-type:none; }
.valtop { vertical-align:top; }
.valmid { vertical-align:middle; }
.valbot { vertical-align:bottom; }

.code { border-style:solid; border-width:0 0 0 1px; padding-left:1em;
        font-family:monospace; white-space:pre; }
.block { }
.blockof { margin:0.4em 2em 0.5em 2em; }
.example { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
           margin-top:0.5em; margin-bottom:0.5em; white-space:pre; }
.indent { margin-left:2em; margin-right:2em; }
.noindent { margin-left:0; margin-right:0; }
.inblock { display:inline-block; }
.mono { white-space:pre; font-family:monospace; }
.note { margin:0.4em 2em 0.5em 2em; page-break-inside:avoid; }
.note h5 { margin-top:0 }
.note_hr { width:80%; border:1px solid gray; }
.prop { padding-left:1em; margin-top:0.5em; margin-bottom:0.5em; }
.quote { border-style:dashed; border-width:0 0 0 1px; padding-left:1em;
         margin-top:0.5em; margin-bottom:0.5em; }
.this { display:none; }

a:link,a:visited { color:black; text-decoration:none; }
a:hover,a:active { text-decoration:underline; }
a:focus { outline:0; } 

:target:before { content:''; display:block; height:0.1em; margin:-0.1em; }
a.link:link, a.link:visited,a.link:active 
{ color:midnightBlue; text-decoration:underline; text-decoration-style:solid; }

.TOC1cols1 { width:80%; max-width:80%; }
.TOC1cols2 { column-count:2; width:80%; max-width:80%; }
.TOC1cols3 { column-count:3; max-width:90%; max-width:90%; }
.TOC1cols4 { column-count:4; max-width:100%; max-width:100%; }
.TOC1table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC1table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC1table td+td { padding:0 0 0 0.5em; }
.TOC1table .numb { width:3em; max-width:3em; }
.TOC1table .sepr { width:5em; max-width:6em; overflow:hidden; }
.TOC1table .majr { font-weight:bold; }
.TOC1table .text { white-space:normal; }

/* These are due to Firefox (at least <= 76) recalcitrant multi-column handling.
   Web search "Split table into css columns, issue in Firefox" (stackoverflow).
   "Good grief, Charlie Brown!" */
 
.TOC1cols2 table,
.TOC1cols2 tbody,
.TOC1cols2 tr,
.TOC1cols3 table,
.TOC1cols3 tbody,
.TOC1cols3 tr,
.TOC1cols4 table,
.TOC1cols4 tbody,
.TOC1cols4 tr { display:block; padding:0; }

.TOC2cols1 { width:60%; max-width:60%; }
.TOC2cols2 { column-count:2; width:70%; max-width:70%; }
.TOC2cols3 { column-count:3; width:80%; max-width:80%; }
.TOC2cols4 { column-count:4; width:90%; max-width:90%; }
.TOC2table { margin-left:2em; white-space:nowrap; break-inside:auto; }
.TOC2table tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.TOC2table .numb { font-weight:bold; padding-right:0.5em; }
.TOC2table .text { width:100%; white-space:normal; }

/* see "recalcitrant" above */
.TOC2cols2 table,
.TOC2cols2 tbody,
.TOC2cols2 tr,
.TOC2cols3 table,
.TOC2cols3 tbody,
.TOC2cols3 tr,
.TOC2cols4 table,
.TOC2cols4 tbody,
.TOC2cols4 tr { display:block; padding:0; }

.NAVtable { margin:0.1em 0 0 2em; }
.NAVtable td { font-size:110%; font-weight:bold; padding:0; margin:0; }
.NAVtable a { padding:0 0.5em 0 0.5em; text-decoration:none; }

.IDXcols1 { width:80%; max-width:80%; }
.IDXcols2 { column-count:2; width:90%; max-width:90%; }
.IDXcols3 { column-count:3; width:95%; max-width:95%;  }
.IDXcols4 { column-count:4; width:100%; max-width:100%;  }
.IDXtable { margin:1em 0 1em 2em; white-space:nowrap; break-inside:auto; }
.IDXtable tr { vertical-align:top; text-align:left; break-inside:avoid; break-after:auto; }
.IDXtable .alpha { font-weight:bold; min-width:2em; }
.IDXtable .text  { width:100%; white-space:normal; }
.IDXtable .para:before { content:'\00b6\00a0'; }

/* see "recalcitrant" above */
.IDXcols2 table,
.IDXcols2 tbody,
.IDXcols2 tr,
.IDXcols3 table,
.IDXcols3 tbody,
.IDXcols3 tr,
.IDXcols4 table,
.IDXcols4 tbody,
.IDXcols4 tr { display:block; padding:0; }

.insight { background-color:cyan; font-family:monospace;
           padding:0 0.2em 0 0.2em; margin:0 0.2em 0 0.2em;
           font-size:100%; font-style:normal; font-weight:normal;
           text-decoration:none; }

.wasdoc { font-family: "Lucida Console", Monaco, monospace; 
          letter-spacing:-0.07em; }

@media screen { .blank::after { content:"\2924"; } 
                .print { display:none; }
}

@media print {
   table { page-break-inside:avoid; }
   .noprint { display:none; }
   .page { border:none; page-break-after: always; }
   .epage { display:none; }
   .ppage { page-break-after:always; }
   .NAVtable { display:none; }
   .NAVprint { display:block!important; }
}

@page { margin:2cm 1cm 2cm 1cm;  }
</style>
<!-- source:0000_env.wasdoc -->

<style type="text/css">._smiley::after { font-size:150%; vertical-align:middle; content:'\263a' }</style>
<style type="text/css">._frowny::after { font-size:150%; vertical-align:middle; content:'\2639' }</style>

<a id="0." href="#"></a>
<title>WASD Web Environment &ndash; Server Side Includes (SSI)</title>
<a id="4." href="#"></a>
<a id="4.serversideincludesssi" href="#"></a>
<a id="serversideincludesssi" href="#"></a>
<h1 class="head chunk">WASD Web Environment</h1>
<h1 class="head"><span class="numb">4.</span><span class="text">Server Side Includes (SSI)</span></h1>

<div class="TOC2cols2">
<table class="TOC2table">
<tr><td><a href="env004.html#4.1.virtualdocuments"><span class="numb">4.1</span><span class="text">Virtual Documents</span></a>
<tr><td><a href="env004.html#4.2.lastmodifiedinformation"><span class="numb">4.2</span><span class="text">Last-Modified Information</span></a>
<tr><td><a href="env004.html#4.3.preexpiringdocuments"><span class="numb">4.3</span><span class="text">Pre-Expiring Documents</span></a>
<tr><td><a href="env004.html#4.4.directivesyntax"><span class="numb">4.4</span><span class="text">Directive Syntax</span></a>
<tr><td><a href="env004.html#4.5.directives"><span class="numb">4.5</span><span class="text">Directives</span></a>
<tr><td><a href="env004.html#4.5.1.accesses"><span class="numb">4.5.1</span><span class="text">#ACCESSES</span></a>
<tr><td><a href="env004.html#4.5.2.config"><span class="numb">4.5.2</span><span class="text">#CONFIG</span></a>
<tr><td><a href="env004.html#4.5.3.dir"><span class="numb">4.5.3</span><span class="text">#DIR</span></a>
<tr><td><a href="env004.html#4.5.4.dcl"><span class="numb">4.5.4</span><span class="text">#DCL</span></a>
<tr><td><a href="env004.html#4.5.5.echo"><span class="numb">4.5.5</span><span class="text">#ECHO</span></a>
<tr><td><a href="env004.html#4.5.6.elif"><span class="numb">4.5.6</span><span class="text">#ELIF</span></a>
<tr><td><a href="env004.html#4.5.7.else"><span class="numb">4.5.7</span><span class="text">#ELSE</span></a>
<tr><td><a href="env004.html#4.5.8.endif"><span class="numb">4.5.8</span><span class="text">#ENDIF</span></a>
<tr><td><a href="env004.html#4.5.9.exec"><span class="numb">4.5.9</span><span class="text">#EXEC</span></a>
<tr><td><a href="env004.html#4.5.10.exit"><span class="numb">4.5.10</span><span class="text">#EXIT</span></a>
<tr><td><a href="env004.html#4.5.11.fcreated"><span class="numb">4.5.11</span><span class="text">#FCREATED</span></a>
<tr><td><a href="env004.html#4.5.12.flastmod"><span class="numb">4.5.12</span><span class="text">#FLASTMOD</span></a>
<tr><td><a href="env004.html#4.5.13.fsize"><span class="numb">4.5.13</span><span class="text">#FSIZE</span></a>
<tr><td><a href="env004.html#4.5.14.if"><span class="numb">4.5.14</span><span class="text">#IF</span></a>
<tr><td><a href="env004.html#4.5.15.include"><span class="numb">4.5.15</span><span class="text">#INCLUDE</span></a>
<tr><td><a href="env004.html#4.5.16.modified"><span class="numb">4.5.16</span><span class="text">#MODIFIED</span></a>
<tr><td><a href="env004.html#4.5.17.orif"><span class="numb">4.5.17</span><span class="text">#ORIF</span></a>
<tr><td><a href="env004.html#4.5.18.printenv"><span class="numb">4.5.18</span><span class="text">#PRINTENV</span></a>
<tr><td><a href="env004.html#4.5.19.set"><span class="numb">4.5.19</span><span class="text">#SET</span></a>
<tr><td><a href="env004.html#4.5.20.ssi"><span class="numb">4.5.20</span><span class="text">#SSI</span></a>
<tr><td><a href="env004.html#4.5.21.stop"><span class="numb">4.5.21</span><span class="text">#STOP</span></a>
<tr><td><a href="env004.html#4.6.variables"><span class="numb">4.6</span><span class="text">Variables</span></a>
<tr><td><a href="env004.html#4.7.flowcontrol"><span class="numb">4.7</span><span class="text">Flow Control</span></a>
<tr><td><a href="env004.html#4.8.querystrings"><span class="numb">4.8</span><span class="text">Query Strings</span></a>
<tr><td><a href="env004.html#4.9.fileandvirtualspecifications"><span class="numb">4.9</span><span class="text">File and Virtual Specifications</span></a>
<tr><td><a href="env004.html#4.9.1.thefilename"><span class="numb">4.9.1</span><span class="text">THE_FILE_NAME</span></a>
<tr><td><a href="env004.html#4.10.timeformat"><span class="numb">4.10</span><span class="text">Time Format</span></a>
<tr><td><a href="env004.html#4.11.osucompatibility"><span class="numb">4.11</span><span class="text">OSU Compatibility</span></a>
<tr><td><a href="env004.html#4.12.scriptgeneratedssidocuments"><span class="numb">4.12</span><span class="text">Script-Generated SSI Documents</span></a>
</table>
</div>

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="env003.html#3.">&#8598;&#xFE0E;</a>
<td><a href="env000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="env005.html#5.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>

<p> The HTML pre-processor is used to provide dynamic information inside of an 
otherwise static, HTML (HyperText Markup Language) document.  The HTTPd server 
provides this as internal functionality, scanning the input document for 
special pre-processor <span class="high italic">directives</span>, which are replaced by dynamic 
information based upon the particular directive. 

<p> As of version 5.1 WASD SSI has been enhanced to provide flow-control
statements, allowing blocks of the document to be conditionally processed, see
<a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a>. These extensions allow quite versatile documents to be
created without resorting to script processing.

<p> Two documents are provided as examples of SSI processing.

<ul class="list">

<li class="item"> <span class="high bold">A simple SSI document.</span>

<table class="tabl">
<tr class="tabr">
<td class="tabd"><a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/ssi.shtml?httpd=content&amp;type=text/plain">WASD_ROOT:[WASDWASDOC.ENV]SSI.SHTML</a>
<td class="tabd">(<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/ssi.shtml">access as SSI</a>)
</table>

<li class="item"> <span class="high bold">An SSI document using variable assignment and flow-control.</span>

<table class="tabl">
<tr class="tabr">
<td class="tabd"><a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=content&amp;type=text/plain">WASD_ROOT:[WASDWASDOC.ENV]XSSI.SHTML</a>
<td class="tabd">(<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">access as SSI</a>)
</table>

</ul>

<p> By default the HTML pre-processor is invoked when the document file's
extension is &quot;.SHTML&quot;. As there is a significant overhead with pre-processed
HTML compared to normal HTML, it should only be used when it serves a useful
documentary purpose, and not just for the novelty.

<p> Essential compatibility with OSU Server Side Includes is provided.  This
may ease any transition between the two.  See <a class="link" href="env004.html#4.11.osucompatibility">4.11 OSU Compatibility</a> for
further information.

<a id="4.1" href="#"></a>
<a id="4.1.virtualdocuments" href="#"></a>
<a id="virtualdocuments" href="#"></a>
<h2 class="head"><span class="numb">4.1</span><span class="text">Virtual Documents</span></h2>

<p> One effective use for pre-processed HTML is the creation of single  virtual
documents from two or more physical documents.  That is, the pre-processed
document is used to include multiple physical documents, that  may even be
independently administered, to return a composite document to the  client. 
This is a relatively low-overhead activity as SSI goes, but because it is a 
dynamic document, without some extra considerations (see
<a class="link" href="env004.html#4.2.lastmodifiedinformation">4.2 Last-Modified Information</a>).

<a id="4.1.0.0.1" href="#"></a>
<a id="4.1.example1" href="#"></a>
<a id="example1" href="#"></a>
<h5 class="head"><span class="text">Example 1</span></h5>

<p> This provides an example of the efficient use of SSI processing to create
virtual documents.  Each page will comprise a header (containing the body tag
and page header, etc), the document proper and a footer (containg the
end-of-page information, modification date, and end-body tag, etc).

<div class="blockof code">&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;Just an example!&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;!--#include virtual=&quot;header.shtml&quot; --&gt;
&lt;P&gt; This is the document information.
&lt;P&gt; Blah, blah, blah.
&lt;!--#include virtual=&quot;/web/common/footer.shtml&quot; --&gt;
&lt;/HTML&gt;
</div>

<p> A more efficient variant places the document proper in its own, plain HTML
file which is then #included (it is much, much, much more efficient for the
server to <span class="high italic">throw</span> a file at the network, than parse every character in one ;^)

<div class="blockof code">&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;Just an example!&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;!--#include virtual=&quot;header.shtml&quot; --&gt;
&lt;!--#include virtual=&quot;example.html&quot; --&gt;
&lt;!--#include virtual=&quot;footer.shtml&quot; --&gt;
&lt;/HTML&gt;
</div>

<a id="4.1.0.0.2" href="#"></a>
<a id="4.1.example2" href="#"></a>
<a id="example2" href="#"></a>
<h5 class="head"><span class="text">Example 2</span></h5>

<p> This example provides a seemingly more convoluted, but very much more
powerful configuration, that uses recursion to greatly simplify maintenance of
common-layout documents for the end-user.

<p> File 1; the document accessed via the browser URL, doesn't matter what
its name is, this configuration is completely naming independent.

<div class="blockof code">&lt;!--#ssi
#if var={PARENT_FILE_NAME} eqs=&quot;&quot;
   #set var=TITLE value=&quot;Just an Example&quot;
   #include virtual=&quot;/web/common/template.shtml&quot;
#else 
   #include virtual=&quot;document.html&quot;
#endif
--&gt;
</div>

<p> File 2; the TEMPLATE.SHTML refered to by the first include above.

<div class="blockof code">&lt;!--#ssi
#include virtual=&quot;/web/common/header.shtml&quot;
#include virtual=&quot;{DOCUMENT_ROOT}header.html&quot; fmt=&quot;?&quot;
#include virtual=&quot;{DOCUMENT_URI}&quot;
#include virtual=&quot;{DOCUMENT_ROOT}footer.html&quot; fmt=&quot;?&quot;
#include virtual=&quot;/web/common/footer.shtml&quot;
--&gt;
</div>

<p> File 3; the DOCUMENT.HTML refered to by the second include in file 1.

<p> This is just a <span class="high bold">bunch of HTML</span>!

<p> <span class="high bold">This is an explanation of how it works &hellip;</span>

<ol class="list list0">
<li class="item"> the browser accesses file 1 via a URL
<li class="item"> processing begins with file 1
<li class="item"> file 1 checks if it has a parent (is the first file processed),
<br> <span class="high bold">it doesn't and so &hellip;</span>
<li class="item"> file 1 set a variable named TITLE
<li class="item"> file 1 #includes file 2, a site-common template
<li class="item"> file 2 substitutes the TITLE variable contents as the document title
<li class="item"> file 2 #includes a site-common header
<li class="item"> file 2 #includes an optional document-local header
<li class="item"> <span class="high bold">here's the interesting bit &hellip;</span>
<br> file 2 now re-#includes the original document, file 1 (!!)
<li class="item"> file 1 checks if it has a parent (is the first file processed),
<br> <span class="high bold">it does and so &hellip;</span>
<li class="item"> file 1 #includes file 3 (the actual contents of the document)
<li class="item"> file 3 is a plain HTML document, just added to the output
<li class="item"> file 1 is now exhausted and processing returns to file 2
<li class="item"> file 2 #includes an optional document-local footer
<li class="item"> file 2 #includes a site-common footer
<li class="item"> file 2 is exhausted and processing returns to file 1
<li class="item"> file 1 is exhausted and processing stops
</ol>

<p> The following link provides an example of a
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/example_document.shtml">such a virtual document</a>.

<a id="4.2" href="#"></a>
<a id="4.2.lastmodifiedinformation" href="#"></a>
<a id="lastmodifiedinformation" href="#"></a>
<h2 class="head"><span class="numb">4.2</span><span class="text">Last-Modified Information</span></h2>

<p> SSI documents generally contain dynamic elements, that is those that may
change with each access to the document (e.g. current date/time).  This makes
evaluation of any document modification date difficult and so by default no
&quot;Last-Modified: <span class="high italic">timestamp</span>&quot; information is supplied against an SSI document.  The
potential efficiencies of having document timestamps, so that requests can be
made for a document to be returned only if modified after a certain date/time
(&quot;If-Modified-Since: <span class="high italic">timestamp</span>&quot;), are significant against
the CPU overheads of processing SSI documents.

<p> WASD allows the document author to determine whether or not a last-modified
header field should be generated for a particular document and which
contributing file(s) should be used to determine it.  This is done using
the #modified directive.  If a virtual document is made up of multiple source
documents (files) each can be assessed using multiple virtual= or file= tags,
the most recently modified will be used to determine if the virtual document
has been modified, and also to generate the last-modified timestamp.

<p> The <span class="high italic">if-modified-since</span> tag compares the determined revision
date/time of the document file(s) with any &quot;If-Modified-Since:&quot;
timestamp supplied with the request.  If the virtual document's revision
date/time is the same or older than the request's then a not-modified (304
status) header is generated and sent to the client and document processing
ceases.  If more recent an appropriate &quot;Last-Modified:&quot; header field is
added to the document and it continues to be processed.

<p> If a request has a &quot;Pragma: no-cache&quot; field (as with Navigator's
<span class="high italic">reload</span> function) the document is always generated (this is
consistent with general WASD behaviour).
The following example illustrates the essential features.

<div class="blockof code">&lt;!--#ssi
#modified
#modified virtual=&quot;/web/common/header.shtml&quot;
#modified virtual=&quot;header.html&quot; fmt=&quot;?&quot;
#modified virtual=&quot;index.html&quot;  fmt=&quot;?&quot;
#modified virtual=&quot;footer.html&quot; fmt=&quot;?&quot;
#modified virtual=&quot;/web/common/footer.shtml&quot;
#modified if-modified-since
--&gt;
</div>

<p> This construct should be placed at the very beginning of the SSI document,
and certainly before there is any chance of output being sent to the browser. 
Once output to the client has occured there can be no change to the response
header information (not unreasonably).

<a id="4.3" href="#"></a>
<a id="4.3.preexpiringdocuments" href="#"></a>
<a id="preexpiringdocuments" href="#"></a>
<h2 class="head"><span class="numb">4.3</span><span class="text">Pre-Expiring Documents</span></h2>


<p> SSI preprocessed documents are <span class="high italic">dynamic</span> in the sense that the
information presented can be different every time the document is generated
(e.g. if time directives are included).  If it is important that each time the
document is accessed it is regenerated then an HTML META tag can be included in
the HTML header to cause the document to <span class="high italic">expire</span>.  This will result
in the document being reloaded with each access.  This can be accomplished two
ways.

<ul class="list">


<li class="item"> Use the #modified directive to include an &quot;Expires:
<span class="high italic">timestamp</span>&quot; response header field.  Place the following construct at
the beginning of the SSI document.

<div class="blockof code">&lt;!--#modified expires=&quot;Fri, 13 Jan 1978 14:00:00 GMT&quot; --&gt;
</div>
 An alternative, if the objective to to pre-expire the document, is to
specify an expiry of zero.  The is specially handled by the SSI engine.  It
adds an expiry response header field, plus cache-control header fields to
suppress document caching (on compliant browsers).

<div class="blockof code">&lt;!--#modified expires=&quot;0&quot; --&gt;
</div>

</ul>


<a id="4.4" href="#"></a>
<a id="4.4.directivesyntax" href="#"></a>
<a id="directivesyntax" href="#"></a>
<h2 class="head"><span class="numb">4.4</span><span class="text">Directive Syntax</span></h2>


<p> The syntax follows closely that used by the other implementations, but
some directives are tailored to the WASD and VMS environment. The directive is
enclosed within an HTML comment and takes the form: 

<div class="blockof code">&lt;!--#<span class="high bold">directive</span> [[<span class="high bold">tag1</span>=&quot;<span class="high italic">value</span>&quot;] [<span class="high bold">tag2</span>=&quot;<span class="high italic">value</span>&quot;] ...] --&gt;
</div>

<p> A <span class="high italic">tag</span> provides parameter information to the directive.  A directive may
have zero, one or more parameters.  Values supplied with any tag may be literal
or via variable substitution (see <a class="link" href="env004.html#4.6.variables">4.6 Variables</a>).  A value must be encolosed
by quotation marks if it contains white-space.

<p> A directive <span class="high bold">can be split over multiple lines</span> provided the
new line begins naturally on white-space within the directive.  For example,
this is correctly split

<div class="blockof code">&lt;!--#echo
created[=&quot;&lt;EMPHASIS&gt;(time-format)&quot;] --&gt;
</div>
 while the following is not (and would produce an error)

<div class="blockof code">&lt;!--#echo creat
ed[=&quot;&lt;EMPHASIS&gt;(time-format)&quot;] --&gt;
</div>

<p> Directive and tag keywords are case insensitive.  The tag value may or 
may not be case sensitive, depending upon the command/tag.  Generally the 
effect of a command is to produce additional text to be inserted in the 
document, although it is possible to control the flow of processing in a
document with decision structures.

<a id="4.5" href="#"></a>
<a id="4.5.directives" href="#"></a>
<a id="directives" href="#"></a>
<h2 class="head"><span class="numb">4.5</span><span class="text">Directives</span></h2>

<a id="4.5.0.0.1" href="#"></a>
<a id="4.5.ssidirectives" href="#"></a>
<a id="ssidirectives" href="#"></a>
<h5 class="head"><span class="text">SSI Directives</span></h5>

<table class="tabl">
<tr class="tabr under">
<th class="tabh">Directive
<th class="tabh">Description
<th class="tabh">Section
<tr class="tabr">
<tr class="tabr backlight">
<td class="tabd">#accesses
<td class="tabd">document access count
<td class="tabd"><a class="link" href="env004.html#4.5.1.accesses">4.5.1 #ACCESSES</a>
<tr class="tabr">
<td class="tabd">#config
<td class="tabd">document processing options
<td class="tabd"><a class="link" href="env004.html#4.5.2.config">4.5.2 #CONFIG</a>
<tr class="tabr backlight">
<td class="tabd">#dir
<td class="tabd">directory listing
<td class="tabd"><a class="link" href="env004.html#4.5.3.dir">4.5.3 #DIR</a>
<tr class="tabr">
<td class="tabd">#dcl
<td class="tabd">DCL command processing
<td class="tabd"><a class="link" href="env004.html#4.5.4.dcl">4.5.4 #DCL</a>
<tr class="tabr backlight">
<td class="tabd">#echo
<td class="tabd">output information
<td class="tabd"><a class="link" href="env004.html#4.5.5.echo">4.5.5 #ECHO</a>
<tr class="tabr">
<td class="tabd">#elif
<td class="tabd">flow control
<td class="tabd"><a class="link" href="env004.html#4.5.6.elif">4.5.6 #ELIF</a>
<tr class="tabr backlight">
<td class="tabd">#else
<td class="tabd">flow control
<td class="tabd"><a class="link" href="env004.html#4.5.7.else">4.5.7 #ELSE</a>
<tr class="tabr">
<td class="tabd">#endif
<td class="tabd">flow control
<td class="tabd"><a class="link" href="env004.html#4.5.8.endif">4.5.8 #ENDIF</a>
<tr class="tabr backlight">
<td class="tabd">#exec
<td class="tabd">same as &quot;#dcl&quot;
<td class="tabd"><a class="link" href="env004.html#4.5.9.exec">4.5.9 #EXEC</a>
<tr class="tabr">
<td class="tabd">#exit
<td class="tabd">flow control, stop current document processing
<td class="tabd"><a class="link" href="env004.html#4.5.10.exit">4.5.10 #EXIT</a>
<tr class="tabr backlight">
<td class="tabd">#fcreated
<td class="tabd">output file creation date/time
<td class="tabd"><a class="link" href="env004.html#4.5.11.fcreated">4.5.11 #FCREATED</a>
<tr class="tabr">
<td class="tabd">#flastmod
<td class="tabd">output file last modification date/time
<td class="tabd"><a class="link" href="env004.html#4.5.12.flastmod">4.5.12 #FLASTMOD</a>
<tr class="tabr backlight">
<td class="tabd">#fsize
<td class="tabd">output file size
<td class="tabd"><a class="link" href="env004.html#4.5.13.fsize">4.5.13 #FSIZE</a>
<tr class="tabr">
<td class="tabd">#if
<td class="tabd">flow control
<td class="tabd"><a class="link" href="env004.html#4.5.14.if">4.5.14 #IF</a>
<tr class="tabr backlight">
<td class="tabd">#include
<td class="tabd">include a text file or another SSI document
<td class="tabd"><a class="link" href="env004.html#4.5.15.include">4.5.15 #INCLUDE</a>
<tr class="tabr">
<td class="tabd">#modified
<td class="tabd">HTTP response control
<td class="tabd"><a class="link" href="env004.html#4.5.16.modified">4.5.16 #MODIFIED</a>
<tr class="tabr backlight">
<td class="tabd">#orif
<td class="tabd">flow control
<td class="tabd"><a class="link" href="env004.html#4.5.17.orif">4.5.17 #ORIF</a>
<tr class="tabr">
<td class="tabd">#printenv
<td class="tabd">list document variables
<td class="tabd"><a class="link" href="env004.html#4.5.18.printenv">4.5.18 #PRINTENV</a>
<tr class="tabr backlight">
<td class="tabd">#set
<td class="tabd">assign value to a document variable
<td class="tabd"><a class="link" href="env004.html#4.5.19.set">4.5.19 #SET</a>
<tr class="tabr">
<td class="tabd">#ssi
<td class="tabd">block of SSI statements
<td class="tabd"><a class="link" href="env004.html#4.5.20.ssi">4.5.20 #SSI</a>
<tr class="tabr backlight">
<td class="tabd">#stop
<td class="tabd">stop SSI processing completely
<td class="tabd"><a class="link" href="env004.html#4.5.21.stop">4.5.21 #STOP</a>
</table>

<a id="4.5.1" href="#"></a>
<a id="4.5.1.accesses" href="#"></a>
<a id="accesses" href="#"></a>
<h3 class="head"><span class="numb">4.5.1</span><span class="text">#ACCESSES</span></h3>

<p> The <span class="high italic">#accesses</span> directive allows the number of times the document 
has been accessed to be included.  It does this by creating a counter file in 
the same location and using the same name with a dollar symbol appended to the 
type (extension).  The count may be reset by deleting the file.  This is an 
expensive function (in terms of file system activity) and so should be used 
appropriately.  It can be disabled by server configuration.  Three tags provide 
additional functionality: 

<ul class="list">

<li class="item"> <span class="high bold">ORDINAL</span>

<div class="blockof code">&lt;!--#accesses ordinal --&gt;
</div>

<p> Provides the count as 1st, 2nd, 3rd, 4th, 5th &hellip; 10th, 11th, 12th
&hellip; 120th, 121st, 122nd, etc.

<li class="item"> <span class="high bold">SINCE</span>

<div class="blockof code">&lt;!--#accesses since=&quot;<span class="high italic">text</span>&quot; --&gt;
</div>

<p> This tag includes the specified text immediately after the access count is 
displayed, then adds the creation date of the counter file.

<li class="item"> <span class="high bold">TIMEFMT</span>

<div class="blockof code">&lt;!--#accesses since=&quot;<span class="high italic">text</span>&quot; timefmt=&quot;[<span class="high italic">time-format</span>]&quot; --&gt;
</div>

Allows the time format of the <span class="high italic">since</span> tag to be supplied, where 
<span class="high italic">time-format</span> is specified according to <a class="link" href="env004.html#4.10.timeformat">4.10 Time Format</a>. 

</ul>

<a id="4.5.2" href="#"></a>
<a id="4.5.2.config" href="#"></a>
<a id="config" href="#"></a>
<h3 class="head"><span class="numb">4.5.2</span><span class="text">#CONFIG</span></h3>

<p> The <span class="high italic">#config</span> directive allows time and file size formats to be  specified
for all subsequent directives providing these values.  Optional  specifications
for individual directives may still be made, and override, do  not supercede,
any specification made using a <span class="high italic">config</span> directive.  A  <span class="high italic">config</span> directive may
be made once, or any number of times in a  document, and applies until another
is made, or until the end of the document. 

<ul class="list">

<li class="item"> <span class="high bold">ERRMSG</span>

<div class="blockof code">&lt;!--#config errmsg=&quot;<span class="high italic">string</span>&quot; --&gt;
</div>

<p> This directive allows the error message generated if a problem problem
processing the SSI document occurs (e.g. miss-spelled directive) to be
specified in the document. 

<li class="item"> <span class="high bold">TIMEFMT</span>

<div class="blockof code">&lt;!--#config timefmt=&quot;<span class="high italic">time-format</span>&quot; --&gt;
</div>

Where <span class="high italic">time-format</span> is specified according to<a class="link" href="env004.html#4.10.timeformat">4.10 Time Format</a>.

<li class="item"> <span class="high bold">SIZEFMT</span>

<div class="blockof code">&lt;!--#config sizefmt=&quot;<span class="high italic">size-format</span>&quot; --&gt;
</div>

Where <span class="high italic">size-format</span> is specified using the following keywords:

<ul class="list list0">
<li class="item"> &quot;abbrev&quot; (as bytes, kbytes, Mbytes)
<li class="item"> &quot;blocks&quot; (VMS blocks, used)
<li class="item"> &quot;bytes&quot; (e.g. &quot;1,256,731 bytes&quot;)
</ul>

<li class="item"> <span class="high bold">TRACE</span>

<div class="blockof code">&lt;!--#config trace=&quot;<span class="high italic">1</span>&verbar;<span class="high italic">0</span>&quot;  --&gt;
</div>

<p> Switches document processing trace on or off, intended for use when
debugging more complex or flow-controlled SSI documents.

<p> Output from a trace is colour-coded.

<ul class="list">

<li class="item"> <span class="high bold">Blue &ndash; </span>
As a line is read from the document is is displayed in blue.  The text is
preceded by a square-bracketed source file line number and flow-control level.

<li class="item"> <span class="high bold">Red &ndash; </span>
As an SSI statement is actually processed it is displayed in red. Due to
document parsing this may occur at some point after the line is read from file.

<li class="item"> <span class="high bold">Magenta &ndash; </span>
As variables are set or read the variable name and value is displayed.  A
variable set has the name separated from the value by an equate symbol
(&quot;=&quot;), when being read the character is a full-colon (&quot;:&quot;). 

<li class="item"> <span class="high bold">Black &ndash; </span>
Document (HTML and text) output is displayed as black plain text.

</ul>

<p> The following link provides an example of a
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;trace=on">document trace</a>.

</ul>

<a id="4.5.3" href="#"></a>
<a id="4.5.3.dir" href="#"></a>
<a id="dir" href="#"></a>
<h3 class="head"><span class="numb">4.5.3</span><span class="text">#DIR</span></h3>

<p> The <span class="high italic">#dir</span> directive generates an <span class="high italic">Index of &hellip;</span> directory listing
inside an HTML document.  Apart from not  generating a title (it is up to the
pre-processed document to title, or  otherwise caption, the listing) it
provides all the functionality of the WASD  HTTPd directory listing (see
<a class="link" href="env003.html#3.directorylisting">3. Directory Listing</a>), including query string format control via the
&quot;par=&quot; parameter (note that from the &quot;?httpd=index&quot; introducer used with
directory listings is not necessary from SSI). It is an WASD HTTPd extension to
pre-processed HTML.

<ul class="list">

<li class="item"> <span class="high bold">FILE</span>

<p> Listing specified using a VMS file path. 

<div class="blockof code">&lt;!--#dir file=&quot;<span class="high italic">file-name</span>&quot; [par=&quot;<span class="high italic">server-directive(s)</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Listing specified using URL-style syntax. 

<div class="blockof code">&lt;!--#dir virtual=&quot;<span class="high italic">path</span>&quot; [par=&quot;<span class="high italic">server-directive(s)</span>&quot;] --&gt;
</div>

</ul>

<p> For example:

<div class="blockof code">&lt;!--#dir file=&quot;/wasd_root/src/httpd/&quot; --&gt;

&lt;!--#dir file=&quot;/wasd_root/src/httpd/*.c&quot; par=&quot;layout=UL__S&amp;nops=yes&quot; --&gt;
</div>

<a id="4.5.4" href="#"></a>
<a id="4.5.4.dcl" href="#"></a>
<a id="dcl" href="#"></a>
<h3 class="head"><span class="numb">4.5.4</span><span class="text">#DCL</span></h3>

<p> The <span class="high italic">#dcl</span> directive executes a DCL command and incorporates the output
into the processed document.  It is an WASD HTTPd extension to the more common
<span class="high italic">exec</span> directive, which is also included.

<p> By default, output from the DCL command has all HTML-forbidden characters
(e.g. &quot;&lt;&quot;, &quot;&amp;&quot;) escaped before inclusion in the processed document.  Thus
command output cannot interfere with document  markup, but nor can the DCL
command provide HTML markup.  This behaviour may be changed by appending the
following tag to the directive:

<div class="blockof code">type=&quot;text/html&quot;
</div>

<p> Some <span class="high italic">#dcl</span> directives are for <span class="high italic">privileged</span> documents only, documents
defined as those being owned by the SYSTEM account, and not  being
world-writeable.  The reason for this should be obvious.  There are implicit
security concerns about any document being able to execute any DCL command(s),
even if it is being executed in a completely unprivileged process.  Hence only
<span class="high italic">innocuous</span> commands are allowed in standard documents. 

<ul class="list">

<li class="item"> <span class="high bold">SAY</span>

<p> Execute the DCL &quot;WRITE SYS&dollar;OUTPUT&quot; command, using the  specified parameter. 

<div class="blockof code">&lt;!--#dcl say=&quot;hello.&quot; --&gt;
</div>

<li class="item"> <span class="high bold">SHOW</span>

<p> Execute the DCL &quot;SHOW&quot; command, using the specified parameter. 

<div class="blockof code">&lt;!--#dcl show=&quot;device/full tape1:&quot; --&gt;
</div>

<li class="item"> <span class="high bold">DIR</span>

<p> Execute the DCL &quot;DIRECTORY&quot; command, using the supplied file specification. 
Qualifiers may be included in the optional &quot;par&quot; tag to control the format of
the listing.

<div class="blockof code">&lt;!--#dcl dir=&quot;web:[000000]&quot; --&gt;
&lt;!--#dcl dir=&quot;web:[000000]&quot; par=&quot;/nohead/notrail&quot; --&gt;
&lt;!--#dcl dir=&quot;web:[000000]&quot; par=&quot;/size/date&quot; --&gt;
</div>

<li class="item"> <span class="high bold">EXEC</span> (privileged)

<p> Execute the specified DCL command.

<div class="blockof code">&lt;!--#dcl exec=&quot;show device/full tape1:&quot; --&gt;
</div>

<li class="item"> <span class="high bold">FILE</span> (privileged)

<p> Execute the DCL command procedure specified as a VMS file path, with any 
specified parameters applied to the procedure. 

<div class="blockof code">&lt;!--#dcl file=&quot;WASD_ROOT:[SHTML]TEST.COM&quot; par=&quot;PARAM1 PARAM2&quot; --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span> (privileged)

<p> Execute the DCL command procedure specified in URL-style syntax, with any 
specified parameters applied to the procedure. 

<div class="blockof code">&lt;!--#dcl virtual=&quot;../shtml/test.com&quot; par=&quot;PARAM1 PARAM2&quot; --&gt;
</div>

<li class="item"> <span class="high bold">CGI</span>

<p> Execute the specified CGI script.  The CGI response header is suppressed and
only the response body is included in the document.

<div class="blockof code">&lt;!--#dcl cgi=&quot;/cgi-bin/calendar?2004&quot; --&gt;
</div>

</ul>

<a id="4.5.5" href="#"></a>
<a id="4.5.5.echo" href="#"></a>
<a id="echo" href="#"></a>
<h3 class="head"><span class="numb">4.5.5</span><span class="text">#ECHO</span></h3>

<p> The <span class="high italic">#echo</span> directive incorporates the specified information into the
processed document. Multiple tags may be used within the one directive.

<ul class="list">

<li class="item"> <span class="high bold">VALUE=</span>
<br><span class="high bold">VAR=</span>

<p> Any SSI variable (e.g. CREATED), CGI variable (e.g. HTTP_USER_AGENT),
or document assigned variable (e.g. EXAMPLE1), see <a class="link" href="env004.html#4.6.variables">4.6 Variables</a>.

<div class="blockof code">&lt;!--#echo value={created} var={example1} --&gt;
</div>

<li class="item"> <span class="high bold">CREATED</span>

<p> The date/time of the current document's creation.

<div class="blockof code">&lt;!--#echo created[=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">DATE_LOCAL</span>

<p> Include the current date/time.

<div class="blockof code">&lt;!--#echo date_local[=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">DATE_GMT</span>

<p> Include the current Greenwich Mean Time (UTC) date/time.

<div class="blockof code">&lt;!--#echo date_gmt[=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">DOCUMENT_NAME</span>

<p> The current document's URL-style path.

<div class="blockof code">&lt;!--#echo document_name --&gt;
</div>

<li class="item"> <span class="high bold">FILE_NAME</span>

<p> The current document's VMS file path.

<div class="blockof code">&lt;!--#echo file_name --&gt;
</div>

<li class="item"> <span class="high bold">HEADER</span>

<p> Append the specified string to the response header (with correct carriage
control).  Should be used as early as possible in the SSI document.

<div class="blockof code">&lt;!--#echo header=&quot;Pragma: no-cache&quot; --&gt;
&lt;!--#echo header=&quot;X-Extension-Header: just an example!&quot; --&gt;
</div>

<li class="item"> <span class="high bold">LAST_MODIFIED</span>

<p> The date/time of the current document's last modification.

<div class="blockof code">&lt;!--#echo last_modified[=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

</ul>

<a id="4.5.6" href="#"></a>
<a id="4.5.6.elif" href="#"></a>
<a id="elif" href="#"></a>
<h3 class="head"><span class="numb">4.5.6</span><span class="text">#ELIF</span></h3>

<p> The <span class="high italic">#elif</span> directive (else-if) allows blocks of HTML markup and SSI
directives to be conditionally processed, see <a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a> and
<a class="link" href="env004.html#4.5.14.if">4.5.14 #IF</a>.  This directive effectively allows a <span class="high italic">case</span> statement to be
constructed.

<div class="blockof code">&lt;!--#elif var=&quot;[<span class="high italic">variable}</span>&verbar;<span class="high italic">literal</span>&quot; --&gt;
</div>
 
<a id="4.5.7" href="#"></a>
<a id="4.5.7.else" href="#"></a>
<a id="else" href="#"></a>
<h3 class="head"><span class="numb">4.5.7</span><span class="text">#ELSE</span></h3>

<p> The <span class="high italic">#else</span> directive allows blocks of HTML markup and SSI directives to be
conditionally processed, see <a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a>.  It is the default block
after an &quot;#if&quot;, &quot;#orif&quot; or &quot;#elif&quot;.

<div class="blockof code">&lt;!--#else --&gt;
</div>
 
<a id="4.5.8" href="#"></a>
<a id="4.5.8.endif" href="#"></a>
<a id="endif" href="#"></a>
<h3 class="head"><span class="numb">4.5.8</span><span class="text">#ENDIF</span></h3>

<p> The <span class="high italic">#endif</span> directive marks the end of a block of document text
being conditionally processed, see <a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a>.

<div class="blockof code">&lt;!--#endif --&gt;
</div>

<a id="4.5.9" href="#"></a>
<a id="4.5.9.exec" href="#"></a>
<a id="exec" href="#"></a>
<h3 class="head"><span class="numb">4.5.9</span><span class="text">#EXEC</span></h3>

<p> The <span class="high italic">#exec</span> directive executes a DCL command and incorporates the  output
into the processed document.  It is the VMS equivalent of the  <span class="high italic">exec</span> shell
directive of some Unix implementations.  It is  implemented in the same way as
the #DCL directive, and so the general detail  of that directive applies.  It
supports both the <span class="high italic">cmd</span> tag and the  <span class="high italic">cgi</span> tag, allowing execution of CGI
scripts (the response header is absorbed).

<div class="blockof code">&lt;!--#exec cmd=&quot;show device/full tape1:&quot; --&gt;
&lt;!--#exec cgi=&quot;/cgi-bin/calendar?2004&quot; --&gt;
</div>

<p> The <span class="high italic">#exec</span> directive is for <span class="high italic">privileged</span> documents only, documents
defined as those being owned by the SYSTEM account, and not being
world-writeable.  The reason for this should be obvious.  There are implicit
security concerns about any document being able to execute any DCL command(s),
even if it is being executed in a completely unprivileged process. 
 
<a id="4.5.10" href="#"></a>
<a id="4.5.10.exit" href="#"></a>
<a id="exit" href="#"></a>
<h3 class="head"><span class="numb">4.5.10</span><span class="text">#EXIT</span></h3>

<p> The <span class="high italic">#exit</span> directive causes the server to stop processing the current SSI
file.  If the current file was an #included SSI file, processing continues back
with the parent file.  Note that the <span class="high italic">#stop</span> directive also is available, it
stops processing of the entire virtual document.

<div class="blockof code">&lt;!--#exit --&gt;
</div>
 
<a id="4.5.11" href="#"></a>
<a id="4.5.11.fcreated" href="#"></a>
<a id="fcreated" href="#"></a>
<h3 class="head"><span class="numb">4.5.11</span><span class="text">#FCREATED</span></h3>

<p> The <span class="high italic">#fcreated</span> directive incorporates the creation date/time of a
specified file/document into the processed document. 

<ul class="list">

<li class="item"> <span class="high bold">FILE</span>

<p> Document specified using a VMS file path. 

<div class="blockof code">&lt;!--#fcreated file=&quot;<span class="high italic">file-name</span>&quot; [fmt=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Document specified using URL-style syntax. 

<div class="blockof code">&lt;!--#fcreated virtual=&quot;<span class="high italic">path</span>&quot; [fmt=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

</ul>

<a id="4.5.12" href="#"></a>
<a id="4.5.12.flastmod" href="#"></a>
<a id="flastmod" href="#"></a>
<h3 class="head"><span class="numb">4.5.12</span><span class="text">#FLASTMOD</span></h3>

<p> The <span class="high italic">#flastmod</span> directive incorporates the last modification 
date/time of a specified file/document into the processed document. 

<ul class="list">


<li class="item"> <span class="high bold">FILE</span>

<p> Document specified using a VMS file path. 

<div class="blockof code">&lt;!--#flastmod file=&quot;<span class="high italic">file-name</span>&quot; [fmt=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Document specified using URL-style syntax. 

<div class="blockof code">&lt;!--#flastmod virtual=&quot;<span class="high italic">path</span>&quot; [fmt=&quot;<span class="high italic">time-format</span>&quot;] --&gt;
</div>

</ul>

<a id="4.5.13" href="#"></a>
<a id="4.5.13.fsize" href="#"></a>
<a id="fsize" href="#"></a>
<h3 class="head"><span class="numb">4.5.13</span><span class="text">#FSIZE</span></h3>

<p> The <span class="high italic">#fsize</span> directive incorporates the size, in bytes, kbytes or 
Mbytes, of a specified file/document into the processed document. 

<ul class="list">

<li class="item"> <span class="high bold">FILE</span>

<p> Document specified using a VMS file path.

<div class="blockof code">&lt;!--#fsize file=&quot;<span class="high italic">file-name</span>&quot; [fmt=&quot;<span class="high italic">size-format</span>&quot;] --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Document specified using URL-style syntax.

<div class="blockof code">&lt;!--#fsize virtual=&quot;<span class="high italic">path</span>&quot; [fmt=&quot;<span class="high italic">size-format</span>&quot;] --&gt;
</div>

</ul>

<a id="4.5.14" href="#"></a>
<a id="4.5.14.if" href="#"></a>
<a id="if" href="#"></a>
<h3 class="head"><span class="numb">4.5.14</span><span class="text">#IF</span></h3>

<p> The <span class="high italic">#if</span> directive allows blocks of HTML markup and SSI directives to be
conditionally processed, see <a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a>.

<ul class="list">

<li class="item"> <span class="high bold">VAR=</span>

<p> Variable the decision will be based upon.

<div class="blockof code">&lt;!--#if var=&quot;[<span class="high italic">variable}</span>&verbar;<span class="high italic">literal</span>]&quot; --&gt;
</div>

<li class="item"> <span class="high bold">EQS=</span>

<p> Is the string the same as in the variable?

<li class="item"> <span class="high bold">EQ=</span>

<p> If the variable is a number is it the same as this?

<li class="item"> <span class="high bold">GT=</span>

<p> If the variable is a number is it greater than this?

<li class="item"> <span class="high bold">LT=</span>

<p> If the variable is a number is it less than this?

<li class="item"> <span class="high bold">SRCH=</span>

<p> Search the variable for this string.  May contain the <span class="high monosp">*</span> (asterisk)
wildcard, matching one or more characters, and the <span class="high bold">%</span> (percentage), matching
any single character.

</ul>

<p> As in the following examples:

<div class="blockof code">&lt;!--#if value={DOCUMENT_URI} eqs=&quot;/wasd_root/doc/env/xssi.shtml&quot; --&gt;
&lt;!--#if value={COUNT} lt=10 --&gt;
&lt;!--#if value=&quot;This is a test!&quot; eqs={STRING} --&gt;
&lt;!--#if value={PATH_INFO} srch=&quot;*/env/*&quot; --&gt;
</div>
 
<a id="4.5.15" href="#"></a>
<a id="4.5.15.include" href="#"></a>
<a id="include" href="#"></a>
<h3 class="head"><span class="numb">4.5.15</span><span class="text">#INCLUDE</span></h3>

<p> The <span class="high italic">#include</span> directive incorporates the contents of a specified 
file/document into the processed document.

<ul class="list">

<li class="item"> <span class="high bold">FILE</span>

<p> Include the contents of the document specified using a VMS file
specification.

<div class="blockof code">&lt;!--#include file=&quot;<span class="high italic">file-name</span>&quot; --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Include the contents of the document specified using URL-style syntax.

<div class="blockof code">&lt;!--#include virtual=&quot;<span class="high italic">path</span>&quot; --&gt;
</div>

</ul>

<p> The contents of the specified file are included differently depending on the
MIME content-type of the file.  Files of <span class="high italic">text/html</span> content-type (HTML
documents) are included directly, and any HTML tags within them contribute to
the markup of the document.  Files of <span class="high italic">text/plain</span> content-type (plain-text
documents) are encapsulated in &quot;&lt;pre&gt;&lt;/pre&gt;&quot; tags and have all HTML-forbidden
characters (e.g. &quot;&lt;&quot;, &quot;&amp;&quot;) escaped before inclusion in the processed document. 
An HTML file can be forced to be included as plain-text by using the following
syntax:

<div class="blockof code">&lt;!--#include virtual=&quot;example.html&quot; type=&quot;text/plain&quot; --&gt;
</div>

<p> To &quot;force&quot; a file to be considered as text regardless of the actual content
(as determined by the server from the file type), use on of the following
depending on whether it should be rendered as plain or HTML text.

<div class="blockof code">&lt;!--#include virtual=&quot;example.html&quot; content=&quot;text/plain&quot; --&gt;
&lt;!--#include virtual=&quot;example.html&quot; content=&quot;text/html&quot; --&gt;
</div>

<p> Other SSI files may be included and their content dynamically included in
the resulting document.  To prevent a recursive inclusion of documents the
nesting level of SSI documents is limited to five.
 
<a id="4.5.16" href="#"></a>
<a id="4.5.16.modified" href="#"></a>
<a id="modified" href="#"></a>
<h3 class="head"><span class="numb">4.5.16</span><span class="text">#MODIFIED</span></h3>

<p> The <span class="high italic">#modified</span> directive allows a document author to control the
&quot;Last-Modified:&quot;/&quot;If-Modified-Since:&quot;/&quot;304 Not modified&quot; behaviour of an SSI
document.  See <a class="link" href="env004.html#4.1.virtualdocuments">4.1 Virtual Documents</a>.

<ul class="list">

<li class="item"> <span class="high bold italic">no tag</span>

<p> Get the last-modified date/time of the current document.

<div class="blockof code">&lt;!--#modified --&gt;
</div>

<li class="item"> <span class="high bold">FILE</span>

<p> Get the last-modified date/time of the document specified using VMS file
specification.

<div class="blockof code">&lt;!--#modified file=&quot;<span class="high italic">file-name</span>&quot; --&gt;
</div>

<li class="item"> <span class="high bold">VIRTUAL</span>

<p> Get the last-modified date/time of the document specified using URL-style
syntax.

<div class="blockof code">&lt;!--#modified virtual=&quot;<span class="high italic">path</span>&quot; --&gt;
</div>

<li class="item"> <span class="high bold">IF-MODIFIED-SINCE</span>

<p> Compares any &quot;If-Modified-Since:&quot; request header timestamp to the revision
date time obtained using <span class="high italic">file</span> or <span class="high italic">virtual</span> (most recent if multiple).  If
the document timestamp is more recent (has been modified) an appropriate
&quot;Last-Modified&quot; response header field is generated and added to the response,
and document processing continues.  If it has not been modified a &quot;304&quot;
response header is return (document not modified) and document processing
stops.

<div class="blockof code">&lt;!--#modified if-modified-since --&gt;
</div>

<li class="item"> <span class="high bold">LAST-MODIFIED</span>
<p> Adds a &quot;Last-Modified:&quot; response header field using a timestamp retrieved
using <span class="high italic">file</span> or <span class="high italic">virtual</span> (note: unnecessary if the <span class="high italic">if-modified-since</span> tag
is used).

<div class="blockof code">&lt;!--#modified last-modified --&gt;
</div>

<li class="item"> <span class="high bold">EXPIRES</span>

<p> Adds a &quot;Expires:&quot; response header field.  The string literal should be a legitimate RFC-1123 date string.  This can be
used for pre-expiring documents (so they are always reloaded), set it to a date
in the not-too-distant past (as in the example below). Of course it could also
be used for setting the legitimate future expiry of documents.

<div class="blockof code">&lt;!--#modified expires=&quot;Fri, 13 Jan 1978 14:00:00 GMT&quot; --&gt;
</div>

</ul>

<a id="4.5.17" href="#"></a>
<a id="4.5.17.orif" href="#"></a>
<a id="orif" href="#"></a>
<h3 class="head"><span class="numb">4.5.17</span><span class="text">#ORIF</span></h3>

<p> The <span class="high italic">#orif</span> directive (or-if) allows blocks of HTML markup and SSI
directives to be conditionally processed, see <a class="link" href="env004.html#4.7.flowcontrol">4.7 Flow Control</a> and
<a class="link" href="env004.html#4.5.14.if">4.5.14 #IF</a>.  In the absence of any real expression parser this directive allows
a block to be processed if one of multiple conditions are met.

<div class="blockof code">&lt;!--#orif var=&quot;[<span class="high italic">variable}</span>&verbar;<span class="high italic">literal</span>&quot; --&gt;
</div>
 
<a id="4.5.18" href="#"></a>
<a id="4.5.18.printenv" href="#"></a>
<a id="printenv" href="#"></a>
<h3 class="head"><span class="numb">4.5.18</span><span class="text">#PRINTENV</span></h3>

<p> The <span class="high italic">#printenv</span> directive prints a plain-text list of all SSI-specific,
then CGI, then document-assigned variables (see <a class="link" href="env004.html#4.6.variables">4.6 Variables</a>). This
directive is intended for use when debugging flow-controlled SSI documents.

<div class="blockof code">&lt;!--#printenv --&gt;
</div>

<p> The following link uses the example SSI document
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;text=plain">WASD_ROOT:[WASDOC.ENV]XSSI.SHTML</a> to
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">demonstrate</a> this.

<a id="4.5.19" href="#"></a>
<a id="4.5.19.set" href="#"></a>
<a id="set" href="#"></a>
<h3 class="head"><span class="numb">4.5.19</span><span class="text">#SET</span></h3>

<p> The <span class="high italic">#set</span> directive allows a user variable to be assigned or modified,
see <a class="link" href="env004.html#4.6.variables">4.6 Variables</a>.

<div class="blockof code">&lt;!--#set var=&quot;<span class="high italic">variable-name</span>&quot; value=&quot;<span class="high italic">whatever</span>&quot; --&gt;
</div>

<p> Variables are always stored as strings and have a finite but generally
usable length.  Some comparison tags provided in the flow-control directives
treat the contents of variables as numbers.  A numeric conversion is done at
evaluation time.
 
<a id="4.5.20" href="#"></a>
<a id="4.5.20.ssi" href="#"></a>
<a id="ssi" href="#"></a>
<h3 class="head"><span class="numb">4.5.20</span><span class="text">#SSI</span></h3>

<p> The <span class="high italic">#ssi</span> directive allows multiple SSI directives to be used without the
requirement to enclose them in the normal HTML comment tags (i.e. &lt;!-- --&gt;).
This helps reduce the clutter in an SSI document that uses the extended
capabilities of variable assignment and flow control. Document HTML cannot be
included between the opening and closing comment elements of the &quot;#ssi&quot; tag,
although of course document output can be generated using the &quot;#echo&quot; tag.

<div class="blockof code">&lt;!--#ssi
#set var=HOUR value={DATE_LOCAL,12,2}
#if var={HOUR} lt=12
  #set var=GREETING value=&quot;Good morning&quot;
#elif var={HOUR} lt=19
  #set var=GREETING value=&quot;Good afternoon&quot;
#else
  #set var=GREETING value=&quot;Good evening&quot;
#endif
--&gt;
</div>

<p> The example SSI document
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;text=plain">WASD_ROOT:[WASDOC.ENV]XSSI.SHTML</a> will
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">demonstrate</a> this concept.

<a id="4.5.21" href="#"></a>
<a id="4.5.21.stop" href="#"></a>
<a id="stop" href="#"></a>
<h3 class="head"><span class="numb">4.5.21</span><span class="text">#STOP</span></h3>

<p> The <span class="high italic">#stop</span> directive causes the server to stop processing the virtual
document.  It can be used with flow control structures to conditionally process
only part of a virtual document.  Note that the <span class="high italic">#exit</span> directive also is
available, it stops processing of the current file (for nested #includes,
etc.). 

<div class="blockof code">&lt;!--#stop --&gt;
</div>
 
<a id="4.6" href="#"></a>
<a id="4.6.variables" href="#"></a>
<a id="variables" href="#"></a>
<h2 class="head"><span class="numb">4.6</span><span class="text">Variables</span></h2>

<p> The SSI processor maintains information about the server, date and time,
request path, request parameters, etc., accessible via <span class="high italic">variable name</span>.
Although these <span class="high italic">server variables</span> cannot be modified by the document the
processor also allows the author to create and assign new <span class="high italic">document variables</span>
by name.  SSI variables have global scope, with a small number of exceptions
listed below.  That is, the same set of variables are shared with the parent
document by any other SSI documents <span class="high italic">#included</span>, and any included by those,
etc.

<p> Local variables:

<ul class="list list0">
<li class="item"> DOCUMENT_DEPTH &ndash; the current nesting level for #included SSI files
<li class="item"> PARENT_FILE_NAME &ndash; if an #included SSI file the name of the including file
<li class="item">THIS_FILE_NAME &ndash; the name of the SSI file currently being processed
</ul>

<p> One other special-purpose variable, THE_FILE_NAME, see <a class="link" href="env004.html#4.9.1.thefilename">4.9.1 THE_FILE_NAME</a>.

<p> Server assigned variables comprise some SSI-specific as well as the same
CGI variables available to CGI scripts. These may be found listed in the
<a class="link blank" target="_blank" href="../scripting/#cgivariables">CGI Variables</a> in <a class="link blank" target="_blank" href="../scripting/#0.">WASD Scripting</a> document.

&lt;P&gt; The following link provides a list of the
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;printenv=yes">SSI and CGI variables</a> available to SSI documents.

<p> Whenever a directive uses information from a tag (see <a class="link" href="env004.html#4.4.directivesyntax">4.4 Directive Syntax</a>) values from variables may be substituted as as a whole or partial
value.  This is done using curly braces to delimit the variable name.  For
example

<div class="blockof code">&lt;!--#include virtual={FILENAME} --&gt;
</div>

would include the file named by the contents of a variable named &quot;FILENAME&quot;.
When using a variable in a tag it is not necessary to enclose the tag parameter
in quotation marks unless there is additional literal text.  Variables may also
be used within literal strings, producing a compound, resultant string, as in
the following example

<div class="blockof code">&lt;!--#echo var=&quot;Hello {REMOTE_HOST}, time here is {LOCAL_TIME}&quot; --&gt;
</div>

<p> Variables are considered numeric when they begin with a digit.  Those
beginning with an alphabetic are considered to have a numeric value of zero.

<p> Variables are considered to be boolean <span class="high italic">false</span> if empty and <span class="high italic">true</span> when
not empty.

<a id="4.6.0.0.1" href="#"></a>
<a id="4.6.substrings" href="#"></a>
<a id="substrings" href="#"></a>
<h5 class="head"><span class="text">Substrings</span></h5>

<p> It is also possible to extract substrings from variables using the following
syntax,

<div class="blockof code">{<span class="high italic">variable-name</span>,<span class="high italic">start-index</span>,<span class="high italic">count</span>}
</div>

<p> where the start-index begins with the zeroth character and numbers up to
the last character in the string, and count may be zero or any positive number.
If only one number is supplied it is regarded as a count and the string is
extracted from the zeroth character.

<p> To illustrate,

<div class="blockof code">&lt;!--#set var=EXAMPLE value=&quot;This is an example!&quot; --&gt;
&lt;!--#echo &quot;{EXAMPLE,2}at was {EXAMPLE,8,999}&quot; --&gt;
</div>

<p> would output

<div class="blockof code">That was an example!
</div>

<a id="4.6.0.0.2" href="#"></a>
<a id="4.6.otherquotfunctionsquot" href="#"></a>
<a id="otherquotfunctionsquot" href="#"></a>
<h5 class="head"><span class="text">Other &quot;Functions&quot;</span></h5>

<ul class="list">

<li class="item"> <span class="high bold">LENGTH - </span> This &quot;function&quot; returns the length of the parameter string
(or substring).

<div class="blockof code">{<span class="high italic">variable-name</span>[,<span class="high italic">start-index</span>],<span class="high italic">count</span>]],length}
</div>

<p> For example

<div class="blockof code">&lt;!--#set var=EXAMPLE value=&quot;This is an example!&quot; --&gt;
&lt;!--#echo &quot;\&quot;{EXAMPLE}\&quot; is {EXAMPLE,length} characters long.&quot; --&gt;
&lt;!--#echo &quot;\&quot;{EXAMPLE,5,2}\&quot; is {EXAMPLE,5,2,length} characters long!&quot; --&gt;
</div>

<p> would output

<div class="blockof code">&quot;This is an example!&quot; is 19 characters long.
&quot;is&quot; is 2 characters long!
</div>

<li class="item"> <span class="high bold">EXISTS &ndash; </span> This &quot;function&quot; returns <span class="high italic">true</span> if the variable exists and
<span class="high italic">false</span> if it does not.  This is useful as accessing a non-existant variable
will result in an SSI error message with document processing ceasing!

<div class="blockof code">var={<span class="high italic">variable-name</span>,exists}
</div>

<p> For example

<div class="blockof code">&lt;!--#set var=BOGUS_VARIABLE value=&quot;irrelevant&quot; --&gt;
&lt;!--#if var={BOGUS_VARIABLE,exists} --&gt;
&amp;quot;BOGUS_VARIABLE&amp;quot; exists!
&lt;!--#else --&gt;
&amp;quot;BOGUS_VARIABLE&amp;quot; does NOT exist!
&lt;!--#endif --&gt;
</div>

</ul>

<p> The example SSI document
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;text=plain">WASD_ROOT:[WASDOC.ENV]XSSI.SHTML</a> can
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">demonstrate</a> these concepts.
 
<a id="4.7" href="#"></a>
<a id="4.7.flowcontrol" href="#"></a>
<a id="flowcontrol" href="#"></a>
<h2 class="head"><span class="numb">4.7</span><span class="text">Flow Control</span></h2>

<p> WASD SSI allows blocks of document to be conditionally processed. This
uses constructs in a similar way to any programming language.  The emphasis
has been on simplicity and speed of processing.  No complex expression parser
is provided.  Despite this, complex document constructs can be implemented.
Flow control structures may be nested up to eight levels.

<ul class="list">

<li class="item"> <span class="high bold">#if &ndash; </span>
Marks the start of a conditionally processed block.  If evaluated true the
block is processed.

<li class="item"> <span class="high bold">#orif &ndash; </span>
Allows a document block to be
processed if one of multiple conditions are met. Must be used immediately
following a &quot;#if&quot; or &quot;elif&quot;. (This is the only really
WASD-idiosyncratic element)

<li class="item"> <span class="high bold">#elif &ndash; </span>
Allows a series of conditionals to be tested each with its own document block
available for processing.  Allows a type of case statement to be constructed.

<li class="item"> <span class="high bold">#else &ndash; </span>
Provides a default document block following unsuccessful &quot;#if&quot;,
&quot;orif&quot; and &quot;elif&quot; testing and consequent non-processed blocks.

<li class="item"> <span class="high bold">#endif &ndash; </span>
Terminates a conditional block.

</ul>

<p> The &quot;#if&quot;, &quot;#orif&quot; and &quot;#elif&quot; directives must provide an evaluation. This
can be single variable, which if numeric and non-zero is considered true, if
zero if false, or can be a string, which if empty is false, and if not empty is
true.  Tests can be made against the variable which when evaluated return a
true or false.  Multiple tests may be made against the one variable, or against
more than one variable.  Multiple tests act as a logical AND of the results and
terminate when the first fails.

<ul class="list">

<li class="item"> <span class="high bold">eqs &ndash; </span>
If the supplied string is the same as the variable string.

<li class="item"> <span class="high bold">srch &ndash; </span>
If the variable string matches the supplied search string. The search string
may contain the <span class="high monosp">*</span> (asterisk), matching any zero or more characters, and
<span class="high monosp">%</span> (percentage), matching any one character.

<li class="item"> <span class="high bold">eq &ndash; </span>
If the numeric value of the variable is the same as that of the supplied
number.  For a numeric value test to be legitimate both values must begin with
a digit.  Those beginning with an alphabetic are considered zero.

<li class="item"> <span class="high bold">lt &ndash; </span>
If the numeric value of the variable is less than that of the supplied number.

<li class="item"> <span class="high bold">gt &ndash; </span>
If the numeric value of the variable is greater than that of the supplied
number.

</ul>

<p> Any evaluation can have the result negated by prefixing it with an
exclamation point.  For instance, the first of these examples would produce a
<span class="high italic">false</span> result, the second <span class="high italic">true</span>.

<div class="blockof code">&lt;!--#if value=&quot;test&quot; !eqs=&quot;test&quot; --&gt;
&lt;!--#if value=20 !lt=10 --&gt;
</div>

<p> The following is a simple example illustration of variable setting, use
of variable substrings, and conditional processing of document blocks.

<div class="blockof code">&lt;!--##config trace=1 --&gt;
&lt;HTML&gt;
&lt;!--#set var=HOUR value={DATE_LOCAL,12,5} --&gt;
&lt;!--#if var={HOUR} lt=12 --&gt;
&lt;!--#set var=GREETING value=&quot;Good morning&quot; --&gt;
&lt;!--#elif var={HOUR} lt=19 --&gt;
&lt;!--#set var=GREETING value=&quot;Good afternoon&quot; --&gt;
&lt;!--#else --&gt;
&lt;!--#set var=GREETING value=&quot;Good evening&quot; --&gt;
&lt;!--#endif --&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;&lt;!--#echo var={GREETING} --&gt;
&lt;!--#echo var=&quot;{REMOTE_HOST}!&quot; --&gt;&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;H1&gt;Simple XSSI Demonstration&lt;/H1&gt;
&lt;!--#echo var={GREETING} --&gt; &lt;!--#echo var={REMOTE_HOST} --&gt;,
the time here is &lt;!--#echo var={DATE_LOCAL,12,5} --&gt;.
&lt;!--#if var={REMOTE_HOST} eqs={REMOTE_ADDR} --&gt;
(Sorry, I do not know your name, DNS lookup must be disabled!)
&lt;!--#endif --&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</div>

<p> The example SSI document
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;text=plain">WASD_ROOT:[WASDOC.ENV]XSSI.SHTML</a> further
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">illustrates</a> these concepts.
 
<a id="4.8" href="#"></a>
<a id="4.8.querystrings" href="#"></a>
<a id="querystrings" href="#"></a>
<h2 class="head"><span class="numb">4.8</span><span class="text">Query Strings</span></h2>

<p> A query string may be passed to an SSI document in much the same way as to
a CGI script. In this way the behaviour of the document can be varied in
accordance to information explicitly passed to it when accessed. To prevent
the server's default query engine being given the request precede any query
string with &quot;?httpd=ssi&quot;. The server detects this and passes the
request instead to the SSI processor. Just append the desired query string
components to this as if they were form elements. For example:

<div class="blockof code">?httpd=ssi&amp;printenv=no
?httpd=ssi&amp;printenv=yes
?httpd=ssi&amp;trace=yes&amp;test2=one&amp;test2=two&amp;test3=three
</div>

<p> The following link uses the example SSI document
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml?httpd=ssi&amp;text=plain">WASD_ROOT:[WASDOC.ENV]XSSI.SHTML</a> to
<a class="link blank" target="_blank" href="/wasd_root/wasdoc/env/xssi.shtml">demonstrate</a>
this. Look for the &lt;QUOTE&gt;(FORM_TEST1=one), etc.

<a id="4.9" href="#"></a>
<a id="4.9.fileandvirtualspecifications" href="#"></a>
<a id="fileandvirtualspecifications" href="#"></a>
<h2 class="head"><span class="numb">4.9</span><span class="text">File and Virtual Specifications</span></h2>

<p> Documents may be specified using either the &quot;FILE&quot; or &quot;VIRTUAL&quot; tags.

<p> The &quot;FILE&quot; tag expects an absolute VMS file specification.

<p> The &quot;VIRTUAL&quot; tag expects an URL-style path to a document.  This can be an
absolute or relative path.  See <a class="link" href="env002.html#2.3.documentspecification">2.3 Document Specification</a> for further
details.

<a id="4.9.1" href="#"></a>
<a id="4.9.1.thefilename" href="#"></a>
<a id="thefilename" href="#"></a>
<h3 class="head"><span class="numb">4.9.1</span><span class="text">THE_FILE_NAME</span></h3>

<p> Generally, when an error are encountered document processing halts and
and an error report is generated.  For some common circumstances, in particular
the existance or not of a particular file, may require an alternative action. 
For file activities (e.g. #include, #flastmod, #created, #fsize) the optional
fmt=&quot;&quot; tag provides some measure of control on error behaviour.  If the format
string begins with a &quot;?&quot; files not found are not reported as errors and
processing continues.  Other file systems errors, such as directory not found,
syntax errors, etc., are always reported.

<p> Every time a file is accessed (e.g. #include, #flastmod) the server
variable THE_FILE_NAME gets set to that name if successful, or reset to empty
if unsuccessful.  This variable can be checked to determine success or
otherwise.

<ul class="list">

<li class="item"> For #included files, the 'fmt=&quot;?&quot;' just suppresses an error report, if
the file exists then it is included.

<li class="item"> For #modified file specifications use 'fmt=&quot;?&quot;' to suppress error
reporting on evaluation of files that may exist but are not mandatory.

<li class="item"> For file statistic directives (e.g. #flastmod, #fcreated, #fsize) the
'fmt=&quot;?&quot;' tag completely suppresses all output as well as error reporting. 
This can be used to check for the existance of a file.  For example if the file
TEST.TXT exists in the following example the variable THE_FILE_NAME would
contain the full file name, if it does not exist it would be empty, and the
code example would behave accordingly.

<div class="blockof code">&lt;!--#fcreated virtual=&quot;TEST.TXT&quot; fmt=&quot;?&quot; --&gt;
&lt;!--#if var={THE_FILE_NAME} eqs=&quot;&quot; --&gt;
File does not exist!
&lt;!--#else --&gt;
File exists!
&lt;!--#endif --&gt;
</div>

</ul>

<a id="4.10" href="#"></a>
<a id="4.10.timeformat" href="#"></a>
<a id="timeformat" href="#"></a>
<h2 class="head"><span class="numb">4.10</span><span class="text">Time Format</span></h2>

<p> Whenever a time directive is used an optional tag can be included to
specify the format of the output.  The default looks a little VMS-ish.  If a
format specification is made it must confirm to the C programming language
function <span class="high italic">strftime()</span>.

<p> The format specifier follows a similar syntax to the C standard library
<span class="high italic">printf()</span> family of functions, where conversion specifiers are introduced by
percentage symbols.  Here are some example uses:

<div class="blockof code">The date is &lt;!--#echo date_local fmt=&quot;%d/%m/%y&quot; --&gt;.
The time is &lt;!--#echo date_local fmt=&quot;%r&quot; --&gt;.
The day-of-the-week is &lt;!--#echo date_local fmt=&quot;%A&quot; --&gt;.
</div>

<p> A problem with any supplied time formatting specification will be reported.

<p> The following table provides the general conversion specifiers.  For further
information on the formatting process refer to a C programming library document
on the <span class="high italic">strftime()</span> function.

<a id="4.10.0.0.1" href="#"></a>
<a id="4.10.strftimeformatdirectives" href="#"></a>
<a id="strftimeformatdirectives" href="#"></a>
<h5 class="head"><span class="text">strftime() Format Directives</span></h5>

<table class="tabl">
<tr class="tabr under">
<th class="tabh">Specifier
<th class="tabh">Replaced by
<tr class="tabr">
<tr class="tabr backlight">
<td class="tabd">a
<td class="tabd">The locale's abbreviated weekday name
<tr class="tabr">
<td class="tabd">A
<td class="tabd">The locale's full weekday name
<tr class="tabr backlight">
<td class="tabd">b
<td class="tabd">The locale's abbreviated month name
<tr class="tabr">
<td class="tabd">B
<td class="tabd">The locale's full month name
<tr class="tabr backlight">
<td class="tabd">c
<td class="tabd">The locale's appropriate date and time representation
<tr class="tabr">
<td class="tabd">C
<td class="tabd">The century number (the year divided by 100 and truncated
to an integer) as a decimal number (00 - 99)
<tr class="tabr backlight">
<td class="tabd">d
<td class="tabd">The day of the month as a decimal number (01 - 31)
<tr class="tabr">
<td class="tabd">D
<td class="tabd">Same as %m/%d/%y
<tr class="tabr backlight">
<td class="tabd">e
<td class="tabd">The day of the month as a decimal number (1 - 31) in a
2 digit field with the leading space character fill
<tr class="tabr">
<td class="tabd">Ec
<td class="tabd">The locale's alternative date and time representation
<tr class="tabr backlight">
<td class="tabd">EC
<td class="tabd">The name of the base year (period) in the locale's
alternative representation
<tr class="tabr">
<td class="tabd">Ex
<td class="tabd">The locale's alternative date representation
<tr class="tabr backlight">
<td class="tabd">EX
<td class="tabd">The locale's alternative time representation
<tr class="tabr">
<td class="tabd">Ey
<td class="tabd">The offset from the base year (%EC) in the locale's
alternative representation
<tr class="tabr backlight">
<td class="tabd">EY
<td class="tabd">The locale's full alternative year representation
<tr class="tabr">
<td class="tabd">h
<td class="tabd">Same as %b
<tr class="tabr backlight">
<td class="tabd">H
<td class="tabd">The hour (24-hour clock) as a decimal number (00 - 23)
<tr class="tabr">
<td class="tabd">I
<td class="tabd">The hour (12-hour clock) as a decimal number (01 - 12)
<tr class="tabr backlight">
<td class="tabd">j
<td class="tabd">The day of the year as a decimal number (001 - 366)
<tr class="tabr">
<td class="tabd">m
<td class="tabd">The month as a decimal number (01 - 12)
<tr class="tabr backlight">
<td class="tabd">M
<td class="tabd">The minute as a decimal number (00 - 59)
<tr class="tabr">
<td class="tabd">n
<td class="tabd">The newline character
<tr class="tabr backlight">
<td class="tabd">Od
<td class="tabd">The day of the month using the locale's alternative
numeric symbols
<tr class="tabr">
<td class="tabd">Oe
<td class="tabd">The date of the month using the locale's alternative
numeric symbols
<tr class="tabr backlight">
<td class="tabd">OH
<td class="tabd">The hour (24-hour clock) using the locale's alternative
numeric symbols
<tr class="tabr">
<td class="tabd">OI
<td class="tabd">The hour (12-hour clock) using the locale's alternative
numeric symbols
<tr class="tabr backlight">
<td class="tabd">Om
<td class="tabd">The month using the locale's alternative numeric symbols
<tr class="tabr">
<td class="tabd">OM
<td class="tabd">The minutes using the locale's alternative numeric symbols
<tr class="tabr backlight">
<td class="tabd">OS
<td class="tabd">The seconds using the locale's alternative numeric symbols
<tr class="tabr">
<td class="tabd">Ou
<td class="tabd">The weekday as a number in the locale's alternative
representation (Monday=1)
<tr class="tabr backlight">
<td class="tabd">OU
<td class="tabd">The week number of the year (Sunday as the first day of the
week) using the locale's alternative numeric symbols
<tr class="tabr">
<td class="tabd">OV
<td class="tabd">The week number of the year (Monday as the first day of the
week) as a decimal number (01 -53) using the locale's
alternative numeric symbols. If the week containing January 1
has four or more days in the new year, it is considered
as week 1.  Otherwise, it is considered as week 53 of the
previous year, and the next week is week 1.
<tr class="tabr backlight">
<td class="tabd">Ow
<td class="tabd">The weekday as a number (Sunday=0) using the locale's
alternative numeric symbols
<tr class="tabr">
<td class="tabd">OW
<td class="tabd">The week number of the year (Monday as the first day of
the week) using the locale's alternative numeric symbols
<tr class="tabr backlight">
<td class="tabd">Oy
<td class="tabd">The year without the century using the locale's alternative
numeric symbols
<tr class="tabr">
<td class="tabd">p
<td class="tabd">The locale's equivalent of the AM/PM designations associated
with a 12-hour clock
<tr class="tabr backlight">
<td class="tabd">r
<td class="tabd">The time in AM/PM notation
<tr class="tabr">
<td class="tabd">R
<td class="tabd">The time in 24-hour notation (%H:%M)
<tr class="tabr backlight">
<td class="tabd">S
<td class="tabd">The second as a decimal number (00 - 61)
<tr class="tabr">
<td class="tabd">t
<td class="tabd">The tab character
<tr class="tabr backlight">
<td class="tabd">T
<td class="tabd">The time (%H:%M:%S)
<tr class="tabr">
<td class="tabd">u
<td class="tabd">The weekday as a decimal number between 1 and 7 (Monday=1)
<tr class="tabr backlight">
<td class="tabd">U
<td class="tabd">The week number of the year (the first Sunday as the first
day of week 1) as a decimal number (00 - 53)
<tr class="tabr">
<td class="tabd">V
<td class="tabd">The week number of the year (Monday as the first day of the
week) as a decimal number (00 - 53). If the week containing
January 1 has four or more days in the new year, it is
considered as week 1. Otherwise, it is considered as week 53
of the previous year, and the next week is week 1.
<tr class="tabr backlight">
<td class="tabd">w
<td class="tabd">The weekday as a decimal number (0 [Sunday] - 6)
<tr class="tabr">
<td class="tabd">W
<td class="tabd">The week number of the year (the first Monday as the first
day of week 1) as a decimal number (00 - 53)
<tr class="tabr backlight">
<td class="tabd">x
<td class="tabd">The locale's appropriate date representation
<tr class="tabr">
<td class="tabd">X
<td class="tabd">The locale's appropriate time representation
<tr class="tabr backlight">
<td class="tabd">y
<td class="tabd">The year without century as a decimal number (00 - 99)
<tr class="tabr">
<td class="tabd">Y
<td class="tabd">The year with century as a decimal number
<tr class="tabr backlight">
<td class="tabd">Z
<td class="tabd">Timezone name or abbreviation. If timezone information is
not available, no character is output.
<tr class="tabr">
<td class="tabd">%
<td class="tabd">%
</table>

<a id="4.11" href="#"></a>
<a id="4.11.osucompatibility" href="#"></a>
<a id="osucompatibility" href="#"></a>
<h2 class="head"><span class="numb">4.11</span><span class="text">OSU Compatibility</span></h2>

<p> Essential compatibility with OSU Server Side Includes directives is
provided.  This is intended to ease any transition to WASD, as existing SSI
documents will not need to be changed unless any of the WASD capabilities are
required.  To provide transparent processing of OSU <span class="high monosp">.HTMLX</span> files ensure the
following WASD configuration is in place.

<p> In HTTPD&dollar;CONFIG file:

<div class="blockof code">[AddType]
.HTMLX  text/x-shtml  -  OSU SSI HTML
</div>

<p> Note that the content description must contain the string &quot;OSU&quot; to activate
some compliancy behaviours.  

<p> In HTTPD&dollar;MAP file:

<div class="blockof code">redirect /*.*.htmlx /*.htmlx?httpd=ssi&amp;__part=*
</div>

<p> This provides a mechanism for the OSU part-document facility.
(Yes, the &quot;__part&quot; has two leading underscores!)

<a id="4.11.0.0.1" href="#"></a>
<a id="4.11.osudirectives" href="#"></a>
<a id="osudirectives" href="#"></a>
<h5 class="head"><span class="text">OSU Directives</span></h5>

<p> The following OSU directives are provided specifically for OSU
compatibility, although there is no reason why most of these may not also be 
deployed in general WASD SSI documents if there is a requirement.  Note that
these are OSU-specifics, other OSU directives are provided by the standard WASD
SSI engine.

<a id="4.11.0.0.1.1" href="#"></a>
<a id="4.11.osucompatibledirectives" href="#"></a>
<a id="osucompatibledirectives" href="#"></a>
<h6 class="head display0"><span class="text">OSU Compatible Directives</span></h6>
<table class="tabl">
<tr class="tabr under">
<th class="tabh">Directive
<th class="tabh">Description
<tr class="tabr">
<tr class="tabr backlight">
<td class="tabd">#begin <span class="high italic">label [<span class="high italic">label</span>]</span>
<td class="tabd">delimit a part-document (see <a class="link" href="env004.html#4.11.osuquotpartquots">&lsquo;OSU &quot;Part&quot;s&rsquo; in 4.11 OSU Compatibility</a>)
<tr class="tabr">
<td class="tabd">#config verify=1
<td class="tabd">enable commented-tag trace output
<tr class="tabr backlight">
<td class="tabd">#echo accesses
<td class="tabd">document access count
<tr class="tabr">
<td class="tabd">#echo accesses_ordinal
<td class="tabd">document access count
<tr class="tabr backlight">
<td class="tabd">#echo getenv=&quot;&quot;
<td class="tabd">output logical or symbol
<tr class="tabr">
<td class="tabd">#echo hw_name
<td class="tabd">system hardware name
<tr class="tabr backlight">
<td class="tabd">#echo server_name
<td class="tabd">HTTPd server host name
<tr class="tabr">
<td class="tabd">#echo server_version
<td class="tabd">HTTPd software version
<tr class="tabr backlight">
<td class="tabd">#echo vms_version
<td class="tabd">HTTPd system version of VMS
<tr class="tabr">
<td class="tabd">#end <span class="high italic">label</span> [<span class="high italic">label</span>]
<td class="tabd">delimit a part-document (see <a class="link" href="env004.html#4.11.osuquotpartquots">&lsquo;OSU &quot;Part&quot;s&rsquo; in 4.11 OSU Compatibility</a>)
<tr class="tabr backlight">
<td class="tabd">#include [file&verbar;virtual]=&quot;&quot; part=&quot;<span class="high italic">label</span>&quot;
<td class="tabd">include only part of a virtual document
</table>

<p> If WASD is configured for OSU SSI compatibility the following link provides
an online demonstration as well as further explanation of the OSU SSI engine
using an OSU preprocessor document from the distribution (included within
copyright compliance).

<p class="indent"> <a class="link blank monosp" target="_blank" href="/wasd_root/src/osu/preproc.htmlx">/wasd_root/src/osu/preproc.htmlx</a>

<p> How do we know WASD is processing it?  Look for the
<span class="high italic">#echo var=&quot;GETENV=SYS&dollar;REM_ID&quot;</span> towards the end of the document.  It should
indicate <span class="high nowrap">&quot;[VARIABLE_DOES_NOT_EXIST!]&quot;</span> because it's attempting to output a
DECnet-related logical name!

<a id="4.11.0.0.2" href="#"></a>
<a id="4.11.osuquotpartquots" href="#"></a>
<a id="osuquotpartquots" href="#"></a>
<h5 class="head"><span class="text">OSU &quot;Part&quot;s</span></h5>

<p> The OSU processor allows for delimited subsections of an <span class="high italic">#include</span>d
document, or a URL referenced document for that matter, to be included in the
output.  This is supported, but only for compatibility.  It is only enabled for
&quot;.HTMLX&quot; documents and if otherwise used may interact unexpectedly with WASD
SSI flow-control.

<a id="4.12" href="#"></a>
<a id="4.12.scriptgeneratedssidocuments" href="#"></a>
<a id="scriptgeneratedssidocuments" href="#"></a>
<h2 class="head"><span class="numb">4.12</span><span class="text">Script-Generated SSI Documents</span></h2>

<p> It is possible to have script output passed back through the SSI engine for
markup.  This approach might allow script output to automatically be wrapped
in standard site headers and footers for example.  Essentially the script must
output an SSI-markup response body and include in the otherwise standard CGI
response header a field containing &quot;Script-Control: X-content-handler=SSI&quot;. 
The following example in DCL show the essential elements of such a script.

<div class="blockof code">&dollar; say = &quot;write sys&dollar;output&quot;
&dollar; say &quot;Status: 200&quot;
&dollar; say &quot;Script-Control: X-content-handler=SSI&quot;&quot;
&dollar; say &quot;&quot;
&dollar; say &quot;&lt;HTML&gt;&quot;
&dollar; say &quot;&lt;HEAD&gt;&quot;
&dollar; say &quot;&lt;TITLE&gt;Example of X-content-handler=SSI&lt;/TITLE&gt;&quot;
&dollar; say &quot;&lt;/HEAD&gt;&quot;
&dollar; say &quot;&lt;BODY&gt;&quot;
&dollar; say &quot;&lt;!--#include virtual=&quot;&quot;/site/header.html&quot;&quot; --&gt;&quot;
&dollar; say &quot;&lt;H1&gt;Example of X-content-handler:SSI&lt;/H1&gt;&quot;
&dollar; say &quot;Hi there &lt;!--#echo var=&quot;&quot;WWW_REMOTE_HOST&quot;&quot; --&gt;&quot;
&dollar; say &quot;&lt;!--#include virtual=&quot;&quot;/site/footer.html&quot;&quot; --&gt;&quot;
&dollar; say &quot;&lt;/BODY&gt;&quot;
&dollar; say &quot;&lt;/HTML&gt;&quot;
</div>
<!-- source:0500_SEARCH.WASDOC -->

<table class="NAVtable NAVprint"><tr>
<td><a href="javascript:window.history.back();">&#8617;&#xFE0E;</a>
<td><a href="env003.html#3.">&#8598;&#xFE0E;</a>
<td><a href="env000.html#0.">&#8593;&#xFE0E;</a>
<td><a href="env005.html#5.">&#8600;&#xFE0E;</a>
<td><a href="javascript:window.history.forward();">&#8618;&#xFE0E;</a>
</table>