changeset 2:5da2e67620f9

Upgrade to Ivy configuration and begin clean up of tests. Added FreeBSD license.
author smith@nwoca.org
date Tue, 25 Jan 2011 17:06:57 -0500
parents b6e94d49a9a9
children 4417b025157e
files LICENSE build.xml ivy.xml ivysettings.xml nbproject/build-impl.xml nbproject/genfiles.properties nbproject/ivy-impl.xml nbproject/project.properties nbproject/project.xml src/org/nwoca/ssdt/tools/html2wiki/Html2Wiki.java test/org/nwoca/ssdt/tools/html2wiki/Html2WikiTest.java test/resources/sysman_handbook.html
diffstat 12 files changed, 8179 insertions(+), 728 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE	Tue Jan 25 17:06:57 2011 -0500
@@ -0,0 +1,26 @@
+Copyright 2010 Northwest Ohio Computer Association/SSDT. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY NORTHWEST OHIO COMPUTER ASSOCIATION ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT  SHALL NORTHWEST OHIO COMPUTER ASSOCATION OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those of the
+authors and should not be interpreted as representing official policies, either expressed
+or implied, of NORTHWEST OHIO COMPUTER ASSOCIATION.
--- a/build.xml	Thu Jun 08 18:11:12 2006 -0400
+++ b/build.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -1,88 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See commented blocks below for -->
-<!-- some examples of how to customize the build. -->
-<!-- (If you delete it and reopen the project it will be recreated.) -->
-<project name="html2wiki" default="default" basedir=".">
+<project name="html2wiki" default="default" basedir="."
+    xmlns:ivy="antlib:fr.jayasoft.ivy.ant"
+    xmlns:ssdt="http://www.ssdt-ohio.org/ant/common">
     <description>Builds, tests, and runs the project html2wiki.</description>
     <import file="nbproject/build-impl.xml"/>
     
-    <property name="project.name"    value="html2wiki" />
-    <property name="project.version" value="0.1-0" />
-
-    <property file="../../build.global"/>    
-    <property name="ssdt.home.dir" value="../../"/>
-    <property name="tools.dir" value="${ssdt.home.dir}/Tools"/>    
-    <import file="${tools.dir}/jalopy/ant/jalopy-ant.xml" optional="true"/>
-    <import file="${tools.dir}/checkstyle/ant/checkstyle-ant.xml"/>
-    
-        <import file="${tools.dir}/findbugs/ant/findbugs-ant.xml"/>
-    <!--
-
-    There exist several targets which are by default empty and which can be 
-    used for execution of your tasks. These targets are usually executed 
-    before and after some main targets. They are: 
-
-      -pre-init:                 called before initialization of project properties
-      -post-init:                called after initialization of project properties
-      -pre-compile:              called before javac compilation
-      -post-compile:             called after javac compilation
-      -pre-compile-single:       called before javac compilation of single file
-      -post-compile-single:      called after javac compilation of single file
-      -pre-compile-test:         called before javac compilation of JUnit tests
-      -post-compile-test:        called after javac compilation of JUnit tests
-      -pre-compile-test-single:  called before javac compilation of single JUnit test
-      -post-compile-test-single: called after javac compilation of single JUunit test
-      -pre-jar:                  called before JAR building
-      -post-jar:                 called after JAR building
-      -post-clean:               called after cleaning build products
-
-    (Targets beginning with '-' are not intended to be called on their own.)
-
-    Example of inserting an obfuscator after compilation could look like this:
+    <property file="../build.global"/>
+    <property file="../../build.global"/>
 
-        <target name="-post-compile">
-            <obfuscate>
-                <fileset dir="${build.classes.dir}"/>
-            </obfuscate>
-        </target>
-
-    For list of available properties check the imported 
-    nbproject/build-impl.xml file. 
-
-
-    Another way to customize the build is by overriding existing main targets.
-    The targets of interest are: 
+    <property name="ssdt.devel.kit" value="${user.home}/.ssdt"/>
+    <property name="ssdt.devel.kit.src" value="http://hg.ssdt-ohio.org/browse/public/develkit"/>
+    <mkdir dir="${ssdt.devel.kit}"/>
+    <get dest="${ssdt.devel.kit}/bootstrap.xml"
+         src="${ssdt.devel.kit.src}/bootstrap.xml" usetimestamp="true" ignoreerrors="true"/>
+    <import file="${ssdt.devel.kit}/bootstrap.xml"/>
 
-      -init-macrodef-javac:     defines macro for javac compilation
-      -init-macrodef-junit:     defines macro for junit execution
-      -init-macrodef-debug:     defines macro for class debugging
-      -init-macrodef-java:      defines macro for class execution
-      -do-jar-with-manifest:    JAR building (if you are using a manifest)
-      -do-jar-without-manifest: JAR building (if you are not using a manifest)
-      run:                      execution of project 
-      -javadoc-build:           Javadoc generation
-      test-report:              JUnit report generation
-
-    An example of overriding the target for project execution could look like this:
+    <ssdt:require-ant   file="ivy-ant.xml"/>
+    <import             file="${ssdt.devel.kit}/ivy-ant.xml"/>
 
-        <target name="run" depends="html2wiki-impl.jar">
-            <exec dir="bin" executable="launcher.exe">
-                <arg file="${dist.jar}"/>
-            </exec>
-        </target>
-
-    Notice that the overridden target depends on the jar target and not only on 
-    the compile target as the regular run target does. Again, for a list of available 
-    properties which you can use, check the target you are overriding in the
-    nbproject/build-impl.xml file. 
-
-    -->
-    <target name="-pre-compile-single">
-        <antcall target="jalopy-single"/>
-    </target>
-    
-    <target name="checkstyle" depends="compile,do-checkstyle"/>
-    <target name="findbugs" depends="compile,-do-findbugs"/>
-    <target name="findbugs-view" depends="compile,-do-findbugsViewer"/>
+    <target name="-ivy-retrieve"        depends="-ivy-define, -ant-contrib-define, -lib-path-init, -ivy-retrieve-custom"/>
 
 </project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ivy.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module version="2.0">
+    <info module="html2wiki" organisation="org.ssdt-ohio" revision="0.2.0" status="integration"/>
+    <configurations>
+        <conf name="compile"/>
+        <conf name="runtime"/>
+        <conf name="compile-test"/>
+        <conf name="runtime-test"/>
+    </configurations>
+    <dependencies >
+     <dependency org="org.apache.commons" name="com.springsource.org.apache.commons.io" rev="1.4.0" />
+     <dependency org="org.junit" name="com.springsource.org.junit" rev="4.8.1" />
+    </dependencies>
+</ivy-module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ivysettings.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -0,0 +1,4 @@
+<ivysettings>
+   <property name="ssdt.devel.kit" value="${user.home}/.ssdt" override="false"/>
+   <include file="${ssdt.devel.kit}/ssdt.default.ivy.settings.xml"/>
+</ivysettings>
\ No newline at end of file
--- a/nbproject/build-impl.xml	Thu Jun 08 18:11:12 2006 -0400
+++ b/nbproject/build-impl.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -1,541 +1,806 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT  ***
-***         EDIT ../build.xml INSTEAD         ***
-
-For the purpose of easier reading the script
-is divided into following sections:
-
-  - initialization
-  - compilation
-  - jar
-  - execution
-  - debugging
-  - javadoc
-  - junit compilation
-  - junit execution
-  - junit debugging
-  - applet
-  - cleanup
-
--->
-<project name="html2wiki-impl" default="default" basedir=".." xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:j2seproject2="http://www.netbeans.org/ns/j2se-project/2" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1">
-    <target name="default" depends="test,jar,javadoc" description="Build and test whole project."/>
-    <!-- 
-    ======================
-    INITIALIZATION SECTION 
-    ======================
-    -->
-    <target name="-pre-init">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-init-private" depends="-pre-init">
-        <property file="nbproject/private/private.properties"/>
-    </target>
-    <target name="-init-user" depends="-pre-init,-init-private">
-        <property file="${user.properties.file}"/>
-        <!-- The two properties below are usually overridden -->
-        <!-- by the active platform. Just a fallback. -->
-        <property name="default.javac.source" value="1.4"/>
-        <property name="default.javac.target" value="1.4"/>
-    </target>
-    <target name="-init-project" depends="-pre-init,-init-private,-init-user">
-        <property file="nbproject/project.properties"/>
-    </target>
-    <target name="-do-init" depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property">
-        <available file="${manifest.file}" property="manifest.available"/>
-        <condition property="manifest.available+main.class">
-            <and>
-                <isset property="manifest.available"/>
-                <isset property="main.class"/>
-                <not>
-                    <equals arg1="${main.class}" arg2="" trim="true"/>
-                </not>
-            </and>
-        </condition>
-        <condition property="manifest.available+main.class+mkdist.available">
-            <and>
-                <istrue value="${manifest.available+main.class}"/>
-                <isset property="libs.CopyLibs.classpath"/>
-            </and>
-        </condition>
-        <condition property="have.tests">
-            <or>
-                <available file="${test.src.dir}"/>
-            </or>
-        </condition>
-        <condition property="have.sources">
-            <or>
-                <available file="${src.dir}"/>
-            </or>
-        </condition>
-        <condition property="netbeans.home+have.tests">
-            <and>
-                <isset property="netbeans.home"/>
-                <isset property="have.tests"/>
-            </and>
-        </condition>
-        <condition property="no.javadoc.preview">
-            <isfalse value="${javadoc.preview}"/>
-        </condition>
-        <property name="run.jvmargs" value=""/>
-        <property name="javac.compilerargs" value=""/>
-        <property name="work.dir" value="${basedir}"/>
-        <condition property="no.deps">
-            <and>
-                <istrue value="${no.dependencies}"/>
-            </and>
-        </condition>
-        <property name="javac.debug" value="true"/>
-        <property name="javadoc.preview" value="true"/>
-    </target>
-    <target name="-post-init">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-init-check" depends="-pre-init,-init-private,-init-user,-init-project,-do-init">
-        <fail unless="src.dir">Must set src.dir</fail>
-        <fail unless="test.src.dir">Must set test.src.dir</fail>
-        <fail unless="build.dir">Must set build.dir</fail>
-        <fail unless="dist.dir">Must set dist.dir</fail>
-        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
-        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
-        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
-        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
-        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
-        <fail unless="dist.jar">Must set dist.jar</fail>
-    </target>
-    <target name="-init-macrodef-property">
-        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute name="name"/>
-            <attribute name="value"/>
-            <sequential>
-                <property name="@{name}" value="${@{value}}"/>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-javac">
-        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute name="srcdir" default="${src.dir}"/>
-            <attribute name="destdir" default="${build.classes.dir}"/>
-            <attribute name="classpath" default="${javac.classpath}"/>
-            <attribute name="debug" default="${javac.debug}"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <javac srcdir="@{srcdir}" destdir="@{destdir}" debug="@{debug}" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}" includeantruntime="false">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <compilerarg line="${javac.compilerargs}"/>
-                    <customize/>
-                </javac>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-junit">
-        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute name="includes" default="**/*Test.java"/>
-            <sequential>
-                <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
-                    <batchtest todir="${build.test.results.dir}">
-                        <fileset dir="${test.src.dir}" includes="@{includes}"/>
-                    </batchtest>
-                    <classpath>
-                        <path path="${run.test.classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="test-sys-prop."/>
-                        <mapper type="glob" from="test-sys-prop.*" to="*"/>
-                    </syspropertyset>
-                    <formatter type="brief" usefile="false"/>
-                    <formatter type="xml"/>
-                    <jvmarg line="${run.jvmargs}"/>
-                </junit>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-nbjpda">
-        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute name="name" default="${main.class}"/>
-            <attribute name="classpath" default="${debug.classpath}"/>
-            <attribute name="stopclassname" default=""/>
-            <sequential>
-                <nbjpdastart transport="dt_socket" addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                </nbjpdastart>
-            </sequential>
-        </macrodef>
-        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute name="dir" default="${build.classes.dir}"/>
-            <sequential>
-                <nbjpdareload>
-                    <fileset includes="${fix.includes}*.class" dir="@{dir}"/>
-                </nbjpdareload>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-debug">
-        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute name="classname" default="${main.class}"/>
-            <attribute name="classpath" default="${debug.classpath}"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <java fork="true" classname="@{classname}" dir="${work.dir}">
-                    <jvmarg value="-Xdebug"/>
-                    <jvmarg value="-Xnoagent"/>
-                    <jvmarg value="-Djava.compiler=none"/>
-                    <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
-                    <jvmarg line="${run.jvmargs}"/>
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="run-sys-prop."/>
-                        <mapper type="glob" from="run-sys-prop.*" to="*"/>
-                    </syspropertyset>
-                    <customize/>
-                </java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-java">
-        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute name="classname" default="${main.class}"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <java fork="true" classname="@{classname}" dir="${work.dir}">
-                    <jvmarg line="${run.jvmargs}"/>
-                    <classpath>
-                        <path path="${run.classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="run-sys-prop."/>
-                        <mapper type="glob" from="run-sys-prop.*" to="*"/>
-                    </syspropertyset>
-                    <customize/>
-                </java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-presetdef-jar">
-        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <jar jarfile="${dist.jar}" compress="${jar.compress}">
-                <j2seproject1:fileset dir="${build.classes.dir}"/>
-            </jar>
-        </presetdef>
-    </target>
-    <target name="init" depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar"/>
-    <!--
-    ===================
-    COMPILATION SECTION
-    ===================
-    -->
-    <target name="deps-jar" depends="init" unless="no.deps"/>
-    <target name="-pre-pre-compile" depends="init,deps-jar">
-        <mkdir dir="${build.classes.dir}"/>
-    </target>
-    <target name="-pre-compile">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-do-compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile" if="have.sources">
-        <j2seproject3:javac/>
-        <copy todir="${build.classes.dir}">
-            <fileset dir="${src.dir}" excludes="${build.classes.excludes}"/>
-        </copy>
-    </target>
-    <target name="-post-compile">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project."/>
-    <target name="-pre-compile-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-do-compile-single" depends="init,deps-jar,-pre-pre-compile">
-        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
-        <j2seproject3:javac>
-            <customize>
-                <patternset includes="${javac.includes}"/>
-            </customize>
-        </j2seproject3:javac>
-    </target>
-    <target name="-post-compile-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="compile-single" depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single"/>
-    <!--
-    ====================
-    JAR BUILDING SECTION
-    ====================
-    -->
-    <target name="-pre-pre-jar" depends="init">
-        <dirname property="dist.jar.dir" file="${dist.jar}"/>
-        <mkdir dir="${dist.jar.dir}"/>
-    </target>
-    <target name="-pre-jar">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-do-jar-without-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" unless="manifest.available">
-        <j2seproject1:jar/>
-    </target>
-    <target name="-do-jar-with-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" unless="manifest.available+main.class">
-        <j2seproject1:jar manifest="${manifest.file}"/>
-    </target>
-    <target name="-do-jar-with-mainclass" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" unless="manifest.available+main.class+mkdist.available">
-        <j2seproject1:jar manifest="${manifest.file}">
-            <j2seproject1:manifest>
-                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
-            </j2seproject1:manifest>
-        </j2seproject1:jar>
-        <echo>To run this application from the command line without Ant, try:</echo>
-        <property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
-        <property name="dist.jar.resolved" location="${dist.jar}"/>
-        <pathconvert property="run.classpath.with.dist.jar">
-            <path path="${run.classpath}"/>
-            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
-        </pathconvert>
-        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
-    </target>
-    <target name="-do-jar-with-libraries" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available">
-        <property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
-        <pathconvert property="run.classpath.without.build.classes.dir">
-            <path path="${run.classpath}"/>
-            <map from="${build.classes.dir.resolved}" to=""/>
-        </pathconvert>
-        <pathconvert property="jar.classpath" pathsep=" ">
-            <path path="${run.classpath.without.build.classes.dir}"/>
-            <chainedmapper>
-                <flattenmapper/>
-                <globmapper from="*" to="lib/*"/>
-            </chainedmapper>
-        </pathconvert>
-        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" name="copylibs" classpath="${libs.CopyLibs.classpath}"/>
-        <copylibs manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}" jarfile="${dist.jar}" compress="${jar.compress}">
-            <fileset dir="${build.classes.dir}"/>
-            <manifest>
-                <attribute name="Main-Class" value="${main.class}"/>
-                <attribute name="Class-Path" value="${jar.classpath}"/>
-            </manifest>
-        </copylibs>
-        <echo>To run this application from the command line without Ant, try:</echo>
-        <property name="dist.jar.resolved" location="${dist.jar}"/>
-        <echo>java -jar "${dist.jar.resolved}"</echo>
-    </target>
-    <target name="-post-jar">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="jar" depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR."/>
-    <!--
-    =================
-    EXECUTION SECTION
-    =================
-    -->
-    <target name="run" depends="init,compile" description="Run a main class.">
-        <j2seproject1:java>
-            <customize>
-                <arg line="${application.args}"/>
-            </customize>
-        </j2seproject1:java>
-    </target>
-    <target name="run-single" depends="init,compile-single">
-        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
-        <j2seproject1:java classname="${run.class}"/>
-    </target>
-    <!--
-    =================
-    DEBUGGING SECTION
-    =================
-    -->
-    <target name="-debug-start-debugger" if="netbeans.home" depends="init">
-        <j2seproject1:nbjpdastart name="${debug.class}"/>
-    </target>
-    <target name="-debug-start-debuggee" depends="init,compile">
-        <j2seproject3:debug>
-            <customize>
-                <arg line="${application.args}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target name="debug" if="netbeans.home" depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE."/>
-    <target name="-debug-start-debugger-stepinto" if="netbeans.home" depends="init">
-        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
-    </target>
-    <target name="debug-stepinto" if="netbeans.home" depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee"/>
-    <target name="-debug-start-debuggee-single" if="netbeans.home" depends="init,compile-single">
-        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
-        <j2seproject3:debug classname="${debug.class}"/>
-    </target>
-    <target name="debug-single" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single"/>
-    <target name="-pre-debug-fix" depends="init">
-        <fail unless="fix.includes">Must set fix.includes</fail>
-        <property name="javac.includes" value="${fix.includes}.java"/>
-    </target>
-    <target name="-do-debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,compile-single">
-        <j2seproject1:nbjpdareload/>
-    </target>
-    <target name="debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix"/>
-    <!--
-    ===============
-    JAVADOC SECTION
-    ===============
-    -->
-    <target name="-javadoc-build" depends="init">
-        <mkdir dir="${dist.javadoc.dir}"/>
-        <javadoc destdir="${dist.javadoc.dir}" source="${javac.source}" notree="${javadoc.notree}" use="${javadoc.use}" nonavbar="${javadoc.nonavbar}" noindex="${javadoc.noindex}" splitindex="${javadoc.splitindex}" author="${javadoc.author}" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}" private="${javadoc.private}" additionalparam="${javadoc.additionalparam}" failonerror="true" useexternalfile="true">
-            <classpath>
-                <path path="${javac.classpath}"/>
-            </classpath>
-            <sourcepath>
-                <pathelement location="${src.dir}"/>
-            </sourcepath>
-            <packageset dir="${src.dir}" includes="*/**"/>
-            <fileset dir="${src.dir}" includes="*.java"/>
-        </javadoc>
-    </target>
-    <target name="-javadoc-browse" if="netbeans.home" unless="no.javadoc.preview" depends="init,-javadoc-build">
-        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
-    </target>
-    <target name="javadoc" depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc."/>
-    <!--
-    =========================
-    JUNIT COMPILATION SECTION
-    =========================
-    -->
-    <target name="-pre-pre-compile-test" if="have.tests" depends="init,compile">
-        <mkdir dir="${build.test.classes.dir}"/>
-    </target>
-    <target name="-pre-compile-test">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-do-compile-test" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test">
-        <j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}"/>
-        <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.src.dir}" excludes="**/*.java"/>
-        </copy>
-    </target>
-    <target name="-post-compile-test">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="compile-test" depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test"/>
-    <target name="-pre-compile-test-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="-do-compile-test-single" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single">
-        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
-        <j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}">
-            <customize>
-                <patternset includes="${javac.includes}"/>
-            </customize>
-        </j2seproject3:javac>
-        <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.src.dir}" excludes="**/*.java"/>
-        </copy>
-    </target>
-    <target name="-post-compile-test-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="compile-test-single" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single"/>
-    <!--
-    =======================
-    JUNIT EXECUTION SECTION
-    =======================
-    -->
-    <target name="-pre-test-run" if="have.tests" depends="init">
-        <mkdir dir="${build.test.results.dir}"/>
-    </target>
-    <target name="-do-test-run" if="have.tests" depends="init,compile-test,-pre-test-run">
-        <j2seproject3:junit/>
-    </target>
-    <target name="-post-test-run" if="have.tests" depends="init,compile-test,-pre-test-run,-do-test-run">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
-    </target>
-    <target name="test-report" if="have.tests" depends="init"/>
-    <target name="-test-browse" if="netbeans.home+have.tests" depends="init"/>
-    <target name="test" depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests."/>
-    <target name="-pre-test-run-single" if="have.tests" depends="init">
-        <mkdir dir="${build.test.results.dir}"/>
-    </target>
-    <target name="-do-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single">
-        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
-        <j2seproject3:junit includes="${test.includes}"/>
-    </target>
-    <target name="-post-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
-    </target>
-    <target name="test-single" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test."/>
-    <!--
-    =======================
-    JUNIT DEBUGGING SECTION
-    =======================
-    -->
-    <target name="-debug-start-debuggee-test" if="have.tests" depends="init,compile-test">
-        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
-        <j2seproject3:debug classname="junit.textui.TestRunner" classpath="${debug.test.classpath}">
-            <customize>
-                <arg line="${test.class}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target name="-debug-start-debugger-test" if="netbeans.home+have.tests" depends="init,compile-test">
-        <j2seproject1:nbjpdastart name="${test.class}" classpath="${debug.test.classpath}"/>
-    </target>
-    <target name="debug-test" depends="init,compile-test,-debug-start-debugger-test,-debug-start-debuggee-test"/>
-    <target name="-do-debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,compile-test-single">
-        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
-    </target>
-    <target name="debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix-test"/>
-    <!--
-    =========================
-    APPLET EXECUTION SECTION
-    =========================
-    -->
-    <target name="run-applet" depends="init,compile-single">
-        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
-        <j2seproject1:java classname="sun.applet.AppletViewer">
-            <customize>
-                <arg value="${applet.url}"/>
-            </customize>
-        </j2seproject1:java>
-    </target>
-    <!--
-    =========================
-    APPLET DEBUGGING  SECTION
-    =========================
-    -->
-    <target name="-debug-start-debuggee-applet" if="netbeans.home" depends="init,compile-single">
-        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
-        <j2seproject3:debug classname="sun.applet.AppletViewer">
-            <customize>
-                <arg value="${applet.url}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target name="debug-applet" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet"/>
-    <!--
-    ===============
-    CLEANUP SECTION
-    ===============
-    -->
-    <target name="deps-clean" depends="init" unless="no.deps"/>
-    <target name="-do-clean" depends="init">
-        <delete dir="${build.dir}"/>
-        <delete dir="${dist.dir}"/>
-    </target>
-    <target name="-post-clean">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target name="clean" depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products."/>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - junit compilation
+  - junit execution
+  - junit debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="html2wiki-impl">
+    <import file="ivy-impl.xml"/>
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property,-ivy-retrieve" name="-do-init">
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <condition property="do.mkdist">
+            <and>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </and>
+        </condition>
+        <condition property="manifest.available+mkdist.available">
+            <and>
+                <istrue value="${manifest.available}"/>
+                <isset property="do.mkdist"/>
+            </and>
+        </condition>
+        <condition property="manifest.available-mkdist.available">
+            <or>
+                <istrue value="${manifest.available}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="manifest.available+main.class-mkdist.available">
+            <or>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <length length="0" string="${endorsed.classpath}" when="greater"/>
+        </condition>
+        <property name="javac.fork" value="false"/>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-javac">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="," property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <delete>
+                    <files includes="${javac.includes.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-junit">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <sequential>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: html2wiki was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+            <manifest>
+                <attribute name="Main-Class" value="${main.class}"/>
+                <attribute name="Class-Path" value="${jar.classpath}"/>
+            </manifest>
+        </copylibs>
+        <echo>To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo>java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+mkdist.available" name="-do-jar-with-libraries-without-mainclass" unless="main.class.available">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+            <manifest>
+                <attribute name="Class-Path" value="${jar.classpath}"/>
+            </manifest>
+        </copylibs>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.mkdist" name="-do-jar-with-libraries-without-manifest" unless="manifest.available">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+            <manifest>
+                <attribute name="Class-Path" value="${jar.classpath}"/>
+            </manifest>
+        </copylibs>
+    </target>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-do-jar-with-libraries-without-mainclass,-do-jar-with-libraries-without-manifest,-post-jar,-ivy-publish" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+            </fileset>
+        </javadoc>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                JUNIT COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                JUNIT EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:junit testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:junit excludes="" includes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <!--
+                =======================
+                JUNIT DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
+        <delete file="${test.report.file}"/>
+        <mkdir dir="${build.test.results.dir}"/>
+        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
+            <customize>
+                <syspropertyset>
+                    <propertyref prefix="test-sys-prop."/>
+                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                </syspropertyset>
+                <arg value="${test.class}"/>
+                <arg value="showoutput=true"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
+                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: html2wiki was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target depends="-ivy-clean" name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <not>
+                <isset property="already.built.${call.subproject}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
--- a/nbproject/genfiles.properties	Thu Jun 08 18:11:12 2006 -0400
+++ b/nbproject/genfiles.properties	Tue Jan 25 17:06:57 2011 -0500
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=9d118728
-build.xml.script.CRC32=867757ba
-build.xml.stylesheet.CRC32=d5b6853a
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=9d118728
-nbproject/build-impl.xml.script.CRC32=22ed648d
-nbproject/build-impl.xml.stylesheet.CRC32=99b91518
+build.xml.data.CRC32=9d118728
+build.xml.script.CRC32=867757ba
+build.xml.stylesheet.CRC32=d5b6853a
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=4b98d2cf
+nbproject/build-impl.xml.script.CRC32=4bfa927d
+nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nbproject/ivy-impl.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+-->
+<project xmlns:ivy="antlib:fr.jayasoft.ivy.ant" basedir=".." default="default" name="ivy-impl">
+    <target name="-check-ivy">
+        <available property="have.ivy" resource="fr/jayasoft/ivy/ant/antlib.xml"/>
+    </target>
+    <target depends="-check-ivy" name="-ivy-define" unless="have.ivy">
+        <echo level="debug" message="ivy.home : ${ivy.home}"/>
+        <taskdef resource="fr/jayasoft/ivy/ant/antlib.xml" uri="antlib:fr.jayasoft.ivy.ant">
+            <classpath>
+                <fileset dir="${ivy.home}">
+                    <include name="*.jar"/>
+                </fileset>
+            </classpath>
+        </taskdef>
+    </target>
+    <target name="-ant-contrib-define">
+        <echo level="debug" message="ant-contrib.lib: ${ant-contrib.lib}"/>
+        <taskdef resource="net/sf/antcontrib/antcontrib.properties">
+            <classpath>
+                <pathelement location="${ant-contrib.lib}"/>
+            </classpath>
+        </taskdef>
+    </target>
+    <target name="-lib-path-init">
+        <echo level="debug" message="$${lib.dir} : ${lib.dir}"/>
+        <if>
+            <equals arg1="${lib.dir}" arg2="$${lib.dir}"/>
+            <then>
+                <if>
+                    <equals arg1="${build.classes.dir}" arg2="$${build.classes.dir}"/>
+                    <then>
+                        <property name="lib.dir" value="lib"/>
+                    </then>
+                    <else>
+                        <property name="lib.dir" value="jar"/>
+                    </else>
+                </if>
+            </then>
+        </if>
+        <echo level="debug" message="$${lib.dir} : ${lib.dir}"/>
+        <mkdir dir="${basedir}/${build.dir}/${lib.dir}"/>
+    </target>
+    <target depends="-ivy-define, -ant-contrib-define, -lib-path-init" name="-ivy-retrieve">
+        <ivy:settings file="ivysettings.xml"/>
+        <ivy:resolve file="ivy.xml"/>
+        <ivy:retrieve pattern="${basedir}/${build.dir}/${lib.dir}/[artifact]-[revision].[ext]" type="jar"/>
+        <path id="ivy.path">
+            <fileset dir="${basedir}/${build.dir}/${lib.dir}">
+                <include name="**/*.jar"/>
+            </fileset>
+        </path>
+        <pathconvert dirsep="/" pathsep="${path.separator}" property="ivy.classpath.computed">
+            <path refid="ivy.path"/>
+            <!--map from="${basedir}${file.separator}" to=""/-->
+        </pathconvert>
+        <property name="old.javac.classpath" value="${javac.classpath}"/>
+        <var name="javac.classpath" unset="true"/>
+        <if>
+            <equals arg1="${old.javac.classpath}" arg2=""/>
+            <then>
+                <property name="javac.classpath" value="${ivy.classpath.computed}"/>
+            </then>
+            <else>
+                <property name="javac.classpath" value="${old.javac.classpath}${path.separator}${ivy.classpath.computed}"/>
+            </else>
+        </if>
+        <echo level="debug" message="$${javac.classpath} : ${javac.classpath}"/>
+        <property name="old.javac.test.classpath" value="${javac.test.classpath}"/>
+        <var name="javac.test.classpath" unset="true"/>
+        <if>
+            <equals arg1="${old.javac.test.classpath}" arg2=""/>
+            <then>
+                <property name="javac.test.classpath" value="${ivy.classpath.computed}"/>
+            </then>
+            <else>
+                <property name="javac.test.classpath" value="${old.javac.test.classpath}${path.separator}${ivy.classpath.computed}"/>
+            </else>
+        </if>
+        <echo level="debug" message="$${javac.test.classpath} : ${javac.test.classpath}"/>
+        <property name="old.run.classpath" value="${run.classpath}"/>
+        <var name="run.classpath" unset="true"/>
+        <if>
+            <equals arg1="${old.run.classpath}" arg2="$${run.classpath}"/>
+            <then>
+                <property name="run.classpath" value="${ivy.classpath.computed}"/>
+            </then>
+            <else>
+                <property name="run.classpath" value="${old.run.classpath}${path.separator}${ivy.classpath.computed}"/>
+            </else>
+        </if>
+        <echo level="debug" message="$${run.classpath} : ${run.classpath}"/>
+        <property name="old.run.test.classpath" value="${run.test.classpath}"/>
+        <var name="run.test.classpath" unset="true"/>
+        <if>
+            <equals arg1="${old.run.test.classpath}" arg2="$${run.test.classpath}"/>
+            <then>
+                <property name="run.test.classpath" value="${ivy.classpath.computed}"/>
+            </then>
+            <else>
+                <property name="run.test.classpath" value="${old.run.test.classpath}${path.separator}${ivy.classpath.computed}"/>
+            </else>
+        </if>
+        <echo level="debug" message="$${run.test.classpath} : ${run.test.classpath}"/>
+        <property name="old.debug.classpath" value="${debug.classpath}"/>
+        <var name="debug.classpath" unset="true"/>
+        <if>
+            <equals arg1="${old.debug.classpath}" arg2="$${debug.classpath}"/>
+            <then>
+                <property name="debug.classpath" value="${ivy.classpath.computed}"/>
+            </then>
+            <else>
+                <property name="debug.classpath" value="${old.debug.classpath}${path.separator}${ivy.classpath.computed}"/>
+            </else>
+        </if>
+        <echo level="debug" message="$${debug.classpath} : ${debug.classpath}"/>
+    </target>
+    <target name="-ivy-publish">
+        <ivy:settings file="ivysettings.xml"/>
+        <ivy:resolve file="ivy.xml"/>
+        <ivy:publish forcedeliver="true" overwrite="true" resolver="local">
+            <artifacts pattern="${basedir}/${dist.dir}/[artifact].[ext]"/>
+        </ivy:publish>
+    </target>
+    <target name="-ivy-clean">
+        <!--delete dir="lib"/-->
+    </target>
+</project>
--- a/nbproject/project.properties	Thu Jun 08 18:11:12 2006 -0400
+++ b/nbproject/project.properties	Tue Jan 25 17:06:57 2011 -0500
@@ -1,60 +1,61 @@
-application.args=
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-debug.classpath=\
-    ${run.classpath}
-debug.test.classpath=\
-    ${run.test.classpath}
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/html2wiki.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-jar.compress=false
-javac.classpath=\
-    ${libs.commons-io-1.2.classpath}
-# Space-separated list of extra javac options
-javac.compilerargs=-Xlint:unchecked
-javac.deprecation=false
-javac.source=1.5
-javac.target=1.5
-javac.test.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}:\
-    ${libs.junit.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-# Property libs.commons-io-1.2.classpath is set here just to make sharing of project simpler.
-# The library definition has always preference over this property.
-libs.commons-io-1.2.classpath=../shared/commons-io-1.2/commons-io-1.2.jar
-main.class=org.nwoca.ssdt.tools.html2wiki.Html2Wiki
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-platform.active=default_platform
-run.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
-# or test-sys-prop.name=value to set system properties for unit tests):
-run.jvmargs=
-run.test.classpath=\
-    ${javac.test.classpath}:\
-    ${build.test.classes.dir}
-src.dir=src
-test.src.dir=test
+application.args=
+application.title=html2wiki
+application.vendor=SMITH
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/html2wiki.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=
+# Space-separated list of extra javac options
+javac.compilerargs=-Xlint:unchecked
+javac.deprecation=false
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=org.nwoca.ssdt.tools.html2wiki.Html2Wiki
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+src.dir=src
+test.src.dir=test
--- a/nbproject/project.xml	Thu Jun 08 18:11:12 2006 -0400
+++ b/nbproject/project.xml	Tue Jan 25 17:06:57 2011 -0500
@@ -1,16 +1,33 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.java.j2seproject</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>html2wiki</name>
-            <minimum-ant-version>1.6.5</minimum-ant-version>
-            <source-roots>
-                <root id="src.dir"/>
-            </source-roots>
-            <test-roots>
-                <root id="test.src.dir"/>
-            </test-roots>
-        </data>
-    </configuration>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <buildExtensions xmlns="http://www.netbeans.org/ns/ant-build-extender/1">
+            <extension file="ivy-impl.xml" id="ivy">
+                <dependency dependsOn="-ivy-retrieve" target="-do-init"/>
+                <dependency dependsOn="-ivy-clean" target="-post-clean"/>
+                <dependency dependsOn="-ivy-publish" target="jar"/>
+            </extension>
+        </buildExtensions>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>html2wiki</name>
+            <minimum-ant-version>1.6.5</minimum-ant-version>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+        <ivyConfiguration xmlns="http://code.google.com/p/ivybeans/ns/ivy-module/1">
+            <descriptorFile>ivy.xml</descriptorFile>
+            <settingsFile>ivysettings.xml</settingsFile>
+            <configurationMapping>
+                <scope confs="compile" name="COMPILE"/>
+                <scope confs="compile,runtime" name="RUNTIME"/>
+                <scope confs="compile,compile-test" name="COMPILE_TEST"/>
+                <scope confs="compile,compile-test,runtime,runtime-test" name="RUNTIME_TEST"/>
+            </configurationMapping>
+        </ivyConfiguration>
+    </configuration>
+</project>
--- a/src/org/nwoca/ssdt/tools/html2wiki/Html2Wiki.java	Thu Jun 08 18:11:12 2006 -0400
+++ b/src/org/nwoca/ssdt/tools/html2wiki/Html2Wiki.java	Tue Jan 25 17:06:57 2011 -0500
@@ -100,8 +100,7 @@
         System.out.println(input.getAbsoluteFile());
         
         Html2Wiki converter = new Html2Wiki(FileUtils.readFileToString(input,null));
-        
-        
+                
         WikiChapter[] chapters = converter.getWikiChapters();
         
         System.out.format("Writing %d wiki files...\n",chapters.length);
@@ -181,7 +180,7 @@
         }
         
     }
-    private static class WikiChapter {
+    protected static class WikiChapter {
         private String chapterName;
         private CharSequence contents;
         
@@ -200,7 +199,7 @@
         }
         
         public String toString() {
-            return "Chapter: " + chapterName + "\nContents: " + contents;
+            return "Chapter: " + chapterName + " Content length: " + contents.length();
         }
     }
     
--- a/test/org/nwoca/ssdt/tools/html2wiki/Html2WikiTest.java	Thu Jun 08 18:11:12 2006 -0400
+++ b/test/org/nwoca/ssdt/tools/html2wiki/Html2WikiTest.java	Tue Jan 25 17:06:57 2011 -0500
@@ -4,24 +4,27 @@
  *
  * Created on May 9, 2006, 4:16 PM
  */
-
 package org.nwoca.ssdt.tools.html2wiki;
 
+import java.io.File;
+import java.net.URL;
 import junit.framework.*;
-import java.io.*;
-
+import org.apache.commons.io.FileUtils;
 
 /**
  *
  * @author SMITH
  */
 public class Html2WikiTest extends TestCase {
-    
+
+    File path;
+
     public Html2WikiTest(String testName) {
         super(testName);
     }
 
     protected void setUp() throws Exception {
+        path = new File(Html2WikiTest.class.getResource("/resources").toURI());
     }
 
     protected void tearDown() throws Exception {
@@ -29,26 +32,33 @@
 
     public static Test suite() {
         TestSuite suite = new TestSuite(Html2WikiTest.class);
-        
+
         return suite;
     }
 
+    public void testChapterParsing() throws Exception {
+
+        File f = new File(path, "sysman_handbook.html");
+
+        Html2Wiki converter = new Html2Wiki(FileUtils.readFileToString(f, null));
+
+        Html2Wiki.WikiChapter[] chapters = converter.getWikiChapters();
+
+        assertTrue( chapters.length > 0);
+        for (Html2Wiki.WikiChapter c : chapters) {
+            System.out.println(c);
+        }
+    }
+
     /**
      * Test of main method, of class org.nwoca.ssdt.tools.html2wiki.Html2Wiki.
-     */
-    public void testMain() throws Exception  {
-        System.out.println("main");
-        
-        
-         Html2Wiki.main(new String[] {"\\C:\\temp\\", "EMIS System Managers Manual"});
-        
-    }
-    
-//    public  void testHtml2Wiki() throws Exception {
-//        
-//        File testFile = new File("\\C:\\temp\\test.html");
-//        Html2Wiki.process(testFile);
-//        
+//     */
+//    public void testMain() throws Exception {
+//        System.out.println("main");
+//
+//        File path = new File(Html2WikiTest.class.getResource("/resources").toURI());
+//        System.out.println(path);
+//        Html2Wiki.main(new String[]{path.toString(), "OECN System Managers Handbook"});
+//
 //    }
-    
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/resources/sysman_handbook.html	Tue Jan 25 17:06:57 2011 -0500
@@ -0,0 +1,7039 @@
+<html>
+<a name="first_page"></a>
+
+<!-- This file created using DECdocument  Version V3.3h on 25-JAN-2011 16:09:07.97 -->
+<!-- TAG definitions version: V3.3h -->
+<!-- The SDML doctype is: SOFTWARE.REFERENCE -->
+<!-- The output destination was: HTML -->
+<!-- SDML file is: NWB:[SMITH.DEV.SDML]OECN10_SYSMAN_HANDBOOK.SDML -->
+
+<body>
+<head>
+<title>Ohio Educational Computer Network System (OECN)</title>
+<style>
+A:hover {color: green}
+A:active {color: red; background-color: white}
+</style>
+</head>
+<h1 align="center">Ohio Educational Computer Network System (OECN)</h1>
+<h1 align="center">System Manager Manual</h1>
+As Developed by: Ohio Department of Education, State Software 
+Development Team
+<p align=center>
+<strong>Revision/Update Information: </strong>
+May, 2001
+
+<p>
+<hr size=5>
+<h4>Copyright &copy;1992, 1995 Ohio Department of Education</h4>
+
+<p>
+Permission to reproduce this document is hereby granted, provided that 
+all such reproductions include all of this document (including this 
+copyright notice), and are not distributed for profit or resale.
+<p>
+<table border=5>
+  <tr>
+    <td width=120 align=center>
+<a href="oecn10_sysman_handbook_full_contents.html"><font size=+2>Contents</font></a>
+    </td>
+  </tr>
+</table>
+<a name="post_contents"></a>
+
+<p>
+<hr size=5>
+<a name="menu_processor"><h1>Menu Processor Theory and Implementation</h1></a>
+<br>
+<br>
+
+<p>
+This section contains 6 chapters which describe the OECN Menu Processor 
+for the system manager. It includes a complete description of the 
+theory and implementation of the menu processor on a VAX/VMS system. 
+The 6 chapters are:
+
+<p>
+ Introduction
+<br>
+        Theory
+<br>
+ Implementation
+<br>
+ Invoking the Menu Processor
+<br>
+ Modifying and Creating Menu Systems
+<br>
+ Customizing Menus from the Distribution
+
+<p>
+<hr size=5>
+<a name="menu_intro"><h1>Chapter 1<br>Introduction</h1></a>
+
+<p>
+ The OECN Menu processor provides a flexible user menu interface to 
+ State Software programs. It also can be used to create menus for DCL 
+ commands, and other layered products. Menu definitions will be provided 
+ for all state software programs. Individual A-sites will be able to add 
+ customized menus to the default menu system provided.
+
+<a name="menu_features_head"><h1>1.1 Features</h1></a>
+
+<p>
+    The Menu processor provides the following features:
+
+<ul>
+  <li>User may access an item by its item number or label.
+  <li>Abbreviations are allowed on the current menu.
+  <li>Aliases are supplied for all items. The user may enter the label 
+  name for any item on any menu in the current menu system.
+  <li>Help may be obtained for the current menu via the VMS Help utility.
+  <li>Users will only see the items on the menu that they are authorized 
+  to access.
+</ul>
+
+<p>
+    Features for the system manager:
+
+<ul>
+  <li>May be used for CAPTIVE user accounts.
+  <li>Menus or items may be easily added or removed.
+  <li>Access to items and menus may be controlled with the standard 
+  OECN_xxxx VMS security identifiers.
+  <li>The OSA utility may be used to customize security.
+  <li>A menu system may consist of multiple menu files. This allows 
+  individual A-sites to add custom menus without modifying the menus 
+  included in the distribution.
+  <li>By default, does not spawn a subprocess when executing a command. 
+  All commands execute in the current process. This prevents the 
+  excessive overhead associated with repeatedly spawning subprocesses.
+  <li>Optionally, spawns most commands in a subprocess. Spawning commands 
+  may increase response time for larger VAX processors. This may be 
+  configured by the system manager.
+  <li>May be used from batch if the third parameter to the OECN_MENU 
+  procedure is used.
+  <li>Optional timeout feature that automatically exits the menu system 
+  if the user remains inactive for a specified period.
+</ul>
+
+<p>
+<hr size=5>
+<a name="menu_theory"><h1>Chapter 2<br>Theory</h1></a>
+
+<p>
+ The basic theory behind the Menu processor is fairly simple. The menu 
+ definitions are stored in an RMS indexed file. The menu definitions are 
+ flexible enough to allow creation of menus containing any combination 
+ of DCL commands, programs and information.
+
+<a name="menu_terms_head"><h1>2.1 Definition of Terms</h1></a>
+
+<p>
+ First, it will be helpful to define some terms that will be used 
+ throughout the rest of this document. <p>
+
+<table border=3>
+  <caption><a name="menu_terms_tab"><strong>Table 2-1 Menu System Terms</strong></a></caption>
+  <tr>
+    <th align=center>Term </th>
+    <th align=center>Meaning </th>
+  </tr>
+  <tr>
+    <td>
+      Menu Processor
+    </td>
+    <td>
+      The program that the user runs to enter a menu system.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu
+    </td>
+    <td>
+      A menu consists of the menu heading and the menu items on that menu.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu name
+    </td>
+    <td>
+      The name of the menu as defined in the MENUEDT program.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu item
+    </td>
+    <td>
+      An item on a menu. An item belongs to a specific menu and must have a 
+      label that is unique throughout the menu system.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      label
+    </td>
+    <td>
+      A label is the unique name for an item. It is defined in the MENUEDT 
+      program and is the label the user will see on the actual menu.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu file
+    </td>
+    <td>
+      A file created by MENUEDT that contains the menu definitions for one 
+      for more menus.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu system
+    </td>
+    <td>
+      A menu system is a collection of menus that the user has access to. 
+      This is the
+      <strong>logical</strong> menu system as viewed by a specific user. A 
+      system may consist of one or more physical menu files.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu specification
+    </td>
+    <td>
+      A menu specification is the format for specifying a menu. The 
+      specification may contain a file and/or a menu name.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      alias
+    </td>
+    <td>
+      For each item in the menu system an alias is created. It has the same 
+      name as the item's label. The alias is global to the entire menu 
+      system, i.e., it crosses all menu file boundaries. The alias must be 
+      unique within each menu system.
+    </td>
+  </tr>
+</table>
+
+<a name="menu_files_theory"><h1>2.2 How Menu Files Create a Menu System</h1></a>
+
+<p>
+<a href="oecn10_sysman_handbook_full.html#menu_system_fig">Figure 2-1</a> displays a graphical representation of a possible menu 
+system.
+<a name="menu_system_fig"></a>
+<p>
+<strong>Figure 2-1 Conceptual View of a Menu system</strong>
+<hr>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
++-----------------------Menu-System-------------------+ 
+|            +Menu-File+                              | 
+|            |         |                +-Alias-File-+| 
+|            | +Menu+  |                |            || 
+|            | |    |  |                |            || 
+|            | +----+  |                |            || 
+|            +----+----+                |            || 
+|         +-------+------------+        +------------+| 
+| +---Menu+File--+        +Menu+File-+  +-Secur-File-+| 
+| | +Menu+       |        |          |  |            || 
+| | |    |       |        | +Menu+   |  |            || 
+| | +-+--+       |        | |    |   |  |            || 
+| |   +------+   |        | +----+   |  |            || 
+| | +Menu+ +Menu+|        +----+-----+  +------------+| 
+| | |    | |    ||        +----+------+               | 
+| | +----+ +-+--+|        |           |               | 
+| |   +------+   |   +Menu+File+ +Menu+File+          | 
+| | +Menu+ +Menu+|   | +Menu+  | | +Menu+  |          | 
+| | |    | |    ||   | |    |  | | |    |  |          | 
+| | +----+ +----+|   | +----+  | | +----+  |          | 
+| +--------------+   +---------+ +---------+          | 
++-----------------------------------------------------+ 
+</pre>
+</table>
+
+<p>
+ You can see from <a href="oecn10_sysman_handbook_full.html#menu_system_fig">Figure 2-1</a> that a menu system as seen by the user may 
+ consist of multiple menu files, and a menu file may contain multiple 
+ menus. This provides considerable flexibility for designing and 
+ modifying a menu system.
+
+<p>
+ The menu system that is included with the distribution will have a 
+ separate menu file for each OECN state software package. Additionally, 
+ each major package will have a <strong>local</strong> menu. This local 
+ menu will be in a separate menu file and left blank. You will be able 
+ to customize this local menu without disturbing the other menus.
+
+<p>
+ A more detailed description of how to modify and create menus will 
+ follow later in this document. The method used to customize local menus 
+ will be discussed.
+
+<p>
+ Each menu system has one alias file. This file is used to find an 
+ item's location if the user enters an alias.
+
+<p>
+Also, the menu system may have one local security file. This file is 
+optional and created by the OSA utility. See the OECN Software Security 
+for VAX/VMS System Manager manual for more information about security 
+and the OSA utility.
+
+<a name="menu_specs_head"><h1>2.3 Menu Specifications</h1></a>
+
+<p>
+ Throughout this document there are references to <strong>menu 
+ specifications</strong>. Wherever a menu specification is required the 
+ following syntax is allowed:
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+@menu_file\menu_name 
+</pre>
+    </td>
+  </tr>
+</table>
+<p>
+
+<table border=3>
+  <tr>
+    <th align=center>Parameter </th>
+    <th align=center>Meaning </th>
+  </tr>
+  <tr>
+    <td>
+      @menu_file
+    </td>
+    <td>
+      Name of a menu file that contains menu_name. If not specified then 
+      menu_name is assumed to exist in the current menu file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      menu_name
+    </td>
+    <td>
+      A menu within either the specified menu file or the current menu file.
+    </td>
+  </tr>
+</table>
+
+<p>
+ A valid menu specification contains one or both of these components.
+
+<p>
+ If a menu name is specified without a menu file then the menu is 
+ assumed to exist in the current menu file. If there is no current menu 
+ file then OECN$MENU is used.
+
+<p>
+ If a menu file is specified without a menu name then the default menu 
+ of the menu file's header record is used.
+
+<p>
+ If both the menu file and menu name are specified they must be 
+ separated by a backslash (\).
+
+<p>
+Examples:
+
+<table border=3>
+  <tr>
+    <th align=center>Specification </th>
+    <th align=center>Result </th>
+  </tr>
+  <tr>
+    <td>
+      @BUD_MENU\USAS_PRC
+    </td>
+    <td>
+      Goes to the USAS_PRC menu of the BUD_MENU file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      @MAIN_MENU
+    </td>
+    <td>
+      Goes to the default menu of the MAIN_MENU file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      LOCAL
+    </td>
+    <td>
+      Goes to the LOCAL menu of the current file.
+    </td>
+  </tr>
+</table>
+
+<a name="alias_file_head"><h1>2.4 The Alias File</h1></a>
+
+<p>
+ Each menu system may have exactly one <strong>alias file</strong>. An 
+ alias file contains a record for each menu item in the menu system. 
+ This alias record contains a pointer to the proper menu file that 
+ contains the item.
+
+<p>
+ When the user enters a label name that is not on the current menu, the 
+ alias file is checked for the label. If found then the item is located 
+ in the appropriate menu file, and, assuming the user has access to the 
+ item, it is executed. This allows the user to get to any item or menu 
+ in the menu system without navigating through the intervening menus.
+
+<p>
+The alias file is built automatically by the MENUUTL program. See 
+<a href="oecn10_sysman_handbook_full.html#build_alias_head">Section 5.2.1, Building the Alias File</a> for more information about creating the alias file.
+
+<a name="option_exec_sect"><h1>2.5 Option execution</h1></a>
+
+<p>
+By default, the menu processor does <em>not</em> spawn subprocesses to 
+execute user options. All commands are executed in the user's current 
+process. This implies that menu processor image must exit and restart 
+(activate) after each option has completed. This is called 
+<strong>"terminate and execute"</strong> mode. This mode may provided 
+optimal response time for smaller VAX processors, particularly machines 
+with small memory configurations.
+
+<a name="heading_2.5.1"><h2>2.5.1 Spawning Options</h2></a>
+
+<p>
+Another mode that may be chosen by the system manager is "spawn and 
+execute". In this mode, <em>most</em> commands are executed in a 
+subprocess. The menu processor remains running in the main process and 
+does not terminate. Spawning options may reduce response time for 
+larger VAX machines with excess physical memory.
+
+<p>
+No firm guidelines can be provided to suggest which mode will provide 
+optimal response time and resource utilization for a given system. 
+Response time in both modes is determined by machine size, available 
+memory, tuning, typical load on the system, etc. Trial and error under 
+a typical work load is the only way to determine the best mode. If the 
+time required to spawn a process is less than the time required to 
+activate the menu image, then spawning is preferable.
+
+<p>
+To implement menu option spawning the system manager must be aware of 
+the following:
+
+<ol start=1 >
+  <li>Users must have a PRCLM Authorize quota of at least 1. If the user 
+  executes programs that also spawn processes (e.g., TPU/EVE, WPS) they 
+  may need a higher PRCLM quota.
+  <li>Other user quotas also may need to be increased in order for the 
+  main and subprocess to have access to sufficient resources.
+  <li>BALCSETCNT (balance set count) in SYSGEN must be large enough to 
+  handle the addition processes.
+  <li>Some types of options must be executed in the main process (see 
+  below).
+</ol>
+
+<p>
+Prior to implementing spawning you must carefully consider whether any 
+custom menu files contain any options that fall under #4 above. The 
+subprocess that is created by the menu processor is temporary (i.e., 
+the subprocess logs out as soon as the option has completed). This 
+means that any commands performed in the subprocess will not be 
+permanent. If you have options that change user logicals, create 
+processes, etc. or anything that must affect both the main process and 
+the subprocess, you must modify your custom menu files.
+
+<p>
+The MENUEDT program will allow you to define an item type "DP" (DCL 
+command in Parent). These types of items will always be executed in the 
+main process using "terminate and execute". These means that any 
+commands executed in this way will affect both the main process and 
+subprocess. These types of items should be used sparingly and will 
+seldom be necessary. The only item in the menu files distributed by 
+SSDT that need the "DP" item type was the DETPRT option of the LOCAL 
+menu. All other SSDT menu items may be executed in a subprocess.
+
+<a name="heading_2.5.2"><h2>2.5.2 Selecting Execution Mode</h2></a>
+
+<p>
+To select either "terminate and execute" or "spawn and execute" mode, 
+the system manager needs only define a single logical. The logical name 
+is OECN$MENU_BEHAVIOR and may be defined in the SYSTARTUP procedure. 
+The valid values are: TERMINATE or SPAWN. For example, if you want to 
+use "spawn and execute", add the following line the SYSTARTUP procedure:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "SPAWN" 
+</pre>
+</table>
+
+<p>
+This logical also can be defined at the group or process level. If the 
+logical is not defined, the default is "TERMINATE".
+
+<a name="timeout_head"><h1>2.6 Inactivity Timeout</h1></a>
+
+<p>
+The menu processor has an optional feature that will cause it to 
+automatically exit if the user does not enter a command after a 
+specified period of time. This might be a useful security feature for 
+user users who remain idle in the menu for long periods of time or 
+forget to logout.
+
+<p>
+The system manager may add a command to the OECN$MENU_BEHAVIOR logical 
+that will enable the timeout feature. The following syntax may be used:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "TIMEOUT=n" 
+</pre>
+</table>
+
+<p>
+ Where <em>n</em> is the number minutes to wait with no activity. After 
+ the timeout period expires without any options being entered, the menu 
+ processor will exit automatically.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+The menu processor simply exits the menu and returns to DCL it does not 
+log the user off the system. It is up to the local captive login 
+procedure or other mechanism to log the user off. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+<hr size=5>
+<a name="menu_implentation_chap"><h1>Chapter 3<br>Implementation</h1></a>
+
+<p>
+ Several steps are required in order to implement the Menu Processor on 
+ your system. The steps are briefly outlined below, detailed 
+ explanations follow:
+
+<ol start=1 >
+  <li> Install the OECN, MENU and HELP distribution packages with 
+  OECN_INSTALL.
+  <li> Establish the necessary OECN logicals.
+  <li> Move the menu files and VMS Help libraries from the distribution 
+  directories to the appropriate directories on your system.
+  <li> Create the OECN_MENU symbol.
+  <li> Use the VMS Install utility to make the Menu Processor a known, 
+  shared image.
+</ol>
+
+<a name="installation_head"><h1>3.1 Installation</h1></a>
+
+<p>
+ The Menu Processor uses files from the OECN, MENU and HELP packages. 
+ Install these packages as usual using OECN_INSTALL. For further 
+ information about OECN_INSTALL see OECN_INSTALL.DOC in the VAX manager 
+ documentation directory.
+
+<a name="logicals_head"><h1>3.2 Establish OECN Logicals</h1></a>
+
+<p>
+ Several logicals are used by the Menu Processor to locate the menu 
+ files and VMS Help libraries. <p>
+
+<table border=3>
+  <caption><a name="logicals_tab"><strong>Table 3-1 Menu Logicals</strong></a></caption>
+  <tr>
+    <th align=center>Logical </th>
+    <th align=center>Purpose </th>
+  </tr>
+  <tr>
+    <td>
+      OECN$MENU$FILES
+      <sup>1</sup>
+    </td>
+    <td>
+      Device and directory where the menu files are located.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$MENU
+      <sup>2</sup>
+    </td>
+    <td>
+      Default menu file if none is specified by the user when the Menu 
+      Processor is invoked.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$ALIAS
+      <sup>2</sup>
+    </td>
+    <td>
+      Default alias file that is used if none is specified when the Menu 
+      Processor is invoked.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$SECUR
+    </td>
+    <td>
+      Local security file. Optional. Created by OSA utility to define local 
+      security.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$HELP
+      <sup>1</sup>
+    </td>
+    <td>
+      Device and directory where the VMS Help libraries are located.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$MENU_HELP
+      <sup>2</sup>
+    </td>
+    <td>
+      Default menu help library. Used when the user presses
+      <kbd>[PF2]</kbd> or ?.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN_MENU_PROMPT
+    </td>
+    <td>
+      Default prompt to be used in the Menu Processor. Optional. May be 
+      overridden by the user with a SET PROMPT command.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN_MENU_MODE
+    </td>
+    <td>
+      Default mode. Optional. May contain the "MENU" or "COMMAND". May be 
+      overridden by the user with a SET MODE command.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$MENU_BEHAVIOR
+    </td>
+    <td>
+      Optional logical that may contain commands to control how the menu 
+      processor behaves at run-time. This logical is defined by the system 
+      manager. See <a href="oecn10_sysman_handbook_full.html#behavior_logical">3.2.1</a>.
+    </td>
+  </tr>
+</table>
+<hr>
+<sup>2</sup> Defined by the OECN_STARTUP procedure.
+<br>
+<sup>1</sup>May be defined as a search list.
+<br>
+<hr>
+
+<p>
+ OECN$MENU$FILES and OECN$HELP must be defined in either the SYSTARTUP 
+ or individual LOGIN.COM files. These logicals may be defined at the 
+ system, group or process level. For example, the OECN$MENU logical may 
+ be defined for each user to provide a different default menu.
+
+<a name="behavior_logical"><h2>3.2.1 Specifying options with OECN$MENU_BEHAVIOR logical</h2></a>
+
+<p>
+ This section describes the commands that may be placed in the 
+ OECN$BEHAVIOR logical. The syntax for the logical definition is:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "command[,command]..." 
+</pre>
+</table>
+
+<p>
+ Where <em>[command]</em> is one of the commands in the following table. 
+ The command(s) must be enclosed in quotes and be in uppercase. When 
+ multiple commands are specified they must be separated by commas (,). 
+ This logical can be defined at the system, group, job or process level. 
+ <p>
+
+<table border=3>
+  <caption><a name="Table_3-2"><strong>Table 3-2 Behavior Options</strong></a></caption>
+  <tr>
+    <th align=center>Command </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      TERMINATE
+    </td>
+    <td>
+      Causes the processor to use the &quot; terminate and execute &quot; 
+      method for executing options. This is the default behavior.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      SPAWN
+    </td>
+    <td>
+      Causes the processor to spawn all DCL and Program type action items in 
+      a subprocess.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TIMEOUT=n
+    </td>
+    <td>
+      Sets the inactivity timeout interval to n minutes.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      NOTIMEOUT
+    </td>
+    <td>
+      Disables inactivity timeout. This is the default behavior.
+    </td>
+  </tr>
+</table>
+
+<p>
+ For example, to specify the spawn option and a timeout of 30 minutes 
+ use the following command:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_BEHAVIOR "SPAWN,TIMEOUT=30" 
+</pre>
+</table>
+
+<a name="move_files_head"><h1>3.3 Move Files to Appropriate Directories</h1></a>
+
+<p>
+ Move the menu files (OECN$ROOT:[MENU.DIST]*.DAT) to the directory 
+ referenced by OECN$MENU$FILES.
+
+<p>
+ Move the VMS Help libraries from the HELP package distribution 
+ directory to the directory referenced by OECN$HELP.
+
+<p>
+ The users of the Menu Processor must have read access to the above 
+ files.
+
+<p>
+ Also move the following files to the OECN$ directory:
+
+<blockquote>
+  OECN$ROOT:[OECN.V1P0.DIST]MENU.EXE
+  <br>OECN$ROOT:[OECN.V1P0.DIST]OECN_MENU.COM
+</blockquote>
+
+<p>
+ The users must have execute access to these files.
+
+<a name="add_symbol_head"><h1>3.4 Add Global Symbol</h1></a>
+
+<p>
+ Add the following symbol to either your SYLOGIN.COM or each user's 
+ LOGIN.COM who will be using the system:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ OECN_MENU :== $OECN$:MENU 
+</pre>
+</table>
+
+<p>
+ This creates a foreign command that the OECN_MENU.COM procedure uses to 
+ invoke the Menu Processor. Other symbols may be necessary to make it 
+ easier for your users to invoke a menu. These symbols will be discussed 
+ in the <a href="oecn10_sysman_handbook_full.html#invoking_chap">Chapter 4, Invoking the Menu Processor</a>. The OECN_MENU symbol is the only required symbol.
+
+<a name="install_head"><h1>3.5 Install the Menu Processor</h1></a>
+
+<p>
+ Although it is not necessary for proper execution of the Menu 
+ Processor, it is <strong>strongly</strong> recommended that you install 
+ the Menu Processor as a known image.
+
+<p>
+ Because the Menu Processor does not spawn a subprocess it must be 
+ reactivated after each time the user selects a menu item. If the image 
+ is not installed, image activation will cause a noticeable delay in the 
+ Menu Processor.
+
+<p>
+ The recommended method of installing the image is to add the following 
+ commands to your SYSTARTUP.COM:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ INSTALL :== $INSTALL/COMMAND_MODE 
+$ INSTALL ADD OECN$:MENU.EXE/OPEN/SHARED/HEADER 
+</pre>
+</table>
+
+<p>
+<hr size=5>
+<a name="invoking_chap"><h1>Chapter 4<br>Invoking the Menu Processor</h1></a>
+
+<p>
+ The Menu Processor must be invoked via a command procedure that is 
+ provided as part of the OECN package. The Menu Processor depends on 
+ this command procedure to perform several vital functions and to 
+ actually execute any items selected by the user. Absolutely nothing 
+ useful will happen if the Menu Processor is invoked directly.
+
+<p>
+ Additionally, the Menu Processor is invoked by the command procedure 
+ with a foreign command. Therefore the following symbol definition is 
+ required. See <a href="oecn10_sysman_handbook_full.html#add_symbol_head">Section 3.4, Add Global Symbol</a>.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ OECN_MENU == "$OECN:MENU" 
+</pre>
+</table>
+
+<p>
+ To invoke the menu processor the following command must be used:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ @OECN$:OECN_MENU [menu spec] [alias file] [menu_option] 
+</pre>
+</table>
+
+<p>
+ The OECN_MENU.COM command procedure is provided with the distribution 
+ and must be used to invoke the menu processor.
+
+<p>
+ The first parameter is an optional menu specification that specifies 
+ the default menu file and menu to be used. If the menu specification is 
+ not supplied then OECN$MENU is used by default. See <a href="oecn10_sysman_handbook_full.html#menu_specs_head">Section 2.3, Menu Specifications</a> for 
+ more information about menu specifications.
+
+<p>
+ The second optional parameter is the alias file for the menu system 
+ being invoked. If not specified then OECN$ALIAS is used by default.
+
+<p>
+The third optional parameter is a menu command, option or alias to be 
+executed. If this parameter is specified then the menu processor will 
+execute the option and return to DCL, the user will 
+<strong>not</strong> be left in the menus after the option has finished 
+executing. This could be used as a replacement for the DCL RUN command, 
+particularly for batch procedures. This would insure that batch 
+procedures do the same security checking as interactive processes.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+The menu processor will operate properly in batch only if the third 
+parameter is supplied. If the parameter is not specified the menu 
+processor will not function in batch. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+ This command may be defined in a global symbol, invoked from a captive 
+ login procedure or from inside another procedure. No restrictions are 
+ placed on the method of invoking the Menu Processor.
+
+<a name="invoke_example_head"><h1>4.1 Examples</h1></a>
+
+<p>
+ For most users the following symbol definition is sufficient:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ MENU == "@OECN$:OECN_MENU" 
+</pre>
+</table>
+
+<p>
+ This will invoke the Menu Processor with the default menu and alias 
+ file. This will normally, unless changed by you, be the MAIN_MENU file, 
+ which contains menu items for all state software packages.
+
+<p>
+If users will be using the third parameter (or it will be used from 
+batch) then the following symbol might be used:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ MENU == "OECN$:OECN_MENU """" """" " 
+</pre>
+</table>
+
+<p>
+This will leave the first two parameters as null (accepting the default 
+menu and alias files) and allow the third parameter to be specified 
+after the MENU symbol.
+
+<p>
+ As another possibility, suppose that you have a payroll user that would 
+ rather be started out in the USPS menu. In this case put this symbol in 
+ that user's LOGIN procedure:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ MENU == "@OECN$:OECN_MENU @PAY_MENU" 
+</pre>
+</table>
+
+<p>
+ This will put the user in the PAY_MENU directly. Note that this does 
+ not restrict the user to the PAY_MENU, it just starts them out in that 
+ menu.
+
+<p>
+<hr size=5>
+<a name="modifying_menus_chap"><h1>Chapter 5<br>Modifying and Creating Menu Systems</h1></a>
+
+<p>
+ The MENUEDT program is a fully functional maintenance program for 
+ modifying and creating menu files. Another program, MENUUTL, provides 
+ several necessary and useful utilities when manipulating the files, 
+ such as building the alias file and reporting functions. <p>
+
+<table border=3>
+  <caption><a name="menu_type_tab"><strong>Table 5-1 Menu Record Types</strong></a></caption>
+  <tr>
+    <th align=center>Record Type </th>
+    <th align=center>Function </th>
+  </tr>
+  <tr>
+    <td>
+      File Header Record
+    </td>
+    <td>
+      Contains information about the entire menu file. There is only one file 
+      header record per file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Menu Header Record
+    </td>
+    <td>
+      Contains information specific to one menu. There is no structural or 
+      logical limit to the number of menus that may exist in a menu file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Item Record
+    </td>
+    <td>
+      Contains the actual item that appears on a menu. Each item record 
+      belongs to one and only one menu. The number of items is limited by the 
+      Menu Processor to 50 items (about 4 screens).
+    </td>
+  </tr>
+</table>
+
+<p>
+ The menu files and records form a <em>loose</em> hierarchy. That is, 
+ the hierarchy is created by the person developing the menu system. The 
+ hierarchy is not enforced by the MENUEDT program or even the Menu 
+ Processor. The menus can be connected in an almost limitless number of 
+ combinations. It is impossible for the MENUEDT program to know exactly 
+ what the runtime environment will be for the menu file. Thus, very 
+ little error checking is performed or even attempted. This means that 
+ menus that you modify or create should be tested thoroughly before 
+ being made available to your users.
+
+<a name="using_edt_head"><h1>5.1 Using MENUEDT</h1></a>
+
+<p>
+ When you first run the MENUEDT program it will prompt you for the name 
+ of the menu file to modify. If the file does not exist it will be 
+ created. <p>
+
+<table border=3>
+  <caption><a name="edt_options_tab"><strong>Table 5-2 MENUEDT Main Menu Options</strong></a></caption>
+  <tr>
+    <th align=center>Option </th>
+    <th align=center>Function </th>
+  </tr>
+  <tr>
+    <td>
+      Add
+    </td>
+    <td>
+      Adds new records of any type.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Change
+    </td>
+    <td>
+      Enters change mode for the current record.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Delete
+    </td>
+    <td>
+      Deletes the current record.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Top
+    </td>
+    <td>
+      Goes to top of file (File header record).
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Find
+    </td>
+    <td>
+      Finds a record by menu or item name.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Next
+    </td>
+    <td>
+      Goes to the next record.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Simulate
+    </td>
+    <td>
+      Simulates how the menu will look to the user. The simulation is 
+      approximate since the MENUEDT upper window is smaller than in the Menu 
+      Processor.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Open
+    </td>
+    <td>
+      Closes the current menu file and prompts for a new menu file to open.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Exit
+    </td>
+    <td>
+      Exits MENUEDT.
+    </td>
+  </tr>
+</table>
+
+<a name="menu_type_head"><h2>5.1.1 Menu File Record Types</h2></a>
+
+<p>
+ This section and the following sections show sample screens that are 
+ used by MENUEDT to modify the various record types. After each screen 
+ is a detailed explanation of each field and its purpose.
+
+<a name="file_header_head"><h2>5.1.2 File Header Record</h2></a>
+
+<p>
+ The first record in each menu file must be a File Header record and 
+ each file must contain exactly one Header record.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+              Menu File Header Record:   
+                                                               
+               1. Desc:  
+               2. Default menu:  
+               3. Modify default security identifiers                  
+                                                               
+</pre>
+</table>
+
+<p>
+
+<table border=3>
+  <caption><a name="file_header_fld_tab"><strong>Table 5-3 File Header Record Fields</strong></a></caption>
+  <tr>
+    <th align=center>Field </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      Desc
+    </td>
+    <td>
+      This description is used in the heading for all menus in this file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Default Menu
+    </td>
+    <td>
+      Is the default menu for this file if the user does not specify a menu 
+      when the file is invoked. This menu will normally be the top-level menu 
+      for this file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Modify default security identifiers
+    </td>
+    <td>
+       Enters the
+      <em>Security Id Maintenance</em> screen to allow default security 
+      identifiers to be placed on the menu file. See <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> for more 
+      information about security identifiers.
+    </td>
+  </tr>
+</table>
+
+<a name="menu_header_head"><h2>5.1.3 Menu Header Record</h2></a>
+
+<p>
+ The Menu Header record contains information about each menu in the 
+ file. There must be exactly one Header record for each menu contained 
+ in the file.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+               Menu header record:                             
+                                                               
+                1. Menu Name   :  
+                2. Description :  
+                3. Heading Type:  
+                4. Help file   :                               
+                5. Help topic  :                               
+                6. Parent Menu :                               
+                7. Modify Security Identifiers                 
+    
+</pre>
+</table>
+
+<p>
+
+<table border=3>
+  <caption><a name="menu_header_fld_tab"><strong>Table 5-4 Menu Header Fields</strong></a></caption>
+  <tr>
+    <th align=center>field </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      Menu Name
+    </td>
+    <td>
+      Name of the menu. This is the name that will be displayed in the menu 
+      heading.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Description
+    </td>
+    <td>
+      This description is used in the heading for this menu.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Heading Type
+    </td>
+    <td>
+      Indicates what type of menu heading to use for this menu.
+      <table border=3> 
+        <tr>
+          <td>
+            A
+          </td>
+          <td>
+            Heading contains both the file description and the menu description.
+          </td>
+        </tr>
+        <tr>
+          <td>
+            B
+          </td>
+          <td>
+            Heading contains only the menu heading description.
+          </td>
+        </tr>
+      </table> 
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Help File
+    </td>
+    <td>
+       The VMS Help file that will be used if the user enters HELP at this 
+       menu.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Help topic
+    </td>
+    <td>
+      The initial topic string used when the user enters HELP.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Parent Menu
+    </td>
+    <td>
+      Must contain the parent menu specification for this menu. This is the 
+      menu that the user will return to when they enter /EXIT or ^. If this 
+      field is blank then the menu is assumed to be the top level menu of the 
+      menu system.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Modify security identifiers
+    </td>
+    <td>
+       Enters the
+      <em>Security Id Maintenance</em> screen to allow security identifiers 
+      to be placed on the menu. See <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> more information about 
+      security identifiers.
+    </td>
+  </tr>
+</table>
+
+<a name="menu_item_head"><h2>5.1.4 Menu Item Record</h2></a>
+
+<p>
+ One menu item record must be specified for each desired item on a menu. 
+ A menu can contain a maximum of 50 item records. If there are less than 
+ 8 items then the menu will be double spaced, otherwise the menu will be 
+ single spaced. If there are more items than will fit on one screen then 
+ the menu will be divided into multiple screens.
+
+<p>
+ An item may be of one of four types, the value and meaning of the 
+ Action field is determined by the Item Type field. The four possible 
+ types and the meaning of the Action field are defined in <a href="oecn10_sysman_handbook_full.html#item_types_tab">Table 5-5</a>. 
+ <p>
+
+<table border=3>
+  <caption><a name="item_types_tab"><strong>Table 5-5 Menu Item Types</strong></a></caption>
+  <tr>
+    <th align=center>Item Type </th>
+    <th align=center>Interpretation of Action Field </th>
+  </tr>
+  <tr>
+    <td>
+      D
+    </td>
+    <td>
+      DCL command to execute
+    </td>
+  </tr>
+  <tr>
+    <td>
+      DP
+    </td>
+    <td>
+      DCL command to execute in Parent process
+    </td>
+  </tr>
+  <tr>
+    <td>
+      P
+    </td>
+    <td>
+      Program filespec to execute
+    </td>
+  </tr>
+  <tr>
+    <td>
+      M
+    </td>
+    <td>
+      Menu specification
+    </td>
+  </tr>
+  <tr>
+    <td>
+      T
+    </td>
+    <td>
+      Ignored
+    </td>
+  </tr>
+</table>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+      Menu Item record: 
+                       
+         1. Menu Name: 
+         2. Label    : 
+         3. Desc     : 
+         4. Item Type: 
+         5. Action   : 
+                             
+         6. Item order#: 
+         7. Modify Security Identifiers 
+ 
+</pre>
+</table>
+
+<p>
+
+<table border=3>
+  <caption><a name="menu_item_tab"><strong>Table 5-6 Menu Item Fields</strong></a></caption>
+  <tr>
+    <th align=center>Field </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      Menu Name
+      <sup>1</sup>
+    </td>
+    <td>
+      Name of the menu that this item belongs to.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Label
+      <sup>1</sup>
+    </td>
+    <td>
+      Label of this item that the user will use to reference this item.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Desc
+    </td>
+    <td>
+      Description displayed for this item.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Item Type
+    </td>
+    <td>
+      Indicates what type of item this is:
+      <table border=3> 
+        <tr>
+          <td>
+            D
+          </td>
+          <td>
+            DCL command
+          </td>
+        </tr>
+        <tr>
+          <td>
+            DP
+          </td>
+          <td>
+            DCL in Parent process
+          </td>
+        </tr>
+        <tr>
+          <td>
+            P
+          </td>
+          <td>
+            Program to be executed
+          </td>
+        </tr>
+        <tr>
+          <td>
+            M
+          </td>
+          <td>
+            Menu item
+          </td>
+        </tr>
+        <tr>
+          <td>
+            T
+          </td>
+          <td>
+            Text Item
+          </td>
+        </tr>
+      </table> 
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Action
+    </td>
+    <td>
+      Contains the action to be performed when this item is selected. See 
+      <a href="oecn10_sysman_handbook_full.html#action_values_head">Section 5.1.4.1</a> for more information.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Item order #
+    </td>
+    <td>
+      This field is used to order the items on the menu. By default the items 
+      are in alphabetical order by Item Label. If you want to change the 
+      order of the items then you may put a number in the Item Order# field. 
+      This number does not affect the number that the user will use to invoke 
+      the item, it only affects the physical order of the items on the menu.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Modify security identifiers
+    </td>
+    <td>
+       Enters the
+      <em>Security Id Maintenance</em> screen to allow security identifiers 
+      to be placed on the item. See section <a href="oecn10_sysman_handbook_full.html#secur_id_screen_head">Section 5.1.5</a> for more information 
+      about security identifiers.
+    </td>
+  </tr>
+</table>
+<hr>
+<sup>1</sup>Key fields of the menu file. However the MENUEDT program 
+allows these fields to be changed.
+<br>
+<hr>
+
+<a name="action_values_head"><h3>5.1.4.1 Values for Action Field</h3></a>
+
+<p>
+ Much of the Menu Processor's flexibility is provided by the values that 
+ may be placed in the Action field. The Action field and the Item Type 
+ field together determine what will happen when the user chooses an item 
+ from a menu.
+<p>
+<strong>Item Type D (DCL)</strong>
+<br>
+
+<p>
+ If Type = "D" then Action must contain a valid DCL command. Any DCL 
+ command may be specified, including command procedures. These commands 
+ may be executed in subprocess depending on the setting of 
+ OECN$MENU_BEHAVIOR (See <a href="oecn10_sysman_handbook_full.html#option_exec_sect">Section 2.5</a>). For example, the following are 
+ valid for Action:
+
+<blockquote>
+  MAIL
+  <br>@PURGE_TEXT_FILES
+  <br>Write sys$output "Hello there."
+</blockquote>
+
+<p>
+ If the DCL command requires or allows parameters to be specified you 
+ may place a tilde (~) at the location where the parameters should be 
+ placed.
+
+<p>
+ As a simple example, assume that you have a print procedure that allows 
+ the filename and the number of copies as parameters. Item Label is 
+ PRINT and the name of the command procedure is OECN$UTL:PRINT.COM. On 
+ the PRINT item record you would put the following in the Action field:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+@OECN$UTL:PRINT ~ ~ 
+</pre>
+</table>
+
+<p>
+ When the user enters the PRINT item from the Menu Processor they may 
+ specify the parameters on one line. For example, the user could enter:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Menu&gt; PRINT MYFILE.TXT 10
+</pre>
+</table>
+
+<p>
+ The DCL command that would be executed by the Menu Processor would be:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ @OECN$UTL:PRINT MYFILE.TXT 10
+</pre>
+</table>
+
+<p>
+ Up to 8 parameters may be specified. Parameters containing spaces must 
+ be enclosed in quotes. (Parameters may not contain quotes.) Lowercase 
+ characters are preserved inside of quotes. Parameters are replaced from 
+ left to right. No other parsing of the parameters is done. Parameters 
+ are always considered to be optional, if the user does not specify a 
+ parameter then the tilde (~) will be replaced by a space.
+<p>
+<strong>Item Type DP (DCL in Parent)</strong>
+<br>
+
+<p>
+ Type "DP" is identical to type "D" except that the Action line is 
+ always executed in the parent process. This only has an effect if the 
+ menu processor is in "spawn and execute" mode (See <a href="oecn10_sysman_handbook_full.html#option_exec_sect">Section 2.5</a>).
+
+<p>
+This item type should be used sparingly and only when the command 
+<em>must</em> be executed in the parent process. This is only necessary 
+when the commands being executed must affect both the parent and 
+subprocess. Examples of such commands are:
+
+<ul>
+  <li>Commands that change security identifiers
+  <li>Commands that modify menu logicals or modes
+  <li>Commands that spawn subprocesses with the /NOWAIT qualifier
+</ul>
+
+<p>
+<strong>Item Type P (Program)</strong>
+<br>
+
+<p>
+ If Type = "P" then the Action field contains the full VMS file 
+ specification for an executable image to be executed by the DCL RUN 
+ command. The distinction between programs and DCL commands is made 
+ primarily for compatibility with the HP version of the Menu Processor. 
+ However, future VAX releases may take advantage of this distinction.
+<p>
+<strong>Item Type M (Menu)</strong>
+<br>
+
+<p>
+ If Type = "M" then the Action field must contain a valid menu 
+ specification. This type of item allows the user to move from one menu 
+ to another at a lower level. The menu specified may be in the current 
+ menu file or may specify a completely different menu file. See 
+ <a href="oecn10_sysman_handbook_full.html#menu_specs_head">Section 2.3</a> for more information about menu specifications.
+<p>
+<strong>Item Type T (Text)</strong>
+<br>
+
+<p>
+ If Type = "T" then the action line is ignored. Text items are used to 
+ put information or subheadings on a menu. For text items, the 
+ Description field is simply displayed on the menu without a label or an 
+ option number.
+
+<a name="secur_id_screen_head"><h2>5.1.5 Menu Security Screen</h2></a>
+
+<p>
+ The <strong>Modify Security Identifier</strong> screen allows you to 
+ require that the user has specific VMS identifiers before they are 
+ allowed access to certain menu elements.
+
+<p>
+ Security may be placed on any level: File, Menu or Item. If the user 
+ does not have access to a menu item, it will not appear on the menu.
+
+<p>
+Three levels of access can be specified for each identifier that 
+appears on the Security Identifier screen: Read-only, Standard or Group 
+Manager. See <a href="oecn10_sysman_handbook_full.html#security_ids">Section 5.1.5.1</a> for more information about how these 
+identifiers are derived.
+
+<p>
+ The following screen shows an example of a menu element that requires 
+ the user to have read-only access to the OECN_PPS identifier or 
+ standard access to the OECN_SALSIM identifier. Note that the user must 
+ only have one of the selected identifiers. Of course, users with 
+ OECN_SYSMAN access have access to all menu elements regardless of these 
+ identifiers.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+    1) OECN_EDCIMS                9) OECN_SYSMAN 
+    2) OECN_EIS                   10) OECN_USAS  
+    3) OECN_OECN                  11) OECN_USPS  
+  R 4) OECN_PPS                   12) OECN_VIS   
+    5) OECN_PVS                   13) OECN_USER1 
+  S 6) OECN_SALSIM                14) OECN_USER2 
+    7) OECN_SECIMS                15) OECN_USER3 
+    8) OECN_SECIMS_GRPMAN         16) OECN_USER4 
+                                                        
+(R = Read-Only,  S = Standard, G = Group Manager)       
+ 
+</pre>
+</table>
+
+<p>
+ Security will be propagated through the menu structure. If security is 
+ not specified for a menu element, then security will be inherited from 
+ the level above it. The following list details the rules that are used 
+ to determine how security is inherited.
+
+<ol start=1 >
+  <li>If a menu item has no security specified for it, then security will 
+  be inherited from the menu header record to which the item belongs.
+  <li>If a menu header has no security, then it will inherit its security 
+  from its parent's menu header record. This occurs until a parent record 
+  is found that contains security information, or the top-level menu is 
+  found within the current menu file.
+  <li>The top-level menu of each menu file, will inherit security from 
+  the file header record.
+  <li>If no security is specified, after rule #3 above, then there is no 
+  security required to access the menu element.
+</ol>
+
+<p>
+ The identifiers OECN_USER1 through OECN_USER4 are for use locally at 
+ the A-sites. You may assign these identifiers in any manner you wish. 
+ For example, you may want to allow specific users to access VMS Mail. 
+ You could use OECN_USER1 to restrict a MAIL menu item to those users. 
+ These identifiers will not be used by SSDT in any State Software 
+ programs.
+
+<p>
+ If four identifiers are not enough for your site, you may add new ones. 
+ Up to 16 identifier positions have been reserved for use at the A-site 
+ level. See OECN_IDS.LIB in OECN$LIB: for instructions.
+
+<a name="security_ids"><h3>5.1.5.1 Security Identifiers</h3></a>
+
+<p>
+ The security identifiers that appear on the Security Identifier screen 
+ are the &quot;standard&quot; identifiers. Three possible identifiers 
+ exist for each standard identifier, which are used to specify three 
+ levels of access. These alternate identifiers are derived by adding a 
+ suffix to the standard identifier.
+
+<p>
+ The following table lists the three access levels, in order of lowest 
+ level access to the highest. <p>
+
+<table border=3>
+  <caption><a name="security_level_tbl"><strong>Table 5-7 Security Access Levels</strong></a></caption>
+  <tr>
+    <th align=center>Access Level </th>
+    <th align=center>Suffix </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      Read-Only
+    </td>
+    <td>
+      _RO
+    </td>
+    <td>
+      If a user holds the identifier then read-only access is granted. This 
+      user may execute read-only programs or have access to read-only 
+      functions within programs.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Standard
+    </td>
+    <td>
+      none
+    </td>
+    <td>
+      If a user holds this identifier then the user is granted 
+      &quot;standard&quot; access to the identifier. This user is assumed to 
+      be a standard read-write user of the corresponding package.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      Group Manager
+    </td>
+    <td>
+      _GM
+    </td>
+    <td>
+      Users that hold this identifier are granted access to &quot;group 
+      manager&quot; functions. This user is assumed to hold special 
+      privileges within the corresponding package.
+    </td>
+  </tr>
+</table>
+
+<p>
+For example, for the OECN_USPS identifier there are really three 
+identifiers that may be granted to a user. These identifiers are:
+
+<blockquote>
+  OECN_USPS_RO
+  <br>OECN_USPS
+  <br>OECN_USPS_GM
+</blockquote>
+
+<p>
+All these access levels, and therefore all the identifiers, exist for 
+all packages, even if the package itself does not implement the 
+identifiers. In other words, the Menu Processor will test for all the 
+identifiers, even if the individual package does not.
+
+<p>
+It also should be noted that the access levels will be applied to the 
+A-site specific identifiers. That is, there will also be OECN_USER1_RO 
+and OECN_USER1_GM identifiers available for use at the A-site level.
+
+<a name="menuutl_head"><h1>5.2 Using MENUUTL</h1></a>
+
+<p>
+ The MENUUTL program provides some necessary functions for building, 
+ maintaining and documenting a menu system. The options provided are:
+
+<ol start=1 >
+  <li>Build the Alias File
+  <li>Simulated Menu Listing
+  <li>Detailed Menu Report
+  <li>Hierarchical Menu Listing
+</ol>
+
+<a name="build_alias_head"><h2>5.2.1 Building the Alias File</h2></a>
+
+<p>
+ The first and the most important option of MENUUTL is the alias file 
+ build option. The alias file contains a pointer for each menu item in 
+ the system. Therefore, whenever you add or remove menu items from a 
+ menu file you must rebuild the alias file.
+
+<p>
+ MENUUTL makes this process rather simple. All you have to do is run 
+ MENUUTL and choose option 1. MENUUTL will ask the following questions:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Physical name of top level menu file:___________
+</pre>
+</table>
+
+<p>
+ Enter the physical filespec of the top-level menu file. This is the 
+ current physical location of the top-level menu file.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Logical name of top level menu file:_____________
+</pre>
+</table>
+
+<p>
+ Enter the logical filespec of the top level menu file. This should be 
+ the logical name of the file that will be used when the user accesses 
+ the menu system.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ The physical and logical name should normally be the same. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Enter new alias filename: ___________________
+</pre>
+</table>
+
+<p>
+ Enter the name of the new alias file to be built. The alias file is 
+ always rebuilt from scratch and a new version is created.
+
+<p>
+ After prompting for these values, MENUUTL will begin reading through 
+ the specified menu file and add an alias for each item found. It will 
+ also search for references to other menu files. If such references are 
+ found, MENUUTL will search those files for menu items and add aliases 
+ for each one.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Important</strong></font></center><hr 
+  size=1 noshade>
+ MENUUTL uses the OECN$MENU$FILES logical to search for the menu files 
+ in the same manner as will be used by the Menu Processor. Therefore, 
+ the runtime environment for MENUUTL must be the same as when the Menu 
+ Processor will be invoked. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+ As stated earlier, all aliases must be unique across the entire menu 
+ system. If MENUUTL finds a duplicate alias name, an error message will 
+ displayed and the duplicate will not be added. Processing will continue 
+ and the alias file will be usable, but the alias for the duplicate item 
+ will not exist.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+    You may also use the OECN$:BUILD_ALIAS.COM command procedure to build 
+    the alias file. This procedure will automatically build a new alias 
+    file using the current values of OECN$MENU$FILES, OECN$MENU and 
+    OECN$ALIAS. You can run this procedure after installing a new 
+    distribution or customizing menu files. If you frequently modify menu 
+    files, you could even run the procedure periodically in batch to ensure 
+    that the alias file is always up-to-date. </td>
+  </tr>
+</table>
+</center>
+
+<a name="simulate_list_head"><h2>5.2.2 Simulated Menu Listing</h2></a>
+
+<p>
+ This option will read through the specified menu file and create a 
+ simulated menu listing. The listing will display the menu in as close 
+ an approximation as possible on a hardcopy printer. The option will 
+ only report on one menu file at a time and will be sorted in 
+ alphabetical order by menu name.
+
+<a name="detailed_list_head"><h2>5.2.3 Detailed Menu Listing</h2></a>
+
+<p>
+ The detailed menu report lists all available information about the 
+ specified menu file. This report is particularly useful for double 
+ checking the action fields and security.
+
+<a name="hier_list_head"><h2>5.2.4 Hierarchical Listing</h2></a>
+
+<p>
+ This report will display the structure of the menu system. The menus 
+ are listed in the proper order as they appear on the menu. This option 
+ will prompt for the top level menu file and menu where the listing is 
+ to start. You need not necessarily start at the top of the entire menu 
+ system.
+
+<a name="osa_head"><h1>5.3 OSA</h1></a>
+
+<p>
+The OSA, OECN Security Authorization, Utility may be used in 
+conjunction with the OECN Menu Processor to fine tune security access. 
+OSA can be used to enable user's access to individual programs to be 
+granted or denied. This <em>local security</em> is defined by each 
+A-site and is maintained separately from the menu system included on 
+the OECN distribution. (See also VMS Manager's Guide)
+
+<p>
+<hr size=5>
+<a name="custom_chap"><h1>Chapter 6<br>Customizing Menus from the Distribution</h1></a>
+
+<p>
+ This chapter describes the recommended procedure for customizing the 
+ menu files from the distribution. Following this procedure will ensure 
+ that you can install future releases with minimum effort and maintain a 
+ consistent user interface across the state.
+
+<p>
+ Each major package has its own menu file. The file name for the primary 
+ menu file ends with _MENU and has an extension of .DAT. For example, 
+ the USAS menu file is named BUD_MENU.DAT. On the main menu of each 
+ package there is an item that links to a <em>local</em> menu file. This 
+ local menu file is an empty menu file that you may customize as you 
+ wish. The local menu filenames end with _LCL. Therefore, the USAS local 
+ menu is named: BUD_LCL.DAT.
+
+<p>
+ It is recommended that you only modify the *_LCL menu files. If you 
+ modify the other primary menu files, you will not be able to install 
+ updated menu files in the future without making all of your 
+ modifications over again.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+Security for all menu items may be customized, even if they are part of 
+the distribution, without modifying the menu files. This is 
+accomplished by using the OECN Security Authorization (OSA) utility. 
+See the <em>OECN Software Security for the VMS System Manager</em> 
+manual for information about the OSA utility and local security. </td>
+  </tr>
+</table>
+</center>
+
+<a name="local_head"><h1>6.1 Modifying a Local Menu File</h1></a>
+
+<p>
+    Following is the recommend procedure for modifying one or more menu 
+    files.
+
+<ol start=1 >
+  <li>Redefine the OECN$MENU$FILES to be a search list.
+  <li>Modify the Menu Files
+  <li>Build a New Alias File
+  <li>Redefine OECN$MENU$FILES permanently
+</ol>
+
+<a name="redefine_logical_head"><h2>6.1.1 Redefine the OECN$MENU$FILES logical</h2></a>
+
+<p>
+ The first step is to redefine OECN$MENU$FILES as a search list. For 
+ consistency with other customized files, it is recommended that you use 
+ OECN$CUSTOM. However, you may use any directory that you wish. The rest 
+ of this chapter assumes that you are placing the customized menu files 
+ in OECN$CUSTOM. For example:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU$FILES -
+_$ OECN$CUSTOM,DUA0:[ODE.MENU.DIST]
+</pre>
+</table>
+
+<p>
+ This will cause the Menu Processor and MENUUTL to search first through 
+ OECN$CUSTOM and then the distribution menu files.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ You may want to make this logical assignment in your current process, 
+ instead of at the SYSTEM level, while changing the menu files. This 
+ will prevent any users from getting into a half completed menu. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_6.1.2"><h2>6.1.2 Modify the Menu Files</h2></a>
+
+<p>
+ Copy the *_LCL.DAT menu files that you want to modify from the 
+ distribution into OECN$CUSTOM. Then use MENUEDT to make the desired 
+ modifications. By making all modifications in OECN$CUSTOM: will insure 
+ that installing future releases will not overlay your customized local 
+ menus.
+
+<p>
+ Use the Menu Processor and MENUUTL to test the new menus as needed. If 
+ you're creating new menus, be sure that the users have read access to 
+ the new files.
+
+<a name="heading_6.1.3"><h2>6.1.3 Build a New Alias File</h2></a>
+
+<p>
+ After all desired changes have been made, use MENUUTL to rebuild the 
+ alias file. You may put the alias file in OECN$CUSTOM or simply replace 
+ the current alias file in OECN$ALIAS. If you change the location of the 
+ alias file be sure to redefine the OECN$ALIAS logical.
+
+<p>
+ You may build the alias file manually by running MENUUTL, or you may 
+ use the BUILD_ALIAS.COM procedure in the OECN$ directory.
+
+<a name="heading_6.1.4"><h2>6.1.4 Redefine OECN$MENU$FILES Permanently</h2></a>
+
+<p>
+ If you have not already done so, define the logical OECN$MENU$FILES to 
+ be a search list as above at the SYSTEM level.
+
+<p>
+ At this point your users should have access to the customized menus.
+
+<a name="heading_6.2"><h1>6.2 After a Distribution</h1></a>
+
+<p>
+ If you modify the local menu files in this way, your changes will not 
+ be affected by any future releases. Changes made by SSDT will 
+ automatically be installed when you copy the distribution menu files to 
+ the OECN$MENU$FILES directory.
+
+<p>
+However, you will have to rebuild the alias file after installing each 
+distribution. After a package has been installed and the menu files 
+moved to thier proper location, you must rebuild the alias file.
+
+<p>
+ You may build the alias file manually by running MENUUTL, or you may 
+ use the BUILD_ALIAS.COM procedure in the OECN$ directory. The 
+ BUILD_ALIAS.COM procedure will automatically build a new alias file 
+ using the files in OECN$MENU$FILES. You can run the procedure 
+ interactvely by typing:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+    $ @OECN$:BUILD_ALIAS 
+</pre>
+</table>
+
+<p>
+Or you can submit it for batch processing using DCL SUBMIT. By default, 
+BUILD_ALIAS will rebuild the default menu system based on the current 
+values of OECN$MENU$FILES, OECN$MENU and OECN$ALIAS logicals. If you 
+have other menu systems on your system, you can pass parameters to 
+BUILD_ALIAS to indicate the location and names of the menu and alias 
+files. See the comments in BUILD_ALIAS.COM for more information about 
+using this procedure.
+
+<a name="intercept_head"><h1>6.3 Intercepting Menu Actions</h1></a>
+
+<p>
+ Sometimes it is desirable, or necessary, to redefine the action 
+ associated with a menu item. For instance, you may want to force 
+ certain actions prior to running a particular program or force certain 
+ options to run in batch.
+
+<p>
+ This may be done by intercepting the action line of specific options 
+ <em>without</em> modifying the menu files supplied by SSDT. You must 
+ write a DCL command procedure that will replace the action line you are 
+ going to intercept. Then assign a special logical to point to this 
+ command procedure.
+
+<p>
+ The logical must be defined as follows:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_ACTION_label filespec 
+</pre>
+</table>
+
+<p>
+ Where <em>label</em> is the menu option label that you want to 
+ intercept and <em>filespec</em> is the full filespec of the DCL command 
+ procedure. The logical may be defined at the system, group or process 
+ level, so you may intercept the action line for different classes of 
+ users.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+    If the logical is defined system-wide it will affect all menu systems 
+    that you have active on your system. If you have multiple menu systems 
+    that contain the same label then they will all be affected. If this is 
+    not what you want you may need to define this logical at the group or 
+    process level. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+ After this logical is defined the command procedure will be executed 
+ <em>instead of</em> the action line defined by the menu file.
+
+<p>
+ The following parameters will be passed to the command procedure :
+
+<table border=3>
+  <tr>
+    <td>
+      P1
+    </td>
+    <td>
+      Menu label name that invoked the procedure
+    </td>
+  </tr>
+  <tr>
+    <td>
+      P2
+    </td>
+    <td>
+      Original action line defined by the menu file
+    </td>
+  </tr>
+  <tr>
+    <td>
+      P3-P8
+    </td>
+    <td>
+      Other parameters entered by the user
+    </td>
+  </tr>
+</table>
+
+<p>
+ The procedure may use these parameters as it wishes or ignore them.
+
+<p>
+ For example, suppose that you want to automatically execute a backup of 
+ the USPS files prior to the user running BUDDIS. The following 
+ procedure, called PAY:BUDDIS_ACTION, might be used:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$! 
+$! PAY:BUDDIS_ACTION.COM -- Procedure used by the BUDDIS menu option 
+$! 
+$ on error then exit 
+$ 
+$ @PAY:SAVEPAY    ! A-site procedure to perform disk backup set of 
+$                 ! USPS files. 
+$ 
+$ DEFINE/USER SYS$INPUT SYS$COMMAND 
+$ RUN OECN$PAY:BUDDIS 
+$ 
+$ EXIT 
+</pre>
+</table>
+
+<p>
+ The following logical definition would be made to intercept the BUDDIS 
+ action for all users:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ DEFINE/SYSTEM OECN$MENU_ACTION_BUDDIS PAY:BUDDIS_ACTION 
+</pre>
+</table>
+
+<p>
+<hr size=5>
+<a name="batch_mail_chap"><h1>Chapter 7<br>Batch Mail Message System Manager  Guide</h1></a>
+
+<a name="heading_7.1"><h1>7.1 Overview</h1></a>
+
+<p>
+The command procedure BATCH_MAIL_MESSAGE.COM can be used to send a VMS 
+mail message via a batch job. This is useful for messages with large 
+audiences where the user does not wish to tie up their terminal for an 
+extended period of time.
+
+<a name="heading_7.2"><h1>7.2 Sending a Mail Message via Batch</h1></a>
+
+<p>
+To use the command procedure for generic mail messages:
+
+<p>
+Create the desired mail message using a text file.
+
+<p>
+Submit the procedure as follows supplying the necessary parameter 
+values:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ SUBMIT OECN$:BATCH_MAIL_MESSAGE/PARAMETER=("P1","P2","P3","P4")
+</pre>
+</table>
+
+<p>
+Where:
+
+<ul>
+  <li>P1 - Name of the text file to be mailed.
+  <li>P2 - VMS mail address the text file will be sent to.
+  <li>P3 - Text that is to be displayed on the Subject Line of the 
+  message.
+  <li>P4 - Y/N (yes/no) flag that indicates whether or not to delete the 
+  text file containing the message after it is sent.
+</ul>
+
+<p>
+
+<hr size=5>
+<a name="oecn_view_chap"><h1>Chapter 8<br>OECN VIEW Utility</h1></a>
+
+<a name="heading_8.1"><h1>8.1 Overview</h1></a>
+
+<p>
+The OECN_VIEW utility allows users to view text files on the screen. It 
+can be used for report files produced by OECN state software or other 
+text documents. OECN_VIEW is a TPU based product, layered on DEC/EVE.
+
+<p>
+By default, OECN_VIEW will search for files in OECN$OUT which have the 
+following extensions: *.TXT, *.LIS, *.DOC, *.RPT, *.LPT, *.RPT. These 
+are the only files that OECN_VIEW will show to the user when they use 
+the "Go_File" function or invoke VIEW without a file name.
+
+<p>
+However, A-sites may customize both the directory and/or the extension 
+if desired. Define the OECN_VIEW_DIRECTORY logical to define the 
+directory(ies) to be searched. It may be a search-list. The default for 
+OECN_VIEW_DIRECTORY is OECN$OUT.
+
+<p>
+In order to change the file extensions, define the logical 
+OECN_VIEW_FILES to be a search list containing the filespecs to search. 
+Each entry in the search list must refer to OECN_VIEW_DIRECTORY.
+
+<p>
+Examples of the logicals are given below:
+
+<a name="heading_8.2"><h1>8.2 OECN_VIEW.COM</h1></a>
+
+<p>
+The OECN_VIEW.COM command procedure is found in OECN$. It is used to 
+define the two logicals, OECN_VIEW_DIRECTORY and OECN_VIEW_FILES. 
+Observe the following notes from this procedure.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+$!+ 
+$! Notes: 
+$! 
+$!  This procedure is a shell for the OECN_VIEW utility.  It provides 
+$!  defaults for the file directory and file types that the user may view. 
+$! 
+$!  A-sites can configure VIEW to behave differently if desired by defining 
+$!  the following logicals: 
+$! 
+$!   OECN_VIEW_DIRECTORY =  Defines the directory OECN_VIEW will search 
+$!       when user uses the 'Go File' command or invokes 
+$!       VIEW without a file name.  This logical may 
+$!       be a search list.  The default is OECN$OUT. 
+$! 
+$!   OECN_VIEW_FILES = Filespecs which user can see when the use 
+$!     'Go file'.  The logical should be a searchlist 
+$!     containing wildcard specfications for the files 
+$!     names or types the user can view.  Each 
+$!     equivalence string must refer to OECN_VIEW_DIRECTORY 
+$!     for the device/directory.  That is, OECN_VIEW_FILES 
+$!     should specify just the wildcard filename and type. 
+$!- 
+ 
+ 
+</pre>
+</table>
+
+<a name="heading_8.2.1"><h2>8.2.1 Customizing OECN VIEW</h2></a>
+
+<p>
+The following sample command file shows how to customize the 
+directories and the file extensions to be viewed.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+$!+ 
+$! VIEW_EXAMPLES.com 
+$! 
+$!  Example of using OECN_VIEW to view shared documents.  This 
+$!  command procedure may be added to a local menu to allow 
+$!  users to view documents on-line. 
+$! 
+$!  In this example, users are given the ability to view internet documents. 
+$!  Allows users to view *.TXT and *.DOC files in the directory 
+$!  PUB:[INTERNET_DOCS]. 
+$! 
+$! - 
+$ set noon 
+$ set noverify 
+$ 
+$ define/user  OECN_VIEW_DIRECTORY PUB:[PUBDOM.NWOCA.INTERNET_DOCS] 
+$ 
+$ define/user  OECN_VIEW_FILES  OECN_VIEW_DIRECTORY:*.TXT,- 
+     OECN_VIEW_DIRECTORY:*.DOC 
+$ 
+$ @oecn$:oecn_view 
+$ 
+$exit 
+ 
+ 
+ 
+</pre>
+</table>
+
+<a name="heading_8.2.2"><h2>8.2.2 Creating a DCL Command</h2></a>
+
+<p>
+The VIEW utility works automatically from the MENU. However, you could 
+define a symbol to execute VIEW from DCL.
+
+<p>
+For example, define:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+LOOK := = @OECN$:OECN_VIEW
+ 
+</pre>
+</table>
+
+<p>
+Then use the LOOK command from the $ prompt.
+
+<a name="heading_8.2.3"><h2>8.2.3 OECN_EDIT</h2></a>
+
+<p>
+The OECN_VIEW utility uses a special editor called OECN_EDIT. Its 
+purpose is to provide I/O routines to allow TPU to automatically read 
+and translate VFC files into text. Please see <a href="oecn10_sysman_handbook_full.html#oecn_edit_chap">Chapter 9, OECN EDIT Utility</a>, for more 
+details.
+<p>
+
+<hr size=5>
+<a name="oecn_edit_chap"><h1>Chapter 9<br>OECN EDIT Utility</h1></a>
+
+<a name="heading_9.1"><h1>9.1 Overview</h1></a>
+
+<p>
+OECN_EDIT is a foreign command replacement for the EDIT/TPU DCL 
+command. It is completely command line (qualifier and parameter) 
+compatible with EDIT/TPU. Its purpose is to provide I/O routines to 
+allow TPU to automatically read and translate VFC files into text. When 
+using OECN_EDIT, all VFC files read by TPU are converted into text with 
+form-feed and line-feed characters to preserve formatting. All other 
+file types are NOT affected by OECN_EDIT and are read normally by TPU. 
+This is different from the default TPU editor, which ignores VFC 
+formatting. OECN_EDIT is used by the OECN_VIEW.COM procedure to allow 
+VFC files to be viewed correctly. However, it may also be used with any 
+TPU section file as an editor.
+
+<a name="heading_9.2"><h1>9.2 Using OECN_EDIT</h1></a>
+
+<p>
+In order to use OECN_EDIT as your interface to TPU, define the 
+following symbol:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+$ EDIT := = $OECN$:OECN_EDIT/TPU
+ 
+</pre>
+</table>
+
+<p>
+Note: The /TPU qualifier is required.
+
+<p>
+You may also include other qualifiers which you would normally use with 
+EDIT/TPU, such as /SECTION, /UNIT, etc. OECN_EDIT will use the normal 
+EVE section and initialization files by default.
+<p>
+
+<hr size=5>
+<a name="oecn_keymap_chap"><h1>Chapter 10<br>OECN KEYMAP Utility</h1></a>
+
+<a name="heading_10.1"><h1>10.1 Overview</h1></a>
+
+<p>
+The OECN_KEYMAP utility allows users to select a terminal emulator, 
+such as REFLECTIONS, EXCURSIONS, or PERSONA. Using this utility defines 
+the logical OECN$KEY_MAP to point to a .INI file containing the desired 
+keymapping. The mapping allows you to re-label the standard function 
+keys. You cannot actually reassign the program functions to different 
+keys. That is, from the programs point of view, the user is required to 
+press a VT200 F11 for the "Find" function. However, you can assign F11 
+to any PC key you wish in the emulator and then relabel F11 on the 
+screen to match the PC keyboard.
+
+<a name="heading_10.2"><h1>10.2 Using KEYMAP</h1></a>
+
+<p>
+Upon selecting the KEYMAP option from the OECN menu the user is given a 
+list of keymapping options to select from. This menu of options is 
+built by searching for all files named OECN$KEYMAP*.INI in either the 
+OECN$ or the OECN$CUSTOM directory. If the same filename is found in 
+both directories, only the one in OECN$CUSTOM will be used. The 
+description used in the menu will be determined by whether or not a 
+"DESCRIPTION=xxx" command is used. If the command is found in the .INI 
+file, the description will be used for the menu, otherwise the filename 
+will be used in the menu.
+
+<p>
+When a user selects their option, the name of the .INI file selected is 
+recorded in a file called OECN$KEYMAP.DAT in their SYS$LOGIN directory. 
+If keymapping is turned off, the OECN$KEYMAP.DAT file is deleted from 
+the SYS$LOGIN directory.
+
+<p>
+The OECN_LOGIN procedure has been modified to look for the existence of 
+this file and define the OECN$KEY_MAP logical to point to the .INI file 
+found in the .DAT file. After selecting their option in KEYMAP, 
+OECN_LOGIN will be immediately executed causing the logical to be 
+defined for that process. Then, each time the user logs in, OECN_LOGIN 
+will check for the OECN$KEYMAP.DAT file and set the OECN$KEY_MAP 
+logical appropriately for that process.
+
+<p>
+The following standard .INI files have been created:
+
+<ul>
+  <li>OECN$KEYMAP_EXCURSIONS.INI
+  <li>OECN$KEYMAP_PERSONA.INI
+  <li>OECN$KEYMAP_REFLECTIONS_MAC.INI
+  <li>OECN$KEYMAP_REFLECTIONS_PC.INI
+</ul>
+
+<p>
+These files may be used as a starting point to create other .INI files 
+for other terminal emulators that may be in use by districts or to 
+support customized key mappings for districts. Instructions are 
+included at the top of the .INI files which explain how the files need 
+to be formatted and which keys are able to be mapped. It is recommended 
+that the new .INI file be placed in the OECN$CUSTOM directory and be 
+given a different name if it is to be an additional menu option. It is 
+also recommended that the description inside the .INI file be changed 
+to something meaningful to the user as this is what they will see in 
+the KEYMAP menu.
+<p>
+
+<hr size=5>
+<a name="oecn_setupenv_chap"><h1>Chapter 11<br>OECN SETUPENV Utility</h1></a>
+
+<a name="heading_11.1"><h1>11.1 Overview</h1></a>
+
+<p>
+SETUPENV is a general purpose utility for establishing or switching to 
+user environments. The goal of the utility is to provide a single place 
+to configure the software environment (primarily logicals) for given 
+entities and allow user processes to configure based on these 
+environment settings.
+
+<p>
+The concept for SETUPENV is similar to the BUNNY/FROG utilities 
+available from NOACSC. However, it is intended to be more flexible and 
+capable of configuring multiple environments. SETUPENV is not tailored 
+to any particular software product. It may be used in the configuration 
+of state software, McSIS, InfOhio, or any other software that requires 
+logicals in establishing a user's environment.
+
+<p>
+The general goals of the utility are as follows:
+
+<ol start=1 >
+  <li>To provide a single location for all configuration information.
+  <li>To provide a means for processes to establish a default context 
+  during login.
+  <li>To provide a means for users to change contexts using an 
+  interactive (or DCL) interface.
+  <li>To allow DAS personnel the ability to switch to any context using 
+  the same rules as a user's process.
+  <li>To provide compatibility with BUNNY, FROG, and USE to make the 
+  transisition to the new utility easier.
+  <li>To provide DCL and API interfaces which allow other utilities the 
+  ability to find and establish contexts.
+  <li>To provide support for common OpenVMS configuration methods in use 
+  by DA Sites, including group tables and shared logical tables.
+</ol>
+
+<a name="heading_11.2"><h1>11.2 Getting Started</h1></a>
+
+<p>
+The SETUPENV utility is very flexible allowing the capability to deal 
+with the variety of possible setups in use at the OECN DA Sites. This 
+flexibility leads to a significant number of options in both the DCL 
+command interface and options available in the OECN$SETUP 
+initialization file. However, it is unlikely that any one DA Site will 
+need all of the features provided by SETUPENV. Most sites will only 
+need a limited set of options.
+
+<p>
+To get started with SETUPENV it is recommended that a simple OECN$SETUP 
+file with a minimal set of options for just a few entities be created. 
+Starting small will give the opportunity to experiment with the utility 
+to see how, or if, it can fit into your environment.
+
+<a name="heading_11.2.1"><h2>11.2.1 Entity Types</h2></a>
+
+<p>
+SETUPENV manages a user's context by assuming that any given process 
+will have one context in each of the four entity "types". The current 
+types of entities are:
+
+<ul>
+  <li>DISTRICT
+  <li>BUILDING
+  <li>LIBRARY
+  <li>OTHER
+</ul>
+
+<p>
+Therefore, a user may have one entity selected in each of these types 
+and change the context for one entity without affecting the others. For 
+example, a user might have a context in DISTRICT_A and BLG_B but be 
+eligible to switch into several different LIBRARY entities. SETUPENV 
+will allow the user to switch into different libraries without 
+affecting the current district and building.
+
+<p>
+Entities can be linked together to form logical hierarchies. For 
+example, a district entity might define the context for USPS, USAS, and 
+EMIS. A building entity might define the context for McSIS. When a user 
+selects a building, it may be desirable for the user's process to also 
+select the corresponding district entity so that the EMIS logicals are 
+switched automatically. SETUPENV can handle these relationships using 
+the PARENT attribute in the OECN$SETUP file. Please refer to the PARENT 
+attribute for more information.
+<p>
+
+<a name="heading_11.2.2"><h2>11.2.2 DCL Command Syntax</h2></a>
+<br>
+
+<p>
+SETUPENV must be defined as a foreign command:
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+$ SETUPENV :== $OECN$:SETUPENV 
+ 
+</pre>
+</table>
+
+<p>
+Syntax:
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+$ SETUPENV [entry_code...] 
+           [/MENU] 
+           [/NEXT] 
+           [/RESET] 
+           [/LOGIN[=([SIS],[INFOHIO],[BY_ACCESS],[USERNAME[=n]])] 
+           [/TYPE={DISTRICT,BUILDING,OTHER,ALL] 
+           [/LOG] 
+           [/[NO]PROMPT] 
+           [/CATEGORIES={wildcard}] 
+           [/APPLICATION={application}] 
+           [/ARCHIVE=[archive_code]] 
+           [/[NO]RESTRICT_IRNS] 
+           [/PRINT] 
+           [/USE] 
+           [/BUNNY] 
+           [/FROG] 
+           
+ 
+</pre>
+</table>
+
+<ul>
+  <li><strong>ENTRY_CODE</strong> indicates the entry(s) to be selected 
+  from the OECN$SETUP.INI file. The INI file indicates the environment to 
+  be established for each entry. Multiple entries may be set by enclosing 
+  the entry codes in quotes separated by commas. When setting multiple 
+  entries, the first entry is considered to be the primary entry.
+  <li><strong>/MENU</strong> indicates the user should be presented a 
+  menu to select an entry based on their process security. /MENU is the 
+  default for interactive processes when there are no other qualifiers 
+  and no parameter specified.
+  <li><strong>/RESET</strong> attempts to reset the current process to 
+  it's original state. Any "reset" entries existing on the INI file are 
+  used to determine which logicals should be reset. If there are no reset 
+  entries on the INI file, the LNM$FILE_DEV logical will be the only one 
+  returned to it's original state.
+  <li><strong>/LOGIN</strong> instructs SETUPENV to attempt to determine 
+  the user's default login context. If a specific entry code(s) is 
+  specified with /LOGIN, the specified entry will override the defaults. 
+  The following flags may be included to control how SETUPENV/LOGIN 
+  determines the default entries:
+
+  <ul>
+    <li><strong>SIS</strong> searches the process' rightslist for 
+    identifiers in the format SIS_x. For the first such identifier "x" is 
+    used as the default entry.
+    <li><strong>INFOHIO</strong> searches the process' rightslist for 
+    identifiers in the format INFOHIO_x. For the first such identifier "x" 
+    is used as the default entry. In order to avoid potential conflicts 
+    with SIS entry codes, SETUPENV will first look for an entry named 
+    "x_LIB". If and x_LIB entry is found, it will be used as the default 
+    InfOhio entry, otherwise just "x" will be used.
+    <li><strong>BY_ACCESS</strong> indicates that SETUPENV should determine 
+    the user's default entry by checking security access to the entries. 
+    SETUPENV will scan OECN$SETUP file and find the first entry of each 
+    type (DISTRICT, BUILDING, LIBRARY, OTHER) to which the user has access 
+    making this the default. BY_ACCESS should only be used by DA Sites who 
+    have carefully placed proper identifiers on entries to allow access to 
+    appropriate users.
+    <li><strong>USERNAME=n</strong> uses the first "n" characters of the 
+    username as the entry code. This is useful for sites who use a username 
+    prefix to indicate districts and who have set up matching entry codes 
+    in the OECN$SETUP file.
+  </ul>
+    <br>SETUPENV/LOGIN will also (unconditionally) search for an identifier 
+    called "SETUPENV_xxx". If the user has such an identifier, then it is 
+    always used as the default entry, superceding the default provided by 
+    the above flags. This serves as a means to provide a specific default 
+    for users who may have access to multiple entries.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+When /LOGIN is specified, SETUPENV will not issue errors if a default 
+entry can not be found. This allows SETUPENV/LOGIN to be used in 
+system-wide login procedures even for users who do not normally need a 
+specific software context. </td>
+  </tr>
+</table>
+</center>
+  <li><strong>/NEXT</strong> indicates that the next entry should be 
+  selected based on the current or specified entry. If an entry is 
+  specified as a parameter, then the entry selected will be the one 
+  immediately following it. Otherwise, the values of the 
+  OECN$SETUP_CURRENT_* logicals are used to determine the current entry. 
+  The primary purpose of /NEXT is to allow DCL procedures to process all 
+  or selected entries sequentially.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+If /TYPE is not specified to indicate the type of the next entry, then 
+the /TYPE defaults to the same type as the current entry 
+(OECN$SETUP_ENTRY). That is, by default, /NEXT moves to the same type 
+of entry as the current entry. If there is no current entry, then the 
+default is DISTRICT. </td>
+  </tr>
+</table>
+</center>
+  <li><strong>/TYPE</strong> may be used in conjunction with /NEXT or 
+  /MENU to determine the type of entry that may be considered. For 
+  example, if /TYPE=DISTRICT is specified with /NEXT, then only district 
+  entries will be considered. The default for /NEXT is DISTRICT. The 
+  default for /MENU is ALL.
+  <li><strong>/CATEGORIES</strong> may be used with /NEXT or /MENU to 
+  select only entries where the CATEGORIES attribute matches the 
+  specified wildcard.
+  <li><strong>/APPLICATION</strong> may be used with /NEXT to select only 
+  entries containing the specified application. Only one application may 
+  be specified and it must exactly match an application specified on the 
+  entries APPLICATION attribute.
+  <li><strong>/[NO]PROMPT</strong> causes the user's DCL prompt and OECN 
+  Menu prompt to be set to a value representing the entry(s) selected. 
+  /NOPROMPT is the default.
+  <li><strong>/LOG</strong> indicates an informational message should be 
+  displayed indicating the entry selected. If multiple entries are set as 
+  a result of the command, only the primary entry is displayed.
+  <li><strong>/ARCHIVE[=archive_code]</strong> indicates which archive is 
+  to be selected. If a specific archive is provided and it exists for the 
+  entry, then the logical and table definitions for the archive will be 
+  set. If no archive is specified, then the first archive for the 
+  selected entry will be used. If /ARCHIVE is specifed with /MENU, the 
+  archvives will be presented to the user as seperate choices on the menu.
+  <li><strong>/RESTRICT_IRNS</strong> determines if SETUPENV should 
+  attempt to define the OECN$EMIS_RESTRICT_IRNS logical. This logical is 
+  set by checking all the entries which have a relationship (parent, 
+  child, or sibling) based on the PARENT attributes. For each such entry, 
+  the users access to the entries is checked (based on the IDENTIFIER 
+  attributes). If the user has access to the entry, then the IRN of the 
+  entry is added to the OECN$EMIS_RESTRIC_IRNS logical.
+  <li><strong>/PRINT</strong> attempts to determine the user's default 
+  printer using a convention from NOACSC. The "owner" field for the 
+  current user is retrieved from SYSUAF. If the owner field contains a 
+  slash (/) the characters after the slash are tested to see if it 
+  contains a valid queue name. If not, "$PRINT" is appended to the string 
+  from the owner field and is again tested as a queue. If either value 
+  translates to a valid queue name (other than SYS$PRINT), then SYS$PRINT 
+  is defined as a logical to point to the queue. The OECN_PRT symbol is 
+  also defined to print to the queue.
+  <li><strong>/EMIS</strong> places SETUPENV in "EMIS" mode. In this 
+  mode, SETUPENV simulates the behavior of EMIS_SELECT.COM. The 
+  OECN$EMIS_DBS file is read and handled in the same manner as 
+  EMIS_SELECT. In this mode, the meaning of the "entry code" parameter is 
+  the DBS code of the EMIS database, instead of a SETUPENV entry code. 
+  The following qualifiers are valid with /EMIS:
+
+  <ul>
+    <li>/NEXT
+    <li>/RESET
+    <li>/MENU
+    <li>/CATEGORIES
+    <li>/LOG
+  </ul>
+    <br>See the "EMIS_SELECT Compatibility" section for more information.
+  <li><strong>/USE, /BUNNY, /FROG</strong> provide compatibility with the 
+  corresponding NOACSC's utilities. When one of these qualifiers is 
+  specified, the utility accepts the corresponding utilitie's qualifiers 
+  and converts them to the nearest SETUPENV equivalent. See the "NOACSC 
+  Compatibility" section for more information.
+</ul>
+
+<h2>Usage Notes</h2>
+
+<p>
+When /NEXT is used, if the specified or next entry cannot be found 
+SETUPENV exits with an error severity.
+
+<p>
+After successfully selecting an entry, OECN_LOGIN.COM is executed to 
+ensure the users OECN$x logicals are set correctly. If the DAS has 
+established the OECN_LOGIN_EPILOGUE procedure, it will subsequently be 
+executed. This provides a means for the DAS to customize the behavior 
+and do any additional processing after an entry is selected.
+
+<p>
+Likewise, when /EMIS is specified, EMIS_SELECT_EPILOGUE and 
+EMIS_SWITCH_FY will be invoked after successfully selecting a database.
+
+<a name="heading_11.3"><h1>11.3 Logicals Created By SETUPENV</h1></a>
+
+<p>
+After successfully selecting an entry, SETUPENV establishes a series of 
+logicals (OECN$SETUP_*) to describe the current context and to maintain 
+it's own context for subsequent invocations of SETUPENV. These logicals 
+may be used by DCL procedures but should never be modified or 
+deassigned (use SETUPENV/RESET to deassign the logicals if necessary).
+
+<p>
+The logical OECN$SETUP_ENTRY contains the current selected entry. This 
+is the primary entry that was specified as a parameter, selected via 
+the menu, or selected using /NEXT.
+
+<p>
+The logical OECN$SETUP_ARCHIVE contains the archive code if one was 
+selected using /ARCHIVE or the menu.
+
+<p>
+One logical is defined for each of the entry types that has been 
+selected. A user can have one context in up to four different "types" 
+of entries: DISTRICT, BUILDING, LIBRARY, OTHER. For each type that has 
+been selected, the corresponding logical will be defined:
+
+<ul>
+  <li>OECN$SETUP_CURRENT_DISTRICT
+  <li>OECN$SETUP_CURRENT_BUILDING
+  <li>OECN$SETUP_CURRENT_LIBRARY
+  <li>OECN$SETUP_CURRENT_OTHER
+</ul>
+
+<p>
+The logical will not exist for types that have not been selected.
+
+<p>
+The value of the OECN$SETUP_CURRENT_* logicals is a string that 
+describes the selected entry. The format for the string entry is:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+        
+        "entry_code,irn,categories,applications" 
+ 
+        Where:  entry_code      the entry for this type 
+                irn             from IRN attribute 
+                categories      space delimited list of categories 
+                                from CATEGORIES attribute 
+                applications    space delimited list of applications 
+                                from APPLICATIONS attribute 
+        
+</pre>
+</table>
+
+<p>
+This string is formatted in a manner that is easily parsed using the 
+F$ELEMENT lexical function.
+
+<p>
+The following logicals may also be defined depending on the selected 
+entries relationship with other entries:
+
+<ul>
+  <li><strong>OECN$SETUP_PARENT</strong>---Contains the PARENT entry for 
+  the current entry
+  <li><strong>OECN$SETUP_CHILDREN</strong>---Contains a list, separated 
+  by commas, of the children for the current entry. That is, a list of 
+  entries which contain a PARENT pointing to the current entry.
+  <li><strong>OECN$SETUP_SIBLINGS</strong>---Contains a list, separated 
+  by commas, of "siblings" (excluding the current entry). That is, a list 
+  of entries that share the same parent entry.
+</ul>
+
+<p>
+Any of the logicals that do not apply to an entry will not be defined 
+(e.g. for a parent entry, the siblings logical will not be defined).
+
+<a name="heading_11.4"><h1>11.4 OECN$SETUP.INI</h1></a>
+
+<p>
+The OECN$SETUP initialization file defines the environment for various 
+entities which use OECN (or other) software products. The default 
+filename is OECN$CUSTOM:OECN$SETUP.INI. OECN$SETUP may be defined as a 
+logical to override the location and filename.
+
+<p>
+Each "section" in the INI file describes an "entity". An entity might 
+be a district, building, library or other entity where a specific 
+context needs to be established. When the SETUPENV utility is executed 
+to select an entity, the context is defined as specified in the rules 
+for that section.
+
+<p>
+The parameters and formats for each section are as follows:
+
+<ul>
+  <li><strong>SECTION={entity_code}</strong> <br>The SECTION statement 
+  begins a new entity definition. The entity code may be up to 12 
+  alphanumeric digits. This is the code used to select the entry and is 
+  seen on the menu. This code must uniquely identify each entity 
+  regardless of type (i.e. You must not specify a district and building 
+  entity with the same code).
+  <li><strong>DESCRIPTION="text"</strong> <br>Text description for menu
+  <li><strong>TYPE={DISTRICT|BUILDING|LIBRARY|OTHER}</strong> 
+  <br>Indicates the type of entity. If TYPE is not specified, the default 
+  is DISTRICT. A user can have context in each of these types at one time.
+  <li><strong>CATEGORIES="string"</strong> <br>An unformatted string that 
+  may further define the entry. Except where otherwise indicated, the 
+  categories are site defined. It might be used as flags to indicate 
+  processes that may be run against the entry. Entries may be selected by 
+  category using the /CATEGORIES qualifer. The categories for each 
+  selected type is also returned to DCL via the OECN$SETUP_CURRENT_* 
+  logicals.
+  <li><strong>APPLICATIONS={app}[,...]</strong> <br>List of applications 
+  used by the entry. Each application is a site defined code of up to 10 
+  characters. Five applications may be specified on each APPLICATIONS 
+  line. Multiple APPLICATIONS lines may be specified if needed. 
+  <br><strong>Note:</strong> Although the applications are site defined, 
+  the SSDT and other software providers may require specific application 
+  codes. It is recommended that you use these codes for established 
+  applications:
+
+  <blockquote>
+     USPS
+    <br> USAS
+    <br> EMIS
+    <br> EIS
+    <br> VIS
+    <br> SIS (McSIS)
+    <br> INFOHIO
+  </blockquote>
+  <li><strong>IRN={irn}</strong> <br>Optional IRN for the entry. Returned 
+  to DCL via the OECN$SETUP_CURRENT logical and optionally used in the 
+  OECN$EMIS_RESTRICT_IRNS logical.
+  <li><strong>PROMPT="prompt string"</strong> <br>Optionally specifies 
+  the prompt string to be used if this entry is selected. This value 
+  overrides the default prompt. The default prompt is the list of entry 
+  codes currently selected.
+  <li><strong>ARCHIVE={archive_code},[description],[table]...</strong> 
+  <br> Declares this entity to have an "archive". Archives can be 
+  selected using the /ARCHIVE qualifier. If a code is specified on the 
+  /ARCHIVE qualifier, then the corresponding archive items are also 
+  processed when the entry is selected. When /ARCHIVE is used with /MENU, 
+  then the archive definitions are listed on the menu as separate items 
+  which the user can select. <br>The optional table parameter indicates 
+  additional table(s) which should be placed in the LNM$FILE_DEV search 
+  path. If specified, they will be placed on the path before the other 
+  shared tables (TABLE and GROUP_TABLE). This permits definitions for 
+  archive logicals to be placed in special shared logical tables for use 
+  as an archive. <br>A multiple ARCHIVE attributes might be included for 
+  each fiscal year, or it may be a generic archive setting which requires 
+  an additional step (outside of SETUPENV) to complete establishing the 
+  archive environment. The usefulness of this attribute depends largely 
+  on how the DAS currently has archives defined and whether/how they are 
+  user selectable.
+  <li><strong>LOGICAL={logical_name[@archive_code]}[,CONCEALED] 
+  [,IF_EXISTS],[values]...</strong> <br> Specifies a process logical to 
+  define. Multiple values may be included to define a search list. If a 
+  logical name is specified without any values, then the logical will be 
+  deassigned. <br> If the CONCEALED keyword is included, then the logical 
+  will be concealed. <br><strong>Conditional Logicals</strong> <br>The 
+  IF_EXISTS keyword causes the logical to be defined conditionally based 
+  on the presence of the file specified in the value. The logical will 
+  only be created if the file specified in the first value exists. In 
+  this case, the value should contain a complete filespec. For example an 
+  EMIS entry might specify:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+          LOGICAL=OECN$EMIS_STU_SEARCH,IF_EXISTS,OECN$EMIS$DTA:EMSALT.IDX 
+          LOGICAL=OECN$EMIS$DTA,CONCEALED,EMIS_ROOT:[LIVE] 
+</pre>
+</table>
+
+    <br> In this case, OECN$EMIS_STU_SEARCH will only be defined if the 
+    OECN$EMIS$DTA:EMSALT.IDX file exists.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+SETUPENV defines logicals in the reverse order that they appear in the 
+section. Therefore, conditional logicals should be placed prior to any 
+logicals which they refer to. </td>
+  </tr>
+</table>
+</center>
+    <br><strong>Archive Logicals</strong> <br>If an optional archive code 
+    is included after the logical name (by specifying the archive code 
+    after an "@") then the logical will only be defined if the 
+    corresponding ARCHIVE code is selected (via the /ARCHIVE qualifier or 
+    the menu). Logicals which contain the archive code will be processed 
+    after any normal logicals and therefore will supercede any previous 
+    definition of the same logical. <br> The archive code on each logical 
+    should match an archive code specified in an ARCHIVE attribute. The 
+    ARCHIVE attribute will provide the description for the menu when the 
+    archive is displayed.
+  <li><strong>SYMBOL={symbol_name}[,symbol_value]</strong> <br>Sets a 
+  global symbol. If a value is not specified, then the symbol is deleted. 
+  <strong>Note:</strong> The symbol and value must be made up of 
+  printable characters. Non-printable values may not be included (in the 
+  current version of SETUPENV).
+  <li><strong>PARENT={entry}</strong> <br>Indicates a parent entry of 
+  this entry. Parent entries may be nested (i.e. parents of an entry may 
+  themselves have a parent). This facility allows multiple entries to 
+  share another entry as a parent. For example, if all buildings share 
+  the district definition of EMIS_ROOT, then EMIS_ROOT can be defined in 
+  the district entry and each building specify the district as PARENT. 
+  <br>When the user selects an entry which contains the PARENT attribute, 
+  then settings for the parent will be set prior to the logicals for the 
+  selected entry. Therefore, selecting a building entry will also 
+  automatically select the corresponding district (parent) entry.
+  <li><strong>GROUP_TABLE={octal_group_number}</strong> <br>Specifies 
+  this entry uses a GROUP logical name table for some of it's logical 
+  definitions. This setting only applies if someone outside the group 
+  attempts to set this entry. If so, the entry's group table will be 
+  added to the process' LNM$FILE_DEV path. Otherwise, if the user is in 
+  the specified group, it's assumed that the default definition of 
+  LNM$FILE_DEV already includes LNM$GROUP.
+  <li><strong>TABLE={logical_name_table},...</strong> <br>Indicates that 
+  this entry uses a sharable logical name table(s) (other than a group 
+  table) for some of its logicals. When this entry is selected, the 
+  logical table will be added to the processes LNM$FILE_DEV logical path. 
+  Up to four tables may be specified.
+  <li><strong>IDENTIFIER={ident_specification}</strong> <br>Indicates an 
+  ACE entry used to control access to the entry. This is used when /MENU 
+  is specified to control which entries the user is allowed to see. It is 
+  also used when determining which entry to select as default when 
+  /LOGIN=BY_ACCESS is specified. <br>The format of the identifier 
+  specification is the same as the "IDENTIFIER=" portion of a standard 
+  identifier ACE entry. If the specification includes a comma then the 
+  specification must be enclosed in quotes. Multiple IDENTIFIER lines may 
+  be included for an entry. If so, standard ACL processing applies for 
+  determining access. Examples:
+
+  <blockquote>
+     IDENTIFIER="[101,*]"
+    <br>IDENTIFIER=SIS_BLDA
+    <br>IDENTIFIER="OECN_USAS+ARCHBOLD_FISCAL"
+  </blockquote>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+IDENTIFIER does not necessarily restrict users from selecting a 
+specific entry. If a specific entry is specified on the command line 
+(manually or via a DCL procedure), SETUPENV will establish the context 
+regardless of the IDENTIFIER attributes. This is useful for sites who 
+do not need, or do not desire, to code specific identifiers into the 
+OECN$SETUP file. </td>
+  </tr>
+</table>
+</center>
+</ul>
+
+<a name="heading_11.4.1"><h2>11.4.1 Special "Reset" Entries</h2></a>
+
+<p>
+Prior to setting any given entry, SETUPENV will attempt to process 
+special sections named "$RESET_type". If a $RESET section of the 
+appropriate type exists in the INI file, it will be processed prior to 
+setting an entry.
+
+<p>
+The following reset sections may be specified:
+
+<ul>
+  <li>$RESET_DISTRICT
+  <li>$RESET_BUILDING
+  <li>$RESET_LIBRARY
+  <li>$RESET_OTHER
+</ul>
+
+<p>
+When a user selects an entry of a specific type, the corresponding 
+reset section is invoked prior to setting the environment for the 
+selected entry.
+
+<p>
+This is useful in cases where some entries specify a process logical 
+but others use a group logical. In order to switch from one entry to 
+another, it is necessary to deassign the common logical from the 
+process table prior to switching to the group logicals.
+
+<p>
+For example, consider that DISTRICT_A has a process logical definition 
+of OECN$DTA. But DISTRICT_B has a group logical for OECN$DTA. Switching 
+from DISTRICT_A to DISTRICT_B requires that the OECN$DTA be deassigned 
+so the group logical is visable. SETUPENV does not attempt to keep 
+track of this, rather it permits you to create a $RESET entry for each 
+type to deassign logicals appropriate for your site. For example, 
+$RESET could be defined as:
+
+<blockquote>
+  SECTION=$RESET_DISTRICT
+  <br>LOGICAL=OECN$DTA
+  <br>LOGICAL=OECN$OUT,"SYS$DISK:[]"
+</blockquote>
+
+<p>
+The above entry would cause SETUPENV to deassign OECN$DTA and define 
+OECN$OUT to the default directory prior to setting any valid entry. In 
+general, you should explicitly deassign any logicals in the reset 
+section that are defined in any entry of the same type.
+
+<a name="heading_11.4.2"><h2>11.4.2 Sample OECN$SETUP File</h2></a>
+
+<p>
+Below is a very simple OECN$SETUP.INI file which defines entries for 
+one district and two buildings. The setup file can contain many such 
+entries for as many districts and buildings provided that the entry 
+codes are unique.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+        SECTION=SAMPLE 
+        TYPE=DISTRICT 
+        DESCRIPTION="Sample City Schools" 
+        LOGICAL=EMIS_ROOT,          FSA:[EMIS_SAMPLE.],CONCEALED 
+        LOGICAL=OECN$DTA,           FSA:[SAMPLE] 
+        LOGICAL=OECN$FORM_DIRDEP,   OECN$PAY:DIRPRT.FRM 
+ 
+        SECTION=SAME 
+        TYPE=BUILDING 
+        DESCRIPTION="Sample Elementary School" 
+        PARENT=SAMPLE 
+        TABLE=SIS_SAME 
+        IDENTIFIER=SIS_SAME 
+ 
+        SECTION=SAMH 
+        TYPE=BUILDING 
+        DESCRIPTION="Sample High School" 
+        PARENT=SAMPLE 
+        TABLE=SIS_SAMH 
+        IDENTIFIER=SIS_SAMH 
+ 
+        SECTION=$RESET_DISTRICT 
+        LOGICAL=EMIS_ROOT 
+        LOGICAL=OECN$DTA 
+        LOGICAL=OECN$FORM_DIRDEP 
+</pre>
+</table>
+
+<p>
+In this example, the buildings point to the district using the PARENT 
+attribute. This creates the appropriate relationship. When the user 
+selects one of the buildings, the corresponding logicals from the 
+district entry will also be set.
+
+<p>
+Also notice that the district entry uses LOGICAL's to define the 
+individual logicals. But the building entries use shared logical tables 
+created outside of SETUPENV.
+
+<p>
+The special $RESET_DISTRICT section is provided to ensure that the 
+district logical get reset appropriately prior to setting an entry.
+
+<a name="heading_11.4.3"><h2>11.4.3 Special "APPLICATION" Entries</h2></a>
+
+<p>
+If an entry is defined with one or more APPLICATION attributes, then 
+SETUPENV will search for an entry named "$APP_app", where "app" is the 
+application code. This allows logicals, symbols or tables that are 
+common for an application to be grouped into shared entries. Consider 
+the following example:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+       SECTION=DISTRICT_A 
+       TYPE=DISTRICT 
+       APPLICATION=USAS 
+       LOGICAL=DISTRICT_ROOT,CONCEAL,DISK1:[DISTRICT_A.] 
+ 
+       SECTION=DISTRICT_B 
+       TYPE=DISTRICT 
+       APPLICATION=USAS 
+       LOGICAL=DISTRICT_ROOT,CONCEAL,DISK1:[DISTRICT_B.] 
+ 
+       SECTION=DISTRICT_C 
+       TYPE=DISTRICT 
+       LOGICAL=DISTRICT_ROOT,CONCEAL,DISK1:[DISTRICT_C.] 
+ 
+       SECTION=$APP_USAS 
+       LOGICAL=OECN$DTA,DISTRICT_ROOT:[DATA] 
+</pre>
+</table>
+
+<p>
+In this example, the DISTRICT_ROOT logical would be defined for all 
+three districts. However, OECN$DTA would only be defined for DISTRICT_A 
+and DISTRICT_B because they have APPLICATION=USAS. DISTRICT_C does not 
+have the application attribute and so would not invoke the $APP_USAS 
+entry.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+Note: The above is for example only. In practice, OECN$DTA might be 
+more efficiently defined as a system logical. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+Application entries do not have a corresponding "reset" section. 
+Logicals defined in this manner may need to be included in the 
+appropriate "$RESET_type" section to ensure they are reset.
+
+<a name="heading_11.4.4"><h2>11.4.4 Special "INCLUDE" Section</h2></a>
+
+<p>
+A special section may be specified in any INI file called $INCLUDE. 
+This section may specify other INI files to be included and processed 
+with the primary INI file. The $INCLUDE section may only contain "FILE" 
+attributes to indicate the file(s) to be included.
+
+<p>
+The $INCLUDE section permits INI files to be split into manageable 
+segments or for INI files to be generated automatically. For example, 
+you might create one INI file for each district and it's associated 
+buildings. Or a separate utility may have information for creating 
+subsets of the INI file. For example, the primary OECN$SETUP.INI might 
+have:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+        SECTION=$INCLUDE 
+        FILE=OECN$CUSTOM:DISTRICT_A.INI 
+        FILE=OECN$CUSTOM:DISTRICT_B.INI 
+        FILE=OECN$CUSTOM:DISTRICT_C.INI 
+</pre>
+</table>
+
+<p>
+Each INI file may also have an $INCLUDE section to indicate other files 
+to be included. There is a maximum of 100 files that may be included 
+throughout all INI files.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+There is a performance penalty incurred for splitting INI files into 
+many parts. SETUPENV must read the primary and all included files each 
+time it is invoked. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+Duplicate entries are handled by merging the entries together. For 
+example, if two included files both contain an entry for DISTRICT_A, 
+then the attributes (e.g. LOGICAL attributes ) from both sections will 
+be combined into a single entry. If duplicate entries specify 
+attributes that only occur once per entry, then the last INI file to be 
+loaded supercedes the previous value.
+
+<p>
+The INI files are NOT processed as they are encountered in the file. 
+Rather they represent a list of INI files that need to be processed. 
+SETUPENV will complete processing of the current file prior to begin 
+processing the next file. Therefore, included INI files will always be 
+processed after the file that included it (although perhaps not 
+immediately after). In general, you should not depend on files being 
+processed in any particular order.
+
+<a name="heading_11.4.5"><h2>11.4.5 Limits</h2></a>
+
+<p>
+Certain limits which apply to the OECN$SETUP.INI file are shown in the 
+table below. Limits are 'per entry' unless otherwise noted. <p>
+
+<table border=3>
+  <caption><a name="Table_11-1"><strong>Table 11-1 wide</strong></a></caption>
+  <tr>
+    <th align=center>Attribute </th>
+    <th align=center>Maximum Length </th>
+    <th align=center>Limit </th>
+  </tr>
+  <tr>
+    <td>
+      FILE (in $INCLUDE section)
+    </td>
+    <td>
+      50
+    </td>
+    <td>
+      100 total in all files
+    </td>
+  </tr>
+  <tr>
+    <td>
+      SECTION
+    </td>
+    <td>
+      12
+    </td>
+    <td>
+      500 total in all files
+    </td>
+  </tr>
+  <tr>
+    <td>
+      DESC
+    </td>
+    <td>
+      40
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TYPE
+    </td>
+    <td>
+      12
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      IRN
+    </td>
+    <td>
+      6
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      CATEGORIES
+    </td>
+    <td>
+      40
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      APPLICATIONS
+    </td>
+    <td>
+      10
+    </td>
+    <td>
+      15 (five per line)
+    </td>
+  </tr>
+  <tr>
+    <td>
+      ARCHIVE
+    </td>
+    <td>
+      6
+    </td>
+    <td>
+      20
+    </td>
+  </tr>
+  <tr>
+    <td>
+      ARCHIVE (tables)
+    </td>
+    <td>
+      32
+    </td>
+    <td>
+      3 per archive
+    </td>
+  </tr>
+  <tr>
+    <td>
+      PROMPT
+    </td>
+    <td>
+      40
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      IDENTIFIERS
+    </td>
+    <td>
+      80
+    </td>
+    <td>
+      unlimited *
+    </td>
+  </tr>
+  <tr>
+    <td>
+      LOGICAL (name)
+    </td>
+    <td>
+      50
+    </td>
+    <td>
+      unlimited *
+    </td>
+  </tr>
+  <tr>
+    <td>
+      LOGCIAL (value)
+    </td>
+    <td>
+      80
+    </td>
+    <td>
+      4 per logical
+    </td>
+  </tr>
+  <tr>
+    <td>
+      SYMBOL (name)
+    </td>
+    <td>
+      24
+    </td>
+    <td>
+      unlimited *
+    </td>
+  </tr>
+  <tr>
+    <td>
+      SYMBOL (value)
+    </td>
+    <td>
+      50
+    </td>
+    <td>
+      1 per symbol
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TABLE
+    </td>
+    <td>
+      50
+    </td>
+    <td>
+      unlimited *
+    </td>
+  </tr>
+  <tr>
+    <td>
+      GROUP
+    </td>
+    <td>
+      Octal Value
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+  <tr>
+    <td>
+      PARENT
+    </td>
+    <td>
+      12
+    </td>
+    <td>
+      1
+    </td>
+  </tr>
+</table>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+* = Attributes which are "unlimited" are limited by virtual memory 
+available to the user. Very large INI files with large numbers of 
+logicals or symbols may exhaust virtual memory. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_11.5"><h1>11.5 EMIS_SELECT Compatibility</h1></a>
+
+<p>
+The /EMIS qualifier provides functional compatibility with the 
+EMIS_SELECT.COM procedure. In this mode, SETUPENV will read the 
+existing OECN$EMIS_DBS file and convert it to equivalent setup entries. 
+The primary advantage of using SETUPENV over EMIS_SELECT is it's 
+ability to use the /NEXT qualifier to process databases sequentially. 
+SETUPENV also provides a slightly improved user interface over the DCL 
+version.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+SETUPENV/EMIS can be used even if the DAS has not created an 
+OECN$SETUP.INI file. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+When SETUPENV/EMIS reads the OECN$EMIS_DBS, it creates a special entry 
+which is equavalent to:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+         SECTION=$EMIS_dbscode 
+         DESCRIPTION=description from DBS 
+         CATEGORIES=RP_x FY_fy flags ! See below 
+         LOGICAL=OECN$EMIS$DTA,dev:[dir]  ! From DBS line 
+         IDENTIFIER=OECN_SYSMAN ! If the DBS line contained "HIDE" 
+</pre>
+</table>
+
+<p>
+The CATEGORIES is constructed based on the optional reporting period 
+and flags parameter from the DBS line. The CATAGORIES value will always 
+be in the format "RP_x FY_fy flags". Where x is the reporting period 
+and "fy" is the fiscal year from the EMIS configuration. If the DBS 
+included any additional flags (other than HIDE), they will also be 
+included in the categories.
+
+<p>
+One implication of the above is that the /CATEGORIES qualifier can be 
+used to select specific reporting periods. For example:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+        $ SETUPENV/EMIS/NEXT/CATEGORIES="*RP_N*" 
+</pre>
+</table>
+
+<p>
+Would select the next EMIS database for reporting period N.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ SETUPENV will invoke the DA Site's EMIS_SELECT_EPILOGUE procedure if it 
+ exists. However, the EMIS_SELECT_PROLOGUE is not supported. DA Sites 
+ that depend on the prologue procedure should contact the SSDT for a 
+ work around. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_11.5.1"><h2>11.5.1 Converting OECN$EMIS_DBS to OECN$SETUP</h2></a>
+
+<p>
+It is possible to completely convert from using the OECN$EMIS_DBS file 
+to corresponding entries in OECN$SETUP.INI. To do so, simply create 
+sections in the OECN$SETUP file as shown in the previous section. The 
+entry code must be prefixed with "$EMIS_". The corresponding code 
+should be removed from OECN$EMIS_DBS, otherwise they will both be 
+processed.
+
+<p>
+To retain compatibility with EMIS_SELECT, you should be certain to 
+define the CATEGORIES attribute in the same format as shown. When 
+entries are stored in the OECN$SETUP file, SETUPENV will not access the 
+EMIS database to retrieve the fiscal year, therefore you should 
+explicitly include FY_fy in the CATEGORIES attribute.
+
+<p>
+One advantage of converting DBS entries into OECN$SETUP is that the 
+entry definitions are not limited to defining a single logical 
+(OECN$EMIS$DTA). The $EMIS_ entries can contain any other valid 
+attribute types, including TABLE, APPLICATION, SYMBOL, etc.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ At the time of this writing, the original EMIS_SELECT.COM procedure is 
+ still invoked by the EMIS_SELECT menu option. Therefore, if you wish to 
+ switch to SETUPENV immediately, you would have to modify the EMIS menu 
+ or customize the EMIS_SELECT.COM procedure. In the future, 
+ EMIS_SELECT.COM will be modified by the SSDT to use SETUPENV/EMIS 
+ instead of the current DCL procedure. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_11.6"><h1>11.6 NOACSC Compatiblity</h1></a>
+
+<p>
+SETUPENV is similar to the USE, BUNNY, and FROG utilities provided by 
+NOACSC. In some respects SETUPENV is based on these utilities. While 
+SETUPENV is not 100% compatible with these utilities, it does attempt 
+to simulate most of the behaviors and should be able to co-exist with 
+them.
+
+<p>
+To provide an easier transition for sites who are using NOACSC's 
+utilities, SETUPENV also provides command line compatibility with the 
+utilities. The following sections provide information regarding 
+compatibility with each of the utilities.
+
+<p>
+Symbols may be established for each of the utilities to invoke SETUPENV 
+in the appropriate compatibility mode:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+    USE :== $OECN$:SETUPENV/USE 
+    BUNNY :== $OECN$:SETUPENV/BUNNY 
+    FROG :== $OECN$:SETUPENV/FROG 
+</pre>
+</table>
+
+<p>
+This should allow SETUPENV to be used without modifying any existing 
+command procedures.
+
+<a name="heading_11.6.1"><h2>11.6.1 USE Compatibliity</h2></a>
+
+<p>
+If /USE is specified as the first qualifier to SETUPENV, then the 
+original USE qualifiers are accepted. The table below lists the USE 
+qualifiers and the corresponding qualifier/behavor for SETUPENV. 
+/PROMPT is the default for /USE.
+
+<p>
+The SETUPENV /PRINTER qualifier is the default. However, instead of 
+defining SYS$PRINT, LCL$PRINT is defined to point the queue from the 
+owner field.
+
+<table border=3>
+  <tr>
+    <th align=center>Qualifier </th>
+    <th align=center>SETUPENV Implementation </th>
+  </tr>
+  <tr>
+    <td>
+      /OUTPUT
+    </td>
+    <td>
+      Not implemented
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /ARCHIVE=nnnn
+    </td>
+    <td>
+      /ARCHIVE=nnnn
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /HOME
+    </td>
+    <td>
+      /RESET
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /PRIMARY_RUN
+    </td>
+    <td>
+      /LOGIN=(SIS,INFOHIO,USERNAME=2)/NOPROMPT
+    </td>
+  </tr>
+</table>
+
+<h2>Notable Differences:</h2>
+
+<ul>
+  <li>The USE default for /ARCHIVE is provided by the .CLD file (which is 
+  changed annually to provide a new default). SETUPENV's default is the 
+  first ARCHIVE for the entry. Therefore, to remain compatible with USE, 
+  archives should be placed with the most recent year first in the 
+  entry's section.
+  <li>USE determines which logicals to set based on the security 
+  identfiers held by the user (e.g. OECN$EIS$DTA is only set if OECN_EIS 
+  is held). SETUPENV sets all logicals specified for the entry regardless 
+  of security identifiers.
+  <li>SETUPENV does not set PMDF_SIGNATURE. Sites depending on this 
+  should add the following line to SYLOGIN:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+      
+       $ if f$search("SYS$LOGIN:PMDF_SIGNATURE.DOC").nes."" - 
+            then define PMDF_SIGNATURE "@SYS$LOGIN:PMDF_SIGNATURE.DOC" 
+       
+</pre>
+</table>
+
+</ul>
+
+<a name="heading_11.6.2"><h2>11.6.2 BUNNY Compatibility</h2></a>
+
+<p>
+If /BUNNY is specified as the first qualifier to SETUPENV, then the 
+original BUNNY qualifiers are accepted.
+
+<p>
+The SETUPENV defaults when /BUNNY is specified are:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+        $ SETUPENV/BUNNY/PROMPT/EMIS=NORESTRICT_IRNS 
+</pre>
+</table>
+
+<p>
+These defaults are affected by the original BUNNY qualifiers per the 
+following table.
+<p>
+
+<table border=3>
+  <tr>
+    <th align=center>Qualifier </th>
+    <th align=center>SETUPENV Implementation </th>
+  </tr>
+  <tr>
+    <td>
+      /ARCHIVE=nnnn
+    </td>
+    <td>
+      /ARCHIVE=nnnn
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /CURRENT_BUILDING
+    </td>
+    <td>
+      not implemented
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /EMIS
+    </td>
+    <td>
+      not implemented (logicals defined by entry)
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /INFOHIO
+    </td>
+    <td>
+      /LOGIN=INFOHIO
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /PRIMARY_RUN
+    </td>
+    <td>
+      /LOGIN=(SIS,INFOHIO)/NOPROMPT
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /LOGICAL_ONLY
+    </td>
+    <td>
+      /NOPROMPT
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /RESTRICT_IRNS
+    </td>
+    <td>
+      EMIS=RESTRICT_IRNS
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /SCHEDULE_BUILDER
+    </td>
+    <td>
+      Chains to SIS$EXE:SISMENU_CMSB.EXE
+    </td>
+  </tr>
+</table>
+
+<p>
+For interactive processes, if neither /PRIMARY_RUN nor /LOGICALS_ONLY 
+is specified then SETUPENV/BUNNY chains to SISMENU.EXE, unless 
+overridden by /SCHEDULE_BUILDER.
+
+<h2>Notable Differences:</h2>
+
+<ul>
+  <li>SETUPENV does not define the ESC, PROFF or T80. These symbols 
+  cannot be placed in the OECN$SETUP SYMBOL attributes because they 
+  contain non-printable characters (not supported). Therefore, these 
+  symbols must be placed in a SYLOGIN procedure.
+  <li>/CURRENT_BUILDING is not supported. SETUPENV does not have ability 
+  to set an entry based on the value of an existing logical.
+  <li>If /ARCHIVE is specified without a value, the default is the first 
+  ARCHIVE attribute for the selected entry.
+</ul>
+
+<a name="heading_11.6.3"><h2>11.6.3 FROG Compatibility</h2></a>
+
+<p>
+If /FROG is specified as the first qualifier to SETUPENV, then the 
+original FROG qualifiers are accepted.
+
+<p>
+The SETUPENV defaults when /BUNNY is specified are:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+        $ SETUPENV/FROG/PROMPT 
+</pre>
+</table>
+
+<p>
+These defaults are affected by the original BUNNY qualifiers per the 
+following table.
+
+<table border=3>
+  <tr>
+    <th align=center>Qualifier </th>
+    <th align=center>SETUPENV Implementation </th>
+  </tr>
+  <tr>
+    <td>
+      /CURRENT_BUILDING
+    </td>
+    <td>
+      Not implemeneted
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /LOGICALS_ONLY
+    </td>
+    <td>
+      /NOPROMPT
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /PRIMARY_RUN
+    </td>
+    <td>
+      LOGIN=INFOHIO
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /PRINTER
+    </td>
+    <td>
+      /PRINTER (see below)
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /OPAC=RESTRICTED
+    </td>
+    <td>
+      Chains to "@LIS_MGR:OPAC"
+    </td>
+  </tr>
+  <tr>
+    <td>
+      /OPAC=UNRESTRICTED
+    </td>
+    <td>
+      Chains to "@LIS_MGR:OPAC R"
+    </td>
+  </tr>
+</table>
+
+<p>
+For interactive processes, if neither /PRIMARY_RUN nor /LOGICALS_ONLY 
+is specified then SETUPENV/FROG chains to "@LIS_MGR:LISMENU SYSADM.M"., 
+unless overridden by /OPAC
+
+<h2>Notable Differences:</h2>
+
+<ul>
+  <li>/PRINTER behaves the same as SETUPENV's /PRINT qualifier, except 
+  that /FROG/PRINTER attempts to find a queue named entry$PRINT where 
+  "entry" is the selected entry. If found, entry$PRINT is assigned to 
+  SYS$PRINT. If the user has a queue definition in their SYSUAF Owner 
+  field, it overrides the entry$PRINT queue.
+  <li>For non-DAS staff, SYS$PRINT is unconditionally assigned to 
+  LCL$PRINT as a job logical (which might be occluded).
+  <li>SETUPENV/FROG does not attempt to define the large number of 
+  symbols created by FROG. These should either be placed in an 
+  $APP_INFOHIO entry, or moved to a global login procedure. Symbols 
+  containing non-printable characters (e.g. CLEAR) must be moved to a 
+  global procedure.
+</ul>
+
+<p>
+
+<a name="heading_11.7"><h1>11.7 OECN$SETUPENV API</h1></a>
+SETUPENV provides a callable API which can be used by programs to 
+select entries. The API parallels the qualifier functions and syntax.
+
+<a name="heading_11.7.1"><h2>11.7.1 Working Storage Field(s)</h2></a>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ Picture for string field are maximum sizes that will be used by 
+ OECN$SETUPENV. The string fields are based by descriptor, so the field 
+ sizes are not required to be the exact size. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+       01   WS-FUNCTION             PIC S9(4) COMP VALUE 0. 
+            88  SET-DB                             VALUE 0. 
+            88  NEXT-DB                            VALUE 1. 
+            88  RESET-DB                           VALUE 2. 
+            88  MENU-SELECTION                     VALUE 3. 
+            88  LOOKUP-DB                          VALUE 4. 
+            88  LOGIN-DEFAULTS                     VALUE 5. 
+       01   WS-FLAGS. 
+            03  WS-SIS-DEFAULT      PIC X. 
+            03  WS-INFOHIO-DEFAULT  PIC X. 
+            03  WS-BY-ACCESS        PIC X. 
+            03  WS-BY-USERNAME      PIC X. 
+            03  WS-EMIS-RESTRICT    PIC X. 
+            03  WS-EMIS-SELECT      PIC X. 
+            03  FILLER                  PIC X(26). 
+       01   WS-SELECTED-DB          PIC X(40). 
+       01   WS-SEL-TYPE             PIC X(25). 
+       01   WS-SEL-CATEGORIES       PIC X(40). 
+       01   WS-SEL-APPLICATION      PIC X(10). 
+       01   WS-SEL-ARCHIVE          PIC X(6). 
+       01   WS-TYPE                 PIC X(25). 
+       01   WS-DESC                 PIC X(40). 
+       01   WS-IRN                  PIC X(6). 
+       01   WS-CATEGORIES           PIC X(40). 
+       01   WS-APPLICATIONS         PIC X(80). 
+       01   WS-PROMPT-STRING        PIC X(40). 
+       01   WS-ARCHIVE              PIC X(6). 
+       01   WS-STATUS               PIC S9(9) COMP. 
+            88  OECN__NORMAL        VALUE EXTERNAL OECN__NORMAL. 
+            88  OECN__NOMORE        VALUE EXTERNAL OECN__NOMORE. 
+            88  OECN__NOTFOUND      VALUE EXTERNAL OECN__NOTFOUND. 
+       01  WS-RELATIONSHIPS. 
+            03  WS-RELATION-COUNT    PIC S9(4) COMP. 
+            03  WS-RELATIONSHIP 
+                    OCCURS 0 TO 40 TIMES DEPENDING 
+                    ON WS-RELATION-COUNT. 
+                    05  WS-RELATION-TYPE        PIC X. 
+                    88  WS-RELATION-PARENT      VALUE "P". 
+                    88  WS-RELATION-SIBLING     VALUE "S". 
+                    88  WS-RELATION-CHILD       VALUE "C". 
+                    05  WS-RELATION-ENTRY       PIC X(12). 
+</pre>
+</table>
+
+<p>
+
+<a name="heading_11.7.2"><h2>11.7.2 COBOL Call Arguments</h2></a>
+
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+      CALL "OECN$SETUPENV" 
+                USING 
+                    WS-FUNCTION 
+                    BY DESCRIPTOR WS-FLAGS 
+                    BY DESCRIPTOR WS-SELECTED-DB 
+                    BY DESCRIPTOR WS-SEL-TYPE 
+                    BY DESCRIPTOR WS-SEL-CATEGORIES 
+                    BY DESCRIPTOR WS-SEL-APPLICATION 
+                    BY DESCRIPTOR WS-SEL-ARCHIVE 
+                    BY DESCRIPTOR WS-TYPE 
+                    BY DESCRIPTOR WS-DESC 
+                    BY DESCRIPTOR WS-IRN 
+                    BY DESCRIPTOR WS-CATEGORIES 
+                    BY DESCRIPTOR WS-APPLICATIONS 
+                    BY DESCRIPTOR WS-RELATIONSHIPS 
+                    BY DESCRIPTOR WS-PROMPT-STRING 
+                    BY DESCRIPTOR WS-ARCHIVE 
+                GIVING WS-STATUS. 
+</pre>
+</table>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ The arguments passed by descriptor may be OMITTED if the return value 
+ is not desired. However, the argument list must not be shortened, that 
+ is, the caller should explictly include the OMITTED keyword. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_11.7.3"><h2>11.7.3 Argument Descriptions:</h2></a>
+
+<blockquote>
+<strong>WS-FUNCTION (read)</strong>
+
+  <blockquote>
+    Indicates the function to perform. Behavior matches the corresponding 
+    DCL qualifiers.
+    <br>The LOOKUP-DB function is specific to the API and not implemented 
+    via the DCL command. LOOKUP-DB returns the information about the 
+    specified entry without actually setting the logicals. This allows a 
+    program to retrieve information about an entry without switching 
+    contexts.
+  </blockquote>
+<br>
+  <br><strong>WS-FLAGS</strong>
+
+  <blockquote>
+    List of one character flags which modify the behavior of the API. 
+    Unless noted otherwise, the flags should either contain a spaces or a 
+    "Y" if the flag is on.
+    <br>The following flags are applicable when the LOGIN-DEFAULTS function 
+    is requested:
+  </blockquote>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+                WS-SIS-DEFAULT      Same as /LOGIN=SIS 
+                WS-INFOHIO-DEFAULT  Same as /LOGIN=INFOHIO 
+                WS-BY-ACCESS        Same as /LOGIN=BY_ACCESS 
+                WS-BY-USERNAME      If set, just contain 
+                                    an ascii numeric value indicating 
+                                    the number of characters to use 
+                                    from the username as the entry 
+                                    code.  e.g. Placing "2" in 
+                                    this flag, is the same as 
+                                    /LOGIN=USERNAME=2 
+               WS-EMIS-RESTRICT     Same as /RESTRICT_IRNS 
+               WS-EMIS-SELECT is the same as /EMIS 
+</pre>
+</table>
+
+<br>
+  <br><strong>WS-SELECT-DB (modify, by descriptor)</strong>
+
+  <blockquote>
+    Entry(s) from INI file to select. Optional if MENU or NEXT functions 
+    are being performed. The actual entry selected is also returned in this 
+    parameter.
+  </blockquote>
+<br>
+  <br><strong>WS-SEL-TYPE (read, by descriptor)</strong>
+<br>
+  <br><strong>WS-SEL-CATEGORIES (read, by descriptor)</strong>
+
+  <blockquote>
+    Values to restrict entries by type and/or categories.
+    <br>Same as /TYPE and /CATEGORIES qualifiers.
+  </blockquote>
+<br>
+  <br><strong>WS-SEL-APPLICATION (read, by descriptor)</strong>
+
+  <blockquote>
+    Value to select by application. Same as /APPLICATION qualifier.
+  </blockquote>
+<br>
+  <br><strong>WS-TYPE (write, by descriptor)</strong>
+<br>
+  <br><strong>WS-DESC (write, by descriptor)</strong>
+<br>
+  <br><strong>WS-IRN (write, by descriptor)</strong>
+<br>
+  <br><strong>WS-CATEGORIES (write, by descriptor)</strong>
+
+  <blockquote>
+    Return values which describe the entry. Same values that are also 
+    placed in the OECN$SETUP_CURRENT Logical.
+  </blockquote>
+<br>
+  <br><strong>WS-APPLICATIONS (write, by descriptor)</strong>
+
+  <blockquote>
+    Space delimited list of appliations associated with the current entry.
+  </blockquote>
+<br>
+  <br><strong>WS-PROMPT-STRING (write, by descriptor)</strong>
+
+  <blockquote>
+    The string SETUPENV would use to create the DCL and Menu prompt if 
+    /PROMPT is specified. Note: The API never sets the prompt. The calling 
+    routine may use this string to set the prompts, if desired.
+  </blockquote>
+<br>
+  <br><strong>WS-RELATIONSHIPS (write, by descriptor)</strong>
+
+  <blockquote>
+    A structure that describes the selected entries relationship to other 
+    entries based on the PARENT attributes. Currently three types of 
+    relationships are defined: Parent, sibling or children. The types of 
+    entries returned in this table will vary depending on the entry 
+    selected.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ Calling routines should not assume that only these three types of 
+ relationships exist. Future versions of the API may return other 
+ relationships. </td>
+  </tr>
+</table>
+</center>
+<br>
+  <br><strong>WS-ARCHIVE</strong>
+
+  <blockquote>
+    Contains code of archive if one was selected.
+  </blockquote>
+</blockquote>
+
+<a name="heading_11.7.4"><h2>11.7.4 Return Status</h2></a>
+
+<p>
+OECN$SETUP returns one of the following conditions:
+
+<table border=3>
+  <tr>
+    <td>
+      OECN__NORMAL
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      Function completed successfully (Item selected or reset)
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN__NOMORE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      When using "next" function, no more matching entries were found.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN__NOTFOUND
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      Specified entry was not found.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN__INVNEXT
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      Invalid combination of TYPE and current entry for NEXT function. Must 
+      specify a starting entry or valid select type.
+    </td>
+  </tr>
+</table>
+
+<a name="heading_11.7.5"><h2>11.7.5 Description</h2></a>
+
+<p>
+The OECN$SETUPENV routine does basically everything that the SETUPENV 
+DCL interface does; however, there are some notable exceptions. Here is 
+a list that the callable interface does NOT provide:
+
+<ol start=1 >
+  <li>Does not simulate /USE, /BUNNY or /FROG behaviors. Those qualifiers 
+  are handled by the SETUPENV utility and are not exposed to the callable 
+  interface.
+  <li>Does not modify the Menu or DCL prompts (a string is returned for 
+  setting the prompt if desired).
+  <li>Does not invoke OECN_LOGIN or EMIS_SWITCH_FY to ensure that the 
+  correct state software logicals are defined based on the version of the 
+  data files. If the calling program depends on files/programs in any of 
+  the OECN$x logicals, it should take it's own action to ensure the 
+  correct version is selected (or contact the SSDT if this is important).
+  <li>Does not implement the function of /PRINTER
+</ol>
+
+<p>
+
+<hr size=5>
+<a name="sysman_ump_chap"><h1>Chapter 12<br>Installing and Using UMP - User Mail Profile  System</h1></a>
+
+<a name="heading_12.1"><h1>12.1 Overview</h1></a>
+
+<p>
+   The UMP package provides a means for DA-sites to maintain user e-mail 
+   profiles in a standard way. This will provides an efficient means of 
+   sending mail to a large variety of users across the state. It will also 
+   allows for the creation of an electronic "white pages phone directory" 
+   which permits an easy way to lookup an e-mail address for any user on 
+   the OECN network.
+
+<a name="heading_12.1.1"><h2>12.1.1 Feature List</h2></a>
+
+<p>
+UMP provides the following features:
+
+<ul>
+  <li>Ability to add/modify user profiles.
+  <li>Allows end-user to modify their own profile.
+  <li>Permits 'group managers' to manage other user profiles within their 
+  group
+  <li>Imports an existing distribution list and creates a basic user 
+  profile (NM or PMDF style distribution lists).
+  <li>Ability to provide complete 'centralized naming' facility for both 
+  local and remote addresses, including ability to create user aliases 
+  independent of username or mailbox address.
+  <li>Exports user profiles into the following formats:
+
+  <blockquote>
+    - NM
+    <br>- PMDF style distribution lists
+    <br>- PMDF DIRECTORY DAEMON format
+  </blockquote>
+  <li>Handles OECN standard distribution lists and allows local 
+  distribution lists to be added.
+  <li>Includes a utility to create distribution lists based on VMS 
+  identifiers.
+  <li>Includes a utility to check UMP profiles against SYSUAF.
+  <li>Includes a utility to run during login to determine if user has 
+  modified their own profile.
+  <li>Includes a utility to transmit UMP data into the CSO white pages 
+  directory.
+  <li>Tracks whether the user has modified/updated their own profile. 
+  Optionally, users who have not updated their own profile will be asked 
+  if they wish to update their user mail profile during login.
+</ul>
+
+<a name="heading_12.1.2"><h2>12.1.2 Web Attachments for OECN state-wide mail</h2></a>
+
+<p>
+A special feature of the OECN state-wide lists is the ability to 
+"web-ify" attachments send to the OECN lists. As messages addressed to 
+the OECN lists pass through the central OECN mail server, they are 
+inspected for certain attachment types. If a suitable attachment type 
+is discovered, it is placed on a public web site and the original 
+attachment is replaced by a web link (URL) pointing to the documents 
+location. Thus, only a single copy of each attachment must be stored on 
+the OECN web server and will not be delivered to each user's mailbox.
+
+<p>
+ Each user subscribed to UMP has the option of receiving the original 
+ message with the attachments or the version containing web links 
+ instead of attachments. Most users will benefit from receiving web 
+ links instead of attachments (reduced local storage, shorter download 
+ times and reduce risk of viruses. However, some users may prefer the 
+ original attachments, especially if they download their mail for 
+ disconnected (off-line) reading.
+
+<p>
+ The benefit of web attachments to DA Sites can be signficant. Without 
+ web attachments, any message containing a large attachment must be 
+ delivered to each user's mailbox separately consuming considerable disk 
+ space and computer resources to deliver.
+
+<p>
+ However, each DA Site may decide how, and if, to implement OECN web 
+ attachments for their users. Converting existing users to web 
+ attachments may cause confusion or concerns. Therefore, DA Sites are 
+ encouraged not to switch existing users to web attachments without 
+ training or notification.
+
+<a name="heading_12.1.2.1"><h3>12.1.2.1 Enabling Web Attachments</h3></a>
+
+<p>
+Web attachments are only enabled for each DA Site upon request. If you 
+wish your users to have the ability to request web attachments, you 
+must set ENABLE_OECN_WEBATTACH to "YES" and send mail to 
+listmaster@oecn.k12.oh.us. The listmaster will verify the correct 
+configuration of your UMP configuration and enable web attachments if 
+appropriate. Your request may be denied if you have a non-standard UMP 
+configuration. In that case, the listmaster will explain the problem(s) 
+with your configuration.
+
+<p>
+ To see if web attachments are enabled for your site, look for the SITE 
+ command in OECN$UMP_STANDARD.INI and see if the "webatt" parameter is 
+ set for your domain. If this parameter is set, then web attachments are 
+ already enabled. Note: You can not change OECN$UMP_STANDARD.INI 
+ yourself. Only the OECN listmaster can make the change that affects the 
+ OECN mail server.
+
+<a name="heading_12.1.3"><h2>12.1.3 Files</h2></a>
+
+<p>
+The following sections describe the files used and produced by the UMP 
+system.
+<p>
+<strong>Files and Procedures Used</strong>
+<br>
+
+<table border=3>
+  <tr>
+    <th align=center>File/Procedure </th>
+    <th align=center>Use </th>
+  </tr>
+  <tr>
+    <td>
+      OECN$UMP_LOCAL.INI
+    </td>
+    <td>
+      Contains A-site specific information and list codes.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      OECN$UMP_STANDARD.INI
+    </td>
+    <td>
+      Contains OECN_wide list codes and definitions.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      IMPORT_NM_LISTS.COM
+    </td>
+    <td>
+      Used to import data from NM style distribution lists into user profiles.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      IMPORT_PMDF_LISTS.COM
+    </td>
+    <td>
+      Used to import data from PMDF style distribution lists into user 
+      profiles.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      EXPORT_LISTS.COM
+    </td>
+    <td>
+      Used to generate both NM and PMDF style distribution lists.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      EXPORT_DD.COM
+    </td>
+    <td>
+      Used to generate a file suitable for loading into a PMDF DIRECTORY 
+      DAEMON database.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      UMP_SEND_CSO.COM
+    </td>
+    <td>
+      Used to transmit UMP data to the CSO white pages directory.
+    </td>
+  </tr>
+</table>
+<p>
+<strong>Files Created</strong>
+<br>
+
+<p>
+    The table below describes the files created by UMP. Unless otherwise 
+    specified, the files are created in OECN$UMP:.
+
+<table border=3>
+  <tr>
+    <th align=center>File </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      MAIL_*_A.DIS
+    </td>
+    <td>
+      One file for each distribution list. This file contains addresses of 
+      users who have requested to receive original attachments sent to an 
+      OECN list..
+    </td>
+  </tr>
+  <tr>
+    <td>
+      MAIL_*_W.DIR
+    </td>
+    <td>
+      One file for each distribution list. This file contains addresses of 
+      user who have requested web links to attachments sent to the an OECN 
+      lists.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      MAIL_ALIASES.DAT
+    </td>
+    <td>
+      Alias file defining aliases for UMP generated lists. This file is 
+      intended to be loaded into the PMDF alias database or included into the 
+      PMDF alias file.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      USER_ALIASES.TXT
+    </td>
+    <td>
+      Alias file defining aliases for UMP remote users to create centralized 
+      naming. This file is intended to be loaded into the PMDF alias database.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      USER_RESERVE.TXT
+    </td>
+    <td>
+      File containing reversing entries for users to create centralized 
+      naming. This file is intended to be loaded into the PMDF reverse 
+      database.
+    </td>
+  </tr>
+</table>
+
+<a name="heading_12.2"><h1>12.2 UMP Menu and Profile Screen</h1></a>
+
+<p>
+The program may be executed by typing:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$RUN OECN$:UMP
+</pre>
+</table>
+
+<p>
+at the $ prompt or from the menu system, type:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Menu&gt;UMP
+</pre>
+</table>
+
+<p>
+<strong>The Main UMP Menu</strong>
+<br>
+
+<p>
+The following menu will appear:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+___________________________________________________________________ 
+|                                                                 | 
+|  UMP - User Mail Profile Maintenance                            |                
+|  -------------------------------------------------------------  |  
+|     1. PERSONAL   - Modify Personal Profile                     |               
+|     2. MAINTAIN   - Maintain User Profiles                      | 
+|     3. EXIT       - Exit program                                |               
+|                                                                 |               
+|                                                                 |               
+|                                                                 |               
+|                                                                 |               
+|                                                                 |               
+|                                                                 |               
+|                                                                 |                
+|                                                                 |               
+|     Menu: UMP Option&gt;                                           |               
+|                                                                 |               
+|   XXX Accept       XX  Help        XX  Exit        XXX Next     |          
+|_________________________________________________________________|                                                                 
+             
+ 
+ 
+</pre>
+</table>
+
+<p>
+<strong>Profile Screen</strong>
+<br>
+
+<p>
+When you execute the UMP program and select the MAINTAIN option, a User 
+Mail Profile screen similar to the following will appear:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+___________________________________________________________________________ 
+|                                                                         | 
+|                                             Updated  12-DEC-1995 16:26  | 
+|                                                                         |  
+| Username  DOE     Group         Node  NWOCAC   User Type  STAFF         | 
+| Internet Host/Mailbox    NWOCA.ORG                                      | 
+| Name   Doe, John                               Phone                    |  
+| Title  NBEC/NWOCA    SSDT Documentalist/Supp   Fax                      |   
+| Position Code                                  Cell/Pager               | 
+|                                                Alternate                | 
+| District IRN                                                            | 
+| Building IRN                                                            | 
+| County   Henry                                                          | 
+| District/Organization  NBEC/NWOCA                                       |   
+| Street Address                                                          |   
+| City, State, Zip                                                        |   
+| Comment                                                                 |   
+| URL                                                                     | 
+| Site information                                                        |   
+| Management Groups                                                       | 
+|                                                                         | 
+|                                                                         |   
+|  UMP: User Mail Profile for OECN Users                                  |   
+|   XX  Top             XXX  Find            XXX  Lockmode                |    
+|   XX  Help            XXX  Add             XXX  Set Defaults            |    
+|   XX  Exit            XXX  Delete          XXX  Email Lists             |    
+|   XXX Next            XXX  Modify                                       |   
+|_________________________________________________________________________| 
+ 
+ 
+</pre>
+</table>
+
+<p>
+<strong>EMAIL Lists</strong>
+<br>
+
+<p>
+In order to view the Email lists you currently subscribe to, press the 
+<kbd>[Email Lists]</kbd> key. A screen similar to the following will 
+appear giving both OECN statewide and local distribution lists.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+___________________________________________________________________________ 
+| User  DOE        Name  Doe, John                                        | 
+|                                Subscribe by name _________________      | 
+| Receive OECN attachments as web links?  Y                               | 
+|Subscribed?  --  Subscribed Distribution Lists --                        | 
+|   -- OECN lists --                                                      | 
+|    Y   MAIL_STAFF           DAS Staff   [Restricted]                    | 
+|    Y   MAIL_SUPT_PUB        Superintendents-Pub   [Restricted]          |   
+|    Y   MAIL_TREAS           Treasuere    [Restricted]                   | 
+|   -- NWOCA lists --                                                     | 
+|    Y   MAIL_SSDT            SSDT Staff                                  | 
+|    Y   MAIL_STAFF_EMIS      EMIS Staff                                  | 
+|    Y   MAIL_STAFF_FIS       Fiscal Staff                                | 
+|                                                                         | 
+|                                                                         | 
+|                                                                         | 
+|                                                                         | 
+|                                                                         | 
+|  Press &lt;Show All Lists&gt; to see all available lists                      | 
+|                                                                         | 
+|  UMP: E-mail Distribution Lists                              1 of   1   | 
+|   XXX Accept (Resort)       XX  Cancel                XX  Prev Screen   |  
+|   XX  First Screen          XXX Last Screen           XX  Next Screen   | 
+|   XX  Help                  XXX Show All Lists                          |  
+|   XX  Exit Dist Lists       XXX Exit Dist Lists                         | 
+|                                                                         | 
+|_________________________________________________________________________| 
+ 
+</pre>
+</table>
+
+<p>
+ The field "Receive OECN attachments as web links?" indicates if the 
+ user wishes to receive links, instead of attachments, for files sent to 
+ the OECN state-wide lists.
+
+<p>
+You may subscribe or unsubscribe to any unrestricted list by entering 
+the name of the list in the indicated field at the top of the screen 
+and pressing the <kbd>[Accept]</kbd> key.
+<p>
+<strong>Table of Email Distribution Lists</strong>
+<br>
+
+<p>
+In order to see the available distribution lists, press the <kbd>[Show 
+All Lists]</kbd> key. A set of screens such as the following will 
+appear:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+___________________________________________________________________________ 
+|                                                                         | 
+| User  DOE        Name  Doe, John                                        | 
+|                                Subscribe by name _________________      |                   
+| Receive OECN attachments as web links?  Y                               | 
+| Subscribed?  --  All Available Distribution Lists --                    |        
+|   -- OECN lists --                                                      |       
+|        MAIL_CSTAFF          C-site staff (obsolete)                     |       
+|        MAIL_EMIS            EMIS Coordinators   [Restricted]            |       
+|    _   MAIL_LIBRARIAN       Librarian                                   |       
+|        MAIL_PRINC_NONPUB    Principals-Nonpublic   [Restricted]         |       
+|        MAIL_PRINC_PUB       Principals-Public   [Restricted]            |       
+|           MAIL_PRINC_ELEM      Principals-Elementary   [Restricted]     |       
+|           MAIL_PRINC_SEC       Principals-Secondary   [Restricted]      |       
+|    _   MAIL_SPECED          Special Education                           |       
+|    Y   MAIL_STAFF           DAS Staff   [Restricted]                    |       
+|        MAIL_SUPT_NONPUB     Superintendents-Nonpublic   [Restricted]    |       
+|    Y   MAIL_SUPT_PUB        Superintendents-Pub   [Restricted]          |       
+|           MAIL_SUPT_CITY       Superintendents-City   [Restricted]      |  
+|           MAIL_SUPT_COUNTY     Superintendents-County   [Restricted]    |   
+|  This is the first screen                                               |    
+|                                                                         |  
+|  UMP: E-mail Distribution Lists                              1 of   6   | 
+|   XXX Accept (Resort)       XX  Cancel                XX  Prev Screen   |  
+|   XX  First Screen          XXX Last Screen           XX  Next Screen   |   
+|   XX  Help                  XXX Show Subscribed                         | 
+|   XX  Exit Dist Lists       XXX Exit Dist Lists                         |   
+|_________________________________________________________________________| 
+ 
+ 
+</pre>
+</table>
+
+<a name="heading_12.3"><h1>12.3 Startup Procedure</h1></a>
+
+<p>
+  Follow the steps below to install UMP on your system:
+
+<ol start=1 >
+  <li>Create the system logical OECN$UMP to point to the device and 
+  directory where profile and distribution lists will be created. You 
+  should NOT use the same directory as your NM: or OECN$MAIL directories. 
+  You should create a new directory to contain these files.
+  <li>Use OECN_INSTALL and INSTALL PACKAGE as usual to install the OECN 
+  package.
+  <li>If installing for the first time, copy OECN$UMP_LOCAL.INI to 
+  OECN$UMP with world:read protection.
+<br>
+    <br> Modify OECN$UMP_LOCAL.INI to contain A-site specific information. 
+    You must specify A-site name, DECnet node, and internet host names, 
+    etc. See the .INI file for more information.
+  <li>Run the UMP.EXE program and choose the MAINTAIN option. Then exit 
+  the program. This will create empy .IDX files in OECN$UMP. Set the 
+  protections on the *.IDX files to W:RW.
+</ol>
+
+<p>
+
+<a name="heading_12.4"><h1>12.4 Loading Initial Data</h1></a>
+ Load existing distribution lists. If using NM style distribution lists, 
+ then use:
+<br>
+$ @OECN$:IMPORT_NM_LISTS
+
+<p>
+ If using PMDF style lists created by SWOCA's PUBDOM OECNMAIL utilities, 
+ then use:
+<br>
+$ @OECN$:IMPORT_PMDF_LISTS
+
+<p>
+ Then run OECN$:UMP/MAINTAIN to review the user profiles. It should have 
+ set, at least, the username, DECnet node, and host/domain. If the NM 
+ lists were loaded, it will also have the name, district and county from 
+ the NM lists. If a user was on more than one list, the user profile 
+ will have multiple list codes.
+
+<p>
+ After running the import, the protection on the UMP*.IDX files should 
+ be set to W:RW.
+
+<p>
+ You may, if desired, import from both the NM and PMDF style lists. 
+ Unique usernames will only be added once, and a user will not be 
+ assigned to the same list more than once. Running both imports 
+ essentially "merges" the NM and PMDF lists. This might be useful if you 
+ are uncertain which of your lists is more correct.
+
+<a name="heading_12.5"><h1>12.5 Importing Other Lists</h1></a>
+
+<p>
+ The IMPORT_NM_LISTS.COM and IMPORT_PMDF_LISTS.COM only import the 
+ standard NM lists or lists created by SWOCA's OECN$MAIL utilities. If 
+ you have other local lists which contain users you want to assign to a 
+ list (either a standard list or a local list), you can use the 
+ UMPIMPORT.EXE utility directly.
+
+<p>
+ The UMPIMPORT utiltiy can read an existing list (either NM or PMDF 
+ format) and assign the users to the distribution list code you specify. 
+ The UMPIMPORT utility takes three parameters in the following form:
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ UMPIMPORT :== $OECN$:UMPIMPORT 
+$ UMPIMPORT {NM|PMDF} {code} {file} 
+</pre>
+</table>
+
+<p>
+ The first parameter indicates if the list to be imported is a NM list 
+ or a PMDF list. NM style lists must contain at least the DECnet 
+ address. PMDF style lists must contain internet addresses. The second 
+ parameter is the distribution list code to assign to the users. The 
+ code must be defined in either OECN$UMP_STANDARD.INI or 
+ OECN$UMP_LOCAL.INI. The final parameter is the file to import. See 
+ either IMPORT_NM_LISTS.COM or IMPORT_PMDF_LISTS.COM for examples of 
+ using UMPIMPORT.EXE.
+<p>
+
+<a name="heading_12.6"><h1>12.6 INI File Commands</h1></a>
+The following INI commands are used in either the OECN$UMP_LOCAL.INI or 
+the OECN$UMP_STANDARD.INI files. The following is a summary of these 
+commands. See either of these files for more examples of their use. <p>
+
+<table border=3>
+  <caption><a name="Table_12-1"><strong>Table 12-1 Table of INI File Commands</strong></a></caption>
+  <tr>
+    <th align=center>&nbsp;</th>
+    <th align=center>Command </th>
+    <th align=center>&nbsp;</th>
+    <th align=center>Fields </th>
+    <th align=center>Explanation </th>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      SET_ASITE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Asite}"
+    </td>
+    <td>
+      A-site acronym. Required field.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      SET_NODE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Node}"
+    </td>
+    <td>
+      Default DECnet node, cluster prefered. Required field.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      SET_DOMAIN
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Domain}"
+    </td>
+    <td>
+      Default domain. Used as default for user profile and PMDF aliases. For 
+      example, SET_DOMAIN = "NWOCA.ORG". Required field.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      SET_USER_TYPE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Code}"
+    </td>
+    <td>
+      Default for "User Type" field.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      LOCAL_LIST_PREFIX
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Prefix}"
+    </td>
+    <td>
+      Alias prefix for local distribution lists. Example, LOCAL_LIST_PREFIX = 
+      "Local_". May be null if local lists are not to be prefixed.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      LOCAL_HOST
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{hostname}"
+    </td>
+    <td>
+      This parameter defines host name(s) which should be considered "local" 
+      to the current system. You may include multiple LOCAL_HOST lines if 
+      needed. If a users "internet mailbox/host" field contins a local 
+      address, then a user alias will not be created for them. Use this 
+      parameter if you change the domain specified by SET_DOMAIN but you 
+      still have user profiles which refer to the old address. Without this 
+      parameter, UMP will consider profiles with the old domain to be remote 
+      users and will create aliases for them.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      PROCESS_CHANNEL
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{process_channel_name}"
+    </td>
+    <td>
+      This parameter may be used to set the name of the reprocess channel to 
+      be used for processing UMP distribution lists. By default, UMPEXPORT 
+      will assume the reprocess channel is named reprocess.domain_name where 
+      domain_name is the domain from the SET_DOMAIN parameter.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      DIRECTORY_DOMAIN
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{directory_daemon_domain}"
+    </td>
+    <td>
+      This parameter may be used to specifically set the name of the 
+      directory daemon domain, if any. If this parameter is not specified 
+      then UMPEXPORT will assume that the directory daemon is named 
+      PO.domain_name where domain_name is the deomain from the SET_DOMAIN 
+      parameter.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      REWRITE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{user@host}","{To_Domain}"
+    </td>
+    <td>
+      Used by the UMPEXPORT to rewrite a particular domain to a 
+      "pseudo_domain" for public use in the CSO (White Pages) and for address 
+      reverals. The pseudo_domain may be name of your directory channel or an 
+      alias for the local host. For example, REWRITE = *,"po.nwoca.org". In 
+      this example, the command would cause all of NWOCA's users to have an 
+      email address of "username@po.nwoca.org" regardless of their real host 
+      name. In this way, remote users will not learn the real host name 
+      (which may change). REWRITE supports full wildcarding on the "From" 
+      domain portion of the parameter. The user@host may be a wildcard 
+      pattern which matches user email address from the UMP profiles. The 
+      new_host is the domain that the address will be rewritten to. This 
+      parameter allows you better control over how addresses are published in 
+      the CSO database (OECN White Pages) and address reversal
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      CSO_REWRITE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      Synonym for REWRITE
+    </td>
+    <td>
+      &nbsp;
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      ERRORS_TO
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Email_Address}"
+    </td>
+    <td>
+      Address for "errors-to" parameter on mailing lists. If not preset, the 
+      "errors_to" address defaults to "postmaster".
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      EMPTY_ADDRESS
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Email_Address}"
+    </td>
+    <td>
+      Email address to place in any empty distribution list to prevent 
+      bounces to mail sent to an empty list. Defaults to "empty@bitbucket" 
+      which is suitable if the default "bitbucket" channel is defined.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      ENABLE_OECN_WEBATTACH
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {YES|NO}
+    </td>
+    <td>
+      Enables users to request and receive "web attachments" sent to the OECN 
+      lists. Default is "YES". Set to "NO" to prevent users from requesting 
+      web attachments.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      OECN_WEBATTACH_DEFAULT
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {YES|NO}
+    </td>
+    <td>
+      Specifies the "web attachment" default for new users. By default, new 
+      users will receive web links instead of attachments. Set this to NO if 
+      you wish new users to recieve the original attachments.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      ALLOW_USER_ALIAS
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {YES|NO}
+    </td>
+    <td>
+      Indicates whether the 'Alias' and 'From' fields should be activated. 
+      When set to NO (the default), the alias and from fields will be 
+      disabled. When set to YES, the fields will be active. Note: When set to 
+      YES, the DAS must customize thier procedures to load the 
+      USER_ALIASES.TXT and USER_REVERSE.TXT file into the appropriate PMDF 
+      database.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      LISTPARMS
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{named parameter}"
+    </td>
+    <td>
+      Specifies named parameter(s) to added to the MAIL_ and local aliases 
+      created by UMP. Multiple named parameters may be specified using 
+      multiple LISTPARMS lines. The named parameters will be included on all 
+      MAIL_* and local UMP aliases. See the PMDF Managers Guide for 
+      information about named parameters. Note: Too many named parameters may 
+      prevent the alias from fitting in the PMDF Alias database. In that 
+      case, the MAIL_ALIASES.DAT file must be included into the PMDF alias 
+      file and the configuration compiled nightly.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      PROTECT_SITE_INFO
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      [YES|NO]
+    </td>
+    <td>
+      Protect "Site Info" field in UMP. The default is "YES".
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      TYPE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {Type},"{Description}"
+    </td>
+    <td>
+      Defines a distribution list type. Types 01---0z are reserved for OECN 
+      use. Types 10---zz are available for DAS use. Types must be defined 
+      prior to using a DEFINE_CODE line.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      DEFINE_CODE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+       [Type-],{Code},"{Description}", {List_Name},[User_Modifiable], 
+       [Master_Code]
+    </td>
+    <td>
+       Type is a two digit no., considered above. Code is a 1 to 8 character 
+       code used in the UMP maintenance program. List_Name is the file name 
+       suffix used to create the distribution list filename. User_Modifiable 
+       (Y,N) allows the user to subscribe or unsubscribe to the list. The 
+       default is "NO", which means that the list is restricted. Master_Code 
+       contains the master list code to which a sublist refers. In the case of 
+       a master list, this field also contains the master list code. See the 
+       section, Defining Local Distribution Lists, for more details.
+      <p>The default list type for codes in the OECN - wide file is 01. e.g. 
+      in the OECN$UMP_STANDARD.INI file, DEFINE_CODE=COUN,... is equivalent 
+      to DEFINE_CODE=01-COUN,...
+      <p>If the first character of the distribution codes is a hyphen (--), 
+      the distribution list is obsolete and should be phased out. This means 
+      that the export routines will not force creation of an alias pointing 
+      to empty distribution lists and will not assign these empty lists as a 
+      sub-list of a master list.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      TYPE_RESTRICT
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {Type},{Method},{Value}
+    </td>
+    <td>
+      For example, TYPE_RESTRICT= 02,SUBSCRIBED,01-STF, restricts type 02 
+      lists to users who are also subscribed to the list 01-STF. See the 
+      section below on Restricting Types, for more information and kinds of 
+      restrictions.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      CONVERT
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {From_Code},{To_Code}
+    </td>
+    <td>
+      This command will automatically convert an "old" distribution list code 
+      to a "new" one. For example, CONVERT = 01-PM,02-PM. The "From_Code" is 
+      the old (original) distribution list code, and "To_Code" is the new 
+      distribution list code. Note, that codes must specify both the type and 
+      code (e.g. 01-PM). You should NOT rely on the default prefix when 
+      specifying conversions. See the section below for more information on 
+      conversions.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      NM_MAP
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      {From_Code},{To_Code}
+    </td>
+    <td>
+      The command causes codes to be mapped to produce a single old-style NM 
+      distribution list for compatibility with NM_SEARCH.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      SITE
+    </td>
+    <td>
+      =
+    </td>
+    <td>
+      "{Domain}",{CSO_ID}
+    </td>
+    <td>
+      This command defines the OECN DAS host name. Each SITE in this section 
+      will be included in the OECN_xxxx distribution lists. It also specifies 
+      each site's CSO white pages identifiers. A range of CSO ids has been 
+      allocated to each site. These fields should not be modified. This 
+      command should not be placed in the OECN$UMP_LOCAL.INI file.
+    </td>
+  </tr>
+</table>
+<hr>
+<blockquote>
+* This command can appear at most one time in the Local INI file.
+</blockquote>
+<hr>
+<p>
+
+<a name="heading_12.7"><h1>12.7 Export NM and PMDF Style Lists</h1></a>
+ A procedure called OECN$:EXPORT_LISTS.COM to is used to create the NM 
+ and PMDF style distribution lists and associated aliases. It is 
+ recommended that each DAS write a custom DCL procedure which invokes 
+ EXPORT_LIST.COM which also contains any local commands to add aliases, 
+ etc. This procedure should be scheduled to run nightly to keep the 
+ aliases and distributions lists up to date. See <a href="oecn10_sysman_handbook_full.html#exam_build_proc">Section 12.18</a> for an 
+ example procedure which takes advantage of most of UMP's features.
+
+<p>
+ To run the procedure:
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ @OECN$:EXPORT_LISTS  "{options}" 
+</pre>
+</table>
+
+<p>
+ The P1 parameter should specify one or more of the following options 
+ separated by commas:
+
+<table border=3>
+  <tr>
+    <th align=center>Option </th>
+    <th align=center>Description </th>
+  </tr>
+  <tr>
+    <td>
+      REBUILD
+    </td>
+    <td>
+       Rebuild the PMDF alias database from scratch using the alias file(s) 
+       from UMPEXPORT. Use REBUILD if you allow UMP to control all the aliases 
+       in your database, or if you add additional aliases after 
+       EXPORT_LISTS.COM is executed.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      MERGE
+    </td>
+    <td>
+      (Default) Merge the UMP aliases with the existing PMDF_ALIAS_DATABASE. 
+      Use this option if you control/rebuild the alias files prior to 
+      executing EXPORT_LISTS.COM Note: If this option is used then UMP will 
+      always add aliases and old UMP aliases will not be deleted unless you 
+      are rebuilding the database yourself elsewhere.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+       Note: REBUILD and MERGE are mutually exclusive.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      USER
+    </td>
+    <td>
+       Indicates that the USER_ALIASES.TXT and USER_REVERSE.TXT should be 
+       loaded into PMDF_ALIAS_DATABASE and PMDF_REVERSE_DATABASE, 
+       respectively. This should option should be specified if the DAS is 
+       using remote addresses or user alias features of UMP.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      DEFER
+    </td>
+    <td>
+       Defers placing updated PMDF databases back into the PMDF production 
+       directories. This permits the DAS procedure to add additional aliases 
+       to the database before being used by PMDF. If this option is specified 
+       then the DAS's procedures are responsible for moving the databases back 
+       into the PMDF production directories. The PMDF database files created 
+       are: OECN$UMP:ALIASES.DAT (Alias database) OECN$UMP:REVERSE.DAT 
+       (reverse database).
+    </td>
+  </tr>
+</table>
+
+<p>
+ If you are using UMP as your only source of PMDF database aliases, you 
+ should specify REBUILD. This will ensure that any old or obsolete 
+ aliases are not retained in your database.
+
+<p>
+ However, if you have other aliases which you are building into your 
+ local PMDF alias database, you must take local action to periodically 
+ rebuild the PMDF alias database using your own aliases. This is 
+ necessary to ensure that old aliases are not retained in your PMDF 
+ alias database.
+
+<p>
+ If you are unfamilar with how aliases work in PMDF and how the alias 
+ database (PMDF_ALIAS_DATABASE) and the alias file (PMDF_ALIAS_FILE) 
+ interact, we recommend that you do the following:
+
+<ul>
+  <li>Allow UMP's EXPORT_LISTS.COM to rebuild the alias database from 
+  scratch (by specifying the REBUILD option). This will give UMP complete 
+  control over the aliases and ensure that no obsolete aliases are 
+  retained.
+  <li>Place any local aliases (those not created by UMP) in your 
+  PMDF_ALIAS_FILE. This file is not used by UMP and will allow you to 
+  create local aliases without them being wiped out by UMP. 
+  Alternatively, you can specify the DEFER option in EXPORT_LIST and 
+  write procedure which adds additional aliases prior to moving the 
+  databases into PMDF_TABLE:.
+</ul>
+
+<a name="heading_12.7.1"><h2>12.7.1 Centralized Naming</h2></a>
+
+<p>
+ This section describes several ways in which UMP can be used to provide 
+ centrialized naming in a PMDF configuration. Centralized naming 
+ provides means to provide stable user email addresses regardless of 
+ where the users mail is actually being delivered. This section assumes 
+ you are already familar with the basic concepts of centralized naming 
+ in PMDF.
+
+<a name="heading_12.7.1.1"><h3>12.7.1.1 Remote Mail Boxes</h3></a>
+
+<p>
+ UMP can provide centralized naming for users who have "remote" 
+ mailboxes. Using UMP's centralized naming, a user can have an address 
+ such as USER@das.org even if thier mail is being delivered to a 
+ different address (mailbox), regardless of where that mailbox resides. 
+ The centralized naming may be used to deliver mail to remote systems on 
+ behalf of the user, or simply as a means of forwarding mail without 
+ resorting to VMS Mail forwarding.
+
+<p>
+ Examples of "remote" users include:
+
+<ul>
+  <li>Users who wish to have thier OECN mail delivered to a different 
+  account (e.g. on the same system or on a third-party ISP)
+  <li>Users who's mailbox exists on a school district mail server or 
+  another DAS mail server.
+  <li>Users who's mailbox is in PMDF popstore
+</ul>
+
+<p>
+The primary benefit of centralized naming is that it permits a user to 
+have a stable mailing address even if the actual mailbox changes in the 
+future. Everyone with an DAS can have the same host name in thier 
+address regardless of where the mailbox reside.
+
+<p>
+ UMP determines if a user requires an alias based on the "Internet 
+ Host/Mailbox" field on the profile. If the "Internet Host/Mailbox" 
+ field contains a different mailbox or a "remote" hostname, then the 
+ user is considered "remote" and an alias is generated. The definition 
+ of "remote" is if the host name portion of the address does not match 
+ the value of SET_DOMAIN or any LOCAL_HOST in the OECN$UMP_LOCAL.INI. 
+ For each user which UMP determines requires an alias, an line is 
+ written to USER_ALIASES.TXT. A line is also written to 
+ USER_REVERSE.TXT. USER_REVERSE.TXT contains the appropriate "address 
+ reversal" entry which allows PMDF to adjust the user's "From:" address 
+ for outgoing mail.
+
+<p>
+ Both USER_ALIASES.TXT and USER_REVERSE.TXT are suitable for loading 
+ into the PMDF_ALIAS_DATABASE and PMDF_REVERSE_DATABASE, respectively. 
+ The use of these files is optional and is up to each DAS to determine 
+ if they are useful in their configuration. EXPORT_LIST will not load 
+ the files into PMDF by default. You must either set the USER option in 
+ EXPORT_LISTS or write a custom procedure to load these files after 
+ EXPORT_LISTS is executed.
+
+<p>
+ Please note, the USER_REVERSE.TXT is only effective if mail sent by the 
+ user is routed through your system. For remote systems running mailers 
+ which send internet mail directly (such as a remote VMS system running 
+ PMDF), you must use that system's mechanisms for rewriting "From" 
+ address lines. For instance, on a remote PMDF system, adding a REVERSE 
+ mapping to the PMDF_MAPPING_FILE may be appropriate. Alternatively, you 
+ could take steps to ensure that all outgoing mail is routed through the 
+ system containing the UMP reversing entries.
+
+<p>
+ When exporting CSO, the user's real mailbox will be exported by 
+ default. You can control this by using the REWRITE line in the local 
+ INI file to rewrite addresses to either the DAS domain, a host alias, 
+ or the directory channel. If you do this, be sure that you are loading 
+ the appropriate file into either PMDF_ALIAS_DATABASE or your directory 
+ channel. An address rewritten in this manner will be rewritten back to 
+ the username or alias on the UMP profile (not the username in the 
+ mailbox field).
+
+<a name="heading_12.7.1.2"><h3>12.7.1.2 User Aliases</h3></a>
+
+<p>
+ UMP provides the ability to create a user-specific alias independent of 
+ the username or actual mailbox. For example, a username of 
+ "SMITH@nwoca.org" could have an alias of "dave.smith@nwoca.org". 
+ Furthermore, the user alias may optionally be used as the user's 
+ backward pointing (From:) address. This permits the user to have an 
+ easier to remember address as well as obscuring the actual username for 
+ security purposes.
+
+<p>
+ The user aliases in UMP are implemented as two fields on the UMP 
+ profile called "Alias" and "From". The alias is a 32 character field 
+ which may consist of letters, digits or dots (.). The alias is required 
+ to have a least one dot to avoid duplicates with VMS usernames. The 
+ 'From' field is a flag indicating if the alias should be used as the 
+ profile's official "From:" address. If the "From" flag is set to 'N', 
+ then the alias is merely an alternative address for the user and will 
+ be published in the CSO (White Pages). If the flag is set to 'Y', then 
+ an entry will be added into the USER_REVERSE.TXT to reverse the 
+ backward pointing addresses for any mail sent by the user.
+
+<p>
+ The 'Alias' and 'From' fields may only be modified by a system or group 
+ manager. That is, end-users cannot specify thier own alias or reversal. 
+ This allows the appropriate manager to control the alias standards. It 
+ also prevents users from changing thier alias or 'From:' address 
+ frequently without understanding the implications or attempting to 
+ forge mail messages.
+
+<p>
+Group managers are required to specify an "alias prefix" which matches 
+one of the group codes they are responsible for. For example, if a 
+group manager is responsible for the groups "AA,AB", then they may only 
+specify aliases beginning with "aa." or "ab.". This helps ensure 
+uniqueness in the mailbox namespace when multiple group managers are 
+responsbile for different groups of profiles.
+
+<p>
+ Since the DAS must take additional configuration steps in PMDF to 
+ implement aliases and address reversal, the 'Alias' and 'From' fields 
+ are disabled by default. The DAS must take explicit action (see below) 
+ to implement this feature.
+
+<a name="heading_12.7.1.2.1"><h4>12.7.1.2.1 Implementing User Aliases</h4></a>
+
+<p>
+ The following steps must be performed in order to activate the user 
+ alias and address reversal using UMP:
+
+<ol start=1 >
+  <li>Configure PMDF to use the 'reverse database' on the appropriate 
+  channels. This feature is enabled by default in a standard PMDF 
+  configuration. See the PMDF documentation for more information.
+  <li>Set ALLOW_USER_ALIAS to YES in OECN$UMP_LOCAL.INI. This flag 
+  enables the 'Alias' and 'From' fields in UMP.
+  <li>Invoke EXPORT_LISTS.COM using the USER option to cause the 
+  USER_ALIASES.TXT and USER_REVERSE.TXT files to be loaded into the 
+  appropriate database. See <a href="oecn10_sysman_handbook_full.html#exam_build_proc">Section 12.18, Example Procedure for Periodic Rebuilds</a> for an example procedure which 
+  invokes EXPORT_LISTS.COM.
+</ol>
+
+<a name="heading_12.8"><h1>12.8 Distribution List Codes</h1></a>
+
+<p>
+ Each distribution list code has a "type" prefix. The type value allows 
+ distribution lists to be organized into subsets independent of the 
+ list's name and allows restrictions to be placed on lists so users only 
+ see lists that may apply to them. The type codes also ensure that lists 
+ defined by the OECN do not conflict with those created by the DAS.
+
+<p>
+ This version uses an 8 character code in the following format:
+<br>
+TT-CCCCCC
+
+<p>
+ Where TT is the distribution list "type" (or category) and CCCCCC is 
+ the distribution list code. The following types are predefined by UMP:
+
+<table border=3>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      01
+    </td>
+    <td>
+      OECN-wide user distribution lists
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      02
+    </td>
+    <td>
+      OECN DAS staff-only lists
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      10
+    </td>
+    <td>
+      Default type for lists defined by DAS
+    </td>
+  </tr>
+</table>
+
+<p>
+ Types beginning with "0" are reserved for OECN use. All other types 
+ (any type not starting with "0) are available for use by the DAS. 
+ Currently, a maximum of 100 types can be defined.
+
+<p>
+ Type 10 is predefined and available for DAS use. To add additional 
+ types add a line to the local ini file, like:
+<br>
+TYPE=tt,"description"
+
+<p>
+ For example:
+<br>
+TYPE=11,"NWOCA Staff Lists"
+
+<p>
+ Once a type has been defined, you may use the type in subsequent 
+ DEFINE_CODE lines, for example:
+<br>
+DEFINE_CODE = 11-STFRCP, "Staff Recipes", STAFF_RECIPIES
+<br>
+DEFINE_CODE = 11-STFJOK, "Staff Jokes", STAFF_JOKES
+
+<p>
+ This creates two lists called MAIL_STAFF_RECIPIES and MAIL_STAFF_JOKES. 
+ When displayed in UMP, they will be sorted and displayed under a 
+ subheading called "NWOCA Staff lists".
+<p>
+<strong>Restricting Types to Particular Users</strong>
+<br>
+
+<p>
+ Using types allows you to organize your lists into categories for 
+ presentation to the user. But it may also be useful to restrict 
+ categories of lists to particular types of users. UMP allows you to 
+ apply several types of restrictions based on the user's profile 
+ information.
+
+<p>
+ Note that type restrictions do NOT affect whether or not a user can 
+ subscribe or unsubscribe from a given list. Each DEFINE_CODE line 
+ determines whether a list is user-subscribable. The type restrictions 
+ only limit whether the user can see a list or not.
+
+<p>
+ Please note that the type restrictions are not intended as rigid 
+ security. Since some of the criteria is based on user modifiable 
+ fields, it is possible for a user to enter incorrect information and 
+ get assigned to the wrong lists. For example, a user might enter 
+ another district's IRN which allows them to subscribe to another 
+ districts lists. However, if the user changes the IRN back to the 
+ correct value, UMP will remove them from any incorrectly assigned lists.
+
+<p>
+ To apply a restriction to a type value, use one of the following 
+ commands in the local ini file:
+<br>
+
+<table border=3>
+  <tr>
+    <td>
+      TYPE_RESTRICT=tt,SUBSCRIBED,tt-cccccc
+    </td>
+    <td>
+       Restricts type tt to users who are also subscribed to list tt-ccccc.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TYPE_RESTRICT=tt,IRN,nnnnnn
+    </td>
+    <td>
+       Restrict type to users who have a district or building IRN matching 
+       nnnnnn
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TYPE_RESTRICT=tt,TYPE,xxxx
+    </td>
+    <td>
+       Restrict type to users with a 'user type' field matching xxxxx.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TYPE_RESTRICT=tt,COUNTY,xxxx
+    </td>
+    <td>
+       Restrict type to users with a 'county' field matching xxxx.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      TYPE_RESTRICT=tt,USERNAME,wildcard
+    </td>
+    <td>
+       Restrict type to users with a 'username' field matching wildcard mask.
+    </td>
+  </tr>
+</table>
+
+<p>
+ Multiple TYPE_RESTRICT lines may be added for a single list type. In 
+ this case, the restrictions form a logical OR operation. That is, if 
+ the user matches any one of the criteria, they will have access to the 
+ type.
+
+<p>
+ For example, to restrict the type 11 lists (from the example in the 
+ previous section) to DAS staff members, the following restriction could 
+ be applied:
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+TYPE_RESTRICT=11, SUBSCRIBED, 01-STF 
+</pre>
+</table>
+
+<p>
+ This will restrict all type 11 lists to users who are also subscribed 
+ to the standard DAS staff list.
+
+<a name="heading_12.9"><h1>12.9 Auto Conversion of Distribution List Codes (Optional)</h1></a>
+
+<p>
+ Because of the features provided by the distribution list types, it may 
+ be desirable for DAS's to change their existing distribution list 
+ codes. By default, during the conversion, all distribution list codes 
+ in the LOCAL INI file are prefixed with type 10. For instance, if a DAS 
+ has defined several "staff" lists, you may wish to separate these into 
+ a separate type and restrict them to staff members only.
+
+<p>
+ To help facilitate this, an optional command is available for the LOCAL 
+ INI file called CONVERT. The CONVERT command takes the following form:
+<br>
+<em>CONVERT={old_code},{new_code}</em>
+
+<p>
+ For example, to convert an existing code of 10-SEM (Staff EMIS) to 
+ 11-STFEMS, place the following line in the LOCAL.INI:
+<br>
+CONVERT=10-SEM, 11-STFEMS
+
+<p>
+ Note that the prefix is required even if you did not use the prefix 
+ when defining the code originally. Remember that any codes defined by 
+ the local ini file default to type 10, so if a code was defined without 
+ a type, it's type is 10.
+
+<p>
+ When changing a existing code using a CONVERT line, you should change 
+ the DEFINE_CODE line to reflect the new code at the time you add the 
+ CONVERT line. You should not reuse old codes until you are certain they 
+ no longer exist in the UMDDAT file. After you are certain the old code 
+ no longer exists in the UMDDAT file, you may remove the CONVERT line 
+ from your INI file.
+
+<p>
+ Adding the CONVERT line and revising the DEFINE_CODE line, is all that 
+ must be done to convert an existing list. UMP and it's utilities will 
+ automatically convert the code as needed "on-the-fly". If you look at 
+ the UMDDAT.IDX file after making a conversion, you may notice that some 
+ users have the new code and others still have the old code. This is the 
+ expected behavior. The new code will not be physically written to the 
+ file until the record is changed with UMP's Modify function.
+
+<p>
+ If you are creating locally written programs to update or report on 
+ user's distribution list codes, it may be confusing to have both the 
+ old and new codes on file. In this case, you may run the UMPUPDATE 
+ program to force the conversion on all records.
+
+<a name="heading_12.10"><h1>12.10 Defining Local Distribution Lists</h1></a>
+
+<p>
+To define a local distribution list, you need to add several additional 
+lines to the OECN$UMP_LOCAL.INI file.
+
+<p>
+You will probally need to use the ini commands:
+<br>
+LOCAL_LIST_PREFIX, TYPE, TYPE_RESTRICT, DEFINE_CODE
+<p>
+<strong>Example 1</strong>
+<br>
+
+<p>
+The following example illustrates how to define a local distribution 
+list for payroll clerks.
+
+<p>
+Add the following lines to the OECN$UMP_LOCAL.INI file:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+TYPE = 12,"Local Payroll Clerks" 
+DEFINE_CODE = 12-PAYCLK,"Payroll Clerks",PAYROLL_CLERK 
+</pre>
+</table>
+
+<p>
+In order to actually subscribe to this distribution list, a user or DAS 
+person, will have to access the user's UMP profile, bring up the list 
+of available distribution lists, and subscribe the person.
+<p>
+<strong>Example 2</strong>
+<br>
+
+<p>
+As another example, suppose you wish to set up a distribution list for 
+staff jokes, restrict the list to just those users who have access to 
+DAS staff lists, create sublists for fiscal, programming, and EMIS 
+jokes, and set a prefix for local lists.
+
+<p>
+Add the following lines to the OECN$UMP_LOCAL.INI file:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+LOCAL_LIST_PREFIX = "local_" 
+TYPE = 11, "Local Staff Lists" 
+TYPE_RESTRICT = 11,SUBSCRIBED,01-STF 
+DEFINE_CODE = 11-STFJOK,"Staff Jokes",STAFF_JOKES,Y,11-STFJOK 
+DEFINE_CODE = 11-FISJOK,"Fiscal Jokes",FISCAL_JOKES,Y,11-STFJOK 
+DEFINE_CODE = 11-PRGJOK,"Programmer Jokes",PROGRAMMER_JOKES,Y,11-STFJOK 
+DEFINE_CODE = 11-EMSJOK,"EMIS Jokes",EMIS_JOKES,Y,11-STFJOK 
+</pre>
+</table>
+
+<p>
+Then those users who are subscribed to the 01-STF list will see the 
+following entry when they access the table of available lists in the 
+UMP program.
+<br>
+-- LOCAL STAFF LISTS --
+<br>
+---LOCAL_STAFF_JOKES Staff Jokes
+<br>
+---LOCAL_FISCAL_JOKES Fiscal Jokes
+<br>
+---LOCAL_PROGRAMER_JOKES Programmer Jokes
+<br>
+---LOCAL_EMIS_JOKES EMIS Jokes
+<br>
+
+<p>
+Users who are not subscrbed to the list 01-STF would see not entries 
+for "Local Staff Lists" including the heading itself.
+
+<p>
+Note that the three sublists point to the master list, 11-STFJOK in the 
+DEFINE_CODE lines. This makes these sublists, so that mail addressed to 
+one of these sublists will be delivered to anyone on this list and 
+anyone on the master list, but not to users on any of the other 
+sublists. Also, mail addressed to the master list will be delivered to 
+everyone on any of the sublists.
+
+<a name="heading_12.11"><h1>12.11 Profile Group Management</h1></a>
+
+<p>
+ UMP provides the ability to segregate profiles into <strong>management 
+ groups</strong> and delegate responsibility for the groups to selected 
+ individuals. Once delegated, the group manager has nearly complete 
+ control over the content of the profiles in the groups they are 
+ responsible for. They may add, change or delete profiles within their 
+ group and assign profiles to unrestricted distribution lists.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ Group managers may not add or remove profiles from the restricted 
+ distribution lists. These lists (MAIL_STAFF, MAIL_SUPT_PUB, etc.) are 
+ the responsibility of the DA-site and may not be delegated. </td>
+  </tr>
+</table>
+</center>
+
+<p>
+ User profiles are assigned to groups simply by placing a value in the 
+ 'Group' field on the UMP profile. If desired, the field may be massed 
+ changed using Datatrieve by modifying the GRP field in the UMP_HEADER 
+ domain or UMP view. This value is a protected field and may only be 
+ changed by DAS personnel or a group manager associated with the group.
+
+<p>
+ A user may be granted management rights to one or more groups by 
+ entering a comma separated list of groups in the 'Management Groups' 
+ field. A limit of ten comma separated groups may be included. The 
+ following standard wildcards are supported in the management groups 
+ field:
+
+<table border=3>
+  <tr>
+    <td>
+      *
+    </td>
+    <td>
+      Any sequence of zero or more characters
+    </td>
+  </tr>
+  <tr>
+    <td>
+      %
+    </td>
+    <td>
+      Exactly one character
+    </td>
+  </tr>
+  <tr>
+    <td>
+      #
+    </td>
+    <td>
+      Exactly one numeric character
+    </td>
+  </tr>
+  <tr>
+    <td>
+      @
+    </td>
+    <td>
+      Exactly one alphabetic character
+    </td>
+  </tr>
+</table>
+
+<p>
+ The user with any value in the 'Management Groups' field will be 
+ permitted access to the MAINTAIN option in UMP. No special security 
+ identifiers are required. The user will be able to view any profile on 
+ the system, but will only be permitted to modify or delete profiles 
+ associated with one of their groups. If a group manager adds a profile, 
+ they must enter a group which matches their group management field.
+
+<p>
+ The value of the group field is entirely arbitrary. The DAS may assign 
+ the groups in any fashion desirable. Most likely, a group would be 
+ created for all users in a district and one or more group managers 
+ would be assigned to manage that district's profiles. However, groups 
+ could be further defined by building, or perhaps by classes of users 
+ (teachers, administrators, etc.). Since wildcards are supported, it is 
+ possible to devise complex hierarchies of groups which permit different 
+ users various levels of access.
+
+<p>
+ Group managers should be carefully instructed regarding local 
+ conventions for the various UMP fields. In particular, if the DAS uses 
+ the USER_ALIAS.TXT to route mail to remote mailboxes, then proper use 
+ of the UMP 'Internet Host/Mailbox' field is critical to ensure proper 
+ mail delivery. Likewise, if the DAS uses the 'User Type' field to 
+ control which profiles are sent to the OECN White Pages, then the 
+ correct values must be provided to the group manager.
+
+<a name="heading_12.12"><h1>12.12 Export DIRECTORY DAEMON File (optional)</h1></a>
+
+<p>
+ You have the option of exporting to a DIRECTORY DAEMON database. 
+ Executing the EXPORT_DD.COM file will produce a file suitable for 
+ loading into a PMDF DIRECTORY-DAEMON data file. The procedure only 
+ produces a DIRECTORY-DAEMON.TXT file in the OECN$UMP directory. You 
+ must execute the appropriate PMDF CRDB command to create the indexed 
+ file database and place it in the PMDF_ROOT:[DIRECTORY] with the 
+ appropriate filename for your pseudo-domain.
+
+<p>
+ EXPORT_DD creates several aliases for each user. For example, the 
+ following aliases would be created for username "SMITH" and a profile 
+ name "Dave Smith":
+
+<table border=3>
+  <tr>
+    <td>
+      SMITH
+    </td>
+    <td>
+      SMITH@nwoca.org
+    </td>
+  </tr>
+  <tr>
+    <td>
+      dave.smith
+    </td>
+    <td>
+      SMITH@po.NWOCA.ORG
+    </td>
+  </tr>
+  <tr>
+    <td>
+      smith.dave
+    </td>
+    <td>
+      SMITH@po.NWOCA.ORG
+    </td>
+  </tr>
+  <tr>
+    <td>
+      d.smith
+    </td>
+    <td>
+      SMITH@po.NWOCA.ORG
+    </td>
+  </tr>
+  <tr>
+    <td>
+      smith.d
+    </td>
+    <td>
+      SMITH@po.NWOCA.ORG
+    </td>
+  </tr>
+</table>
+
+<p>
+ Notice that the first alias (the username alias) sends directly to the 
+ user's "real" address. The other aliases (dotted names) send to the 
+ username at the directory channel. Since the username should be unique, 
+ the first alias should never cause a bounce. The other addresses may 
+ cause a bounce if they are not unique (the sender is notified of the 
+ duplicates and their addresses). Since only dotted names and their 
+ addresses are returned to the sender, the sender never learns the 
+ "real" address. This helps isolate remote users from knowning the real 
+ host names of the recipient.
+
+<p>
+ The directory channel for the DAS is assumed to be "po." plus the value 
+ of the SET_DOMAIN line from the OECN$UMP_LOCAL.INI file. For instance, 
+ for nwoca.org, the directory channel is assumed to be po.nwoca.org. If 
+ the DAS is using a different name for the directory channel, you may 
+ place the following line in the OECN$UMP_LOCAL.INI file:
+<br>
+<em>DIRECTORY_DOMAIN=pseudo.domain</em>
+
+<p>
+ See the PMDF System Adminstrators Guide for more information about the 
+ directory daemon, channels and pseudo-domains.
+
+<a name="heading_12.13"><h1>12.13 Submit UMP Data to OECN CSO Database</h1></a>
+
+<p>
+ The CSO nameserver is a public domain software system which allows a 
+ single database to be built containing name and address information. 
+ The CSO is much flexible and allows client/server access to the 
+ database anywhere on the network. Users can use GOPHER, LYNX or other 
+ web browsers to perform queries. A utility called PH is also available 
+ to perform direct queries against the central database.
+
+<p>
+ To transmit UMP data for loading into the CSO database, each DAS should 
+ run the UMP_SEND_CSO.COM command procedure once per week. This command 
+ procedure will extract the UMP database into CSO format and send it to 
+ NWOCA.ORG for loading into CSO.
+
+<p>
+ Unless instructed otherwise, please do not routinely run UMP_SEND_CSO 
+ more than once per week. In general, a single weekly run is sufficient 
+ to keep the OECN White Pages up to date. However, situations will arise 
+ where an extra run of UMP_SEND_CSO is necessary or desirable. For 
+ example, if you change domain names, or load a large number of new 
+ users or make significant changes to the the profiles. In these cases, 
+ feel free to make a special run of UMP_SEND_CSO.
+
+<p>
+ NWOCA's system will run an update routine at approximately midnight 
+ each night to load any files submitted during the day. Therefore, the 
+ CSO data on file at the server will be updated the day after you run 
+ UMP_SEND_CSO. This schedule means that your CSO data will be at most 
+ one week behind when compared to your current UMP database.
+
+<p>
+ If you are also using EXPORT_DD.COM to build a DIRECTORY-DAEMON 
+ database, you may wish to have the email addresses in the CSO database 
+ reflect your directory daemon address, rather than your user's real 
+ addresses. In this case, you may add the following line to your 
+ OECN$UMP_LOCAL.INI file:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+    REWRITE=*,"pseudo_domain" 
+</pre>
+</table>
+
+<p>
+    Where "pseudo_domain" is the domain name of your directory channel, for 
+    example, NWOCA uses the following line:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+    REWRITE=*,"po.nwoca.org" 
+</pre>
+</table>
+
+<p>
+    This line would cause all of NWOCA's users to have an email address of 
+    username@po.nwoca.org regardless of their real host. In this way, 
+    remote users will not learn the real host name (which may change).
+
+<a name="heading_12.14"><h1>12.14 Master List/Sub-list Handling</h1></a>
+
+<p>
+ Starting with the 29-Aug-95 version of UMPEXPORT, the master lists are 
+ handled differently than in the past. Previously, there were master 
+ lists which pointed to the respective sub-lists. But this caused 
+ duplicate messages if the user was on more than one sub-list. With this 
+ version, the master lists will contain the actual email addresses of 
+ the users who are on the master list or any of the sub-lists.
+
+<p>
+ There were also "compatibility" codes which were used for the original 
+ NM distribution list codes. This proved too cumbersome and confusing. 
+ Therefore, a new method of handling the master lists was implemented 
+ which essentially combines the master lists with the NM-compatibilty 
+ lists.
+
+<p>
+ The codes PRN, SPT and TRS were previously indicated as "Obsolete-NM" 
+ codes. This is no longer the case. These codes are now "master list" 
+ codes (and indicated as such on the UMP help screen). If a user is 
+ coded as having a "master list" code, they will placed on the master 
+ list _and_ will also be placed on _all_ of the sub-lists for that code.
+
+<p>
+ If a user is coded on one of the sub-lists, they will be placed on that 
+ sub-list and the corresponding master list.
+
+<p>
+ These changes provides two advantages:
+
+<ol start=1 >
+  <li>It provides a simple way of placing a single user on all sub-lists 
+  using a single code. For example, if a DAS staff member wishes to be 
+  placed on all the MAIL_TREAS_xxx lists, they may simply be given the 
+  TRS master code. This will cause them to be placed on the master list 
+  and all of TRS's sub-lists.
+  <li>Users which have not yet been recoded to one of the more specific 
+  lists will automatically be placed on the master and all sub-lists. 
+  This ensures that users who have not been recoded to the appropriate 
+  list will still receive mail sent to any of the lists.
+</ol>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+This change means that it is somewhat less important to get your users 
+migrated off of the old distribution list codes. However, if you leave 
+users on the master list codes, they may receive mail that was not 
+intended for them. For example, if mail is sent to mail_supt_jvsd, it 
+will be received by all users who are on the SPT or SJV lists. </td>
+  </tr>
+</table>
+</center>
+
+<a name="heading_12.15"><h1>12.15 UMPCHECK - Verifying UMP Profiles against SYSUAF (Optional)</h1></a>
+
+<p>
+ UMPCHECK is a utility which reads the UMP profiles and compares the 
+ usernames to the SYSUAF file. It reports usernames which do not exist, 
+ have been disusered or dismailed. Optionally, UMPCHECK can delete 
+ profiles for such usernames. By default, UMPCHECK only checks profiles 
+ when the user's DECnet node name matches the values of the SYS$NODE or 
+ SYS$CLUSTER_NODE logicals. Other users are considered to be remote 
+ users and are not verified against the current node's SYSUAF. UMPCHECK 
+ must be run as a foreign command and accepts the following syntax:
+<br>
+<em>$ UMPCHECK {CHECK|DELETE|DELETE/CONFIRM} [nodes,...]</em>
+
+<p>
+ The first parameter is the function to perform:
+
+<table border=3>
+  <tr>
+    <td>
+      CHECK
+    </td>
+    <td>
+      --
+    </td>
+    <td>
+      Verify the UMP profiles against the SYSUAF and report usernames which 
+      are invalid, disusered or dismailed.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      DELETE
+    </td>
+    <td>
+      --
+    </td>
+    <td>
+      Unconditionally deletes local usernames which are invalid, disusered or 
+      dismailed.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      DELETE/
+      <br> CONFIRM
+    </td>
+    <td>
+      --
+    </td>
+    <td>
+      Same as DELETE but prompts whether each username should be deleted or 
+      not.
+    </td>
+  </tr>
+</table>
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ The function must be specified exactly as shown above without 
+ abbreviation and there may not be spaces between DELETE and /CONFIRM. 
+ </td>
+  </tr>
+</table>
+</center>
+
+<p>
+ The second parameter indicates the node names of the users to be 
+ validated against the current SYSUAF. By default, the node names used 
+ are the current values of the SYS$NODE and SYS$CLUSTER_NODE logicals.
+<p>
+
+<a name="heading_12.16"><h1>12.16 UMP_LOGIN - To Prompt Users to Enter Profiles During Login (Optional)</h1></a>
+ UMP_LOGIN.COM may be run during login to determine if the user has ever 
+ modified their own profile. If they have not entered their profile, 
+ UMP_LOGIN will ask them if they would like to do so immediately and 
+ place them in the UMP profile.
+
+<p>
+ You may invoke UMP_LOGIN.COM at any point during login when appropriate 
+ for your users. For example, SYLOGIN or other procedure appropriate for 
+ your system. If you want UMP_LOGIN to be invoked automatically by 
+ OECN_LOGIN, you may create a file in OECN$CUSTOM called 
+ OECN_LOGIN_EPILOGUE.COM and execute OECN$:UMP_LOGIN from there.
+
+<p>
+ If you use UMP_LOGIN.COM you may wish to use the VMS INSTALL utility to 
+ install OECN$:UMPMODIFIED.EXE as a known image to speed up the login 
+ process.
+
+<a name="heading_12.17"><h1>12.17 UMPID2DIS - Creating Distribution Lists from VMS Identifiers (Optional)</h1></a>
+
+<p>
+ UMPID2DIS.EXE is an optional utility which builds PMDF style 
+ distribution lists containing all users who hold a specified 
+ identifier. This may be used by sites who wish to build distribution 
+ lists for all users of a given package. These distribution lists are 
+ not standard OECN-wide lists.
+
+<p>
+ UMPID2DIS will only work correctly on your system if your UIC's are 
+ unique. That is, each user (holder of an identifier) has their own 
+ unique UIC. If two users hold the same UIC identifier, only one of them 
+ will be output to the lists.
+
+<p>
+ To create a distribution list for users holding a given identifier, use 
+ the following commands:
+<br>
+$ ID2DIS :== $OECN$:UMPID2DIS
+<br>
+$ ID2DIS {identifier},... {distribution_list_file}
+
+<blockquote>
+      where "identifier" is the identifier. If you specify an OECN_ 
+      identifier, users who hold the standard identifier or the _RO and _GM 
+      variants will be included in the list. You may specify multiple 
+      identifiers separated by commas (no spaces). If a user holds more than 
+      one of the identifiers, they will only be included on the list once.
+<br>
+  <br> "distribution_list_file" is the filename to contain the 
+  distribution list. If a device and extention are not included, the 
+  default is OECN$UMP:.DIS.
+</blockquote>
+
+<p>
+ Only users that meet the following criteria will be output to the list:
+
+<table border=3>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      1)
+    </td>
+    <td>
+      The user holds one or more of the specified identifiers.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      2)
+    </td>
+    <td>
+      The UAF flags DISUSER and DISMAIL are not set.
+    </td>
+  </tr>
+  <tr>
+    <td>
+      &nbsp;
+    </td>
+    <td>
+      3)
+    </td>
+    <td>
+      The username has a valid UMP profile.
+    </td>
+  </tr>
+</table>
+
+<p>
+ Note that UMPID2DIS does NOT create the PMDF alias to point to the 
+ distribution list. If aliases are desired for the list you must use 
+ PMDF CRDB or PMDF DB to create the PMDF aliases.
+
+<p>
+ For example, NWOCA could use the following commands to create a 
+ distribution list for all NWOCA USPS users:
+<br>
+$ ID2DIS := $OECN$:UMPID2DIS
+<br>
+$
+<br>
+$ ID2DIS OECN_USPS NWOCA_USPS
+<br>
+$
+<br>
+$ PMDF DB
+<br>
+    open pmdf_alias_database
+<br>
+    override on
+<br>
+    add "nwoca_usps" "nwoca_usps-list@reprocess.nwoca.org"
+<br>
+    add "nwoca_usps-list" "&lt;oecn$ump:nwoca_usps.dis,*,*,postmaster,*, 
+    USPS"
+<br>
+$ EXIT
+
+<a name="exam_build_proc"><h1>12.18 Example Procedure for Periodic Rebuilds</h1></a>
+
+<p>
+ Periodically, each site should run EXPORT_LISTS.COM to update the 
+ distribution lists from the UMP data. Most likely you will want to run 
+ EXPORT_LISTS nightly. You should also run it anytime that you recreate 
+ your PMDF alias database from scratch or make significant modifications 
+ to the UMP profiles.
+
+<p>
+ If you have PMDF's directory channel configured, you should run 
+ EXPORT_DD.COM and build a new directory daemon database. You may also 
+ to use UMPID2DIS to create distribution lists based on VMS identifiers.
+
+<p>
+ You will most likely want to write a DCL command procedure to execute 
+ all of the appropriate steps in a single batch job, and then schedule 
+ it with DECscheduler. Attached is a sample of such a procedure which is 
+ currently in use at NWOCA. You may wish to use this as a starting point 
+ for your own procedure.
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+$!+ 
+$! NWOCA_EXPORT_UMP.COM 
+$! 
+$!  This procedure run the UMP routines to export distribution list, build 
+$!  aliases, etc. 
+$! 
+$! - 
+$! 
+$ SET PROC/PRIV=(BYPASS,SYSPRV,SYSNAM,SYSLCK) 
+$ SET VERIFY 
+$ SET DEFAULT OECN$UMP 
+$!+ 
+$! Temporarily suspend mail processing while lists are being 
+$! created and datbases rebuilt. 
+$!- 
+$ STOP/QUEUE/NEXT MAIL$BATCH 
+$!+ 
+$! Export distribution lists and rebuild PMDF databases. 
+$!- 
+$ @OECN$:EXPORT_LISTS "REBUILD,USER,DEFER" STAFFR 
+$ ! 
+$ ! Merge aliases for mail addressed to former MAVCA users.  
+$ ! May be removed after MAVCA.OHIO.GOV goes away. 
+$ ! 
+$ pmdf crdb /long/nofast/nodup/strip OECN$UMP:MAVCA_ALIASES.DAT oecn$ump:aliases.dat 
+$ 
+$!+ 
+$! Create directory daemon text file. 
+$!- 
+$ @OECN$:EXPORT_DD 
+$!+ 
+$! Build new directory daemon database.  Build into a temp file in case 
+$! someone attempts to use database while in progress. 
+$!- 
+$ pmdf crdb/duplicate/stat oecn$ump:directory_daemon.txt - 
+   oecn$ump:directory_daemon.tmp 
+$ copy oecn$ump:directory_daemon.tmp - 
+     pmdf_root:[directories]PO$NWOCA$ORG.DAT 
+$ set prot=w:re pmdf_root:[directories]PO$NWOCA$ORG.DAT 
+$ purge pmdf_root:[directories]PO$NWOCA$ORG.DAT 
+$ delete/nolog oecn$ump:directory_daemon.tmp;* 
+$! 
+$! Build distribution list based on VMS identifiers 
+$! 
+$ ID2DIS := $OECN$:UMPID2DIS 
+$ 
+$ ID2DIS OECN_USPS,OECN_SYSMAN  NWOCA_USPS NM_USPS.DIS 
+$ ID2DIS OECN_PPS,OECN_SYSMAN    NWOCA_PPS NM_PPS.DIS 
+$ ID2DIS OECN_USAS,OECN_SYSMAN    NWOCA_USAS NM_USAS.DIS 
+$ ID2DIS OECN_EMIS,OECN_EMIS_STU,OECN_EMIS_STF,OECN_EMIS_SFU,OECN_EMIS_GEN,OECN_EMIS_FIN,OECN_SYSMAN NWOCA_EMIS NM_EMIS_USERS.DIS 
+$ ID2DIS OECN_EIS,OECN_SYSMAN  NWOCA_EIS NM_EIS.DIS 
+$ ID2DIS OECN_VIS,OECN_SYSMAN  NWOCA_VIS NM_VIS.DIS 
+$ ID2DIS OECN_SECIMS,OECN_SYSMAN NWOCA_SECIMS NM_SECIMS.DIS 
+$ ID2DIS NWOCA_INFOHIO NWOCA_INFOHIO NM_INFOHIO.DIS 
+$ COPY OECN$UMP:nm_*.dis/sinc NM:/PROT=W:R 
+$ 
+$! Create aliases for NWOCA's identifier lists 
+$ PMDF DB 
+open oecn$ump:aliases.dat 
+override on 
+add "mail_hs_counselors" "mail_counselor_sec" 
+ 
+add "nwoca_usps" "nwoca_usps-list@reprocess.nwoca.org" 
+add "nwoca_usps-list" "&lt;oecn$ump:nwoca_usps.dis,*,*,postmaster,*, USPS" 
+ 
+add "nwoca_PPS" "nwoca_PPS-list@reprocess.nwoca.org" 
+add "nwoca_PPS-list" "&lt;oecn$ump:nwoca_PPS.dis,*,*,postmaster,*, PPS" 
+ 
+add "nwoca_USAS" "nwoca_USAS-list@reprocess.nwoca.org" 
+add "nwoca_USAS-list" "&lt;oecn$ump:nwoca_USAS.dis,*,*,postmaster,*, USAS" 
+ 
+add "nwoca_EMIS" "nwoca_EMIS-list@reprocess.nwoca.org" 
+add "nwoca_EMIS-list" "&lt;oecn$ump:nwoca_EMIS.dis,*,*,postmaster,*, EMIS" 
+ 
+add "nwoca_EIS" "nwoca_EIS-list@reprocess.nwoca.org" 
+add "nwoca_EIS-list" "&lt;oecn$ump:nwoca_EIS.dis,*,*,postmaster,*, EIS" 
+ 
+add "nwoca_VIS" "nwoca_VIS-list@reprocess.nwoca.org" 
+add "nwoca_VIS-list" "&lt;oecn$ump:nwoca_VIS.dis,*,*,postmaster,*, VIS" 
+ 
+add "nwoca_SECIMS" "nwoca_SECIMS-list@reprocess.nwoca.org" 
+add "nwoca_SECIMS-list" "&lt;oecn$ump:nwoca_SECIMS.dis,*,*,postmaster,*, SECIMS" 
+ 
+add "nwoca_INFOHIO" "nwoca_INFOHIO-list@reprocess.nwoca.org" 
+add "nwoca_INFOHIO-list" "&lt;oecn$ump:nwoca_INFOHIO.dis,*,*,postmaster,*, INFOhio" 
+$ 
+$!+ 
+$! Create VMS Mail forwarding addresses for same aliases 
+$!- 
+$ mail := mail 
+$ mail 
+set forward/user=nwoca_usps in%nwoca_usps 
+set forward/user=nwoca_pps in%nwoca_pps 
+set forward/user=nwoca_usas in%nwoca_usas 
+set forward/user=nwoca_emis in%nwoca_emis 
+set forward/user=nwoca_eis in%nwoca_eis 
+set forward/user=nwoca_vis in%nwoca_vis 
+set forward/user=nwoca_secims in%nwoca_secims 
+set forward/user=nwoca_infohio in%nwoca_infohio 
+$ 
+$ 
+$!+ 
+$! Create a MAIL_ALL distribution list.  Will contain all user profiles 
+$! which are subscribed to one or more distribution list (non-duplicated 
+$! addresses). 
+$!- 
+$ delete /nolog/noconfirm mail_all.*;* 
+$ append mail_*.dis/sinc mail_all.tmp/new 
+$ sort/nodupli mail_all.tmp mail_all.dis 
+$ set prot=w:r mail_all.dis;* 
+$ 
+$ PMDF DB 
+open oecn$ump:aliases.dat 
+override on 
+add "mail_all" "mail_all-list@reprocess.nwoca.org" 
+add "mail_all-list" "&lt;oecn$ump:mail_all.dis,*,*,postmaster,*, All NWOCA users" 
+$ mail := mail 
+$ mail 
+set forward/user=mail_all in%mail_all 
+$ 
+$ purge oecn$ump:*.* 
+$ 
+$!+ 
+$! All local aliases have been added to databases.  
+$! Place the new databases back into PMDF production 
+$! directory. 
+$!- 
+$ copy/nolog oecn$ump:aliases.dat PMDF_ALIAS_DATABASE 
+$ set file pmdf_alias_database/prot=w:re 
+$ purge/keep=3/nolog pmdf_alias_database 
+$ 
+$ copy/nolog oecn$ump:reverse.dat PMDF_REVERSE_DATABASE 
+$ set file pmdf_reverse_database/prot=w:re 
+$ purge/keep=3/nolog pmdf_reverse_database 
+$ 
+$!+ 
+$! All done.  Restart dispatcher to ensure services open 
+$! the fresh databases. 
+$ PMDF RESTART DISPATCHER 
+$ START/QUEUE MAIL$BATCH 
+$  
+$ EXIT 
+ 
+ 
+</pre>
+</table>
+
+<p>
+
+<a name="heading_12.19"><h1>12.19 Multiple Non-Clustered Systems</h1></a>
+ DAS's with a single VMS system, or a single VMS cluster, need not be 
+ concerned with this section.
+
+<p>
+ The UMP system is currently designed assuming that each A-site will 
+ have a single set of UMP files regardless of how many independent 
+ (non-VMSclustered) systems. This provides a single point of 
+ adminstration for DAS personnel and makes building the PMDF 
+ distribution lists and aliases easier. At present, there are no plans 
+ to implement multiple UMP files on multiple systems while still being 
+ able to produce a single set of distribution lists for the entire DAS. 
+ This may be added in the future if a well defined need arises.
+
+<p>
+ However, it would be useful if remote users could modify their own user 
+ profiles without having to log into the system which contains the UMP 
+ files. This section describes a secure way of providing remote users 
+ access to their own UMP profiles.
+
+<p>
+ Use the following procedure to establish remote access to the UMP 
+ system.
+
+<ol start=1 >
+  <li>Choose a system to contain the UMP files. This would normally be 
+  your cluster or the system primarily responsible for mail delivery. 
+  This will be called the "server" system.
+  <li>Put UMP on the server normally as described in the "Setup" section. 
+  Users on this system will use the UMP program directly from this system.
+  <li>Create a username on the server called UMP_SERVER. This should be 
+  non-prived, network-only access. The login directory for this account 
+  can be the OECN$UMP directory, or it can have a separate login 
+  directory.
+  <li>On the server define the OECN$UMP logical as normal.
+  <li>On the server use AUTHORIZE to define network proxies into the 
+  server for each remote system. For example:
+<br>
+UAF&gt; ADD/PROXY node::* UMP_SERVER <br> Where "node" is the DECnet 
+node name of the remote node. <br> This will give any user on one of 
+your non-server nodes proxy access to the UMP_SERVER.
+  <li>On each node (client) that you want to have access to the server, 
+  define OECN$UMP as follows (assuming MAIN:: is the server):
+<br>
+$ DEFINE OECN$UMP "MAIN""UMP_SERVER""::OECN$UMP:" <br> Also, copy the 
+UMP.EXE file to the OECN$: directory on the client node. Set up the 
+users to run the local copy of the .EXE.
+  <li>Copy the *.INI files from the server to the client system. and 
+  define the following logicals:
+<br>
+$ DEFINE OECN$UMP_STANDARD dev:[dir]OECN$UMP_STANDARD.INI
+<br>
+$ DEFINE OECN$UMP_LOCAL dev:[dir]OECN$UMP_LOCAL.INI <br> Modify the 
+OECN$UMP_LOCAL.INI file to contain the local system's DECnet node name 
+and internet host. This will ensure that each user's profile is built 
+using the local system's node names.
+</ol>
+
+<p>
+ If you do the above, each node will appear to have local access to the 
+ UMP files, and you will end up with a central DAS-wide database to 
+ build your distribution lists from. The server node will be the only 
+ one that needs to run the EXPORT_LISTS.COM to produce the mail_ and 
+ oecn_ for your DAS.
+
+<a name="heading_12.20"><h1>12.20 Programming Considerations</h1></a>
+
+<p>
+ DAS programmers may wish to use DTR, COBOL or other high level language 
+ to query or manipulate the UMP data files. This section contains a 
+ brief description of the UMP data files and special considerations. DTR 
+ and COBOL definitions are provided with the software release for this 
+ purpose. The COBOL definitions are contained in UMPDAT.LIB and 
+ UMDDAT.LIB in OECN$LIB. The DTR definitions are in the domains 
+ OECN$CDD_OECN.UMP_HEADER and OECN$CDD_OECN.UMP_DIST. OECN$CDD_UMP.UMPS 
+ is a view which joins the header and distribution list code.
+
+<p>
+  The UMP data is stored in two files in OECN$UMP:
+
+<table border=3>
+  <tr>
+    <td>
+      UMPDAT.IDX
+    </td>
+    <td>
+      Contains profile information. Keys:
+      <ul>
+      <li>Primary: Group + Username
+      <li>Secondary: Username (no duplicates)
+      <li>Secondary: Alias (no duplicates)
+      </ul>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      UMDDAT.IDX
+    </td>
+    <td>
+      Contains the distribution lists the user is subscribed to. Each record 
+      represents a single distribution list assignment. The distribution 
+      lists are stored as a code value defined by the OECN$UMP_STANDARD.INI 
+      or OECN$UMP_LOCAL.INI files. Primary key: Username + 
+      Distribution_list_code
+    </td>
+  </tr>
+</table>
+
+<a name="heading_12.20.1"><h2>12.20.1 Field Requirements</h2></a>
+
+<p>
+Some fields in UMP may display to the user differently than is 
+physically stored in the file. Other fields have specific requirements. 
+Please note the following:
+
+<ul>
+  <li>The ALIAS field must always contain a value. If the user does not 
+  have a specific alias, then the ALIAS must be set equal to the USERNAME 
+  field.
+  <li>A number of fields are calculated by UMP as needed and may or may 
+  not be stored physically in the field. For example, if the ORGANIZATION 
+  field is blank, but the DISTRICT_IRN is not, then UMP will calculate 
+  the ORGANIZATION name using the OEDS file. However, UMP will not 
+  necessarily store the calculated value. If you are developing programs 
+  which depend on these values being stored on the file, you may run 
+  UMPUPDATE.EXE prior to your program. UMPUPDATE will calculate the files 
+  and store them on the file.
+  <li>Distribution list codes are always stored in internal format 
+  (ttxxxx) as defined by the INI files. In order to manipulate 
+  distribution codes, you must know the lists internal value.
+  <li>The LAST_UPDATE field is a VMS quadword date.
+  <li>MODIFIED_FLAG contains "Y" if the user has modified their own 
+  profile. Any other value indicates the profile is new and has not been 
+  modified by the user.
+</ul>
+
+<p>
+
+<hr size=5>
+<a name="vfc2pdf_chap"><h1>Chapter 13<br>VFC2PDF - Converting Text Files to PDF Format</h1></a>
+
+<p>
+VFC2PDF converts VFC or plain text files into PDF (Portable Document 
+Format) files. After a report is converted to PDF format, it can be 
+transferred to a PC or a MAC. It can also be viewed or printed using 
+the Adobe Acrobat viewer. By using this utility, it becomes much easier 
+to publish documents on public Internet web sites, CDrom, etc.
+<h3>accessing the program</h3>
+<blockquote>
+<br>
+<br>
+
+<p>
+The program may be executed by typing:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+Menu&gt;VFC2PDF
+ 
+</pre>
+</table>
+
+<p>
+at the Menu or from the $ prompt by typing:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+$ VFC2PDF/[qual 1]/.../[qual n]  {input_file}  [output_file]) 
+ 
+</pre>
+</table>
+
+</blockquote>
+
+<p>
+By executing from the Menu, you have no control over the default 
+formatting options.
+
+<p>
+By executing from the $ prompt, you can control the output, including 
+the use of wildcards. By default, VFC2PDF will attempt to choose 
+appropriate orientation, font sizes and margins based on the record 
+length of the input file. However, these values may be controlled by 
+using qualifiers as given below.
+
+<p>
+<center>
+<table border=0 width=75%>
+<tr>
+  <td><center><font size=+2><strong>Note</strong></font></center><hr 
+  size=1 noshade>
+ A foreign command must be defined for VFC2PDF, such as:
+<br>
+   ($ VFC2PDF :== $OECN$:VFC2PDF). </td>
+  </tr>
+</table>
+</center>
+<p>
+<strong>Syntax</strong>
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+   VFC2PDF {input_file} [output_file] 
+   
+        /ORIENTATION={PORTAIT|LANDSCAPE} 
+        /FONT_SIZE={points} 
+        /FONT_STYLE=([NORMAL],[BOLD],[ITALIC]) 
+        /VERTICAL_SPACING={points} 
+        /TOP_MARGIN={points} 
+        /LEFT_MARGIN={points} 
+        /LOG 
+        /PAGE_LENGTH={max_lines_per_page} 
+        /LINE_WIDTH={characters_per_line} (defaults to record size) 
+        /INFORMATION=([AUTHOR="author"], 
+                      [CREATOR="creator (defaults to username)"], 
+                      [TITLE="title (defaults to filename)"], 
+                      [SUBJECT="subject"]) 
+        /[NO]COMPRESS 
+ 
+ 
+</pre>
+</table>
+
+<p>
+<strong>Defaults</strong>
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+    PORTRAIT:  /FONT_SIZE=11 /VERTICAL_SPACING=11 /LEFT_MARGIN=45 
+               /PAGE_LENGTH=66 
+    LANDSCAPE: /FONT_SIZE=9 /VERTICAL_SPACING=9 /LEFT_MARGIN=30 
+               /PAGE_LENGTH=66 
+      If /LINE_WIDTH is greater than 132: 
+               /FONT_SIZE=7 /VERTICAL_SPACING=9 /LEFT_MARGIN=30 
+ 
+ 
+</pre>
+</table>
+
+<p>
+<strong>Notes</strong>
+<br>
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+ 
+   - Wildcards are supported in the input specification. If wildcards 
+     are used, the output_file may be omitted or must not include a file 
+     name. Output files will be written to the default directory unless 
+     the second parameter contains an output directory. 
+ 
+   - All qualifiers are optional.  If /ORIENTATION is omitted, then 
+     it will be selected automatically based on the record length of the 
+     input file.  Line lengths over 80 characters will be printed in LANDSCAPE, 
+     otherwise PORTRAIT will be used. 
+ 
+       Note: Record size determination is based on the MRS (Maximum Record 
+             Size) in the RMS header.  For formats where MRS is not set, 
+             VFC2PDF will assume 80 characters. 
+ 
+ 
+</pre>
+</table>
+
+<h3>transfer options</h3>
+<blockquote>
+<br>
+
+<p>
+There are several methods available to transfer the PDF formated file 
+to a PC or MAC.
+
+<p>
+One method is to use some FTP utility.
+
+<p>
+Another procedure, which seems to work well in Netscape, is to specify 
+an FTP URL as:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+  ftp://username@host.org/ 
+ 
+ 
+</pre>
+</table>
+
+<p>
+Netscape will prompt you for a password and connect with an 
+authenticated FTP.
+
+<p>
+A second simple method is to mail the file(s) to yourself as follows:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+EMAIL&gt;send/file/noedit/nocc/subj="PDF Files" filename.pdf 
+ 
+ 
+</pre>
+</table>
+
+<p>
+or for multiple PDF files:
+
+<p>
+<table border=0>
+  <tr>
+    <td>
+      <br>
+<pre>
+ 
+EMAIL&gt;send/file/noedit/nocc/subj="PDF Files" *.pdf 
+ 
+ 
+</pre>
+</table>
+
+<p>
+For the above, "noedit" means No Edit feature, and "nocc" means No 
+Carbon Copy desired.
+
+<p>
+Once the files are sent, the user can open the message with their 
+browser, or WEB-Mail, or some other client, and then save it to their 
+desktop or print from there.
+</blockquote>
+<p>
+<table border=2>
+  <tr>
+    <td width=150 align=center><a href="oecn10_sysman_handbook_full_contents.html">Contents</a></td>
+  </tr>
+</table>
+</body>
+</html>