ant -f C:\\x3d-code\\www.web3d.org\\x3d\\stylesheets test.X3DJSAIL
versions:
ant -version
Apache Ant(TM) version 1.10.7 compiled on September 1 2019
java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment (build 14+36-1461)
OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
python -version
Python 3.8.1
ANT_HOME  =C:\apache-ant-1.10.7
JAVA_HOME =C:\Program Files\Java\openjdk\jdk-14
PYTHONHOME=${env.PYTHONHOME}
PYTHONPATH=C:\x3d-code\www.web3d.org\x3d\stylesheets\python\x3d
javac source/target      $java.source=1.8
Java/JVM version    $ant.java.version=14
Java/JVM detail version $java.version=14
Ant version              $ant.version=Apache Ant(TM) version 1.10.7 compiled on September 1 2019
Configuration settings:  https://savage.nps.edu/Savage/developers.html
===========================================
test.X3DJSAIL.clean:
===========================================
Preliminary cleanups
Deleting: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabLauncher.MeshLab.log.txt
Deleting: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabLauncher.stl
Deleting: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabLauncher.x3d
Could not find file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabRoundTrip.log.txt to delete.
Deleting: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_RoundTrip.stl
Could not find file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_RoundTrip.MeshLab.log.txt to delete.
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_MeshLabImport.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\flowers4.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\test\CameraExamples.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\test\HelloWorld.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\test\arc.java
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\test\flowers4.java
test.mkdir:
compile.examples.java:
delete *.class bytecode...
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgram.class
compile HelloWorldProgram.java source...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
test.X3DJSAIL:
===========================================
helpful invocations for CommandLine debugging
org.web3d.x3d.jsail.CommandLine -version -help
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.CommandLine
       [-help | -version | -home | -javadoc | -resources | -hints | -regexes | -tooltips | -X3DUOM]
       [-properties [propertiesFile]]
       [sourceModel.x3d | sourceModel.exi [-fromEXI] | sourceModel.gz [-fromGZIP] | sourceModel.zip [-fromZIP]]
       [-canonical] [-validate] [-EXIFICIENT | -OpenEXI]
       [-Tidy | -toX3D | -toXML | -toClassicVrml | -toJava | -toJSON | -toPython | -toVRML97]
       [-toHTML | -toX3DOM | -toX_ITE | -toMarkdown | -toEXI | -toGZIP | -toZIP]
       [-tofile [resultFile.*]] [-toImage [snapshotName.*]]

-classpath X3DJSAIL.*.jar         # optional classpath, can be set as environment variable
org.web3d.x3d.jsail.CommandLine   # invoke CommandLine application
==================================#====== informational ======================
-help                             # provide this help message
-version                          # version date when this X3DJSAIL build was autogenerated
-home                             # launch X3DJSAIL home page
-javadoc                          # launch X3DJSAIL javadoc page
-resources                        # launch X3D Resources page
-hints                            # launch X3D Scene Authoring Hints page
-regex                            # launch X3D Regular Expressions page
-tooltips                         # launch X3D Tooltips page
-X3DUOM                           # launch X3D Unified Object Model (X3DUOM) page
 =================================#====== properties, inputs =================
-properties [propertiesFile]      # override X3DJSAIL properties (default file: X3DJSAIL.properties)
-EXIFICIENT                       # use Exificient (default) as EXI_ENGINE
-OpenEXI                          # use OpenEXI (Nagasena)   as EXI_ENGINE (testing in progress)
sourceModel.x3d                   # source model file name, X3D  format
sourceModel.exi [-fromEXI]        # source model file name, EXI  format
sourceModel.gz  [-fromGZIP]       # source model file name, GZIP format
sourceModel.zip [-fromZIP]        # source model file name, ZIP  format
==================================#====== operations =========================
-canonical                        # canonical XML output using X3D Canonicalization (c14n)
-validate                         # validate correctness of loaded model
-Tidy                             # X3D-Tidy cleanup in .x3d (XML) format
-toX3D                            # output in .x3d (XML) format
-toXML                            # output in .xml (X3D) format
-toClassicVrml                    # output in .x3dv (ClassicVrml) X3D format
-toJava                           # output in .java source code using X3DJSAIL
-toJSON                           # output in .json (JavaScript Object Notation) format
-toPython                         # output in .py Python source code
-toVRML97                         # output in .wrl  (VRML97) format
-toHTML                           # output in .html  pretty-print documentation
-toX3DOM                          # output in .xhtml page with X3DOM display of X3D model
-toX_ITE                          # output in .html  page with X_ITE display of X3D model
-toMarkdown                       # output document metadata (meta tags) in .md (Markdown) format
-toEXI                            # output in .exi (Efficient XML Interchange) compressed-XML format
-toGZIP                           # output in .gz  (X3D XML) format, with gzip compression
-toZIP                            # output in .zip (X3D XML) format, with zip  compression
==================================#====== outputs ============================
-tofile  [resultFile.*]           # specify output filename (otherwise original name with extension)
-toImage [snapshotName.*]         # create output images for each Viewpoint using Blender

===========================================
org.web3d.x3d.jsail.CommandLine -properties C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties
CommandLine parameter: "-properties" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties" for properties file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties loading complete.
===========================================
compile.X3DJSAIL.tests:
Compiling java/tests classes
test.X3DJSAIL.FieldObjectTests:
FieldObjectTests start...
FieldObjectTests.fieldObjectInitializationsTest() start...
Preliminary tests...
SFBoolObjectTests...
MFBoolObjectTests...
SFImageObjectTests...
MFImageObjectTests...
SFInt32ObjectTests...
MFInt32ObjectTests...
SFFloatObjectTests...
SFDoubleObjectTests...
SFTimeObjectTests...
MFFloatObjectTests...
MFDoubleObjectTests...
MFTimeObjectTests...
SFVec2fObjectTests...
SFVec2dObjectTests...
MFVec2fObjectTests...
MFVec2dObjectTests...
SFVec3fObjectTests...
SFVec3fBboxSizeObjectTests for bounding box (bbox) constraints...
SFVec3dObjectTests...
MFVec3fObjectTests...
MFVec3dObjectTests...
SFVec4fObjectTests...
SFVec4dObjectTests...
MFVec4fObjectTests...
MFVec4dObjectTests...
SFColorObjectTests...
MFColorObjectTests...
SFColorRGBAObjectTests...
MFColorRGBAObjectTests...
SFRotationObjectTests...
MFRotationObjectTests...
SFMatrix3fObjectTests...
SFMatrix3dObjectTests...
MFMatrix3fObjectTests...
MFMatrix3dObjectTests...
SFMatrix4fObjectTests...
SFMatrix4dObjectTests...
MFMatrix4fObjectTests...
MFMatrix4dObjectTests...
FieldObjectTests.fieldObjectInitializationsTest() complete
FieldObjectTests complete
===========================================
compile.examples.java:
delete *.class bytecode...
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgram.class
compile HelloWorldProgram.java source...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
===========================================
test execution and self-validation of HelloWorldProgram and other examples:
compile.examples.java:
delete *.class bytecode...
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgram.class
compile HelloWorldProgram.java source...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
test.NewX3dModel.java:
Error: Could not find or load main class NewX3dModel
Caused by: java.lang.ClassNotFoundException: NewX3dModel
Java Result: 1
test.HelloWorldProgram.java:
===========================================
SpecialTest section:
justify 1="BEGIN" "MIDDLE"
justify 2="END" "MIDDLE"
justify field independence test #1 pass = true
justify field independence test #2 pass = true
pixelTexture.getImage=[0, 0, 0], getWidth=0, getHeight=0, getNumberComponents=0, getPixelsString()=
pixelTexture.getImage=[1, 3, 4, -16777080, 16711816, 65416], getWidth=1, getHeight=3, getNumberComponents=4, getPixelsString()=0xFF000088 0x00FF0088 0x0000FF88, isValid()=true, validate() diagnostic=''
===========================================
ConfigurationProperties.getClassPath()=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples;C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar
===========================================
X3DUnifiedObjectModelJaxbTests.x3duomInspectionsTest() start...
X3DUnifiedObjectModelJaxbTests.x3duomInspectionsTest() complete
===========================================
X3DJSAIL version date: 7 April 2020
===========================================
HelloWorldProgram() Constructor
===========================================
buildModelSceneGraph(); // construct this model, testing many variations
===========================================
showSceneResults();     // test all serializer outputs
ConfigurationProperties.getPropertiesFileName()=X3DJSAIL.properties
X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
X3DJSAIL.properties loading complete.

HelloWorldProgramOutput.java console output
===========================================
HelloWorldProgram validation results for resulting scene graph: 
no errors detected.
===========================================
x3dModel.toStringX3D()

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.3.xsd'>
  <!-- x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true -->
  <head>
    <!-- comment #1 -->
    <!-- comment #2 -->
    <!-- comment #3 -->
    <!-- comment #4 -->
    <component name='Navigation' level='3'/>
    <component name='Shaders' level='1'/>
    <component name='CADGeometry' level='2'/>
    <component name='DIS' level='2'/>
    <component name='H-Anim' level='1'/>
    <component name='Grouping' level='1'/>
    <component name='Layering' level='1'/>
    <unit name='AngleUnitConversion' category='angle' conversionFactor='1.0'/>
    <unit name='LengthUnitConversion' category='length' conversionFactor='1.0'/>
    <unit name='ForceFromPoundsToNewtons' category='force' conversionFactor='4.4482'/>
    <meta content='HelloWorldProgramOutput.x3d' name='title'/>
    <meta content='continued development and testing in progress' name='info'/>
    <meta content='Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)' name='description'/>
    <meta content='https://www.web3d.org/specifications/java/X3DJSAIL.html' name='reference'/>
    <meta content='HelloWorldProgramOutput.java' name='generator'/>
    <meta content='6 September 2016' name='created'/>
    <meta content='7 April 2020' name='modified'/>
    <meta content='X3D Java Scene Access Interface Library (X3DJSAIL)' name='generator'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java' name='generator'/>
    <meta content='Netbeans http://www.netbeans.org' name='generator'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:' name='reference'/>
    <meta content='HelloWorldProgramOutput.txt' name='reference'/>
    <meta content='HelloWorldProgramOutput.x3dv' name='reference'/>
    <meta content='HelloWorldProgramOutput.wrl' name='reference'/>
    <meta content='HelloWorldProgramOutput.html' name='reference'/>
    <meta content='https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='identifier'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <ViewpointGroup description='Available viewpoints'>
      <Viewpoint DEF='DefaultView' description='Hello X3DJSAIL'/>
      <Viewpoint DEF='TopDownView' description='top-down view from above' orientation='1 0 0 -1.570796' position='0 100 0'/>
    </ViewpointGroup>
    <NavigationInfo avatarSize='0.25 1.6 0.75' transitionType='"LINEAR"' type='"EXAMINE" "FLY" "ANY"'/>
    <WorldInfo DEF='WorldInfoDEF' title='HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)'/>
    <WorldInfo USE='WorldInfoDEF'/>
    <WorldInfo USE='WorldInfoDEF'/>
    <MetadataString DEF='scene.addChildMetadata' name='test' value='"Top-level root Metadata node beneath Scene needs to be one of &apos;-children&apos; in JSON encoding"'/>
    <LayerSet DEF='scene.addChildLayerSetTest' order='0'/>
    <Transform DEF='LogoGeometryTransform' translation='0 1.5 0'>
      <Anchor description='select for X3D Java SAI Library (X3DJSAIL) description' url='"../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html"'>
        <Shape DEF='BoxShape'>
          <Appearance>
            <Material DEF='GreenMaterial' diffuseColor='0 1 1' emissiveColor='0.8 0 0' transparency='0.1'/>
            <ImageTexture url='"images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"'/>
          </Appearance>
          <Box DEF='test-NMTOKEN_regex.0123456789' class='untextured'/>
        </Shape>
      </Anchor>
    </Transform>
    <Shape DEF='LineShape'>
      <Appearance>
        <Material emissiveColor='0.6 0.19607843 0.8'/>
      </Appearance>
      <IndexedLineSet coordIndex='0 1 2 3 4 0'>
        <!-- Coordinate 3-tuple point count: 6 -->
        <Coordinate point='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
      </IndexedLineSet>
    </Shape>
    <PositionInterpolator DEF='BoxPathAnimator' key='0 0.125 0.375 0.625 0.875 1' keyValue='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
    <TimeSensor DEF='OrbitClock' cycleInterval='8.0' loop='true'/>
    <ROUTE fromField='fraction_changed' fromNode='OrbitClock' toField='set_fraction' toNode='BoxPathAnimator'/>
    <ROUTE fromField='value_changed' fromNode='BoxPathAnimator' toField='set_translation' toNode='LogoGeometryTransform'/>
    <Transform DEF='TextTransform' translation='0 -1.5 0'>
      <Shape>
        <Appearance>
          <Material USE='GreenMaterial'/>
        </Appearance>
        <Text string='"X3D Java" "SAI Library" "X3DJSAIL"'>
          <!-- Comment example A, plain quotation marks: He said, "Immel did it!" -->
          <!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
          <MetadataSet name='EscapedQuotationMarksMetadataSet'>
            <MetadataString name='quotesTestC' containerField='value' value='"MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""'/>
            <MetadataString name='extraChildTest' containerField='value' value='"checks MetadataSetObject addValue() method"'/>
          </MetadataSet>
          <FontStyle family='"SERIF"' justify='"MIDDLE" "MIDDLE"'/>
        </Text>
      </Shape>
      <Collision>
        <!-- test containerField='proxy' -->
        <Shape DEF='ProxyShape' containerField='proxy'>
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' -->
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' -->
          <!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""}) -->
          <!-- reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
          <Text string='"One, Two, Text" "" "He said, \"Immel did it!\" \"\""'/>
        </Shape>
      </Collision>
      <!-- It's a beautiful world -->
      <!-- ... for you! -->
      <!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
    </Transform>
    <!-- repeatedly spin 180 degrees as a readable special effect -->
    <OrientationInterpolator DEF='SpinInterpolator' key='0 0.5 1' keyValue='0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964'/>
    <TimeSensor DEF='SpinClock' cycleInterval='5.0' loop='true'/>
    <ROUTE fromField='fraction_changed' fromNode='SpinClock' toField='set_fraction' toNode='SpinInterpolator'/>
    <ROUTE fromField='value_changed' fromNode='SpinInterpolator' toField='rotation' toNode='TextTransform'/>
    <Group DEF='BackgroundGroup'>
      <Background DEF='GradualBackground'/>
      <Script DEF='colorTypeConversionScript'>
        <field name='colorInput' accessType='inputOnly' type='SFColor'/>
        <field name='colorsOutput' accessType='outputOnly' type='MFColor'/>
<![CDATA[
ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}
]]>
      </Script>
      <ColorInterpolator DEF='ColorAnimator' key='0 0.5 1' keyValue='0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1'>
        <!-- AZURE to INDIGO and back again -->
      </ColorInterpolator>
      <TimeSensor DEF='ColorClock' cycleInterval='60.0' loop='true'/>
      <ROUTE fromField='colorsOutput' fromNode='colorTypeConversionScript' toField='skyColor' toNode='GradualBackground'/>
      <ROUTE fromField='value_changed' fromNode='ColorAnimator' toField='colorInput' toNode='colorTypeConversionScript'/>
      <ROUTE fromField='fraction_changed' fromNode='ColorClock' toField='set_fraction' toNode='ColorAnimator'/>
    </Group>
    <ProtoDeclare name='ArtDeco01Material' appinfo='tooltip: ArtDeco01Material prototype is a Material node'>
      <ProtoInterface>
        <field name='description' accessType='inputOutput' appinfo='tooltip for descriptionField' type='SFString' value='ArtDeco01Material prototype is a Material node'/>
        <field name='enabled' accessType='inputOutput' type='SFBool' value='true'/>
      </ProtoInterface>
      <ProtoBody>
        <!-- Initial node of ProtoBody determines prototype node type -->
        <Material ambientIntensity='0.25' diffuseColor='0.282435 0.085159 0.134462' shininess='0.127273' specularColor='0.276305 0.11431 0.139857'/>
        <!-- [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material" -->
        <!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
        <TouchSensor description='within ProtoBody'>
          <IS>
            <connect nodeField='description' protoField='description'/>
            <connect nodeField='enabled' protoField='enabled'/>
          </IS>
        </TouchSensor>
      </ProtoBody>
    </ProtoDeclare>
    <ExternProtoDeclare name='ArtDeco02Material' appinfo='this is a different Material node' url='"http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"'>
      <!-- [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
      <field name='description' accessType='inputOutput' appinfo='tooltip for descriptionField' type='SFString'/>
    </ExternProtoDeclare>
    <!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
    <Shape DEF='TestShape1'>
      <Appearance DEF='TestAppearance1'>
        <!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance name='ArtDeco01Material' containerField='material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" -->
          <fieldValue name='description' value='ArtDeco01Material can substitute for a Material node'/>
        </ProtoInstance>
      </Appearance>
      <Sphere radius='0.001'/>
    </Shape>
    <Shape DEF='TestShape2'>
      <Appearance DEF='TestAppearance2'>
        <!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance DEF='ArtDeco02MaterialDEF' name='ArtDeco02Material' containerField='material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
          <fieldValue name='description' value='ArtDeco02Material can substitute for another Material node'/>
        </ProtoInstance>
      </Appearance>
      <Cone bottomRadius='0.001' height='0.001'/>
    </Shape>
    <Shape DEF='TestShape3'>
      <Appearance DEF='TestAppearance3'>
        <!-- ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. -->
        <ProtoInstance USE='ArtDeco02MaterialDEF' containerField='material'/>
      </Appearance>
      <Cylinder height='0.001' radius='0.001'/>
    </Shape>
    <Inline DEF='inlineSceneDef' url='"someOtherScene.x3d" "https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"'/>
    <IMPORT AS='WorldInfoDEF2' importedDEF='WorldInfoDEF' inlineDEF='inlineSceneDef'/>
    <EXPORT AS='WorldInfoDEF3' localDEF='WorldInfoDEF'/>
    <ProtoDeclare name='MaterialModulator' appinfo='mimic a Material node and modulate fields as an animation effect' documentation='http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html'>
      <ProtoInterface>
        <field name='enabled' accessType='inputOutput' type='SFBool' value='true'/>
        <field name='diffuseColor' accessType='inputOutput' type='SFColor' value='0 0 0'/>
        <field name='emissiveColor' accessType='inputOutput' type='SFColor' value='0.05 0.05 0.5'/>
        <field name='specularColor' accessType='inputOutput' type='SFColor' value='0 0 0'/>
        <field name='transparency' accessType='inputOutput' type='SFFloat' value='0.0'/>
        <field name='shininess' accessType='inputOutput' type='SFFloat' value='0.0'/>
        <field name='ambientIntensity' accessType='inputOutput' type='SFFloat' value='0.0'/>
      </ProtoInterface>
      <ProtoBody>
        <Material DEF='MaterialNode'>
          <IS>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
            <connect nodeField='emissiveColor' protoField='emissiveColor'/>
            <connect nodeField='specularColor' protoField='specularColor'/>
            <connect nodeField='transparency' protoField='transparency'/>
            <connect nodeField='shininess' protoField='shininess'/>
            <connect nodeField='ambientIntensity' protoField='ambientIntensity'/>
          </IS>
        </Material>
        <!-- Only first node (the node type) is renderable, others are along for the ride -->
        <Script DEF='MaterialModulatorScript'>
          <field name='enabled' accessType='inputOutput' type='SFBool'/>
          <field name='diffuseColor' accessType='inputOutput' type='SFColor'/>
          <field name='newColor' accessType='outputOnly' type='SFColor'/>
          <field name='clockTrigger' accessType='inputOnly' type='SFTime'/>
          <IS>
            <connect nodeField='enabled' protoField='enabled'/>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
          </IS>
<![CDATA[
ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}
]]>
        </Script>
      </ProtoBody>
    </ProtoDeclare>
    <!-- Test success: declarative statement createDeclarativeShapeTests() -->
    <Group DEF='DeclarativeGroupExample'>
      <Shape>
        <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/>
        <Appearance DEF='DeclarativeAppearanceExample'>
          <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
          <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/>
        </Appearance>
        <Cone bottom='false' bottomRadius='0.05' height='0.1'/>
      </Shape>
      <!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
    </Group>
    <!-- Test success: declarative statement addChild() -->
    <!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
    <!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
    <!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
    <Group DEF='TestFieldObjectsGroup'>
      <!-- testFieldObjects() results -->
      <!-- SFBool default=true, true=true, false=false, negate()=true -->
      <!-- MFBool default=, initial=true false true, negate()=false true false -->
      <!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
      <!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
      <!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
      <!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
      <!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
    </Group>
    <Sound location='0 1.6 0'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <AudioClip description='chimes' url='"chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d -->
      </AudioClip>
    </Sound>
    <Sound location='0 1.6 0'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <MovieTexture containerField='source' description='mpgsys.mpg from ConformanceNist suite' url='"mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
        <!-- Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList" -->
      </MovieTexture>
    </Sound>
    <!-- Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true -->
    <!-- Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false -->
    <!-- Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false -->
    <!-- Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
    <!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
    <!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
    <Shape DEF='ExtrusionShape'>
      <!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
      <!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
      <Appearance DEF='TransparentAppearance'>
        <Material transparency='1.0'/>
      </Appearance>
      <Extrusion DEF='ExampleExtrusion'/>
    </Shape>
    <Group>
      <!-- Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes -->
      <ProtoDeclare name='NewWorldInfo'>
        <ProtoInterface>
          <field name='description' accessType='initializeOnly' type='SFString'/>
        </ProtoInterface>
        <ProtoBody>
          <WorldInfo/>
        </ProtoBody>
      </ProtoDeclare>
      <ProtoInstance DEF='Proto1' name='NewWorldInfo'>
        <fieldValue name='description' value='testing 1 2 3'/>
      </ProtoInstance>
      <Group DEF='Node2'>
        <!-- intentionally empty -->
      </Group>
      <ProtoInstance DEF='Proto3' name='NewWorldInfo'/>
      <Transform DEF='Node4'>
        <!-- intentionally empty -->
      </Transform>
      <!-- Test satisfactorily creates MFNode children array as an ordered list with mixed content -->
    </Group>
    <ProtoDeclare name='ShaderProto'>
      <ProtoBody>
        <ProgramShader/>
      </ProtoBody>
    </ProtoDeclare>
    <Shape>
      <Appearance>
        <!-- Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes -->
        <!-- Test satisfactorily creates MFNode shaders array as an ordered list with mixed content -->
        <ProgramShader DEF='TestShader1'>
          <ShaderProgram DEF='TestShader2'/>
        </ProgramShader>
        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/>
        <ComposedShader DEF='TestShader4'>
          <ShaderPart DEF='TestShader5'/>
        </ComposedShader>
      </Appearance>
    </Shape>
    <Transform DEF='SpecialtyNodes'>
      <CADLayer>
        <CADAssembly>
          <CADPart>
            <CADFace/>
          </CADPart>
        </CADAssembly>
      </CADLayer>
      <EspduTransform geoSystem='"GD" "WE"'/>
      <ReceiverPdu geoSystem='"GD" "WE"'/>
      <SignalPdu geoSystem='"GD" "WE"'/>
      <TransmitterPdu geoSystem='"GD" "WE"'/>
      <DISEntityManager>
        <DISEntityTypeMapping/>
      </DISEntityManager>
    </Transform>
  </Scene>
</X3D>

===========================================
x3dModel.toStringXML()

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.3.xsd'>
  <!-- x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true -->
  <head>
    <!-- comment #1 -->
    <!-- comment #2 -->
    <!-- comment #3 -->
    <!-- comment #4 -->
    <component name='Navigation' level='3'/>
    <component name='Shaders' level='1'/>
    <component name='CADGeometry' level='2'/>
    <component name='DIS' level='2'/>
    <component name='H-Anim' level='1'/>
    <component name='Grouping' level='1'/>
    <component name='Layering' level='1'/>
    <unit name='AngleUnitConversion' category='angle' conversionFactor='1.0'/>
    <unit name='LengthUnitConversion' category='length' conversionFactor='1.0'/>
    <unit name='ForceFromPoundsToNewtons' category='force' conversionFactor='4.4482'/>
    <meta content='HelloWorldProgramOutput.x3d' name='title'/>
    <meta content='continued development and testing in progress' name='info'/>
    <meta content='Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)' name='description'/>
    <meta content='https://www.web3d.org/specifications/java/X3DJSAIL.html' name='reference'/>
    <meta content='HelloWorldProgramOutput.java' name='generator'/>
    <meta content='6 September 2016' name='created'/>
    <meta content='7 April 2020' name='modified'/>
    <meta content='X3D Java Scene Access Interface Library (X3DJSAIL)' name='generator'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java' name='generator'/>
    <meta content='Netbeans http://www.netbeans.org' name='generator'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:' name='reference'/>
    <meta content='HelloWorldProgramOutput.txt' name='reference'/>
    <meta content='HelloWorldProgramOutput.x3dv' name='reference'/>
    <meta content='HelloWorldProgramOutput.wrl' name='reference'/>
    <meta content='HelloWorldProgramOutput.html' name='reference'/>
    <meta content='https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='identifier'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <ViewpointGroup description='Available viewpoints'>
      <Viewpoint DEF='DefaultView' description='Hello X3DJSAIL'/>
      <Viewpoint DEF='TopDownView' description='top-down view from above' orientation='1 0 0 -1.570796' position='0 100 0'/>
    </ViewpointGroup>
    <NavigationInfo avatarSize='0.25 1.6 0.75' transitionType='"LINEAR"' type='"EXAMINE" "FLY" "ANY"'/>
    <WorldInfo DEF='WorldInfoDEF' title='HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)'/>
    <WorldInfo USE='WorldInfoDEF'/>
    <WorldInfo USE='WorldInfoDEF'/>
    <MetadataString DEF='scene.addChildMetadata' name='test' value='"Top-level root Metadata node beneath Scene needs to be one of &apos;-children&apos; in JSON encoding"'/>
    <LayerSet DEF='scene.addChildLayerSetTest' order='0'/>
    <Transform DEF='LogoGeometryTransform' translation='0 1.5 0'>
      <Anchor description='select for X3D Java SAI Library (X3DJSAIL) description' url='"../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html"'>
        <Shape DEF='BoxShape'>
          <Appearance>
            <Material DEF='GreenMaterial' diffuseColor='0 1 1' emissiveColor='0.8 0 0' transparency='0.1'/>
            <ImageTexture url='"images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"'/>
          </Appearance>
          <Box DEF='test-NMTOKEN_regex.0123456789' class='untextured'/>
        </Shape>
      </Anchor>
    </Transform>
    <Shape DEF='LineShape'>
      <Appearance>
        <Material emissiveColor='0.6 0.19607843 0.8'/>
      </Appearance>
      <IndexedLineSet coordIndex='0 1 2 3 4 0'>
        <!-- Coordinate 3-tuple point count: 6 -->
        <Coordinate point='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
      </IndexedLineSet>
    </Shape>
    <PositionInterpolator DEF='BoxPathAnimator' key='0 0.125 0.375 0.625 0.875 1' keyValue='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
    <TimeSensor DEF='OrbitClock' cycleInterval='8.0' loop='true'/>
    <ROUTE fromField='fraction_changed' fromNode='OrbitClock' toField='set_fraction' toNode='BoxPathAnimator'/>
    <ROUTE fromField='value_changed' fromNode='BoxPathAnimator' toField='set_translation' toNode='LogoGeometryTransform'/>
    <Transform DEF='TextTransform' translation='0 -1.5 0'>
      <Shape>
        <Appearance>
          <Material USE='GreenMaterial'/>
        </Appearance>
        <Text string='"X3D Java" "SAI Library" "X3DJSAIL"'>
          <!-- Comment example A, plain quotation marks: He said, "Immel did it!" -->
          <!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
          <MetadataSet name='EscapedQuotationMarksMetadataSet'>
            <MetadataString name='quotesTestC' containerField='value' value='"MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""'/>
            <MetadataString name='extraChildTest' containerField='value' value='"checks MetadataSetObject addValue() method"'/>
          </MetadataSet>
          <FontStyle family='"SERIF"' justify='"MIDDLE" "MIDDLE"'/>
        </Text>
      </Shape>
      <Collision>
        <!-- test containerField='proxy' -->
        <Shape DEF='ProxyShape' containerField='proxy'>
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' -->
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' -->
          <!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""}) -->
          <!-- reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
          <Text string='"One, Two, Text" "" "He said, \"Immel did it!\" \"\""'/>
        </Shape>
      </Collision>
      <!-- It's a beautiful world -->
      <!-- ... for you! -->
      <!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
    </Transform>
    <!-- repeatedly spin 180 degrees as a readable special effect -->
    <OrientationInterpolator DEF='SpinInterpolator' key='0 0.5 1' keyValue='0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964'/>
    <TimeSensor DEF='SpinClock' cycleInterval='5.0' loop='true'/>
    <ROUTE fromField='fraction_changed' fromNode='SpinClock' toField='set_fraction' toNode='SpinInterpolator'/>
    <ROUTE fromField='value_changed' fromNode='SpinInterpolator' toField='rotation' toNode='TextTransform'/>
    <Group DEF='BackgroundGroup'>
      <Background DEF='GradualBackground'/>
      <Script DEF='colorTypeConversionScript'>
        <field name='colorInput' accessType='inputOnly' type='SFColor'/>
        <field name='colorsOutput' accessType='outputOnly' type='MFColor'/>
<![CDATA[
ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}
]]>
      </Script>
      <ColorInterpolator DEF='ColorAnimator' key='0 0.5 1' keyValue='0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1'>
        <!-- AZURE to INDIGO and back again -->
      </ColorInterpolator>
      <TimeSensor DEF='ColorClock' cycleInterval='60.0' loop='true'/>
      <ROUTE fromField='colorsOutput' fromNode='colorTypeConversionScript' toField='skyColor' toNode='GradualBackground'/>
      <ROUTE fromField='value_changed' fromNode='ColorAnimator' toField='colorInput' toNode='colorTypeConversionScript'/>
      <ROUTE fromField='fraction_changed' fromNode='ColorClock' toField='set_fraction' toNode='ColorAnimator'/>
    </Group>
    <ProtoDeclare name='ArtDeco01Material' appinfo='tooltip: ArtDeco01Material prototype is a Material node'>
      <ProtoInterface>
        <field name='description' accessType='inputOutput' appinfo='tooltip for descriptionField' type='SFString' value='ArtDeco01Material prototype is a Material node'/>
        <field name='enabled' accessType='inputOutput' type='SFBool' value='true'/>
      </ProtoInterface>
      <ProtoBody>
        <!-- Initial node of ProtoBody determines prototype node type -->
        <Material ambientIntensity='0.25' diffuseColor='0.282435 0.085159 0.134462' shininess='0.127273' specularColor='0.276305 0.11431 0.139857'/>
        <!-- [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material" -->
        <!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
        <TouchSensor description='within ProtoBody'>
          <IS>
            <connect nodeField='description' protoField='description'/>
            <connect nodeField='enabled' protoField='enabled'/>
          </IS>
        </TouchSensor>
      </ProtoBody>
    </ProtoDeclare>
    <ExternProtoDeclare name='ArtDeco02Material' appinfo='this is a different Material node' url='"http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"'>
      <!-- [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
      <field name='description' accessType='inputOutput' appinfo='tooltip for descriptionField' type='SFString'/>
    </ExternProtoDeclare>
    <!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
    <Shape DEF='TestShape1'>
      <Appearance DEF='TestAppearance1'>
        <!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance name='ArtDeco01Material' containerField='material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" -->
          <fieldValue name='description' value='ArtDeco01Material can substitute for a Material node'/>
        </ProtoInstance>
      </Appearance>
      <Sphere radius='0.001'/>
    </Shape>
    <Shape DEF='TestShape2'>
      <Appearance DEF='TestAppearance2'>
        <!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance DEF='ArtDeco02MaterialDEF' name='ArtDeco02Material' containerField='material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
          <fieldValue name='description' value='ArtDeco02Material can substitute for another Material node'/>
        </ProtoInstance>
      </Appearance>
      <Cone bottomRadius='0.001' height='0.001'/>
    </Shape>
    <Shape DEF='TestShape3'>
      <Appearance DEF='TestAppearance3'>
        <!-- ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. -->
        <ProtoInstance USE='ArtDeco02MaterialDEF' containerField='material'/>
      </Appearance>
      <Cylinder height='0.001' radius='0.001'/>
    </Shape>
    <Inline DEF='inlineSceneDef' url='"someOtherScene.x3d" "https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"'/>
    <IMPORT AS='WorldInfoDEF2' importedDEF='WorldInfoDEF' inlineDEF='inlineSceneDef'/>
    <EXPORT AS='WorldInfoDEF3' localDEF='WorldInfoDEF'/>
    <ProtoDeclare name='MaterialModulator' appinfo='mimic a Material node and modulate fields as an animation effect' documentation='http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html'>
      <ProtoInterface>
        <field name='enabled' accessType='inputOutput' type='SFBool' value='true'/>
        <field name='diffuseColor' accessType='inputOutput' type='SFColor' value='0 0 0'/>
        <field name='emissiveColor' accessType='inputOutput' type='SFColor' value='0.05 0.05 0.5'/>
        <field name='specularColor' accessType='inputOutput' type='SFColor' value='0 0 0'/>
        <field name='transparency' accessType='inputOutput' type='SFFloat' value='0.0'/>
        <field name='shininess' accessType='inputOutput' type='SFFloat' value='0.0'/>
        <field name='ambientIntensity' accessType='inputOutput' type='SFFloat' value='0.0'/>
      </ProtoInterface>
      <ProtoBody>
        <Material DEF='MaterialNode'>
          <IS>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
            <connect nodeField='emissiveColor' protoField='emissiveColor'/>
            <connect nodeField='specularColor' protoField='specularColor'/>
            <connect nodeField='transparency' protoField='transparency'/>
            <connect nodeField='shininess' protoField='shininess'/>
            <connect nodeField='ambientIntensity' protoField='ambientIntensity'/>
          </IS>
        </Material>
        <!-- Only first node (the node type) is renderable, others are along for the ride -->
        <Script DEF='MaterialModulatorScript'>
          <field name='enabled' accessType='inputOutput' type='SFBool'/>
          <field name='diffuseColor' accessType='inputOutput' type='SFColor'/>
          <field name='newColor' accessType='outputOnly' type='SFColor'/>
          <field name='clockTrigger' accessType='inputOnly' type='SFTime'/>
          <IS>
            <connect nodeField='enabled' protoField='enabled'/>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
          </IS>
<![CDATA[
ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}
]]>
        </Script>
      </ProtoBody>
    </ProtoDeclare>
    <!-- Test success: declarative statement createDeclarativeShapeTests() -->
    <Group DEF='DeclarativeGroupExample'>
      <Shape>
        <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/>
        <Appearance DEF='DeclarativeAppearanceExample'>
          <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
          <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/>
        </Appearance>
        <Cone bottom='false' bottomRadius='0.05' height='0.1'/>
      </Shape>
      <!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
    </Group>
    <!-- Test success: declarative statement addChild() -->
    <!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
    <!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
    <!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
    <Group DEF='TestFieldObjectsGroup'>
      <!-- testFieldObjects() results -->
      <!-- SFBool default=true, true=true, false=false, negate()=true -->
      <!-- MFBool default=, initial=true false true, negate()=false true false -->
      <!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
      <!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
      <!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
      <!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
      <!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
    </Group>
    <Sound location='0 1.6 0'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <AudioClip description='chimes' url='"chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d -->
      </AudioClip>
    </Sound>
    <Sound location='0 1.6 0'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <MovieTexture containerField='source' description='mpgsys.mpg from ConformanceNist suite' url='"mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
        <!-- Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList" -->
      </MovieTexture>
    </Sound>
    <!-- Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true -->
    <!-- Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false -->
    <!-- Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false -->
    <!-- Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
    <!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
    <!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
    <Shape DEF='ExtrusionShape'>
      <!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
      <!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
      <Appearance DEF='TransparentAppearance'>
        <Material transparency='1.0'/>
      </Appearance>
      <Extrusion DEF='ExampleExtrusion'/>
    </Shape>
    <Group>
      <!-- Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes -->
      <ProtoDeclare name='NewWorldInfo'>
        <ProtoInterface>
          <field name='description' accessType='initializeOnly' type='SFString'/>
        </ProtoInterface>
        <ProtoBody>
          <WorldInfo/>
        </ProtoBody>
      </ProtoDeclare>
      <ProtoInstance DEF='Proto1' name='NewWorldInfo'>
        <fieldValue name='description' value='testing 1 2 3'/>
      </ProtoInstance>
      <Group DEF='Node2'>
        <!-- intentionally empty -->
      </Group>
      <ProtoInstance DEF='Proto3' name='NewWorldInfo'/>
      <Transform DEF='Node4'>
        <!-- intentionally empty -->
      </Transform>
      <!-- Test satisfactorily creates MFNode children array as an ordered list with mixed content -->
    </Group>
    <ProtoDeclare name='ShaderProto'>
      <ProtoBody>
        <ProgramShader/>
      </ProtoBody>
    </ProtoDeclare>
    <Shape>
      <Appearance>
        <!-- Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes -->
        <!-- Test satisfactorily creates MFNode shaders array as an ordered list with mixed content -->
        <ProgramShader DEF='TestShader1'>
          <ShaderProgram DEF='TestShader2'/>
        </ProgramShader>
        <ProtoInstance DEF='TestShader3' name='ShaderProto' containerField='shaders'/>
        <ComposedShader DEF='TestShader4'>
          <ShaderPart DEF='TestShader5'/>
        </ComposedShader>
      </Appearance>
    </Shape>
    <Transform DEF='SpecialtyNodes'>
      <CADLayer>
        <CADAssembly>
          <CADPart>
            <CADFace/>
          </CADPart>
        </CADAssembly>
      </CADLayer>
      <EspduTransform geoSystem='"GD" "WE"'/>
      <ReceiverPdu geoSystem='"GD" "WE"'/>
      <SignalPdu geoSystem='"GD" "WE"'/>
      <TransmitterPdu geoSystem='"GD" "WE"'/>
      <DISEntityManager>
        <DISEntityTypeMapping/>
      </DISEntityManager>
    </Transform>
  </Scene>
</X3D>

===========================================
x3dModel.toStringClassicVRML()

#X3D V3.3 utf8
PROFILE Immersive
# Scene
  children [
  ViewpointGroup { 
     description "Available viewpoints"
       children [
      DEF DefaultView Viewpoint { 
         description "Hello X3DJSAIL"
         }
DEF TopDownView Viewpoint { 
         description "top-down view from above"
         orientation 1 0 0 -1.570796
         position 0 100 0
         }
      ]
    }
NavigationInfo { 
     avatarSize [ 0.25 1.6 0.75 ]
     transitionType [ "LINEAR" ]
     type [ "EXAMINE" "FLY" "ANY" ]
     }
DEF WorldInfoDEF WorldInfo { 
     title "HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"
     }
USE WorldInfoDEF
USE WorldInfoDEF
DEF scene.addChildMetadata MetadataString { 
     name "test"
     value [ "Top-level root Metadata node beneath Scene needs to be one of &apos;-children&apos; in JSON encoding" ]
     }
DEF scene.addChildLayerSetTest LayerSet { 
     order [ 0 ]
     }
DEF LogoGeometryTransform Transform { 
     translation 0 1.5 0
       children [
      Anchor { 
         description "select for X3D Java SAI Library (X3DJSAIL) description"
         url [ "../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html" ]
           children [
          DEF BoxShape Shape { 
              appearance Appearance { 
                material DEF GreenMaterial Material { 
                 diffuseColor 0 1 1
                 emissiveColor 0.8 0 0
                 transparency 0.1
                 }
               texture ImageTexture { 
                 url [ "images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png" ]
                 }
              }
             geometry DEF test-NMTOKEN_regex.0123456789 Box { 
               # class "untextured"
               }
            }
          ]
        }
      ]
    }
DEF LineShape Shape { 
      appearance Appearance { 
        material Material { 
         emissiveColor 0.6 0.19607843 0.8
         }
      }
     geometry IndexedLineSet { 
       coordIndex [ 0 1 2 3 4 0 ]
        coord Coordinate { 
         point [ 0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0 ]
         }
      # Coordinate 3-tuple point count: 6
            }
    }
DEF BoxPathAnimator PositionInterpolator { 
     key [ 0 0.125 0.375 0.625 0.875 1 ]
     keyValue [ 0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0 ]
     }
DEF OrbitClock TimeSensor { 
     cycleInterval 8.0
     loop true
     }
ROUTE OrbitClock.fraction_changed TO BoxPathAnimator.set_fraction
    ROUTE BoxPathAnimator.value_changed TO LogoGeometryTransform.set_translation
    DEF TextTransform Transform { 
     translation 0 -1.5 0
       children [
      Shape { 
          appearance Appearance { 
            material USE GreenMaterial
          }
         geometry Text { 
           string [ "X3D Java" "SAI Library" "X3DJSAIL" ]
            metadata MetadataSet { 
             name "EscapedQuotationMarksMetadataSet"
               value [
              MetadataString { 
                 name "quotesTestC"
                 value [ "MFString example C, backslash-escaped quotes: He said, \"Immel did it!\"" ]
                 }
MetadataString { 
                 name "extraChildTest"
                 value [ "checks MetadataSetObject addValue() method" ]
                 }
              ]
            }
           fontStyle FontStyle { 
             family [ "SERIF" ]
             justify [ "MIDDLE" "MIDDLE" ]
             }
          # Comment example A, plain quotation marks: He said, "Immel did it!"
          # Comment example B, XML character entities: He said, &quot;Immel did it!&quot;
                    }
        }
Collision { 
           children [
          # test containerField='proxy'
                      ]
         proxy DEF ProxyShape Shape { 
            geometry Text { 
             string [ "One, Two, Text" "" "He said, \"Immel did it!\" \"\"" ]
             }
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' 
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' 
          #  alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""})
          #  reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html 
                    }
        }
# It's a beautiful world
        # ... for you!
        # https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)
              ]
    }
# repeatedly spin 180 degrees as a readable special effect
    DEF SpinInterpolator OrientationInterpolator { 
     key [ 0 0.5 1 ]
     keyValue [ 0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964 ]
     }
DEF SpinClock TimeSensor { 
     cycleInterval 5.0
     loop true
     }
ROUTE SpinClock.fraction_changed TO SpinInterpolator.set_fraction
    ROUTE SpinInterpolator.value_changed TO TextTransform.rotation
    DEF BackgroundGroup Group { 
       children [
      DEF GradualBackground Background { 
         }
DEF colorTypeConversionScript Script { 
          inputOnly SFColor colorInput
          outputOnly MFColor colorsOutput          url [ "ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}
" ]
}
DEF ColorAnimator ColorInterpolator { 
         key [ 0 0.5 1 ]
         keyValue [ 0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1 ]
         # AZURE to INDIGO and back again
                }
DEF ColorClock TimeSensor { 
         cycleInterval 60.0
         loop true
         }
ROUTE colorTypeConversionScript.colorsOutput TO GradualBackground.skyColor
        ROUTE ColorAnimator.value_changed TO colorTypeConversionScript.colorInput
        ROUTE ColorClock.fraction_changed TO ColorAnimator.set_fraction
              ]
    }
PROTO ArtDeco01Material [
           # [appinfo] "tooltip: ArtDeco01Material prototype is a Material node"
      # ProtoInterface
        inputOutput SFString description "ArtDeco01Material prototype is a Material node" # [appinfo] "tooltip for descriptionField"
      
        inputOutput SFBool enabled true] {
    
      # ProtoBody
      # Initial node of ProtoBody determines prototype node type
      Material { 
       ambientIntensity 0.25
       diffuseColor 0.282435 0.085159 0.134462
       shininess 0.127273
       specularColor 0.276305 0.11431 0.139857
       }
# [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material"
      #  presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types
      TouchSensor { 
        description IS description
        enabled IS enabled
       nodeField "description"
protoField "description"
nodeField "enabled"
protoField "enabled"
}
}
    EXTERNPROTO ArtDeco02Material [
           # [appinfo] "this is a different Material node"
     url [ "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material" ]
      inputOutput SFString description # [appinfo] "tooltip for descriptionField"
    # [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
    ]
    # Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place
    DEF TestShape1 Shape { 
      appearance DEF TestAppearance1 Appearance { 
        material ArtDeco01Material { name "ArtDeco01Material"

          description "ArtDeco01Material can substitute for a Material node"# [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material"
                }
      # ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java
            }
     geometry Sphere { 
       radius 0.001
       }
    }
DEF TestShape2 Shape { 
      appearance DEF TestAppearance2 Appearance { 
        material DEF ArtDeco02MaterialDEF ArtDeco02Material { name "ArtDeco02Material"

          description "ArtDeco02Material can substitute for another Material node"# [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
                }
      # ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java
            }
     geometry Cone { 
       bottomRadius 0.001
       height 0.001
       }
    }
DEF TestShape3 Shape { 
      appearance DEF TestAppearance3 Appearance { 
        material USE ArtDeco02MaterialDEF
        }
      # ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. 
            }
     geometry Cylinder { 
       height 0.001
       radius 0.001
       }
    }
DEF inlineSceneDef Inline { 
     url [ "someOtherScene.x3d" "https://www.web3d.org/specifications/java/examples/someOtherScene.x3d" ]
     }
IMPORT inlineSceneDef.WorldInfoDEF AS WorldInfoDEF2 
    EXPORT WorldInfoDEF AS WorldInfoDEF3 
    PROTO MaterialModulator [
           # [appinfo] "mimic a Material node and modulate fields as an animation effect"
      # [documentation] "http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html"
     
      # ProtoInterface
        inputOutput SFBool enabled true
        inputOutput SFColor diffuseColor 0 0 0
        inputOutput SFColor emissiveColor 0.05 0.05 0.5
        inputOutput SFColor specularColor 0 0 0
        inputOutput SFFloat transparency 0.0
        inputOutput SFFloat shininess 0.0
        inputOutput SFFloat ambientIntensity 0.0] {
    
      # ProtoBody
      DEF MaterialNode Material { 
        ambientIntensity IS ambientIntensity
        diffuseColor IS diffuseColor
        emissiveColor IS emissiveColor
        shininess IS shininess
        specularColor IS specularColor
        transparency IS transparency
       nodeField "diffuseColor"
protoField "diffuseColor"
nodeField "emissiveColor"
protoField "emissiveColor"
nodeField "specularColor"
protoField "specularColor"
nodeField "transparency"
protoField "transparency"
nodeField "shininess"
protoField "shininess"
nodeField "ambientIntensity"
protoField "ambientIntensity"
}
# Only first node (the node type) is renderable, others are along for the ride
      DEF MaterialModulatorScript Script { 
        inputOutput SFBool enabled
        inputOutput SFColor diffuseColor
        outputOnly SFColor newColor
        inputOnly SFTime clockTriggernodeField "enabled"
protoField "enabled"
nodeField "diffuseColor"
protoField "diffuseColor"
        url [ "ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}
" ]
}
}
    # Test success: declarative statement createDeclarativeShapeTests()
    DEF DeclarativeGroupExample Group { 
       children [
      Shape { 
          metadata DEF FindableMetadataStringTest MetadataString { 
           name "findThisNameValue"
           value [ "test case" ]
           }
         appearance DEF DeclarativeAppearanceExample Appearance { 
            material DEF MyMaterialModulator MaterialModulator { name "MaterialModulator"
            }
          # DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance
                    }
         geometry Cone { 
           bottom false
           bottomRadius 0.05
           height 0.1
           }
        }
# Test success: declarativeGroup.addChild() singleton pipeline method
              ]
    }
# Test success: declarative statement addChild()
    # Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance --> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance>
    # Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/>
    # Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found
    # Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found
    # Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found
    DEF TestFieldObjectsGroup Group { 
       children [
      # testFieldObjects() results
        # SFBool default=true, true=true, false=false, negate()=true
        # MFBool default=, initial=true false true, negate()=false true false
        # SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0
        # MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7
        # ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear=
        # SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true
        # regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value
              ]
    }
Sound { 
     location 0 1.6 0
      source AudioClip { 
       description "chimes"
       url [ "chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav" ]
       # Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d
            }
    # set sound-ellipsoid location height at 1.6m to match typical avatar height
        }
Sound { 
     location 0 1.6 0
      source MovieTexture { 
       description "mpgsys.mpg from ConformanceNist suite"
       url [ "mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg" ]
       # Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d
      # Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList"
            }
    # set sound-ellipsoid location height at 1.6m to match typical avatar height
        }
# Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true
    # Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false
    # Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false
    # Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true
    # Test success: CommentsBlock.isNode()=false, testComments.isNode()=false
    # Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true
    DEF ExtrusionShape Shape { 
      appearance DEF TransparentAppearance Appearance { 
        material Material { 
         transparency 1.0
         }
      }
     geometry DEF ExampleExtrusion Extrusion { 
       }
    # ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]'
    # ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]'
        }
Group { 
       children [
      # Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes
        PROTO NewWorldInfo [
        
          # ProtoInterface
            initializeOnly SFString description] {
        
          # ProtoBody
          WorldInfo { 
           }
}
        DEF Proto1 NewWorldInfo { name "NewWorldInfo"

          description "testing 1 2 3"        }
DEF Node2 Group { 
           children [
          # intentionally empty
                      ]
        }
DEF Proto3 NewWorldInfo { name "NewWorldInfo"
        }
DEF Node4 Transform { 
           children [
          # intentionally empty
                      ]
        }
# Test satisfactorily creates MFNode children array as an ordered list with mixed content
              ]
    }
PROTO ShaderProto [
    ] {
    
      # ProtoBody
      ProgramShader { 
       }
}
    Shape { 
      appearance Appearance { 
         shaders [
        DEF TestShader1 ProgramShader { 
             programs [
            DEF TestShader2 ShaderProgram { 
               }
            ]
          }
DEF TestShader3 ShaderProto { name "ShaderProto"
          }
DEF TestShader4 ComposedShader { 
             parts [
            DEF TestShader5 ShaderPart { 
               }
            ]
          }
        ]
      # Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes
      # Test satisfactorily creates MFNode shaders array as an ordered list with mixed content
            }
    }
DEF SpecialtyNodes Transform { 
       children [
      CADLayer { 
           children [
          CADAssembly { 
               children [
              CADPart { 
                   children [
                  CADFace { 
                     }
                  ]
                }
              ]
            }
          ]
        }
EspduTransform { 
         geoSystem [ "GD" "WE" ]
         }
ReceiverPdu { 
         geoSystem [ "GD" "WE" ]
         }
SignalPdu { 
         geoSystem [ "GD" "WE" ]
         }
TransmitterPdu { 
         geoSystem [ "GD" "WE" ]
         }
DISEntityManager { 
           mapping [
          DISEntityTypeMapping { 
             }
          ]
        }
      ]
    }
  ]
# head
COMPONENT Navigation:3
COMPONENT Shaders:1
COMPONENT CADGeometry:2
COMPONENT DIS:2
COMPONENT H-Anim:1
COMPONENT Grouping:1
COMPONENT Layering:1
UNIT angle AngleUnitConversion 1.0
UNIT length LengthUnitConversion 1.0
UNIT force ForceFromPoundsToNewtons 4.4482
META "title" "HelloWorldProgramOutput.x3d"
META "info" "continued development and testing in progress"
META "description" "Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)"
META "reference" "https://www.web3d.org/specifications/java/X3DJSAIL.html"
META "generator" "HelloWorldProgramOutput.java"
META "created" "6 September 2016"
META "modified" "7 April 2020"
META "generator" "X3D Java Scene Access Interface Library (X3DJSAIL)"
META "generator" "https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java"
META "generator" "Netbeans http://www.netbeans.org"
META "creator" "Don Brutzman"
META "reference" "https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d"
META "reference" "Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:"
META "reference" "HelloWorldProgramOutput.txt"
META "reference" "HelloWorldProgramOutput.x3dv"
META "reference" "HelloWorldProgramOutput.wrl"
META "reference" "HelloWorldProgramOutput.html"
META "reference" "https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
META "identifier" "https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
META "license" "../license.html"
# comment #1
# comment #2
# comment #3
# comment #4
# x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true

===========================================
x3dModel.toStringVRML97()

#VRML V2.0 utf8
#PROFILE Immersive
# Scene
  children [
  ViewpointGroup { 
     description "Available viewpoints"
       children [
      DEF DefaultView Viewpoint { 
         description "Hello X3DJSAIL"
         }
DEF TopDownView Viewpoint { 
         description "top-down view from above"
         orientation 1 0 0 -1.570796
         position 0 100 0
         }
      ]
    }
NavigationInfo { 
     avatarSize [ 0.25 1.6 0.75 ]
     transitionType [ "LINEAR" ]
     type [ "EXAMINE" "FLY" "ANY" ]
     }
DEF WorldInfoDEF WorldInfo { 
     title "HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"
     }
USE WorldInfoDEF
USE WorldInfoDEF
DEF scene.addChildMetadata MetadataString { 
     name "test"
     value [ "Top-level root Metadata node beneath Scene needs to be one of &apos;-children&apos; in JSON encoding" ]
     }
DEF scene.addChildLayerSetTest LayerSet { 
     order [ 0 ]
     }
DEF LogoGeometryTransform Transform { 
     translation 0 1.5 0
       children [
      Anchor { 
         description "select for X3D Java SAI Library (X3DJSAIL) description"
         url [ "../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html" ]
           children [
          DEF BoxShape Shape { 
              appearance Appearance { 
                material DEF GreenMaterial Material { 
                 diffuseColor 0 1 1
                 emissiveColor 0.8 0 0
                 transparency 0.1
                 }
               texture ImageTexture { 
                 url [ "images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png" ]
                 }
              }
             geometry DEF test-NMTOKEN_regex.0123456789 Box { 
               # class "untextured"
               }
            }
          ]
        }
      ]
    }
DEF LineShape Shape { 
      appearance Appearance { 
        material Material { 
         emissiveColor 0.6 0.19607843 0.8
         }
      }
     geometry IndexedLineSet { 
       coordIndex [ 0 1 2 3 4 0 ]
        coord Coordinate { 
         point [ 0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0 ]
         }
      # Coordinate 3-tuple point count: 6
            }
    }
DEF BoxPathAnimator PositionInterpolator { 
     key [ 0 0.125 0.375 0.625 0.875 1 ]
     keyValue [ 0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0 ]
     }
DEF OrbitClock TimeSensor { 
     cycleInterval 8.0
     loop true
     }
ROUTE OrbitClock.fraction_changed TO BoxPathAnimator.set_fraction
    ROUTE BoxPathAnimator.value_changed TO LogoGeometryTransform.set_translation
    DEF TextTransform Transform { 
     translation 0 -1.5 0
       children [
      Shape { 
          appearance Appearance { 
            material USE GreenMaterial
          }
         geometry Text { 
           string [ "X3D Java" "SAI Library" "X3DJSAIL" ]
            metadata MetadataSet { 
             name "EscapedQuotationMarksMetadataSet"
               value [
              MetadataString { 
                 name "quotesTestC"
                 value [ "MFString example C, backslash-escaped quotes: He said, \"Immel did it!\"" ]
                 }
MetadataString { 
                 name "extraChildTest"
                 value [ "checks MetadataSetObject addValue() method" ]
                 }
              ]
            }
           fontStyle FontStyle { 
             family [ "SERIF" ]
             justify [ "MIDDLE" "MIDDLE" ]
             }
          # Comment example A, plain quotation marks: He said, "Immel did it!"
          # Comment example B, XML character entities: He said, &quot;Immel did it!&quot;
                    }
        }
Collision { 
           children [
          # test containerField='proxy'
                      ]
         proxy DEF ProxyShape Shape { 
            geometry Text { 
             string [ "One, Two, Text" "" "He said, \"Immel did it!\" \"\"" ]
             }
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' 
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' 
          #  alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""})
          #  reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html 
                    }
        }
# It's a beautiful world
        # ... for you!
        # https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)
              ]
    }
# repeatedly spin 180 degrees as a readable special effect
    DEF SpinInterpolator OrientationInterpolator { 
     key [ 0 0.5 1 ]
     keyValue [ 0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964 ]
     }
DEF SpinClock TimeSensor { 
     cycleInterval 5.0
     loop true
     }
ROUTE SpinClock.fraction_changed TO SpinInterpolator.set_fraction
    ROUTE SpinInterpolator.value_changed TO TextTransform.rotation
    DEF BackgroundGroup Group { 
       children [
      DEF GradualBackground Background { 
         }
DEF colorTypeConversionScript Script { 
          inputOnly SFColor colorInput
          outputOnly MFColor colorsOutput          url [ "ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}
" ]
}
DEF ColorAnimator ColorInterpolator { 
         key [ 0 0.5 1 ]
         keyValue [ 0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1 ]
         # AZURE to INDIGO and back again
                }
DEF ColorClock TimeSensor { 
         cycleInterval 60.0
         loop true
         }
ROUTE colorTypeConversionScript.colorsOutput TO GradualBackground.skyColor
        ROUTE ColorAnimator.value_changed TO colorTypeConversionScript.colorInput
        ROUTE ColorClock.fraction_changed TO ColorAnimator.set_fraction
              ]
    }
PROTO ArtDeco01Material [
           # [appinfo] "tooltip: ArtDeco01Material prototype is a Material node"
      # ProtoInterface
        inputOutput SFString description "ArtDeco01Material prototype is a Material node" # [appinfo] "tooltip for descriptionField"
      
        inputOutput SFBool enabled true] {
    
      # ProtoBody
      # Initial node of ProtoBody determines prototype node type
      Material { 
       ambientIntensity 0.25
       diffuseColor 0.282435 0.085159 0.134462
       shininess 0.127273
       specularColor 0.276305 0.11431 0.139857
       }
# [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material"
      #  presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types
      TouchSensor { 
        description IS description
        enabled IS enabled
       nodeField "description"
protoField "description"
nodeField "enabled"
protoField "enabled"
}
}
    EXTERNPROTO ArtDeco02Material [
           # [appinfo] "this is a different Material node"
     url [ "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material" ]
      inputOutput SFString description # [appinfo] "tooltip for descriptionField"
    # [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
    ]
    # Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place
    DEF TestShape1 Shape { 
      appearance DEF TestAppearance1 Appearance { 
        material ArtDeco01Material { name "ArtDeco01Material"

          description "ArtDeco01Material can substitute for a Material node"# [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material"
                }
      # ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java
            }
     geometry Sphere { 
       radius 0.001
       }
    }
DEF TestShape2 Shape { 
      appearance DEF TestAppearance2 Appearance { 
        material DEF ArtDeco02MaterialDEF ArtDeco02Material { name "ArtDeco02Material"

          description "ArtDeco02Material can substitute for another Material node"# [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
                }
      # ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java
            }
     geometry Cone { 
       bottomRadius 0.001
       height 0.001
       }
    }
DEF TestShape3 Shape { 
      appearance DEF TestAppearance3 Appearance { 
        material USE ArtDeco02MaterialDEF
        }
      # ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. 
            }
     geometry Cylinder { 
       height 0.001
       radius 0.001
       }
    }
DEF inlineSceneDef Inline { 
     url [ "someOtherScene.x3d" "https://www.web3d.org/specifications/java/examples/someOtherScene.x3d" ]
     }
IMPORT inlineSceneDef.WorldInfoDEF AS WorldInfoDEF2 
    EXPORT WorldInfoDEF AS WorldInfoDEF3 
    PROTO MaterialModulator [
           # [appinfo] "mimic a Material node and modulate fields as an animation effect"
      # [documentation] "http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html"
     
      # ProtoInterface
        inputOutput SFBool enabled true
        inputOutput SFColor diffuseColor 0 0 0
        inputOutput SFColor emissiveColor 0.05 0.05 0.5
        inputOutput SFColor specularColor 0 0 0
        inputOutput SFFloat transparency 0.0
        inputOutput SFFloat shininess 0.0
        inputOutput SFFloat ambientIntensity 0.0] {
    
      # ProtoBody
      DEF MaterialNode Material { 
        ambientIntensity IS ambientIntensity
        diffuseColor IS diffuseColor
        emissiveColor IS emissiveColor
        shininess IS shininess
        specularColor IS specularColor
        transparency IS transparency
       nodeField "diffuseColor"
protoField "diffuseColor"
nodeField "emissiveColor"
protoField "emissiveColor"
nodeField "specularColor"
protoField "specularColor"
nodeField "transparency"
protoField "transparency"
nodeField "shininess"
protoField "shininess"
nodeField "ambientIntensity"
protoField "ambientIntensity"
}
# Only first node (the node type) is renderable, others are along for the ride
      DEF MaterialModulatorScript Script { 
        inputOutput SFBool enabled
        inputOutput SFColor diffuseColor
        outputOnly SFColor newColor
        inputOnly SFTime clockTriggernodeField "enabled"
protoField "enabled"
nodeField "diffuseColor"
protoField "diffuseColor"
        url [ "ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}
" ]
}
}
    # Test success: declarative statement createDeclarativeShapeTests()
    DEF DeclarativeGroupExample Group { 
       children [
      Shape { 
          metadata DEF FindableMetadataStringTest MetadataString { 
           name "findThisNameValue"
           value [ "test case" ]
           }
         appearance DEF DeclarativeAppearanceExample Appearance { 
            material DEF MyMaterialModulator MaterialModulator { name "MaterialModulator"
            }
          # DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance
                    }
         geometry Cone { 
           bottom false
           bottomRadius 0.05
           height 0.1
           }
        }
# Test success: declarativeGroup.addChild() singleton pipeline method
              ]
    }
# Test success: declarative statement addChild()
    # Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance --> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance>
    # Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/>
    # Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found
    # Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found
    # Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found
    DEF TestFieldObjectsGroup Group { 
       children [
      # testFieldObjects() results
        # SFBool default=true, true=true, false=false, negate()=true
        # MFBool default=, initial=true false true, negate()=false true false
        # SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0
        # MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7
        # ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear=
        # SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true
        # regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value
              ]
    }
Sound { 
     location 0 1.6 0
      source AudioClip { 
       description "chimes"
       url [ "chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav" ]
       # Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d
            }
    # set sound-ellipsoid location height at 1.6m to match typical avatar height
        }
Sound { 
     location 0 1.6 0
      source MovieTexture { 
       description "mpgsys.mpg from ConformanceNist suite"
       url [ "mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg" ]
       # Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d
      # Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList"
            }
    # set sound-ellipsoid location height at 1.6m to match typical avatar height
        }
# Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true
    # Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false
    # Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false
    # Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true
    # Test success: CommentsBlock.isNode()=false, testComments.isNode()=false
    # Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true
    DEF ExtrusionShape Shape { 
      appearance DEF TransparentAppearance Appearance { 
        material Material { 
         transparency 1.0
         }
      }
     geometry DEF ExampleExtrusion Extrusion { 
       }
    # ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]'
    # ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]'
        }
Group { 
       children [
      # Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes
        PROTO NewWorldInfo [
        
          # ProtoInterface
            initializeOnly SFString description] {
        
          # ProtoBody
          WorldInfo { 
           }
}
        DEF Proto1 NewWorldInfo { name "NewWorldInfo"

          description "testing 1 2 3"        }
DEF Node2 Group { 
           children [
          # intentionally empty
                      ]
        }
DEF Proto3 NewWorldInfo { name "NewWorldInfo"
        }
DEF Node4 Transform { 
           children [
          # intentionally empty
                      ]
        }
# Test satisfactorily creates MFNode children array as an ordered list with mixed content
              ]
    }
PROTO ShaderProto [
    ] {
    
      # ProtoBody
      ProgramShader { 
       }
}
    Shape { 
      appearance Appearance { 
         shaders [
        DEF TestShader1 ProgramShader { 
             programs [
            DEF TestShader2 ShaderProgram { 
               }
            ]
          }
DEF TestShader3 ShaderProto { name "ShaderProto"
          }
DEF TestShader4 ComposedShader { 
             parts [
            DEF TestShader5 ShaderPart { 
               }
            ]
          }
        ]
      # Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes
      # Test satisfactorily creates MFNode shaders array as an ordered list with mixed content
            }
    }
DEF SpecialtyNodes Transform { 
       children [
      CADLayer { 
           children [
          CADAssembly { 
               children [
              CADPart { 
                   children [
                  CADFace { 
                     }
                  ]
                }
              ]
            }
          ]
        }
EspduTransform { 
         geoSystem [ "GD" "WE" ]
         }
ReceiverPdu { 
         geoSystem [ "GD" "WE" ]
         }
SignalPdu { 
         geoSystem [ "GD" "WE" ]
         }
TransmitterPdu { 
         geoSystem [ "GD" "WE" ]
         }
DISEntityManager { 
           mapping [
          DISEntityTypeMapping { 
             }
          ]
        }
      ]
    }
  ]
# head
#COMPONENT Navigation:3
#COMPONENT Shaders:1
#COMPONENT CADGeometry:2
#COMPONENT DIS:2
#COMPONENT H-Anim:1
#COMPONENT Grouping:1
#COMPONENT Layering:1
#UNIT angle AngleUnitConversion 1.0
#UNIT length LengthUnitConversion 1.0
#UNIT force ForceFromPoundsToNewtons 4.4482
#META "title" "HelloWorldProgramOutput.x3d"
#META "info" "continued development and testing in progress"
#META "description" "Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)"
#META "reference" "https://www.web3d.org/specifications/java/X3DJSAIL.html"
#META "generator" "HelloWorldProgramOutput.java"
#META "created" "6 September 2016"
#META "modified" "7 April 2020"
#META "generator" "X3D Java Scene Access Interface Library (X3DJSAIL)"
#META "generator" "https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java"
#META "generator" "Netbeans http://www.netbeans.org"
#META "creator" "Don Brutzman"
#META "reference" "https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d"
#META "reference" "Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:"
#META "reference" "HelloWorldProgramOutput.txt"
#META "reference" "HelloWorldProgramOutput.x3dv"
#META "reference" "HelloWorldProgramOutput.wrl"
#META "reference" "HelloWorldProgramOutput.html"
#META "reference" "https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
#META "identifier" "https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
#META "license" "../license.html"
# comment #1
# comment #2
# comment #3
# comment #4
# x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true

===========================================
Create .x3d (X3D XML Encoding) version of model
Warning: toFileX3D() is overwriting prior file HelloWorldProgramOutput.x3d
helloWorldObject.toFileX3D("HelloWorldProgramOutput.x3d") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.x3d
===========================================
Create .xml (X3D XML Encoding) version of model
Warning: toFileX3D() is overwriting prior file HelloWorldProgramOutput.xml
helloWorldObject.toFileXML("HelloWorldProgramOutput.xml") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.xml
===========================================
Create pretty-print .html documentation of model
Warning: toFileStylesheetConversion(X3dExtrusionCrossSectionToSvg.xslt) is overwriting prior file HelloWorldProgramOutput.svg
Warning: toFileStylesheetConversion(X3dToXhtml.xslt) is overwriting prior file HelloWorldProgramOutput.html
helloWorldObject.toFileHtmlDocumentation("HelloWorldProgramOutput.html") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.html
===========================================
Create .x3d (X3D XML Encoding) cleaned-up version of model using X3D Tidy
Warning: toFileStylesheetConversion(X3dTidy.xslt) is overwriting prior file HelloWorldProgramOutputTidy.x3d
*** revision: &lt;meta name='modified' content='7 April 2020'/&gt;
helloWorldObject.toFileX3dTidy("HelloWorldProgramOutputTidy.x3d") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutputTidy.x3d
===========================================
Create .md (Markdown) file for model meta information using X3dModelMetaToMarkdown.xslt
Warning: toFileStylesheetConversion(X3dModelMetaToMarkdown.xslt) is overwriting prior file HelloWorldProgramOutput.md
helloWorldObject.toFileModelMetaMarkdown("HelloWorldProgramOutput.md") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.md
===========================================
Create X3D ClassicVRML Encoding of model
Warning: toFileClassicVRML() is overwriting prior file HelloWorldProgramOutput.x3dv
helloWorldObject.toFileClassicVRML("HelloWorldProgramOutput.x3dv") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.x3dv
===========================================
Create VRML97 Encoding of model
Warning: toFileVRML97() is overwriting prior file HelloWorldProgramOutput.wrl
helloWorldObject.toFileVRML97("HelloWorldProgramOutput.wrl") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.wrl
===========================================
Create pretty-print HTML documentation of model using ConfigurationProperties.getXsltEngine()=SAXON9HE and stylesheet X3dToXhtml.xslt
Warning: toFileStylesheetConversion(X3dExtrusionCrossSectionToSvg.xslt) is overwriting prior file HelloWorldProgramOutput.svg
Warning: toFileStylesheetConversion(X3dToXhtml.xslt) is overwriting prior file HelloWorldProgramOutput.html
helloWorldObject.toFileHtmlDocumentation("HelloWorldProgramOutput.html") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.html
===========================================
Create concise Java source of model using stylesheet X3dToJava.xslt
[meta] name='info' content='continued development and testing in progress'
helloWorldObject.toFileJava("HelloWorldProgramOutput.java") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.java
Test toStringJava()

[meta] name='info' content='continued development and testing in progress'
import java.util.*;
import org.web3d.x3d.jsail.Core.*;
import org.web3d.x3d.jsail.CADGeometry.*;
import org.web3d.x3d.jsail.DIS.*;
import org.web3d.x3d.jsail.EnvironmentalEffects.*;
import org.web3d.x3d.jsail.fields.*;
import org.web3d.x3d.jsail.Geometry3D.*;
import org.web3d.x3d.jsail.Grouping.*;
import org.web3d.x3d.jsail.Interpolation.*;
import org.web3d.x3d.jsail.Layering.*;
import org.web3d.x3d.jsail.Navigation.*;
import org.web3d.x3d.jsail.Networking.*;
import org.web3d.x3d.jsail.PointingDeviceSensor.*;
import org.web3d.x3d.jsail.Rendering.*;
import org.web3d.x3d.jsail.Scripting.*;
import org.web3d.x3d.jsail.Shaders.*;
import org.web3d.x3d.jsail.Shape.*;
import org.web3d.x3d.jsail.Sound.*;
import org.web3d.x3d.jsail.Text.*;
import org.web3d.x3d.jsail.Texturing.*;
import org.web3d.x3d.jsail.Time.*;

// Javadoc annotations follow, see below for source.
/**
 * <p> Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL). </p>
 <p> Related links: temporaryJavaOutputFile.java source, <a href="https://www.web3d.org/x3d/content/examples/X3dResources.html" target="_blank">X3D Resources</a>, <a href="https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html" target="_blank">X3D Scene Authoring Hints</a>, and <a href="https://www.web3d.org/x3d/content/X3dTooltips.html" target="_blank">X3D Tooltips</a>. </p>
	<table style="color:black; border:0px solid; border-spacing:10px 0px;">
        <caption>Scene Meta Information</caption>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center; padding:10px 0px;"><i>meta tags</i></td>
			<td style="text-align:left;   padding:10px 0px;">temporaryJavaOutputFile&nbsp; Document Metadata </td>
		</tr>

		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> title </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d">HelloWorldProgramOutput.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> info </i> </td>
			<td> continued development and testing in progress </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> description </i> </td>
			<td> Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL) </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> HelloWorldProgramOutput.java </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> created </i> </td>
			<td> 6 September 2016 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> modified </i> </td>
			<td> 7 April 2020 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> X3D Java Scene Access Interface Library (X3DJSAIL) </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java" target="_blank">https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> Netbeans <a href="http://www.netbeans.org" target="_blank">http://www.netbeans.org</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> creator </i> </td>
			<td> Don Brutzman </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d" target="_blank">https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation: </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> HelloWorldProgramOutput.txt </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3dv">HelloWorldProgramOutput.x3dv</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> HelloWorldProgramOutput.wrl </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.html">HelloWorldProgramOutput.html</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" target="_blank">https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> identifier </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" target="_blank">https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> license </i> </td>
			<td> <a href="https://www.web3d.org/specifications/java/examples/../license.html">../license.html</a> </td>
		</tr>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center;" colspan="2">  &nbsp; </td>
		</tr>
	</table>

	<p>
		This program uses the
		<a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">X3D Java Scene Access Interface Library (X3DJSAIL)</a>.
		It has been produced using the 
		<a href="https://www.web3d.org/x3d/stylesheets/X3dToJava.xslt" target="_blank">X3dToJava.xslt</a>
		stylesheet to create Java source code from an <code>.x3d</code> model.
	</p>

	* @author Don Brutzman
 */

public class temporaryJavaOutputFile
{
	/** Default constructor to create this object. */
	public temporaryJavaOutputFile ()
	{
	  initialize();
	}

	/** Create and initialize the X3D model for this object. */
	public final void initialize()
	{
  x3dModel = new X3DObject().setProfile(X3DObject.PROFILE_IMMERSIVE).setVersion(X3DObject.VERSION_3_3)
  .addComments(" x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true ")
  .setHead(new headObject()
    .addComments(" comment #1 ")
    .addComments(" comment #2 ")
    .addComments(" comment #3 ")
    .addComments(" comment #4 ")
    .addComponent(new componentObject().setName("Navigation").setLevel(3))
    .addComponent(new componentObject().setName("Shaders").setLevel(1))
    .addComponent(new componentObject().setName("CADGeometry").setLevel(2))
    .addComponent(new componentObject().setName("DIS").setLevel(2))
    .addComponent(new componentObject().setName("H-Anim").setLevel(1))
    .addComponent(new componentObject().setName("Grouping").setLevel(1))
    .addComponent(new componentObject().setName("Layering").setLevel(1))
    .addUnit(new unitObject().setName("AngleUnitConversion").setCategory("angle").setConversionFactor(1.0))
    .addUnit(new unitObject().setName("LengthUnitConversion").setCategory("length").setConversionFactor(1.0))
    .addUnit(new unitObject().setName("ForceFromPoundsToNewtons").setCategory("force").setConversionFactor(4.4482))
    .addMeta(new metaObject().setName(metaObject.NAME_TITLE      ).setContent("HelloWorldProgramOutput.x3d"))
    .addMeta(new metaObject().setName(metaObject.NAME_INFO       ).setContent("continued development and testing in progress"))
    .addMeta(new metaObject().setName(metaObject.NAME_DESCRIPTION).setContent("Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("https://www.web3d.org/specifications/java/X3DJSAIL.html"))
    .addMeta(new metaObject().setName(metaObject.NAME_GENERATOR  ).setContent("HelloWorldProgramOutput.java"))
    .addMeta(new metaObject().setName(metaObject.NAME_CREATED    ).setContent("6 September 2016"))
    .addMeta(new metaObject().setName(metaObject.NAME_MODIFIED   ).setContent("7 April 2020"))
    .addMeta(new metaObject().setName(metaObject.NAME_GENERATOR  ).setContent("X3D Java Scene Access Interface Library (X3DJSAIL)"))
    .addMeta(new metaObject().setName(metaObject.NAME_GENERATOR  ).setContent("https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java"))
    .addMeta(new metaObject().setName(metaObject.NAME_GENERATOR  ).setContent("Netbeans http://www.netbeans.org"))
    .addMeta(new metaObject().setName(metaObject.NAME_CREATOR    ).setContent("Don Brutzman"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("HelloWorldProgramOutput.txt"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("HelloWorldProgramOutput.x3dv"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("HelloWorldProgramOutput.wrl"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("HelloWorldProgramOutput.html"))
    .addMeta(new metaObject().setName(metaObject.NAME_REFERENCE  ).setContent("https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"))
    .addMeta(new metaObject().setName(metaObject.NAME_IDENTIFIER ).setContent("https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"))
    .addMeta(new metaObject().setName(metaObject.NAME_LICENSE    ).setContent("../license.html")))
  .setScene(new SceneObject()
    .addChild(new ViewpointGroupObject().setDescription("Available viewpoints")
      .addChild(new ViewpointObject("DefaultView").setDescription("Hello X3DJSAIL"))
      .addChild(new ViewpointObject("TopDownView").setDescription("top-down view from above").setOrientation(1.0f,0.0f,0.0f,-1.570796f).setPosition(0.0f,100.0f,0.0f)))
    .addChild(new NavigationInfoObject().setType(new String[] {"EXAMINE","FLY","ANY"}))
    .addChild(new WorldInfoObject("WorldInfoDEF").setTitle("HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"))
    .addChild(new WorldInfoObject().setUSE("WorldInfoDEF"))
    .addChild(new WorldInfoObject().setUSE("WorldInfoDEF"))
    .addMetadata(new MetadataStringObject("scene.addChildMetadata").setName("test").setValue(new String[] {"Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"}))
    .addLayerSet(new LayerSetObject("scene.addChildLayerSetTest"))
    .addChild(new TransformObject("LogoGeometryTransform").setTranslation(0.0f,1.5f,0.0f)
      .addChild(new AnchorObject().setDescription("select for X3D Java SAI Library (X3DJSAIL) description").setUrl(new String[] {"../X3DJSAIL.html","https://www.web3d.org/specifications/java/X3DJSAIL.html"})
        .addChild(new ShapeObject("BoxShape")
          .setAppearance(new AppearanceObject()
            .setMaterial(new MaterialObject("GreenMaterial").setDiffuseColor(0.0f,1.0f,1.0f).setEmissiveColor(0.8f,0.0f,0.0f).setTransparency(0.1f))
            .setTexture(new ImageTextureObject().setUrl(new String[] {"images/X3dJavaSceneAccessInterfaceSaiLibrary.png","https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"})))
          .setGeometry(new BoxObject("test-NMTOKEN_regex.0123456789").setCssClass("untextured")))))
    .addChild(new ShapeObject("LineShape")
      .setAppearance(new AppearanceObject()
        .setMaterial(new MaterialObject().setEmissiveColor(0.6f,0.19607843f,0.8f)))
      .setGeometry(new IndexedLineSetObject().setCoordIndex(new int[] {0,1,2,3,4,0})
        .addComments(" Coordinate 3-tuple point count: 6 ")
        .setCoord(new CoordinateObject().setPoint(new MFVec3fObject(new float[] {0.0f,1.5f,0.0f,2.0f,1.5f,0.0f,2.0f,1.5f,-2.0f,-2.0f,1.5f,-2.0f,-2.0f,1.5f,0.0f,0.0f,1.5f,0.0f})))))
    .addChild(new PositionInterpolatorObject("BoxPathAnimator").setKey(new float[] {0.0f,0.125f,0.375f,0.625f,0.875f,1.0f}).setKeyValue(new MFVec3fObject(new float[] {0.0f,1.5f,0.0f,2.0f,1.5f,0.0f,2.0f,1.5f,-2.0f,-2.0f,1.5f,-2.0f,-2.0f,1.5f,0.0f,0.0f,1.5f,0.0f})))
    .addChild(new TimeSensorObject("OrbitClock").setCycleInterval(8.0).setLoop(true))
    .addChild(new ROUTEObject().setFromNode("OrbitClock").setFromField("fraction_changed").setToNode("BoxPathAnimator").setToField("set_fraction"))
    .addChild(new ROUTEObject().setFromNode("BoxPathAnimator").setFromField("value_changed").setToNode("LogoGeometryTransform").setToField("set_translation"))
    .addChild(new TransformObject("TextTransform").setTranslation(0.0f,-1.5f,0.0f)
      .addChild(new ShapeObject()
        .setAppearance(new AppearanceObject()
          .setMaterial(new MaterialObject().setUSE("GreenMaterial")))
        .setGeometry(new TextObject().setString(new String[] {"X3D Java","SAI Library","X3DJSAIL"})
          .addComments(" Comment example A, plain quotation marks: He said, \"Immel did it!\" ")
          .addComments(" Comment example B, XML character entities: He said, &quot;Immel did it!&quot; ")
          .setMetadata(new MetadataSetObject().setName("EscapedQuotationMarksMetadataSet")
            .addValue(new MetadataStringObject().setName("quotesTestC").setValue(new String[] {"MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""}))
            .addValue(new MetadataStringObject().setName("extraChildTest").setValue(new String[] {"checks MetadataSetObject addValue() method"})))
          .setFontStyle(new FontStyleObject().setJustify(FontStyleObject.JUSTIFY_MIDDLE_MIDDLE))))
      .addChild(new CollisionObject()
        .addComments(" test containerField='proxy' ")
        .setProxy(new ShapeObject("ProxyShape")
          .addComments(" alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\"' ")
          .addComments(" alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\" \"\"' ")
          .addComments(" alternative Java source: .setString(new String [] {\"One, Two, Comment\", \"\", \"He said, \\\"Immel did it!\\\"\"}) ")
          .addComments(" reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html ")
          .setGeometry(new TextObject().setString(new String[] {"One, Two, Text","","He said, \"Immel did it!\" \"\""}))))
      .addComments(" It's a beautiful world ")
      .addComments(" ... for you! ")
      .addComments(" https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) "))
    .addComments(" repeatedly spin 180 degrees as a readable special effect ")
    .addChild(new OrientationInterpolatorObject("SpinInterpolator").setKey(new float[] {0.0f,0.5f,1.0f}).setKeyValue(new MFRotationObject(new float[] {0.0f,1.0f,0.0f,4.712389f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,1.5707964f})))
    .addChild(new TimeSensorObject("SpinClock").setCycleInterval(5.0).setLoop(true))
    .addChild(new ROUTEObject().setFromNode("SpinClock").setFromField("fraction_changed").setToNode("SpinInterpolator").setToField("set_fraction"))
    .addChild(new ROUTEObject().setFromNode("SpinInterpolator").setFromField("value_changed").setToNode("TextTransform").setToField("rotation"))
    .addChild(new GroupObject("BackgroundGroup")
      .addChild(new BackgroundObject("GradualBackground"))
      .addChild(new ScriptObject("colorTypeConversionScript").setSourceCode("\n" + 
"\n" + 
"ecmascript:" + "\n" + 
"\n" + 
"function colorInput (eventValue) // Example source code" + "\n" + 
"{" + "\n" + 
"   colorsOutput = new MFColor(eventValue); // assigning value sends output event" + "\n" + 
"// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\\n');" + "\n" + 
"}" + "\n")
        .addField(new fieldObject().setName("colorInput").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_INPUTONLY))
        .addField(new fieldObject().setName("colorsOutput").setType(fieldObject.TYPE_MFCOLOR).setAccessType(fieldObject.ACCESSTYPE_OUTPUTONLY)))
      .addChild(new ColorInterpolatorObject("ColorAnimator").setKey(new float[] {0.0f,0.5f,1.0f}).setKeyValue(new MFColorObject(new float[] {0.9411765f,1.0f,1.0f,0.29411766f,0.0f,0.50980395f,0.9411765f,1.0f,1.0f}))
        .addComments(" AZURE to INDIGO and back again "))
      .addChild(new TimeSensorObject("ColorClock").setCycleInterval(60.0).setLoop(true))
      .addChild(new ROUTEObject().setFromNode("colorTypeConversionScript").setFromField("colorsOutput").setToNode("GradualBackground").setToField("skyColor"))
      .addChild(new ROUTEObject().setFromNode("ColorAnimator").setFromField("value_changed").setToNode("colorTypeConversionScript").setToField("colorInput"))
      .addChild(new ROUTEObject().setFromNode("ColorClock").setFromField("fraction_changed").setToNode("ColorAnimator").setToField("set_fraction")))
    .addChild(new ProtoDeclareObject("ArtDeco01Material").setName("ArtDeco01Material").setAppinfo("tooltip: ArtDeco01Material prototype is a Material node")
      .setProtoInterface(new ProtoInterfaceObject()
        .addField(new fieldObject().setName("description").setType(fieldObject.TYPE_SFSTRING).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue("ArtDeco01Material prototype is a Material node").setAppinfo("tooltip for descriptionField"))
        .addField(new fieldObject().setName("enabled").setType(fieldObject.TYPE_SFBOOL).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(true)))
      .setProtoBody(new ProtoBodyObject()
        .addComments(" Initial node of ProtoBody determines prototype node type ")
        .addChild(new MaterialObject().setAmbientIntensity(0.25f).setDiffuseColor(0.282435f,0.085159f,0.134462f).setShininess(0.127273f).setSpecularColor(0.276305f,0.11431f,0.139857f))
        .addComments(" [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()=\"Material\" ")
        .addComments(" presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types ")
        .addChild(new TouchSensorObject().setDescription("within ProtoBody")
          .setIS(new ISObject()
            .addConnect(new connectObject().setNodeField("description").setProtoField("description"))
            .addConnect(new connectObject().setNodeField("enabled").setProtoField("enabled"))))))
    .addChild(new ExternProtoDeclareObject("ArtDeco02Material").setName("ArtDeco02Material").setAppinfo("this is a different Material node").setUrl(new String[] {"http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material","http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"})
      .addComments(" [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()=\"ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file.\" ")
      .addField(new fieldObject().setName("description").setType(fieldObject.TYPE_SFSTRING).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setAppinfo("tooltip for descriptionField")))
    .addComments(" Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place ")
    .addChild(new ShapeObject("TestShape1")
      .setAppearance(new AppearanceObject("TestAppearance1")
        .addComments(" ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java ")
        .setMaterial(new ProtoInstanceObject("ArtDeco01Material")
          .addComments(" [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()=\"Material\" ")
          .addFieldValue(new fieldValueObject().setName("description").setValue("ArtDeco01Material can substitute for a Material node"))))
      .setGeometry(new SphereObject().setRadius(0.001f)))
    .addChild(new ShapeObject("TestShape2")
      .setAppearance(new AppearanceObject("TestAppearance2")
        .addComments(" ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java ")
        .setMaterial(new ProtoInstanceObject("ArtDeco02Material", "ArtDeco02MaterialDEF")
          .addComments(" [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()=\"ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file.\" ")
          .addFieldValue(new fieldValueObject().setName("description").setValue("ArtDeco02Material can substitute for another Material node"))))
      .setGeometry(new ConeObject().setBottomRadius(0.001f).setHeight(0.001f)))
    .addChild(new ShapeObject("TestShape3")
      .setAppearance(new AppearanceObject("TestAppearance3")
        .addComments(" ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. ")
        .setMaterial(new ProtoInstanceObject().setUSE("ArtDeco02MaterialDEF")))
      .setGeometry(new CylinderObject().setHeight(0.001f).setRadius(0.001f)))
    .addChild(new InlineObject("inlineSceneDef").setUrl(new String[] {"someOtherScene.x3d","https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"}))
    .addChild(new IMPORTObject().setImportedDEF("WorldInfoDEF").setInlineDEF("inlineSceneDef").setAS("WorldInfoDEF2"))
    .addChild(new EXPORTObject().setLocalDEF("WorldInfoDEF").setAS("WorldInfoDEF3"))
    .addChild(new ProtoDeclareObject("MaterialModulator").setName("MaterialModulator").setAppinfo("mimic a Material node and modulate fields as an animation effect").setDocumentation("http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html")
      .setProtoInterface(new ProtoInterfaceObject()
        .addField(new fieldObject().setName("enabled").setType(fieldObject.TYPE_SFBOOL).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(true))
        .addField(new fieldObject().setName("diffuseColor").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(new SFColorObject(0.0f,0.0f,0.0f)))
        .addField(new fieldObject().setName("emissiveColor").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(new SFColorObject(0.05f,0.05f,0.5f)))
        .addField(new fieldObject().setName("specularColor").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(new SFColorObject(0.0f,0.0f,0.0f)))
        .addField(new fieldObject().setName("transparency").setType(fieldObject.TYPE_SFFLOAT).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(0.0f))
        .addField(new fieldObject().setName("shininess").setType(fieldObject.TYPE_SFFLOAT).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(0.0f))
        .addField(new fieldObject().setName("ambientIntensity").setType(fieldObject.TYPE_SFFLOAT).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT).setValue(0.0f)))
      .setProtoBody(new ProtoBodyObject()
        .addChild(new MaterialObject("MaterialNode")
          .setIS(new ISObject()
            .addConnect(new connectObject().setNodeField("diffuseColor").setProtoField("diffuseColor"))
            .addConnect(new connectObject().setNodeField("emissiveColor").setProtoField("emissiveColor"))
            .addConnect(new connectObject().setNodeField("specularColor").setProtoField("specularColor"))
            .addConnect(new connectObject().setNodeField("transparency").setProtoField("transparency"))
            .addConnect(new connectObject().setNodeField("shininess").setProtoField("shininess"))
            .addConnect(new connectObject().setNodeField("ambientIntensity").setProtoField("ambientIntensity"))))
        .addComments(" Only first node (the node type) is renderable, others are along for the ride ")
        .addChild(new ScriptObject("MaterialModulatorScript").setSourceCode("\n" + 
"\n" + 
"ecmascript:" + "\n" + 
"function initialize ()" + "\n" + 
"{" + "\n" + 
"    newColor = diffuseColor; // start with correct color" + "\n" + 
"}" + "\n" + 
"function set_enabled (newValue)" + "\n" + 
"{" + "\n" + 
"	enabled = newValue;" + "\n" + 
"}" + "\n" + 
"function clockTrigger (timeValue)" + "\n" + 
"{" + "\n" + 
"    if (!enabled) return;" + "\n" + 
"    red   = newColor.r;" + "\n" + 
"    green = newColor.g;" + "\n" + 
"    blue  = newColor.b;" + "\n" + 
"    " + "\n" + 
"    // note different modulation rates for each color component, % is modulus operator" + "\n" + 
"    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);" + "\n" + 
"	if (enabled)" + "\n" + 
"	{" + "\n" + 
"		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\\n');" + "\n" + 
"	}" + "\n" + 
"}" + "\n")
          .addField(new fieldObject().setName("enabled").setType(fieldObject.TYPE_SFBOOL).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT))
          .addField(new fieldObject().setName("diffuseColor").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_INPUTOUTPUT))
          .addField(new fieldObject().setName("newColor").setType(fieldObject.TYPE_SFCOLOR).setAccessType(fieldObject.ACCESSTYPE_OUTPUTONLY))
          .addField(new fieldObject().setName("clockTrigger").setType(fieldObject.TYPE_SFTIME).setAccessType(fieldObject.ACCESSTYPE_INPUTONLY))
          .setIS(new ISObject()
            .addConnect(new connectObject().setNodeField("enabled").setProtoField("enabled"))
            .addConnect(new connectObject().setNodeField("diffuseColor").setProtoField("diffuseColor"))))))
    .addComments(" Test success: declarative statement createDeclarativeShapeTests() ")
    .addChild(new GroupObject("DeclarativeGroupExample")
      .addChild(new ShapeObject()
        .setMetadata(new MetadataStringObject("FindableMetadataStringTest").setName("findThisNameValue").setValue(new String[] {"test case"}))
        .setAppearance(new AppearanceObject("DeclarativeAppearanceExample")
          .addComments(" DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance ")
          .setMaterial(new ProtoInstanceObject("MaterialModulator", "MyMaterialModulator")))
        .setGeometry(new ConeObject().setBottom(false).setBottomRadius(0.05f).setHeight(0.1f)))
      .addComments(" Test success: declarativeGroup.addChild() singleton pipeline method "))
    .addComments(" Test success: declarative statement addChild() ")
    .addComments(" Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> ")
    .addComments(" Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='\"test case\"'/> ")
    .addComments(" Test success: x3dModel.findElementByNameValue(\"ArtDeco01Material\", \"ProtoDeclare\") found ")
    .addComments(" Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoDeclare\") found ")
    .addComments(" Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoInstance\") found ")
    .addChild(new GroupObject("TestFieldObjectsGroup")
      .addComments(" testFieldObjects() results ")
      .addComments(" SFBool default=true, true=true, false=false, negate()=true ")
      .addComments(" MFBool default=, initial=true false true, negate()=false true false ")
      .addComments(" SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 ")
      .addComments(" MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 ")
      .addComments(" ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= ")
      .addComments(" SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true ")
      .addComments(" regex test SFVec3f().matches(\"1 2 3\")=true, regex test SFVec3f().matches(\"1 2 3 4\")=false, regex test (SFRotationObject.matches(\"0 0 0 0\")=true, failure detecting illegal (zero axis) rotation value "))
    .addChild(new SoundObject().setLocation(0.0f,1.6f,0.0f)
      .addComments(" set sound-ellipsoid location height at 1.6m to match typical avatar height ")
      .setSource(new AudioClipObject().setDescription("chimes").setUrl(new String[] {"chimes.wav","https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"})
        .addComments(" Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d ")))
    .addChild(new SoundObject().setLocation(0.0f,1.6f,0.0f)
      .addComments(" set sound-ellipsoid location height at 1.6m to match typical avatar height ")
      .setSource(new MovieTextureObject().setDescription("mpgsys.mpg from ConformanceNist suite").setUrl(new String[] {"mpgsys.mpg","https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"})
        .addComments(" Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d ")
        .addComments(" Expected containerField='source', allowed containerField values=\"texture\" \"source\" \"back\" \"bottom\" \"front\" \"left\" \"right\" \"top\" \"backTexture\" \"bottomTexture\" \"frontTexture\" \"leftTexture\" \"rightTexture\" \"topTexture\" \"watchList\" ")))
    .addComments(" Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true ")
    .addComments(" Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false ")
    .addComments(" Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false ")
    .addComments(" Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true ")
    .addComments(" Test success: CommentsBlock.isNode()=false, testComments.isNode()=false ")
    .addComments(" Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true ")
    .addChild(new ShapeObject("ExtrusionShape")
      .addComments(" ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' ")
      .addComments(" ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' ")
      .setAppearance(new AppearanceObject("TransparentAppearance")
        .setMaterial(new MaterialObject().setTransparency(1.0f)))
      .setGeometry(new ExtrusionObject("ExampleExtrusion")))
    .addChild(new GroupObject()
      .addComments(" Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes ")
      .addChild(new ProtoDeclareObject("NewWorldInfo").setName("NewWorldInfo")
        .setProtoInterface(new ProtoInterfaceObject()
          .addField(new fieldObject().setName("description").setType(fieldObject.TYPE_SFSTRING).setAccessType(fieldObject.ACCESSTYPE_INITIALIZEONLY)))
        .setProtoBody(new ProtoBodyObject()
          .addChild(new WorldInfoObject())))
      .addChild(new ProtoInstanceObject("NewWorldInfo", "Proto1")
        .addFieldValue(new fieldValueObject().setName("description").setValue("testing 1 2 3")))
      .addChild(new GroupObject("Node2")
        .addComments(" intentionally empty "))
      .addChild(new ProtoInstanceObject("NewWorldInfo", "Proto3"))
      .addChild(new TransformObject("Node4")
        .addComments(" intentionally empty "))
      .addComments(" Test satisfactorily creates MFNode children array as an ordered list with mixed content "))
    .addChild(new ProtoDeclareObject("ShaderProto").setName("ShaderProto")
      .setProtoBody(new ProtoBodyObject()
        .addChild(new ProgramShaderObject())))
    .addChild(new ShapeObject()
      .setAppearance(new AppearanceObject()
        .addComments(" Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes ")
        .addComments(" Test satisfactorily creates MFNode shaders array as an ordered list with mixed content ")
        .addShaders(new ProgramShaderObject("TestShader1")
          .addPrograms(new ShaderProgramObject("TestShader2")))
        .addShaders(new ProtoInstanceObject("ShaderProto", "TestShader3"))
        .addShaders(new ComposedShaderObject("TestShader4")
          .addParts(new ShaderPartObject("TestShader5")))))
    .addChild(new TransformObject("SpecialtyNodes")
      .addChild(new CADLayerObject()
        .addChild(new CADAssemblyObject()
          .addChild(new CADPartObject()
            .addChild(new CADFaceObject()))))
      .addChild(new EspduTransformObject())
      .addChild(new ReceiverPduObject().setReceivedPower(0.0f))
      .addChild(new SignalPduObject())
      .addChild(new TransmitterPduObject().setRelativeAntennaLocation(0.0f,0.0f,0.0f).setTransmitFrequencyBandwidth(0.0f))
      .addChild(new DISEntityManagerObject()
        .addMapping(new DISEntityTypeMappingObject()))));
    }
	// end of initialize() method

	/** The initialized model object, created within initialize() method. */
	private X3DObject x3dModel;

	/** Provide a 
	 * <a href="https://dzone.com/articles/java-copy-shallow-vs-deep-in-which-you-will-swim" target="_blank">shallow copy</a>
	 * of the X3D model.
	 * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3DObject.html">X3DObject</a>
	 * @return temporaryJavaOutputFile model
	 */
	public X3DObject getX3dModel()
	{	  
		return x3dModel;
	}
	   
    /** Default main() method provided for test purposes, uses CommandLine to set global ConfigurationProperties for this object.
     * @param args array of input parameters, provided as arguments
	 * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3DObject.html#handleArguments-java.lang.String:A-">X3DObject.handleArguments(args)</a>
	 * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3DObject.html#validationReport--">X3DObject.validationReport()</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html">CommandLine</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html#USAGE">CommandLine.USAGE</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/ConfigurationProperties.html">ConfigurationProperties</a>
     */
    public static void main(String args[])
    {
        X3DObject thisExampleX3dObject = new temporaryJavaOutputFile().getX3dModel();

		boolean hasArguments = (args != null) && (args.length > 0);
		boolean validate = true; // default
		boolean argumentsLoadNewModel = false;
		String  fileName = new String();

		if (args != null)
		{
			for (String arg : args)
			{
				if (arg.toLowerCase().startsWith("-v") || arg.toLowerCase().contains("validate"))
				{
					validate = true; // making sure
				}
				if (arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_X3D) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_CLASSICVRML) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_X3DB) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_VRML97) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_EXI) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_GZIP) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_ZIP) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_HTML) ||
					arg.toLowerCase().endsWith(X3DObject.FILE_EXTENSION_XHTML))
				{
					argumentsLoadNewModel = true;
					fileName = arg;
				}
			}
		}
		if      (argumentsLoadNewModel)
			System.out.println("WARNING: \"temporaryJavaOutputFile\" model invocation is attempting to load file \"" + fileName + "\" instead of simply validating itself... file loading ignored.");
		else if (hasArguments) // if no arguments provided, this method produces usage warning
			thisExampleX3dObject.handleArguments(args);

		if (validate)
		{
			System.out.print("Java program \"temporaryJavaOutputFile\" self-validation test results: ");
			String validationResults = thisExampleX3dObject.validationReport();
			System.out.println(validationResults);
		}
    }
}

===========================================
Create JSON Encoding of model using stylesheet X3dToJson.xslt
Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file HelloWorldProgramOutput.json
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
helloWorldObject.toFileJSON("HelloWorldProgramOutput.json") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.json
Test toStringJSON()

Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Immersive",
    "@version":"3.3",
    "@xsd:noNamespaceSchemaLocation":"http://www.web3d.org/specifications/x3d-3.3.xsd",
    "JSON schema":"http://www.web3d.org/specifications/x3d-3.3-JSONSchema.json",
    "-children":[
      {
        "#comment":"x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true"
      }
    ],
    "head": {
        "-children":[
          {
            "#comment":"comment #1"
          },
          {
            "#comment":"comment #2"
          },
          {
            "#comment":"comment #3"
          },
          {
            "#comment":"comment #4"
          }
        ],
        "component": [
          {
            "@name":"Navigation",
            "@level":3
          },
          {
            "@name":"Shaders",
            "@level":1
          },
          {
            "@name":"CADGeometry",
            "@level":2
          },
          {
            "@name":"DIS",
            "@level":2
          },
          {
            "@name":"H-Anim",
            "@level":1
          },
          {
            "@name":"Grouping",
            "@level":1
          },
          {
            "@name":"Layering",
            "@level":1
          }
        ],
        "unit": [
          {
            "@name":"AngleUnitConversion",
            "@category":"angle",
            "@conversionFactor":1.0
          },
          {
            "@name":"LengthUnitConversion",
            "@category":"length",
            "@conversionFactor":1.0
          },
          {
            "@name":"ForceFromPoundsToNewtons",
            "@category":"force",
            "@conversionFactor":4.4482
          }
        ],
        "meta": [
          {
            "@name":"title",
            "@content":"HelloWorldProgramOutput.x3d"
          },
          {
            "@name":"info",
            "@content":"continued development and testing in progress"
          },
          {
            "@name":"description",
            "@content":"Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)"
          },
          {
            "@name":"reference",
            "@content":"https://www.web3d.org/specifications/java/X3DJSAIL.html"
          },
          {
            "@name":"generator",
            "@content":"HelloWorldProgramOutput.java"
          },
          {
            "@name":"created",
            "@content":"6 September 2016"
          },
          {
            "@name":"modified",
            "@content":"7 April 2020"
          },
          {
            "@name":"generator",
            "@content":"X3D Java Scene Access Interface Library (X3DJSAIL)"
          },
          {
            "@name":"generator",
            "@content":"https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java"
          },
          {
            "@name":"generator",
            "@content":"Netbeans http://www.netbeans.org"
          },
          {
            "@name":"creator",
            "@content":"Don Brutzman"
          },
          {
            "@name":"reference",
            "@content":"https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d"
          },
          {
            "@name":"reference",
            "@content":"Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:"
          },
          {
            "@name":"reference",
            "@content":"HelloWorldProgramOutput.txt"
          },
          {
            "@name":"reference",
            "@content":"HelloWorldProgramOutput.x3dv"
          },
          {
            "@name":"reference",
            "@content":"HelloWorldProgramOutput.wrl"
          },
          {
            "@name":"reference",
            "@content":"HelloWorldProgramOutput.html"
          },
          {
            "@name":"reference",
            "@content":"https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"
          },
          {
            "@name":"license",
            "@content":"../license.html"
          },
          {
            "@name":"translated",
            "@content":"07 April 2020"
          },
          {
            "@name":"generator",
            "@content":"X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html"
          },
          {
            "@name":"reference",
            "@content":"X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding"
          }
        ]
    },
    "Scene": {
        "-children":[
          { "ViewpointGroup":
            {
              "@description":"Available viewpoints",
              "-children":[
                { "Viewpoint":
                  {
                    "@DEF":"DefaultView",
                    "@description":"Hello X3DJSAIL"
                  }
                },
                { "Viewpoint":
                  {
                    "@DEF":"TopDownView",
                    "@description":"top-down view from above",
                    "@orientation":[1,0,0,-1.570796],
                    "@position":[0,100,0]
                  }
                }
              ]
            }
          },
          { "NavigationInfo":
            {
              "@type":["EXAMINE","FLY","ANY"]
            }
          },
          { "WorldInfo":
            {
              "@DEF":"WorldInfoDEF",
              "@title":"HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"
            }
          },
          { "WorldInfo":
            {
              "@USE":"WorldInfoDEF"
            }
          },
          { "WorldInfo":
            {
              "@USE":"WorldInfoDEF"
            }
          },
          { "MetadataString":
            {
              "@name":"test",
              "@DEF":"scene.addChildMetadata",
              "@value":["Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"]
            }
          },
          { "LayerSet":
            {
              "@DEF":"scene.addChildLayerSetTest"
            }
          },
          { "Transform":
            {
              "@DEF":"LogoGeometryTransform",
              "@translation":[0,1.5,0],
              "-children":[
                { "Anchor":
                  {
                    "@description":"select for X3D Java SAI Library (X3DJSAIL) description",
                    "@url":["../X3DJSAIL.html","https://www.web3d.org/specifications/java/X3DJSAIL.html"],
                    "-children":[
                      { "Shape":
                        {
                          "@DEF":"BoxShape",
                          "-appearance":
                            { "Appearance":
                              {
                                "-material":
                                  { "Material":
                                    {
                                      "@DEF":"GreenMaterial",
                                      "@diffuseColor":[0,1,1],
                                      "@emissiveColor":[0.8,0,0],
                                      "@transparency":0.1
                                    }
                                  },
                                "-texture":
                                  { "ImageTexture":
                                    {
                                      "@url":["images/X3dJavaSceneAccessInterfaceSaiLibrary.png","https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"]
                                    }
                                  }
                              }
                            },
                          "-geometry":
                            { "Box":
                              {
                                "@DEF":"test-NMTOKEN_regex.0123456789",
                                "@class":"untextured"
                              }
                            }
                        }
                      }
                    ]
                  }
                }
              ]
            }
          },
          { "Shape":
            {
              "@DEF":"LineShape",
              "-appearance":
                { "Appearance":
                  {
                    "-material":
                      { "Material":
                        {
                          "@emissiveColor":[0.6,0.19607843,0.8]
                        }
                      }
                  }
                },
              "-geometry":
                { "IndexedLineSet":
                  {
                    "@coordIndex":[0,1,2,3,4,0],
                    "-children":[
                      {
                        "#comment":"Coordinate 3-tuple point count: 6"
                      }
                    ],
                    "-coord":
                      { "Coordinate":
                        {
                          "@point":[0,1.5,0,2,1.5,0,2,1.5,-2,-2,1.5,-2,-2,1.5,0,0,1.5,0]
                        }
                      }
                  }
                }
            }
          },
          { "PositionInterpolator":
            {
              "@DEF":"BoxPathAnimator",
              "@key":[0,0.125,0.375,0.625,0.875,1],
              "@keyValue":[0,1.5,0,2,1.5,0,2,1.5,-2,-2,1.5,-2,-2,1.5,0,0,1.5,0]
            }
          },
          { "TimeSensor":
            {
              "@DEF":"OrbitClock",
              "@cycleInterval":8.0,
              "@loop":true
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"OrbitClock",
              "@toField":"set_fraction",
              "@toNode":"BoxPathAnimator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"BoxPathAnimator",
              "@toField":"set_translation",
              "@toNode":"LogoGeometryTransform"
            }
          },
          { "Transform":
            {
              "@DEF":"TextTransform",
              "@translation":[0,-1.5,0],
              "-children":[
                { "Shape":
                  {
                    "-appearance":
                      { "Appearance":
                        {
                          "-material":
                            { "Material":
                              {
                                "@USE":"GreenMaterial"
                              }
                            }
                        }
                      },
                    "-geometry":
                      { "Text":
                        {
                          "@string":["X3D Java","SAI Library","X3DJSAIL"],
                          "-children":[
                            {
                              "#comment":"Comment example A, plain quotation marks: He said, \"Immel did it!\""
                            },
                            {
                              "#comment":"Comment example B, XML character entities: He said, &quot;Immel did it!&quot;"
                            }
                          ],
                          "-metadata":
                            { "MetadataSet":
                              {
                                "@name":"EscapedQuotationMarksMetadataSet",
                                "-value":[
                                  { "MetadataString":
                                    {
                                      "@name":"quotesTestC",
                                      "@value":["MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""]
                                    }
                                  },
                                  { "MetadataString":
                                    {
                                      "@name":"extraChildTest",
                                      "@value":["checks MetadataSetObject addValue() method"]
                                    }
                                  }
                                ]
                              }
                            },
                          "-fontStyle":
                            { "FontStyle":
                              {
                                "@justify":["MIDDLE","MIDDLE"]
                              }
                            }
                        }
                      }
                  }
                },
                { "Collision":
                  {
                    "-children":[
                      {
                        "#comment":"test containerField='proxy'"
                      }
                    ],
                    "-proxy":
                      { "Shape":
                        {
                          "@DEF":"ProxyShape",
                          "-children":[
                            {
                              "#comment":"alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\"'"
                            },
                            {
                              "#comment":"alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\" \"\"'"
                            },
                            {
                              "#comment":"alternative Java source: .setString(new String [] {\"One, Two, Comment\", \"\", \"He said, \\\"\"Immel did it!\\\"\"\"})"
                            },
                            {
                              "#comment":"reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html"
                            }
                          ],
                          "-geometry":
                            { "Text":
                              {
                                "@string":["One, Two, Text","","He said, \"Immel did it!\" \"\""]
                              }
                            }
                        }
                      }
                  }
                },
                {
                  "#comment":"It's a beautiful world"
                },
                {
                  "#comment":"... for you!"
                },
                {
                  "#comment":"https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)"
                }
              ]
            }
          },
          {
            "#comment":"repeatedly spin 180 degrees as a readable special effect"
          },
          { "OrientationInterpolator":
            {
              "@DEF":"SpinInterpolator",
              "@key":[0,0.5,1],
              "@keyValue":[0,1,0,4.712389,0,1,0,0,0,1,0,1.5707964]
            }
          },
          { "TimeSensor":
            {
              "@DEF":"SpinClock",
              "@cycleInterval":5.0,
              "@loop":true
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"SpinClock",
              "@toField":"set_fraction",
              "@toNode":"SpinInterpolator"
            }
          },
          { "ROUTE":
            {
              "@fromField":"value_changed",
              "@fromNode":"SpinInterpolator",
              "@toField":"rotation",
              "@toNode":"TextTransform"
            }
          },
          { "Group":
            {
              "@DEF":"BackgroundGroup",
              "-children":[
                { "Background":
                  {
                    "@DEF":"GradualBackground"
                  }
                },
                { "Script":
                  {
                    "@DEF":"colorTypeConversionScript",
                    "field": [
                      {
                        "@name":"colorInput",
                        "@accessType":"inputOnly",
                        "@type":"SFColor"
                      },
                      {
                        "@name":"colorsOutput",
                        "@accessType":"outputOnly",
                        "@type":"MFColor"
                      }
                    ],
                    "#sourceText":[
"",
"",
"ecmascript:",
"",
"function colorInput (eventValue) // Example source code",
"{",
"   colorsOutput = new MFColor(eventValue); // assigning value sends output event",
"// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');",
"}",
"",
""
]
                  }
                },
                { "ColorInterpolator":
                  {
                    "@DEF":"ColorAnimator",
                    "@key":[0,0.5,1],
                    "@keyValue":[0.9411765,1,1,0.29411766,0,0.50980395,0.9411765,1,1],
                    "-children":[
                      {
                        "#comment":"AZURE to INDIGO and back again"
                      }
                    ]
                  }
                },
                { "TimeSensor":
                  {
                    "@DEF":"ColorClock",
                    "@cycleInterval":60.0,
                    "@loop":true
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"colorsOutput",
                    "@fromNode":"colorTypeConversionScript",
                    "@toField":"skyColor",
                    "@toNode":"GradualBackground"
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"value_changed",
                    "@fromNode":"ColorAnimator",
                    "@toField":"colorInput",
                    "@toNode":"colorTypeConversionScript"
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"fraction_changed",
                    "@fromNode":"ColorClock",
                    "@toField":"set_fraction",
                    "@toNode":"ColorAnimator"
                  }
                }
              ]
            }
          },
          { "ProtoDeclare":
            {
              "@name":"ArtDeco01Material",
              "@appinfo":"tooltip: ArtDeco01Material prototype is a Material node",
              "ProtoInterface": {
                  "field": [
                    {
                      "@name":"description",
                      "@accessType":"inputOutput",
                      "@appinfo":"tooltip for descriptionField",
                      "@type":"SFString",
                      "@value":"ArtDeco01Material prototype is a Material node"
                    },
                    {
                      "@name":"enabled",
                      "@accessType":"inputOutput",
                      "@type":"SFBool",
                      "@value":true
                    }
                  ]
              },
              "ProtoBody": {
                  "-children":[
                    {
                      "#comment":"Initial node of ProtoBody determines prototype node type"
                    },
                    { "Material":
                      {
                        "@ambientIntensity":0.25,
                        "@diffuseColor":[0.282435,0.085159,0.134462],
                        "@shininess":0.127273,
                        "@specularColor":[0.276305,0.11431,0.139857]
                      }
                    },
                    {
                      "#comment":"[HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()=\"Material\""
                    },
                    {
                      "#comment":"presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types"
                    },
                    { "TouchSensor":
                      {
                        "@description":"within ProtoBody",
                        "IS": {
                            "connect": [
                              {
                                "@nodeField":"description",
                                "@protoField":"description"
                              },
                              {
                                "@nodeField":"enabled",
                                "@protoField":"enabled"
                              }
                            ]
                        }
                      }
                    }
                  ]
              }
            }
          },
          { "ExternProtoDeclare":
            {
              "@name":"ArtDeco02Material",
              "@appinfo":"this is a different Material node",
              "@url":["http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material","http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"],
              "-children":[
                {
                  "#comment":"[HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()=\"ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file.\""
                }
              ],
              "field": [
                {
                  "@name":"description",
                  "@accessType":"inputOutput",
                  "@appinfo":"tooltip for descriptionField",
                  "@type":"SFString"
                }
              ]
            }
          },
          {
            "#comment":"Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place"
          },
          { "Shape":
            {
              "@DEF":"TestShape1",
              "-appearance":
                { "Appearance":
                  {
                    "@DEF":"TestAppearance1",
                    "-children":[
                      {
                        "#comment":"ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java"
                      }
                    ],
                    "-material":
                      { "ProtoInstance":
                        {
                          "@name":"ArtDeco01Material",
                          "-children":[
                            {
                              "#comment":"[HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()=\"Material\""
                            }
                          ],
                          "fieldValue": [
                            {
                              "@name":"description",
                              "@value":"ArtDeco01Material can substitute for a Material node"
                            }
                          ]
                        }
                      }
                  }
                },
              "-geometry":
                { "Sphere":
                  {
                    "@radius":0.001
                  }
                }
            }
          },
          { "Shape":
            {
              "@DEF":"TestShape2",
              "-appearance":
                { "Appearance":
                  {
                    "@DEF":"TestAppearance2",
                    "-children":[
                      {
                        "#comment":"ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java"
                      }
                    ],
                    "-material":
                      { "ProtoInstance":
                        {
                          "@name":"ArtDeco02Material",
                          "@DEF":"ArtDeco02MaterialDEF",
                          "-children":[
                            {
                              "#comment":"[HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()=\"ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file.\""
                            }
                          ],
                          "fieldValue": [
                            {
                              "@name":"description",
                              "@value":"ArtDeco02Material can substitute for another Material node"
                            }
                          ]
                        }
                      }
                  }
                },
              "-geometry":
                { "Cone":
                  {
                    "@bottomRadius":0.001,
                    "@height":0.001
                  }
                }
            }
          },
          { "Shape":
            {
              "@DEF":"TestShape3",
              "-appearance":
                { "Appearance":
                  {
                    "@DEF":"TestAppearance3",
                    "-children":[
                      {
                        "#comment":"ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE."
                      }
                    ],
                    "-material":
                      { "ProtoInstance":
                        {
                          "@USE":"ArtDeco02MaterialDEF"
                        }
                      }
                  }
                },
              "-geometry":
                { "Cylinder":
                  {
                    "@height":0.001,
                    "@radius":0.001
                  }
                }
            }
          },
          { "Inline":
            {
              "@DEF":"inlineSceneDef",
              "@url":["someOtherScene.x3d","https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"]
            }
          },
          { "IMPORT":
            {
              "@AS":"WorldInfoDEF2",
              "@importedDEF":"WorldInfoDEF",
              "@inlineDEF":"inlineSceneDef"
            }
          },
          { "EXPORT":
            {
              "@AS":"WorldInfoDEF3",
              "@localDEF":"WorldInfoDEF"
            }
          },
          { "ProtoDeclare":
            {
              "@name":"MaterialModulator",
              "@appinfo":"mimic a Material node and modulate fields as an animation effect",
              "@documentation":"http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html",
              "ProtoInterface": {
                  "field": [
                    {
                      "@name":"enabled",
                      "@accessType":"inputOutput",
                      "@type":"SFBool",
                      "@value":true
                    },
                    {
                      "@name":"diffuseColor",
                      "@accessType":"inputOutput",
                      "@type":"SFColor",
                      "@value":[0,0,0]
                    },
                    {
                      "@name":"emissiveColor",
                      "@accessType":"inputOutput",
                      "@type":"SFColor",
                      "@value":[0.05,0.05,0.5]
                    },
                    {
                      "@name":"specularColor",
                      "@accessType":"inputOutput",
                      "@type":"SFColor",
                      "@value":[0,0,0]
                    },
                    {
                      "@name":"transparency",
                      "@accessType":"inputOutput",
                      "@type":"SFFloat",
                      "@value":0.0
                    },
                    {
                      "@name":"shininess",
                      "@accessType":"inputOutput",
                      "@type":"SFFloat",
                      "@value":0.0
                    },
                    {
                      "@name":"ambientIntensity",
                      "@accessType":"inputOutput",
                      "@type":"SFFloat",
                      "@value":0.0
                    }
                  ]
              },
              "ProtoBody": {
                  "-children":[
                    { "Material":
                      {
                        "@DEF":"MaterialNode",
                        "IS": {
                            "connect": [
                              {
                                "@nodeField":"diffuseColor",
                                "@protoField":"diffuseColor"
                              },
                              {
                                "@nodeField":"emissiveColor",
                                "@protoField":"emissiveColor"
                              },
                              {
                                "@nodeField":"specularColor",
                                "@protoField":"specularColor"
                              },
                              {
                                "@nodeField":"transparency",
                                "@protoField":"transparency"
                              },
                              {
                                "@nodeField":"shininess",
                                "@protoField":"shininess"
                              },
                              {
                                "@nodeField":"ambientIntensity",
                                "@protoField":"ambientIntensity"
                              }
                            ]
                        }
                      }
                    },
                    {
                      "#comment":"Only first node (the node type) is renderable, others are along for the ride"
                    },
                    { "Script":
                      {
                        "@DEF":"MaterialModulatorScript",
                        "field": [
                          {
                            "@name":"enabled",
                            "@accessType":"inputOutput",
                            "@type":"SFBool"
                          },
                          {
                            "@name":"diffuseColor",
                            "@accessType":"inputOutput",
                            "@type":"SFColor"
                          },
                          {
                            "@name":"newColor",
                            "@accessType":"outputOnly",
                            "@type":"SFColor"
                          },
                          {
                            "@name":"clockTrigger",
                            "@accessType":"inputOnly",
                            "@type":"SFTime"
                          }
                        ],
                        "IS": {
                            "connect": [
                              {
                                "@nodeField":"enabled",
                                "@protoField":"enabled"
                              },
                              {
                                "@nodeField":"diffuseColor",
                                "@protoField":"diffuseColor"
                              }
                            ]
                        },
                        "#sourceText":[
"",
"",
"ecmascript:",
"function initialize ()",
"{",
"    newColor = diffuseColor; // start with correct color",
"}",
"function set_enabled (newValue)",
"{",
"\tenabled = newValue;",
"}",
"function clockTrigger (timeValue)",
"{",
"    if (!enabled) return;",
"    red   = newColor.r;",
"    green = newColor.g;",
"    blue  = newColor.b;",
"",
"    // note different modulation rates for each color component, % is modulus operator",
"    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);",
"\tif (enabled)",
"\t{",
"\t\tBrowser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');",
"\t}",
"}",
"",
""
]
                      }
                    }
                  ]
              }
            }
          },
          {
            "#comment":"Test success: declarative statement createDeclarativeShapeTests()"
          },
          { "Group":
            {
              "@DEF":"DeclarativeGroupExample",
              "-children":[
                { "Shape":
                  {
                    "-metadata":
                      { "MetadataString":
                        {
                          "@name":"findThisNameValue",
                          "@DEF":"FindableMetadataStringTest",
                          "@value":["test case"]
                        }
                      },
                    "-appearance":
                      { "Appearance":
                        {
                          "@DEF":"DeclarativeAppearanceExample",
                          "-children":[
                            {
                              "#comment":"DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance"
                            }
                          ],
                          "-material":
                            { "ProtoInstance":
                              {
                                "@name":"MaterialModulator",
                                "@DEF":"MyMaterialModulator"
                              }
                            }
                        }
                      },
                    "-geometry":
                      { "Cone":
                        {
                          "@bottom":false,
                          "@bottomRadius":0.05,
                          "@height":0.1
                        }
                      }
                  }
                },
                {
                  "#comment":"Test success: declarativeGroup.addChild() singleton pipeline method"
                }
              ]
            }
          },
          {
            "#comment":"Test success: declarative statement addChild()"
          },
          {
            "#comment":"Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance>"
          },
          {
            "#comment":"Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='\"test case\"'/>"
          },
          {
            "#comment":"Test success: x3dModel.findElementByNameValue(\"ArtDeco01Material\", \"ProtoDeclare\") found"
          },
          {
            "#comment":"Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoDeclare\") found"
          },
          {
            "#comment":"Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoInstance\") found"
          },
          { "Group":
            {
              "@DEF":"TestFieldObjectsGroup",
              "-children":[
                {
                  "#comment":"testFieldObjects() results"
                },
                {
                  "#comment":"SFBool default=true, true=true, false=false, negate()=true"
                },
                {
                  "#comment":"MFBool default=, initial=true false true, negate()=false true false"
                },
                {
                  "#comment":"SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0"
                },
                {
                  "#comment":"MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7"
                },
                {
                  "#comment":"... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear="
                },
                {
                  "#comment":"SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true"
                },
                {
                  "#comment":"regex test SFVec3f().matches(\"1 2 3\")=true, regex test SFVec3f().matches(\"1 2 3 4\")=false, regex test (SFRotationObject.matches(\"0 0 0 0\")=true, failure detecting illegal (zero axis) rotation value"
                }
              ]
            }
          },
          { "Sound":
            {
              "@location":[0,1.6,0],
              "-children":[
                {
                  "#comment":"set sound-ellipsoid location height at 1.6m to match typical avatar height"
                }
              ],
              "-source":
                { "AudioClip":
                  {
                    "@description":"chimes",
                    "@url":["chimes.wav","https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"],
                    "-children":[
                      {
                        "#comment":"Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d"
                      }
                    ]
                  }
                }
            }
          },
          { "Sound":
            {
              "@location":[0,1.6,0],
              "-children":[
                {
                  "#comment":"set sound-ellipsoid location height at 1.6m to match typical avatar height"
                }
              ],
              "-source":
                { "MovieTexture":
                  {
                    "@description":"mpgsys.mpg from ConformanceNist suite",
                    "@url":["mpgsys.mpg","https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"],
                    "-children":[
                      {
                        "#comment":"Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d"
                      },
                      {
                        "#comment":"Expected containerField='source', allowed containerField values=\"texture\" \"source\" \"back\" \"bottom\" \"front\" \"left\" \"right\" \"top\" \"backTexture\" \"bottomTexture\" \"frontTexture\" \"leftTexture\" \"rightTexture\" \"topTexture\" \"watchList\""
                      }
                    ]
                  }
                }
            }
          },
          {
            "#comment":"Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true"
          },
          {
            "#comment":"Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false"
          },
          {
            "#comment":"Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false"
          },
          {
            "#comment":"Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true"
          },
          {
            "#comment":"Test success: CommentsBlock.isNode()=false, testComments.isNode()=false"
          },
          {
            "#comment":"Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true"
          },
          { "Shape":
            {
              "@DEF":"ExtrusionShape",
              "-children":[
                {
                  "#comment":"ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]'"
                },
                {
                  "#comment":"ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]'"
                }
              ],
              "-appearance":
                { "Appearance":
                  {
                    "@DEF":"TransparentAppearance",
                    "-material":
                      { "Material":
                        {
                          "@transparency":1.0
                        }
                      }
                  }
                },
              "-geometry":
                { "Extrusion":
                  {
                    "@DEF":"ExampleExtrusion"
                  }
                }
            }
          },
          { "Group":
            {
              "-children":[
                {
                  "#comment":"Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes"
                },
                { "ProtoDeclare":
                  {
                    "@name":"NewWorldInfo",
                    "ProtoInterface": {
                        "field": [
                          {
                            "@name":"description",
                            "@accessType":"initializeOnly",
                            "@type":"SFString"
                          }
                        ]
                    },
                    "ProtoBody": {
                        "-children":[
                          { "WorldInfo":
                            {
                            }
                          }
                        ]
                    }
                  }
                },
                { "ProtoInstance":
                  {
                    "@name":"NewWorldInfo",
                    "@DEF":"Proto1",
                    "fieldValue": [
                      {
                        "@name":"description",
                        "@value":"testing 1 2 3"
                      }
                    ]
                  }
                },
                { "Group":
                  {
                    "@DEF":"Node2",
                    "-children":[
                      {
                        "#comment":"intentionally empty"
                      }
                    ]
                  }
                },
                { "ProtoInstance":
                  {
                    "@name":"NewWorldInfo",
                    "@DEF":"Proto3"
                  }
                },
                { "Transform":
                  {
                    "@DEF":"Node4",
                    "-children":[
                      {
                        "#comment":"intentionally empty"
                      }
                    ]
                  }
                },
                {
                  "#comment":"Test satisfactorily creates MFNode children array as an ordered list with mixed content"
                }
              ]
            }
          },
          { "ProtoDeclare":
            {
              "@name":"ShaderProto",
              "ProtoBody": {
                  "-children":[
                    { "ProgramShader":
                      {
                      }
                    }
                  ]
              }
            }
          },
          { "Shape":
            {
              "-appearance":
                { "Appearance":
                  {
                    "-children":[
                      {
                        "#comment":"Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes"
                      },
                      {
                        "#comment":"Test satisfactorily creates MFNode shaders array as an ordered list with mixed content"
                      }
                    ],
                    "-shaders":[
                      { "ProgramShader":
                        {
                          "@DEF":"TestShader1",
                          "-programs":[
                            { "ShaderProgram":
                              {
                                "@DEF":"TestShader2",
                                "@type":"VERTEX"
                              }
                            }
                          ]
                        }
                      },
                      { "ProtoInstance":
                        {
                          "@name":"ShaderProto",
                          "@DEF":"TestShader3"
                        }
                      },
                      { "ComposedShader":
                        {
                          "@DEF":"TestShader4",
                          "-parts":[
                            { "ShaderPart":
                              {
                                "@DEF":"TestShader5",
                                "@type":"VERTEX"
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
            }
          },
          { "Transform":
            {
              "@DEF":"SpecialtyNodes",
              "-children":[
                { "CADLayer":
                  {
                    "-children":[
                      { "CADAssembly":
                        {
                          "-children":[
                            { "CADPart":
                              {
                                "-children":[
                                  { "CADFace":
                                    {
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                { "EspduTransform":
                  {
                  }
                },
                { "ReceiverPdu":
                  {
                  }
                },
                { "SignalPdu":
                  {
                  }
                },
                { "TransmitterPdu":
                  {
                  }
                },
                { "DISEntityManager":
                  {
                    "-mapping":[
                      { "DISEntityTypeMapping":
                        {
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
    }
  }
}

===========================================
Create Python source of model using stylesheet X3dToPython.xslt
Warning: toFileStylesheetConversion(X3dToPython.xslt) is overwriting prior file HelloWorldProgramOutput.py
helloWorldObject.toFilePython("HelloWorldProgramOutput.py") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.py
Test toStringPython()

###############################################
#
# Now available: developmental python x3d.py package on PyPi for import.
#   This approach greatly simplifies Python X3D deployment and use.
#   https://pypi.org/project/x3d
#
# Installation:
#       pip install x3d
# or
#       python -m pip install x3d
#
# Developer options for loading x3d package:
#
#    from x3d import *  # preferred approach, terser source that avoids x3d.* class
prefixes
#
# or
#    import x3d         # traditional way to subclass x3d package, all classes require
x3d.* prefix
#                       # but python source is very verbose, for example x3d.Material
x3d.Shape etc.
#                       # X3dToPython.xslt stylesheet insertPackagePrefix=true supports
this option.

from x3d import *

###############################################

newModel=X3D(profile='Immersive',version='3.3',
  #  x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true

head=head(
  children=[
    #  comment #1 
    #  comment #2 
    #  comment #3 
    #  comment #4 
component(name='Navigation',level=3),
component(name='Shaders',level=1),
component(name='CADGeometry',level=2),
component(name='DIS',level=2),
component(name='H-Anim',level=1),
component(name='Grouping',level=1),
component(name='Layering',level=1),
unit(name='AngleUnitConversion',category='angle',conversionFactor=1.0),
unit(name='LengthUnitConversion',category='length',conversionFactor=1.0),
unit(name='ForceFromPoundsToNewtons',category='force',conversionFactor=4.4482),
meta(content='HelloWorldProgramOutput.x3d',name='title'),
meta(content='continued development and testing in progress',name='info'),
meta(content='Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access
Interface Library (X3DJSAIL)',name='description'),
meta(content='https://www.web3d.org/specifications/java/X3DJSAIL.html',name='reference'),
meta(content='HelloWorldProgramOutput.java',name='generator'),
meta(content='6 September 2016',name='created'),
meta(content='7 April 2020',name='modified'),
meta(content='X3D Java Scene Access Interface Library (X3DJSAIL)',name='generator'),
meta(content='https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java',name='generator'),
meta(content='Netbeans http://www.netbeans.org',name='generator'),
meta(content='Don Brutzman',name='creator'),
meta(content='https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d',name='reference'),
meta(content='Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:',name='reference'),
meta(content='HelloWorldProgramOutput.txt',name='reference'),
meta(content='HelloWorldProgramOutput.x3dv',name='reference'),
meta(content='HelloWorldProgramOutput.wrl',name='reference'),
meta(content='HelloWorldProgramOutput.html',name='reference'),
meta(content='https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d',name='reference'),
meta(content='https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d',name='identifier'),
meta(content='../license.html',name='license')]),
Scene=Scene(
children=[
ViewpointGroup(description='Available viewpoints',
children=[
Viewpoint(DEF='DefaultView',description='Hello X3DJSAIL'),
Viewpoint(DEF='TopDownView',description='top-down view from above',orientation=(1,0,0,-1.570796),position=(0,100,0))]),
NavigationInfo(type=["EXAMINE","FLY","ANY"]),
WorldInfo(DEF='WorldInfoDEF',title='HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)'),
WorldInfo(USE='WorldInfoDEF'),
WorldInfo(USE='WorldInfoDEF'),
MetadataString(DEF='scene.addChildMetadata',name='test',value=["Top-level root Metadata node beneath
Scene needs to be one of \'-children\' in JSON encoding"]),
LayerSet(DEF='scene.addChildLayerSetTest'),
Transform(DEF='LogoGeometryTransform',translation=(0,1.5,0),
children=[
Anchor(description='select for X3D Java SAI Library (X3DJSAIL) description',url=["../X3DJSAIL.html","https://www.web3d.org/specifications/java/X3DJSAIL.html"],
children=[
Shape(DEF='BoxShape',
appearance=Appearance(
material=Material(DEF='GreenMaterial',diffuseColor=(0,1,1),emissiveColor=(0.8,0,0),transparency=0.1),
texture=ImageTexture(url=["images/X3dJavaSceneAccessInterfaceSaiLibrary.png","https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"])),
geometry=Box(DEF='test-NMTOKEN_regex.0123456789',class_='untextured'))])]),
Shape(DEF='LineShape',
appearance=Appearance(
material=Material(emissiveColor=(0.6,0.19607843,0.8))),
geometry=IndexedLineSet(coordIndex=[0,1,2,3,4,0],
        #  Coordinate 3-tuple point count: 6 
coord=Coordinate(point=[(0,1.5,0),(2,1.5,0),(2,1.5,-2),(-2,1.5,-2),(-2,1.5,0),(0,1.5,0)]))),
PositionInterpolator(DEF='BoxPathAnimator',key=[0,0.125,0.375,0.625,0.875,1],keyValue=[(0,1.5,0),(2,1.5,0),(2,1.5,-2),(-2,1.5,-2),(-2,1.5,0),(0,1.5,0)]),
TimeSensor(DEF='OrbitClock',cycleInterval=8.0,loop=True),
ROUTE(fromField='fraction_changed',fromNode='OrbitClock',toField='set_fraction',toNode='BoxPathAnimator'),
ROUTE(fromField='value_changed',fromNode='BoxPathAnimator',toField='set_translation',toNode='LogoGeometryTransform'),
Transform(DEF='TextTransform',translation=(0,-1.5,0),
children=[
Shape(
appearance=Appearance(
material=Material(USE='GreenMaterial')),
geometry=Text(string=["X3D Java","SAI Library","X3DJSAIL"],
          #  Comment example A, plain quotation marks: He said, "Immel did it!" 
          #  Comment example B, XML character entities: He said, &amp;quot;Immel did it!&amp;quot; 
metadata=MetadataSet(name='EscapedQuotationMarksMetadataSet',
value=[
MetadataString(name='quotesTestC',value=["MFString example C, backslash-escaped quotes: He said,
\"Immel did it!\""]),
MetadataString(name='extraChildTest',value=["checks MetadataSetObject addValue() method"])]),
fontStyle=FontStyle(justify=["MIDDLE","MIDDLE"]))),
Collision(
        #  test containerField='proxy' 
proxy=Shape(DEF='ProxyShape',
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&amp;quot;Immel
did it!\&amp;quot;"' 
          #  alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&amp;quot;Immel
did it!\&amp;quot;" ""' 
          #  alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said,
\"Immel did it!\""}) 
          #  reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html

geometry=Text(string=["One, Two, Text","","He said, \"Immel did it!\" \"\""])))]
      #  It's a beautiful world 
      #  ... for you! 
      #  https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) 
),
    #  repeatedly spin 180 degrees as a readable special effect 
OrientationInterpolator(DEF='SpinInterpolator',key=[0,0.5,1],keyValue=[(0,1,0,4.712389),(0,1,0,0),(0,1,0,1.5707964)]),
TimeSensor(DEF='SpinClock',cycleInterval=5.0,loop=True),
ROUTE(fromField='fraction_changed',fromNode='SpinClock',toField='set_fraction',toNode='SpinInterpolator'),
ROUTE(fromField='value_changed',fromNode='SpinInterpolator',toField='rotation',toNode='TextTransform'),
Group(DEF='BackgroundGroup',
children=[
Background(DEF='GradualBackground'),
Script(DEF='colorTypeConversionScript',
field=[
field(name='colorInput',accessType='inputOnly',type='SFColor'),
field(name='colorsOutput',accessType='outputOnly',type='MFColor')]),
ColorInterpolator(DEF='ColorAnimator',key=[0,0.5,1],keyValue=[(0.9411765,1,1),(0.29411766,0,0.50980395),(0.9411765,1,1)],
        #  AZURE to INDIGO and back again 
),
TimeSensor(DEF='ColorClock',cycleInterval=60.0,loop=True),
ROUTE(fromField='colorsOutput',fromNode='colorTypeConversionScript',toField='skyColor',toNode='GradualBackground'),
ROUTE(fromField='value_changed',fromNode='ColorAnimator',toField='colorInput',toNode='colorTypeConversionScript'),
ROUTE(fromField='fraction_changed',fromNode='ColorClock',toField='set_fraction',toNode='ColorAnimator')]),
ProtoDeclare(name='ArtDeco01Material',appinfo='tooltip: ArtDeco01Material prototype is a Material
node',
ProtoInterface=ProtoInterface(
field=[
field(name='description',accessType='inputOutput',appinfo='tooltip for descriptionField',type='SFString',value='ArtDeco01Material
prototype is a Material node'),
field(name='enabled',accessType='inputOutput',type='SFBool',value=True)]),
ProtoBody=ProtoBody(
        #  Initial node of ProtoBody determines prototype node type 
children=[
Material(ambientIntensity=0.25,diffuseColor=(0.282435,0.085159,0.134462),shininess=0.127273,specularColor=(0.276305,0.11431,0.139857)),
        #  [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material"

        #  presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody
after initial node, regardless of node types 
TouchSensor(description='within ProtoBody',
IS=IS(
connect=[
connect(nodeField='description',protoField='description'),
connect(nodeField='enabled',protoField='enabled')]))])),
ExternProtoDeclare(name='ArtDeco02Material',appinfo='this is a different Material node',url=["http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material","http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"],
      #  [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE:
ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run
time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare
file." 
field=[
field(name='description',accessType='inputOutput',appinfo='tooltip for descriptionField',type='SFString')]),
    #  Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when
ProtoInstance is added in wrong place 
Shape(DEF='TestShape1',
appearance=Appearance(DEF='TestAppearance1',
        #  ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled
in exported Java 
material=ProtoInstance(name='ArtDeco01Material',
          #  [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" 
fieldValue=[
fieldValue(name='description',value='ArtDeco01Material can substitute for a Material node')])),
geometry=Sphere(radius=0.001)),
Shape(DEF='TestShape2',
appearance=Appearance(DEF='TestAppearance2',
        #  ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled
in exported Java 
material=ProtoInstance(DEF='ArtDeco02MaterialDEF',name='ArtDeco02Material',
          #  [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE:
ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run
time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare
file." 
fieldValue=[
fieldValue(name='description',value='ArtDeco02Material can substitute for another Material node')])),
geometry=Cone(bottomRadius=0.001,height=0.001)),
Shape(DEF='TestShape3',
appearance=Appearance(DEF='TestAppearance3',
        #  ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined
as part of ProtoInstance USE. 
material=ProtoInstance(USE='ArtDeco02MaterialDEF')),
geometry=Cylinder(height=0.001,radius=0.001)),
Inline(DEF='inlineSceneDef',url=["someOtherScene.x3d","https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"]),
IMPORT(AS='WorldInfoDEF2',importedDEF='WorldInfoDEF',inlineDEF='inlineSceneDef'),
EXPORT(AS='WorldInfoDEF3',localDEF='WorldInfoDEF'),
ProtoDeclare(name='MaterialModulator',appinfo='mimic a Material node and modulate fields as an
animation effect',documentation='http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html',
ProtoInterface=ProtoInterface(
field=[
field(name='enabled',accessType='inputOutput',type='SFBool',value=True),
field(name='diffuseColor',accessType='inputOutput',type='SFColor',value=(0,0,0)),
field(name='emissiveColor',accessType='inputOutput',type='SFColor',value=(0.05,0.05,0.5)),
field(name='specularColor',accessType='inputOutput',type='SFColor',value=(0,0,0)),
field(name='transparency',accessType='inputOutput',type='SFFloat',value=0.0),
field(name='shininess',accessType='inputOutput',type='SFFloat',value=0.0),
field(name='ambientIntensity',accessType='inputOutput',type='SFFloat',value=0.0)]),
ProtoBody=ProtoBody(
children=[
Material(DEF='MaterialNode',
IS=IS(
connect=[
connect(nodeField='diffuseColor',protoField='diffuseColor'),
connect(nodeField='emissiveColor',protoField='emissiveColor'),
connect(nodeField='specularColor',protoField='specularColor'),
connect(nodeField='transparency',protoField='transparency'),
connect(nodeField='shininess',protoField='shininess'),
connect(nodeField='ambientIntensity',protoField='ambientIntensity')])),
        #  Only first node (the node type) is renderable, others are along for the ride 
Script(DEF='MaterialModulatorScript',
field=[
field(name='enabled',accessType='inputOutput',type='SFBool'),
field(name='diffuseColor',accessType='inputOutput',type='SFColor'),
field(name='newColor',accessType='outputOnly',type='SFColor'),
field(name='clockTrigger',accessType='inputOnly',type='SFTime')],
IS=IS(
connect=[
connect(nodeField='enabled',protoField='enabled'),
connect(nodeField='diffuseColor',protoField='diffuseColor')]))])),
    #  Test success: declarative statement createDeclarativeShapeTests() 
Group(DEF='DeclarativeGroupExample',
children=[
Shape(
metadata=MetadataString(DEF='FindableMetadataStringTest',name='findThisNameValue',value=["test case"]),
appearance=Appearance(DEF='DeclarativeAppearanceExample',
          #  DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator
ProtoInstance 
material=ProtoInstance(DEF='MyMaterialModulator',name='MaterialModulator')),
geometry=Cone(bottom=False,bottomRadius=0.05,height=0.1))]
      #  Test success: declarativeGroup.addChild() singleton pipeline method 
),
    #  Test success: declarative statement addChild() 
    #  Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = &lt;Appearance
DEF='DeclarativeAppearanceExample'/&gt; i.e. &lt;Appearance DEF='DeclarativeAppearanceExample'&gt;
&lt;!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator
ProtoInstance - -&gt; &lt;ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator'
containerField='material'/&gt; &lt;/Appearance&gt; 
    #  Test success: x3dModel.findElementByNameValue(findThisNameValue) = &lt;MetadataString
DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/&gt; 
    #  Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare")
found 
    #  Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare")
found 
    #  Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance")
found 
Group(DEF='TestFieldObjectsGroup',
      #  testFieldObjects() results 
      #  SFBool default=true, true=true, false=false, negate()=true 
      #  MFBool default=, initial=true false true, negate()=false true false 
      #  SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0

      #  MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5,
append(6)=0 1 2 3 4 5 6, size()=7 
      #  ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20
4 6 8 10 12, clear= 
      #  SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232
0.5698029 0.68376344, regex matches()=true 
      #  regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false,
regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero
axis) rotation value 
),
Sound(location=(0,1.6,0),
      #  set sound-ellipsoid location height at 1.6m to match typical avatar height 
source=AudioClip(description='chimes',url=["chimes.wav","https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"],
        #  Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d

)),
Sound(location=(0,1.6,0),
      #  set sound-ellipsoid location height at 1.6m to match typical avatar height 
source=MovieTexture(description='mpgsys.mpg from ConformanceNist suite',url=["mpgsys.mpg","https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"],
        #  Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d

        #  Expected containerField='source', allowed containerField values="texture" "source"
"back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture"
"leftTexture" "rightTexture" "topTexture" "watchList" 
)),
    #  Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true 
    #  Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false 
    #  Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false 
    #  Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true

    #  Test success: CommentsBlock.isNode()=false, testComments.isNode()=false 
    #  Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true 
Shape(DEF='ExtrusionShape',
      #  ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0,
-1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' 
      #  ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' 
appearance=Appearance(DEF='TransparentAppearance',
material=Material(transparency=1.0)),
geometry=Extrusion(DEF='ExampleExtrusion')),
Group(
      #  Test MFNode children array as an ordered list consisting of comments, statements,
ProtoInstance and nodes 
children=[
ProtoDeclare(name='NewWorldInfo',
ProtoInterface=ProtoInterface(
field=[
field(name='description',accessType='initializeOnly',type='SFString')]),
ProtoBody=ProtoBody(
children=[
WorldInfo(),])),
ProtoInstance(DEF='Proto1',name='NewWorldInfo',
fieldValue=[
fieldValue(name='description',value='testing 1 2 3')]),
Group(DEF='Node2',
        #  intentionally empty 
),
ProtoInstance(DEF='Proto3',name='NewWorldInfo'),
Transform(DEF='Node4',
        #  intentionally empty 
)]
      #  Test satisfactorily creates MFNode children array as an ordered list with mixed content

),
ProtoDeclare(name='ShaderProto',
ProtoBody=ProtoBody(
children=[
ProgramShader(),])),
Shape(
appearance=Appearance(
        #  Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance
and nodes 
        #  Test satisfactorily creates MFNode shaders array as an ordered list with mixed content

shaders=ProgramShader(DEF='TestShader1',
programs=ShaderProgram(DEF='TestShader2')),
ProtoInstance(DEF='TestShader3',name='ShaderProto'),
ComposedShader(DEF='TestShader4',
parts=ShaderPart(DEF='TestShader5')))),
Transform(DEF='SpecialtyNodes',
children=[
CADLayer(
children=[
CADAssembly(
children=[
CADPart(
children=[
CADFace(),])])]),
EspduTransform(),
ReceiverPdu(receivedPower=0.0),
SignalPdu(),
TransmitterPdu(relativeAntennaLocation=(0,0,0),transmitFrequencyBandwidth=0.0),
DISEntityManager(
mapping=[
DISEntityTypeMapping(),])])])
) # X3D model complete

###############################################
# Self-test diagnostics
###############################################

if         metaDiagnostics(newModel): # built-in utility method in X3D class
print (metaDiagnostics(newModel))
print ("python x3d.py load successful for HelloWorldProgramOutput.py")

===========================================
Create displayable scene page rendered with X3DOM using stylesheet X3dToX3dom.xslt
Warning: toFileStylesheetConversion(X3dToX3dom.xslt) is overwriting prior file HelloWorldProgramOutputX3dom.xhtml
helloWorldObject.toFileX3DOM("HelloWorldProgramOutputX3dom.xhtml") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutputX3dom.xhtml
===========================================
Create displayable scene page rendered with X_ITE (formerly Cobweb) using stylesheet X3dToX3dom.xslt
Warning: toFileStylesheetConversion(X3dToX3dom.xslt) is overwriting prior file HelloWorldProgramOutputX_ITE.html
helloWorldObject.toFileX3DOM("HelloWorldProgramOutputX_ITE.html") success: true
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutputX_ITE.html
===========================================
Reload and provide text output using Java DOM, which includes default attribute values
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
===========================================
Test success: x3dLoader.loadX3DfromXML(HelloWorldProgramOutput.x3d), x3dLoader.getX3dObjectTree()
===========================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3' xmlns:ds='http://www.w3.org/2000/09/xmldsig#' xmlns:xenc='http://www.w3.org/2001/04/xmlenc#' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.3.xsd'>
  <!-- x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true -->
  <head>
    <!-- comment #1 -->
    <!-- comment #2 -->
    <!-- comment #3 -->
    <!-- comment #4 -->
    <component level='3' name='Navigation'/>
    <component level='1' name='Shaders'/>
    <component level='2' name='CADGeometry'/>
    <component level='2' name='DIS'/>
    <component level='1' name='H-Anim'/>
    <component level='1' name='Grouping'/>
    <component level='1' name='Layering'/>
    <unit category='angle' conversionFactor='1.0' name='AngleUnitConversion'/>
    <unit category='length' conversionFactor='1.0' name='LengthUnitConversion'/>
    <unit category='force' conversionFactor='4.4482' name='ForceFromPoundsToNewtons'/>
    <meta content='HelloWorldProgramOutput.x3d' name='title'/>
    <meta content='continued development and testing in progress' name='info'/>
    <meta content='Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)' name='description'/>
    <meta content='https://www.web3d.org/specifications/java/X3DJSAIL.html' name='reference'/>
    <meta content='HelloWorldProgramOutput.java' name='generator'/>
    <meta content='6 September 2016' name='created'/>
    <meta content='7 April 2020' name='modified'/>
    <meta content='X3D Java Scene Access Interface Library (X3DJSAIL)' name='generator'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java' name='generator'/>
    <meta content='Netbeans http://www.netbeans.org' name='generator'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:' name='reference'/>
    <meta content='HelloWorldProgramOutput.txt' name='reference'/>
    <meta content='HelloWorldProgramOutput.x3dv' name='reference'/>
    <meta content='HelloWorldProgramOutput.wrl' name='reference'/>
    <meta content='HelloWorldProgramOutput.html' name='reference'/>
    <meta content='https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='reference'/>
    <meta content='https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d' name='identifier'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <ViewpointGroup center='0 0 0' containerField='children' description='Available viewpoints' displayed='true' retainUserOffsets='false' size='0 0 0'>
      <Viewpoint DEF='DefaultView' centerOfRotation='0 0 0' containerField='children' description='Hello X3DJSAIL' fieldOfView='0.7854' jump='true' orientation='0 0 1 0' position='0 0 10' retainUserOffsets='false'/>
      <Viewpoint DEF='TopDownView' centerOfRotation='0 0 0' containerField='children' description='top-down view from above' fieldOfView='0.7854' jump='true' orientation='1 0 0 -1.570796' position='0 100 0' retainUserOffsets='false'/>
    </ViewpointGroup>
    <NavigationInfo avatarSize='0.25 1.6 0.75' containerField='children' headlight='true' speed='1' transitionTime='1.0' transitionType='"LINEAR"' type='"EXAMINE" "FLY" "ANY"' visibilityLimit='0'/>
    <WorldInfo DEF='WorldInfoDEF' containerField='children' title='HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)'/>
    <WorldInfo USE='WorldInfoDEF' containerField='children'/>
    <WorldInfo USE='WorldInfoDEF' containerField='children'/>
    <MetadataString DEF='scene.addChildMetadata' containerField='metadata' name='test' value='"Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"'/>
    <LayerSet DEF='scene.addChildLayerSetTest' activeLayer='0' containerField='children' order='0'/>
    <Transform DEF='LogoGeometryTransform' bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' containerField='children' rotation='0 0 1 0' scale='1 1 1' scaleOrientation='0 0 1 0' translation='0 1.5 0'>
      <Anchor bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' description='select for X3D Java SAI Library (X3DJSAIL) description' url='"../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html"'>
        <Shape DEF='BoxShape' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
          <Appearance containerField='appearance'>
            <Material DEF='GreenMaterial' ambientIntensity='0.2' containerField='material' diffuseColor='0 1 1' emissiveColor='0.8 0 0' shininess='0.2' specularColor='0 0 0' transparency='0.1'/>
            <ImageTexture containerField='texture' repeatS='true' repeatT='true' url='"images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"'/>
          </Appearance>
          <Box DEF='test-NMTOKEN_regex.0123456789' class='untextured' containerField='geometry' size='2 2 2' solid='true'/>
        </Shape>
      </Anchor>
    </Transform>
    <Shape DEF='LineShape' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Appearance containerField='appearance'>
        <Material ambientIntensity='0.2' containerField='material' diffuseColor='0.8 0.8 0.8' emissiveColor='0.6 0.19607843 0.8' shininess='0.2' specularColor='0 0 0' transparency='0'/>
      </Appearance>
      <IndexedLineSet colorPerVertex='true' containerField='geometry' coordIndex='0 1 2 3 4 0'>
        <!-- Coordinate 3-tuple point count: 6 -->
        <Coordinate containerField='coord' point='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
      </IndexedLineSet>
    </Shape>
    <PositionInterpolator DEF='BoxPathAnimator' containerField='children' key='0 0.125 0.375 0.625 0.875 1' keyValue='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
    <TimeSensor DEF='OrbitClock' containerField='children' cycleInterval='8.0' enabled='true' loop='true' pauseTime='0' resumeTime='0' startTime='0' stopTime='0'/>
    <ROUTE fromField='fraction_changed' fromNode='OrbitClock' toField='set_fraction' toNode='BoxPathAnimator'/>
    <ROUTE fromField='value_changed' fromNode='BoxPathAnimator' toField='set_translation' toNode='LogoGeometryTransform'/>
    <Transform DEF='TextTransform' bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' containerField='children' rotation='0 0 1 0' scale='1 1 1' scaleOrientation='0 0 1 0' translation='0 -1.5 0'>
      <Shape bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
        <Appearance containerField='appearance'>
          <Material USE='GreenMaterial' ambientIntensity='0.2' containerField='material' diffuseColor='0.8 0.8 0.8' emissiveColor='0 0 0' shininess='0.2' specularColor='0 0 0' transparency='0'/>
        </Appearance>
        <Text containerField='geometry' maxExtent='0.0' solid='false' string='"X3D Java" "SAI Library" "X3DJSAIL"'>
          <!-- Comment example A, plain quotation marks: He said, "Immel did it!" -->
          <!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
          <MetadataSet containerField='metadata' name='EscapedQuotationMarksMetadataSet'>
            <MetadataString containerField='value' name='quotesTestC' value='"MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""'/>
            <MetadataString containerField='value' name='extraChildTest' value='"checks MetadataSetObject addValue() method"'/>
          </MetadataSet>
          <FontStyle containerField='fontStyle' family='"SERIF"' horizontal='true' justify='"MIDDLE" "MIDDLE"' leftToRight='true' size='1.0' spacing='1.0' style='PLAIN' topToBottom='true'/>
        </Text>
      </Shape>
      <Collision bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' enabled='true'>
        <!-- test containerField='proxy' -->
        <Shape DEF='ProxyShape' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='proxy'>
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' -->
          <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' -->
          <!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""}) -->
          <!-- reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
          <Text containerField='geometry' maxExtent='0.0' solid='false' string='"One, Two, Text" "" "He said, \"Immel did it!\" \"\""'/>
        </Shape>
      </Collision>
      <!-- It's a beautiful world -->
      <!-- ... for you! -->
      <!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
    </Transform>
    <!-- repeatedly spin 180 degrees as a readable special effect -->
    <OrientationInterpolator DEF='SpinInterpolator' containerField='children' key='0 0.5 1' keyValue='0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964'/>
    <TimeSensor DEF='SpinClock' containerField='children' cycleInterval='5.0' enabled='true' loop='true' pauseTime='0' resumeTime='0' startTime='0' stopTime='0'/>
    <ROUTE fromField='fraction_changed' fromNode='SpinClock' toField='set_fraction' toNode='SpinInterpolator'/>
    <ROUTE fromField='value_changed' fromNode='SpinInterpolator' toField='rotation' toNode='TextTransform'/>
    <Group DEF='BackgroundGroup' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Background DEF='GradualBackground' containerField='children' skyColor='0 0 0' transparency='0'/>
      <Script DEF='colorTypeConversionScript' containerField='children' directOutput='false' mustEvaluate='false'>
        <field accessType='inputOnly' name='colorInput' type='SFColor'/>
        <field accessType='outputOnly' name='colorsOutput' type='MFColor'/>
        <![CDATA[
ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}
]]>
      </Script>
      <ColorInterpolator DEF='ColorAnimator' containerField='children' key='0 0.5 1' keyValue='0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1'>
        <!-- AZURE to INDIGO and back again -->
      </ColorInterpolator>
      <TimeSensor DEF='ColorClock' containerField='children' cycleInterval='60.0' enabled='true' loop='true' pauseTime='0' resumeTime='0' startTime='0' stopTime='0'/>
      <ROUTE fromField='colorsOutput' fromNode='colorTypeConversionScript' toField='skyColor' toNode='GradualBackground'/>
      <ROUTE fromField='value_changed' fromNode='ColorAnimator' toField='colorInput' toNode='colorTypeConversionScript'/>
      <ROUTE fromField='fraction_changed' fromNode='ColorClock' toField='set_fraction' toNode='ColorAnimator'/>
    </Group>
    <ProtoDeclare appinfo='tooltip: ArtDeco01Material prototype is a Material node' name='ArtDeco01Material'>
      <ProtoInterface>
        <field accessType='inputOutput' appinfo='tooltip for descriptionField' name='description' type='SFString' value='ArtDeco01Material prototype is a Material node'/>
        <field accessType='inputOutput' name='enabled' type='SFBool' value='true'/>
      </ProtoInterface>
      <ProtoBody>
        <!-- Initial node of ProtoBody determines prototype node type -->
        <Material ambientIntensity='0.25' containerField='material' diffuseColor='0.282435 0.085159 0.134462' emissiveColor='0 0 0' shininess='0.127273' specularColor='0.276305 0.11431 0.139857' transparency='0'/>
        <!-- [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material" -->
        <!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
        <TouchSensor containerField='children' description='within ProtoBody' enabled='true'>
          <IS>
            <connect nodeField='description' protoField='description'/>
            <connect nodeField='enabled' protoField='enabled'/>
          </IS>
        </TouchSensor>
      </ProtoBody>
    </ProtoDeclare>
    <ExternProtoDeclare appinfo='this is a different Material node' name='ArtDeco02Material' url='"http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material"'>
      <!-- [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
      <field accessType='inputOutput' appinfo='tooltip for descriptionField' name='description' type='SFString'/>
    </ExternProtoDeclare>
    <!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
    <Shape DEF='TestShape1' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Appearance DEF='TestAppearance1' containerField='appearance'>
        <!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance containerField='material' name='ArtDeco01Material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" -->
          <fieldValue name='description' value='ArtDeco01Material can substitute for a Material node'/>
        </ProtoInstance>
      </Appearance>
      <Sphere containerField='geometry' radius='0.001' solid='true'/>
    </Shape>
    <Shape DEF='TestShape2' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Appearance DEF='TestAppearance2' containerField='appearance'>
        <!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
        <ProtoInstance DEF='ArtDeco02MaterialDEF' containerField='material' name='ArtDeco02Material'>
          <!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
          <fieldValue name='description' value='ArtDeco02Material can substitute for another Material node'/>
        </ProtoInstance>
      </Appearance>
      <Cone bottom='true' bottomRadius='0.001' containerField='geometry' height='0.001' side='true' solid='true'/>
    </Shape>
    <Shape DEF='TestShape3' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Appearance DEF='TestAppearance3' containerField='appearance'>
        <!-- ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. -->
        <ProtoInstance USE='ArtDeco02MaterialDEF' containerField='material'/>
      </Appearance>
      <Cylinder bottom='true' containerField='geometry' height='0.001' radius='0.001' side='true' solid='true' top='true'/>
    </Shape>
    <Inline DEF='inlineSceneDef' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' load='true' url='"someOtherScene.x3d" "https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"'/>
    <IMPORT AS='WorldInfoDEF2' importedDEF='WorldInfoDEF' inlineDEF='inlineSceneDef'/>
    <EXPORT AS='WorldInfoDEF3' localDEF='WorldInfoDEF'/>
    <ProtoDeclare appinfo='mimic a Material node and modulate fields as an animation effect' documentation='http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html' name='MaterialModulator'>
      <ProtoInterface>
        <field accessType='inputOutput' name='enabled' type='SFBool' value='true'/>
        <field accessType='inputOutput' name='diffuseColor' type='SFColor' value='0 0 0'/>
        <field accessType='inputOutput' name='emissiveColor' type='SFColor' value='0.05 0.05 0.5'/>
        <field accessType='inputOutput' name='specularColor' type='SFColor' value='0 0 0'/>
        <field accessType='inputOutput' name='transparency' type='SFFloat' value='0.0'/>
        <field accessType='inputOutput' name='shininess' type='SFFloat' value='0.0'/>
        <field accessType='inputOutput' name='ambientIntensity' type='SFFloat' value='0.0'/>
      </ProtoInterface>
      <ProtoBody>
        <Material DEF='MaterialNode' ambientIntensity='0.2' containerField='material' diffuseColor='0.8 0.8 0.8' emissiveColor='0 0 0' shininess='0.2' specularColor='0 0 0' transparency='0'>
          <IS>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
            <connect nodeField='emissiveColor' protoField='emissiveColor'/>
            <connect nodeField='specularColor' protoField='specularColor'/>
            <connect nodeField='transparency' protoField='transparency'/>
            <connect nodeField='shininess' protoField='shininess'/>
            <connect nodeField='ambientIntensity' protoField='ambientIntensity'/>
          </IS>
        </Material>
        <!-- Only first node (the node type) is renderable, others are along for the ride -->
        <Script DEF='MaterialModulatorScript' containerField='children' directOutput='false' mustEvaluate='false'>
          <field accessType='inputOutput' name='enabled' type='SFBool'/>
          <field accessType='inputOutput' name='diffuseColor' type='SFColor'/>
          <field accessType='outputOnly' name='newColor' type='SFColor'/>
          <field accessType='inputOnly' name='clockTrigger' type='SFTime'/>
          <IS>
            <connect nodeField='enabled' protoField='enabled'/>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
          </IS>
          <![CDATA[
ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;
    
    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}
]]>
        </Script>
      </ProtoBody>
    </ProtoDeclare>
    <!-- Test success: declarative statement createDeclarativeShapeTests() -->
    <Group DEF='DeclarativeGroupExample' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Shape bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
        <MetadataString DEF='FindableMetadataStringTest' containerField='metadata' name='findThisNameValue' value='"test case"'/>
        <Appearance DEF='DeclarativeAppearanceExample' containerField='appearance'>
          <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
          <ProtoInstance DEF='MyMaterialModulator' containerField='material' name='MaterialModulator'/>
        </Appearance>
        <Cone bottom='false' bottomRadius='0.05' containerField='geometry' height='0.1' side='true' solid='true'/>
      </Shape>
      <!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
    </Group>
    <!-- Test success: declarative statement addChild() -->
    <!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
    <!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
    <!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
    <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
    <Group DEF='TestFieldObjectsGroup' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <!-- testFieldObjects() results -->
      <!-- SFBool default=true, true=true, false=false, negate()=true -->
      <!-- MFBool default=, initial=true false true, negate()=false true false -->
      <!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
      <!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
      <!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
      <!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
      <!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
    </Group>
    <Sound containerField='children' direction='0 0 1' intensity='1' location='0 1.6 0' maxBack='10' maxFront='10' minBack='1' minFront='1' priority='0' spatialize='true'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <AudioClip containerField='source' description='chimes' loop='false' pauseTime='0' pitch='1.0' resumeTime='0' startTime='0' stopTime='0' url='"chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d -->
      </AudioClip>
    </Sound>
    <Sound containerField='children' direction='0 0 1' intensity='1' location='0 1.6 0' maxBack='10' maxFront='10' minBack='1' minFront='1' priority='0' spatialize='true'>
      <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
      <MovieTexture containerField='source' description='mpgsys.mpg from ConformanceNist suite' loop='false' pauseTime='0' repeatS='true' repeatT='true' resumeTime='0' speed='1.0' startTime='0' stopTime='0' url='"mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg"'>
        <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
        <!-- Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList" -->
      </MovieTexture>
    </Sound>
    <!-- Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true -->
    <!-- Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false -->
    <!-- Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false -->
    <!-- Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
    <!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
    <!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
    <Shape DEF='ExtrusionShape' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
      <!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
      <Appearance DEF='TransparentAppearance' containerField='appearance'>
        <Material ambientIntensity='0.2' containerField='material' diffuseColor='0.8 0.8 0.8' emissiveColor='0 0 0' shininess='0.2' specularColor='0 0 0' transparency='1.0'/>
      </Appearance>
      <Extrusion DEF='ExampleExtrusion' beginCap='true' ccw='true' containerField='geometry' convex='true' creaseAngle='0.0' crossSection='1 1 1 -1 -1 -1 -1 1 1 1' endCap='true' orientation='0 0 1 0' scale='1 1' solid='true' spine='0 0 0 0 1 0'/>
    </Shape>
    <Group bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <!-- Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes -->
      <ProtoDeclare name='NewWorldInfo'>
        <ProtoInterface>
          <field accessType='initializeOnly' name='description' type='SFString'/>
        </ProtoInterface>
        <ProtoBody>
          <WorldInfo containerField='children'/>
        </ProtoBody>
      </ProtoDeclare>
      <ProtoInstance DEF='Proto1' containerField='children' name='NewWorldInfo'>
        <fieldValue name='description' value='testing 1 2 3'/>
      </ProtoInstance>
      <Group DEF='Node2' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
        <!-- intentionally empty -->
      </Group>
      <ProtoInstance DEF='Proto3' containerField='children' name='NewWorldInfo'/>
      <Transform DEF='Node4' bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' containerField='children' rotation='0 0 1 0' scale='1 1 1' scaleOrientation='0 0 1 0' translation='0 0 0'>
        <!-- intentionally empty -->
      </Transform>
      <!-- Test satisfactorily creates MFNode children array as an ordered list with mixed content -->
    </Group>
    <ProtoDeclare name='ShaderProto'>
      <ProtoBody>
        <ProgramShader containerField='shaders'/>
      </ProtoBody>
    </ProtoDeclare>
    <Shape bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
      <Appearance containerField='appearance'>
        <!-- Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes -->
        <!-- Test satisfactorily creates MFNode shaders array as an ordered list with mixed content -->
        <ProgramShader DEF='TestShader1' containerField='shaders'>
          <ShaderProgram DEF='TestShader2' containerField='programs' type='VERTEX'/>
        </ProgramShader>
        <ProtoInstance DEF='TestShader3' containerField='shaders' name='ShaderProto'/>
        <ComposedShader DEF='TestShader4' containerField='shaders'>
          <ShaderPart DEF='TestShader5' containerField='parts' type='VERTEX'/>
        </ComposedShader>
      </Appearance>
    </Shape>
    <Transform DEF='SpecialtyNodes' bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' containerField='children' rotation='0 0 1 0' scale='1 1 1' scaleOrientation='0 0 1 0' translation='0 0 0'>
      <CADLayer bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
        <CADAssembly bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'>
          <CADPart bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' containerField='children' rotation='0 0 1 0' scale='1 1 1' scaleOrientation='0 0 1 0' translation='0 0 0'>
            <CADFace bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children'/>
          </CADPart>
        </CADAssembly>
      </CADLayer>
      <EspduTransform address='localhost' applicationID='0' articulationParameterCount='0' bboxCenter='0 0 0' bboxSize='-1 -1 -1' center='0 0 0' collisionType='0' containerField='children' deadReckoning='0' detonationLocation='0 0 0' detonationRelativeLocation='0 0 0' detonationResult='0' enabled='true' entityCategory='0' entityCountry='0' entityDomain='0' entityExtra='0' entityID='0' entityKind='0' entitySpecific='0' entitySubcategory='0' eventApplicationID='0' eventEntityID='0' eventNumber='0' eventSiteID='0' fireMissionIndex='0' fired1='false' fired2='false' firingRange='0' firingRate='0' forceID='0' fuse='0' geoCoords='0 0 0' geoSystem='"GD" "WE"' linearAcceleration='0 0 0' linearVelocity='0 0 0' multicastRelayPort='0' munitionApplicationID='0' munitionEndPoint='0 0 0' munitionEntityID='0' munitionQuantity='0' munitionSiteID='0' munitionStartPoint='0 0 0' networkMode='standAlone' port='0' readInterval='0.1' rotation='0 0 1 0' rtpHeaderExpected='false' scale='1 1 1' scaleOrientation='0 0 1 0' siteID='0' translation='0 0 0' warhead='0' writeInterval='1.0'/>
      <ReceiverPdu address='localhost' applicationID='0' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' enabled='true' entityID='0' geoCoords='0 0 0' geoSystem='"GD" "WE"' multicastRelayPort='0' networkMode='standAlone' port='0' radioID='0' readInterval='0.1' receivedPower='0.0' receiverState='0' rtpHeaderExpected='false' siteID='0' transmitterApplicationID='0' transmitterEntityID='0' transmitterRadioID='0' transmitterSiteID='0' whichGeometry='1' writeInterval='1.0'/>
      <SignalPdu address='localhost' applicationID='0' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' dataLength='0' enabled='true' encodingScheme='0' entityID='0' geoCoords='0 0 0' geoSystem='"GD" "WE"' multicastRelayPort='0' networkMode='standAlone' port='0' radioID='0' readInterval='0.1' rtpHeaderExpected='false' sampleRate='0' samples='0' siteID='0' tdlType='0' whichGeometry='1' writeInterval='1.0'/>
      <TransmitterPdu address='localhost' antennaLocation='0 0 0' antennaPatternLength='0' antennaPatternType='0' applicationID='0' bboxCenter='0 0 0' bboxSize='-1 -1 -1' containerField='children' cryptoKeyID='0' cryptoSystem='0' enabled='true' entityID='0' frequency='0' geoCoords='0 0 0' geoSystem='"GD" "WE"' inputSource='0' lengthOfModulationParameters='0' modulationTypeDetail='0' modulationTypeMajor='0' modulationTypeSpreadSpectrum='0' modulationTypeSystem='0' multicastRelayPort='0' networkMode='standAlone' port='0' power='0.0' radioEntityTypeCategory='0' radioEntityTypeCountry='0' radioEntityTypeDomain='0' radioEntityTypeKind='0' radioEntityTypeNomenclature='0' radioEntityTypeNomenclatureVersion='0' radioID='0' readInterval='0.1' relativeAntennaLocation='0 0 0' rtpHeaderExpected='false' siteID='0' transmitFrequencyBandwidth='0.0' transmitState='0' whichGeometry='1' writeInterval='1.0'/>
      <DISEntityManager address='localhost' applicationID='0' containerField='children' port='0' siteID='0'>
        <DISEntityTypeMapping category='0' containerField='mapping' country='0' domain='0' extra='0' kind='0' specific='0' subcategory='0'/>
      </DISEntityManager>
    </Transform>
  </Scene>
</X3D>
===========================================
Test success: x3dLoader.getDomDocument() and x3dLoader.toStringX3D(domDocument)
Now test x3dLoader.toX3dObjectTree(domDocument)
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
Warning: toFileX3D() is overwriting prior file HelloWorldProgramOutput_ReloadedDOM.x3d
Test success: x3dLoader.toX3dObjectTree(domDocument), save HelloWorldProgramOutput_ReloadedDOM.x3d
x3dLoader validation result: no issues reported.
===========================================
Test loadModelFromFileX3D(String) and loadModelFromFileX3D(File)
checking both .x3d and .xml encodings:
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
newX3DModel loadSuccess=true, isEmpty()=false, validate()=success
===========================================
===========================================
Check file sizes for various forms of compression
Source file HelloWorldProgramOutput.x3d 22318 bytes
===========================================
Test toFileEXI() with EXIficient
HelloWorldProgramOutput_EXIFICIENT.exi  filesize 3331 bytes, compression 14.93% of original
===========================================
Test fromFileEXI() with EXIficient
Warning: fromFileEXI() is overwriting prior file HelloWorldProgramOutput_EXIFICIENT.exi
EXI decompressed examples\temp.exiInputTransformed.x3d size=22451 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
  fromFileEXIsuccess=true for HelloWorldProgramOutput_EXIFICIENT.exi
exiModel.validate() results:  success
===========================================
Test toFileEXI() with OpenEXI: testing in progress
HelloWorldProgramOutputOPENEXI.exi  filesize 3331 bytes, compression 14.93% of original
===========================================
Test fromFileEXI() with OpenEXI: TODO testing in progress, not fully implemented yet
===========================================
Test toFileGZIP()
HelloWorldProgramOutput.gz  filesize 5993 bytes, compression 26.85% of original
===========================================
Test toFileZip()
HelloWorldProgramOutput.zip filesize 6249 bytes, compression 28.00% of original
===========================================
===========================================
Test CommandLine invocations
CommandLine [-help]
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.CommandLine
       [-help | -version | -home | -javadoc | -resources | -hints | -regexes | -tooltips | -X3DUOM]
       [-properties [propertiesFile]]
       [sourceModel.x3d | sourceModel.exi [-fromEXI] | sourceModel.gz [-fromGZIP] | sourceModel.zip [-fromZIP]]
       [-canonical] [-validate] [-EXIFICIENT | -OpenEXI]
       [-Tidy | -toX3D | -toXML | -toClassicVrml | -toJava | -toJSON | -toPython | -toVRML97]
       [-toHTML | -toX3DOM | -toX_ITE | -toMarkdown | -toEXI | -toGZIP | -toZIP]
       [-tofile [resultFile.*]] [-toImage [snapshotName.*]]

-classpath X3DJSAIL.*.jar         # optional classpath, can be set as environment variable
org.web3d.x3d.jsail.CommandLine   # invoke CommandLine application
==================================#====== informational ======================
-help                             # provide this help message
-version                          # version date when this X3DJSAIL build was autogenerated
-home                             # launch X3DJSAIL home page
-javadoc                          # launch X3DJSAIL javadoc page
-resources                        # launch X3D Resources page
-hints                            # launch X3D Scene Authoring Hints page
-regex                            # launch X3D Regular Expressions page
-tooltips                         # launch X3D Tooltips page
-X3DUOM                           # launch X3D Unified Object Model (X3DUOM) page
 =================================#====== properties, inputs =================
-properties [propertiesFile]      # override X3DJSAIL properties (default file: X3DJSAIL.properties)
-EXIFICIENT                       # use Exificient (default) as EXI_ENGINE
-OpenEXI                          # use OpenEXI (Nagasena)   as EXI_ENGINE (testing in progress)
sourceModel.x3d                   # source model file name, X3D  format
sourceModel.exi [-fromEXI]        # source model file name, EXI  format
sourceModel.gz  [-fromGZIP]       # source model file name, GZIP format
sourceModel.zip [-fromZIP]        # source model file name, ZIP  format
==================================#====== operations =========================
-canonical                        # canonical XML output using X3D Canonicalization (c14n)
-validate                         # validate correctness of loaded model
-Tidy                             # X3D-Tidy cleanup in .x3d (XML) format
-toX3D                            # output in .x3d (XML) format
-toXML                            # output in .xml (X3D) format
-toClassicVrml                    # output in .x3dv (ClassicVrml) X3D format
-toJava                           # output in .java source code using X3DJSAIL
-toJSON                           # output in .json (JavaScript Object Notation) format
-toPython                         # output in .py Python source code
-toVRML97                         # output in .wrl  (VRML97) format
-toHTML                           # output in .html  pretty-print documentation
-toX3DOM                          # output in .xhtml page with X3DOM display of X3D model
-toX_ITE                          # output in .html  page with X_ITE display of X3D model
-toMarkdown                       # output document metadata (meta tags) in .md (Markdown) format
-toEXI                            # output in .exi (Efficient XML Interchange) compressed-XML format
-toGZIP                           # output in .gz  (X3D XML) format, with gzip compression
-toZIP                            # output in .zip (X3D XML) format, with zip  compression
==================================#====== outputs ============================
-tofile  [resultFile.*]           # specify output filename (otherwise original name with extension)
-toImage [snapshotName.*]         # create output images for each Viewpoint using Blender

===========================================
CommandLine [HelloWorldProgramOutput.x3d, -canonicalize, -toFile, HelloWorldProgramOutputCanonical.xml]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-canonicalize" for X3D and XML canonicalization (C14N)
CommandLine parameter: "-toFile" "HelloWorldProgramOutputCanonical.xml" for result file name root HelloWorldProgramOutputCanonical
CommandLine invocation: new X3dCanonicalizer(C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.x3d,HelloWorldProgramOutputCanonical.xml)
 INFO [main] (X3dHeaderChecker.java:446) - final canonical 3.3 DOCTYPE found
 INFO [main] (X3dHeaderChecker.java:553) - -f final DTD was set, no action taken
 INFO [main] (X3dHeaderChecker.java:647) - Scene "C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d" was not modified
...x3dCanonicalizer.isCanonical()=false
Warning: x3dCanonicalizer is overwriting prior file HelloWorldProgramOutputCanonical.xml
now check result...
CommandLine [HelloWorldProgramOutputCanonical.xml, -validate]
parameter: source file HelloWorldProgramOutputCanonical.xml filesize 22335 bytes
CommandLine parameter: "-validate" for model validation
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
validate results: success, no problems noted
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toX3D, -toFile, HelloWorldProgramOutput_CommandLine.x3d]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toX3D" for conversion to X3D encoding
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.x3d" for result file name root HelloWorldProgramOutput_CommandLine
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to X3D:
Warning: toFileX3D() is overwriting prior file HelloWorldProgramOutput_CommandLine.x3d
file conversion successful: HelloWorldProgramOutput_CommandLine.x3d (22318 bytes)
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toVRML97, -toFile, HelloWorldProgramOutput_CommandLine.wrl]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toVRML97" for conversion to VRML97 encoding
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.wrl" for result file name root HelloWorldProgramOutput_CommandLine
convert to VRML97:
[Error] illegal &lt;component name='Layering'/&gt;
[Info] &lt;meta name='info' content='continued development and testing in progress'/&gt;
[Warning] Metadata nodes are not supported as a child of current node Text in VRML97 encoding.  The child MetadataSet node has been moved to immediately follow the parent Text. Additional Metadata* leaf node(s) follow that are similarly adjusted. [check X3D source or VRML output to find questionable &lt;Text/&gt; with parent Shape]
[Warning] IS/connect ignored for nodeField='description' since not a supported field in VRML97 for parent TouchSensor [check X3D source or VRML output to find questionable TouchSensor]
[Warning] Script field 'enabled' has accessType 'inputOutput' (exposedField), which is only allowed in X3D Script node, not VRML97 Script node.  Using exposedField anyway, may cause errors. [field 'enabled' parent  DEF='MaterialModulatorScript']
[Warning] Script field 'diffuseColor' has accessType 'inputOutput' (exposedField), which is only allowed in X3D Script node, not VRML97 Script node.  Using exposedField anyway, may cause errors. [field 'diffuseColor' parent  DEF='MaterialModulatorScript']
[Warning] ProtoInterface &lt;field name='description'/&gt; is unreferenced in ProtoBody with no corresponding IS/connect/@protoField [check X3D source or VRML output to find questionable field 'description' parent ProtoDeclare NewWorldInfo]
Warning: fileStylesheetConversion() is overwriting prior file HelloWorldProgramOutput_CommandLine.wrl
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toX3DV, -toFile, HelloWorldProgramOutput_CommandLine.x3dv]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toX3DV" for conversion to ClassicVRML encoding
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.x3dv" for result file name root HelloWorldProgramOutput_CommandLine
convert to ClassicVRML:
Warning: fileStylesheetConversion() is overwriting prior file HelloWorldProgramOutput_CommandLine.x3dv
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toMarkdown, -toFile, HelloWorldProgramOutputCatalog.md]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toMarkdown" for producing .md model meta information markdown
CommandLine parameter: "-toFile" "HelloWorldProgramOutputCatalog.md" for result file name root HelloWorldProgramOutputCatalog
convert to .md model meta information markdown, include subdirectories in meta links: true
Warning: fileStylesheetConversion() is overwriting prior file HelloWorldProgramOutputCatalog.md
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toMarkdown, -toFile, HelloWorldProgramOutput.md]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toMarkdown" for producing .md model meta information markdown
CommandLine parameter: "-toFile" "HelloWorldProgramOutput.md" for result file name root HelloWorldProgramOutput
convert to .md model meta information markdown, include subdirectories in meta links: true
Warning: fileStylesheetConversion() is overwriting prior file HelloWorldProgramOutput.md
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -EXIFICIENT, -toEXI, -toFile, HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-EXIFICIENT" invoked ConfigurationProperties.setExiEngine(EXIFICIENT);
CommandLine parameter: "-toEXI" for conversion to compressed EXI containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi" for result file name root HelloWorldProgramOutput_CommandLine_EXIFICIENT
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to EXI using EXIFICIENT:
source: HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi filesize 3331 bytes, compression 14.93% of original
===========================================
CommandLine [HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi, -EXIFICIENT, -fromEXI, -toFile, HelloWorldProgramOutput_CommandLine_EXIFICIENT.RoundTrip.x3d]
parameter: source file HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi filesize 3331 bytes
CommandLine parameter: "-EXIFICIENT" invoked ConfigurationProperties.setExiEngine(EXIFICIENT);
CommandLine parameter: "-fromEXI" for conversion from compressed EXI containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine_EXIFICIENT.RoundTrip.x3d" for result file name root HelloWorldProgramOutput_CommandLine_EXIFICIENT.RoundTrip
Warning: fromFileEXI() is overwriting prior file HelloWorldProgramOutput_CommandLine_EXIFICIENT.exi
EXI decompressed examples\temp.exiInputTransformed.x3d size=22451 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -OpenEXI, -toEXI, -toFile, HelloWorldProgramOutput_CommandLine.OPENEXI.exi]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-OpenEXI" invoked ConfigurationProperties.setExiEngine(OPENEXI);
  Warning: "OPENEXI" testing in progress, can also use EXIFICIENT instead.
CommandLine parameter: "-toEXI" for conversion to compressed EXI containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.OPENEXI.exi" for result file name root HelloWorldProgramOutput_CommandLine.OPENEXI
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to EXI using OPENEXI:
source: HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput_CommandLine.OPENEXI.exi filesize 3387 bytes, compression 15.18% of original
===========================================
CommandLine [HelloWorldProgramOutput_CommandLine.OPENEXI.exi, -OpenEXI, -fromEXI, -toFile, HelloWorldProgramOutput_CommandLine.OPENEXI.RoundTrip.x3d]
parameter: source file HelloWorldProgramOutput_CommandLine.OPENEXI.exi filesize 3387 bytes
CommandLine parameter: "-OpenEXI" invoked ConfigurationProperties.setExiEngine(OPENEXI);
  Warning: "OPENEXI" testing in progress, can also use EXIFICIENT instead.
CommandLine parameter: "-fromEXI" for conversion from compressed EXI containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.OPENEXI.RoundTrip.x3d" for result file name root HelloWorldProgramOutput_CommandLine.OPENEXI.RoundTrip
Warning: fromFileEXI() is overwriting prior file HelloWorldProgramOutput_CommandLine.OPENEXI.exi
EXI decompressed examples\temp.exiInputTransformed.x3d size=22588 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toGZIP, -toFile, HelloWorldProgramOutput_CommandLine.x3d.gz]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toGZIP" for conversion to compressed GZIP containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.x3d.gz" for result file name root HelloWorldProgramOutput_CommandLine.x3d
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to GZIP:
source: HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput_CommandLine.x3d.gz  filesize 5993 bytes, compression 26.85% of original
===========================================
CommandLine [HelloWorldProgramOutput_CommandLine.x3d.gz, -fromGZIP]
parameter: source file HelloWorldProgramOutput_CommandLine.x3d.gz filesize 5993 bytes
CommandLine parameter: "-fromGZIP" for conversion from compressed GZIP containing model
  fromFileGZIP() output modelFileName HelloWorldProgramOutput_CommandLine.x3d
Warning: fromFileGZIP() is overwriting prior file HelloWorldProgramOutput_CommandLine.x3d
gunzipped HelloWorldProgramOutput_CommandLine.x3d size=22318 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
CommandLine [HelloWorldProgramOutput.x3d, -toZIP, -toFile, HelloWorldProgramOutput_CommandLine.x3d.zip]
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toZIP" for conversion to compressed ZIP containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLine.x3d.zip" for result file name root HelloWorldProgramOutput_CommandLine.x3d
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to ZIP:
source: HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput_CommandLine.x3d.zip filesize 6249 bytes, compression 28.00% of original
===========================================
CommandLine [HelloWorldProgramOutput_CommandLine.x3d.zip, -fromZIP, -toFile, HelloWorldProgramOutput_CommandLineUnzipped.x3d]
parameter: source file HelloWorldProgramOutput_CommandLine.x3d.zip filesize 6249 bytes
CommandLine parameter: "-fromZIP" for conversion from compressed ZIP containing model
CommandLine parameter: "-toFile" "HelloWorldProgramOutput_CommandLineUnzipped.x3d" for result file name root HelloWorldProgramOutput_CommandLineUnzipped
Warning: fromFileZIP() modelFileName was empty, unzipping found initial X3D file to load: HelloWorldProgramOutput.x3d
Warning: fromFileZIP() is overwriting prior file HelloWorldProgramOutput_CommandLineUnzipped.x3d
Unzipped HelloWorldProgramOutput_CommandLineUnzipped.x3d size=22318 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
ConfigurationProperties.setDebugModeActive(true);
x3dModel.validate() results with ConfigurationProperties.setDebugModeActive(true): 
ProtoInstance ArtDeco01Material DEF='' has corresponding ProtoDeclare
ProtoInstance ArtDeco02Material DEF='ArtDeco02MaterialDEF' has corresponding ExternProtoDeclare (but node type is unconfirmed)
ProtoInstance MaterialModulator DEF='MyMaterialModulator' has corresponding ProtoDeclare
ProtoInstance NewWorldInfo DEF='Proto1' has corresponding ProtoDeclare
ProtoInstance NewWorldInfo DEF='Proto3' has corresponding ProtoDeclare
ProtoInstance ShaderProto DEF='TestShader3' has corresponding ProtoDeclare

===========================================
HelloWorldProgram complete.
===========================================
testBlenderLauncher();  // check Blender capabilities
Blender default path=[not set]
Blender.checkBlenderPath() updated path=C:\Program Files\Blender Foundation\Blender 2.82\
=================================
BlenderLauncher.hasBlender()=true
=================================
Blender version=Blender 2.82 (sub 7)
===========================================
BlenderLauncher.run("-help")
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.BlenderLauncher sourceFile [-convert [resultFile]] [-toImage [snapshotName.*]] [-home | -help | -version | -properties fileName.properties | -BLENDER_PATH directoryPath]
http://www.blender.org
Blender help:
Blender 2.82 (sub 7)
Usage: blender [args ...] [file] [args ...]
Render Options:
-b or --background 
	Run in background (often used for UI-less rendering).
-a or --render-anim 
	Render frames from start to end (inclusive).
-S or --scene <name>
	Set the active scene <name> for rendering.
-f or --render-frame <frame>
	Render frame <frame> and save it.
	* +<frame> start frame relative, -<frame> end frame relative.
	* A comma separated list of frames can also be used (no spaces).
	* A range of frames can be expressed using '..' separator between the first and last frames (inclusive).

-s or --frame-start <frame>
	Set start to frame <frame>, supports +/- for relative frames too.
-e or --frame-end <frame>
	Set end to frame <frame>, supports +/- for relative frames too.
-j or --frame-jump <frames>
	Set number of frames to step forward after each rendered frame.
-o or --render-output <path>
	Set the render path and file name.
	Use '//' at the start of the path to render relative to the blend-file.
	The '#' characters are replaced by the frame number, and used to define zero padding.
	* 'animation_##_test.png' becomes 'animation_01_test.png'
	* 'test-######.png' becomes 'test-000001.png'
	When the filename does not contain '#', The suffix '####' is added to the filename.
	The frame number will be added at the end of the filename, eg:
	# blender -b animation.blend -o //render_ -F PNG -x 1 -a
	'//render_' becomes '//render_####', writing frames as '//render_0001.png'
-E or --engine <engine>
	Specify the render engine.
	Use '-E' help to list available engines.
-t or --threads <threads>
	Use amount of <threads> for rendering and other operations
	[1-1024], 0 for systems processor count.

Format Options:
-F or --render-format <format>
	Set the render format.
	Valid options are:
	'TGA' 'RAWTGA' 'JPEG' 'IRIS' 'IRIZ' 'AVIRAW' 'AVIJPEG' 'PNG' 'BMP'
	Formats that can be compiled into Blender, not available on all systems:
	'HDR' 'TIFF' 'OPEN_EXR' 'OPEN_EXR_MULTILAYER' 'MPEG' 'CINEON' 'DPX' 'DDS' 'JP2'
-x or --use-extension <bool>
	Set option to add the file extension to the end of the file.

Animation Playback Options:
-a <options> <file(s)>
	Instead of showing Blender's user interface, this runs Blender as an animation player,
	to view movies and image sequences rendered in Blender (ignored if '-b' is set).
	Playback Arguments:
	-p <sx> <sy>
		Open with lower left corner at <sx>, <sy>.
	-m
		Read from disk (Do not buffer).
	-f <fps> <fps-base>
		Specify FPS to start with.
	-j <frame>
		Set frame step to <frame>.
	-s <frame>
		Play from <frame>.
	-e <frame>
		Play until <frame>.

Window Options:
-w or --window-border 
	Force opening with borders.
-W or --window-fullscreen 
	Force opening in fullscreen mode.
-p or --window-geometry <sx> <sy> <w> <h>
	Open with lower left corner at <sx>, <sy> and width and height as <w>, <h>.
-M or --window-maximized 
	Force opening maximized.
-con or --start-console 
	Start with the console window open (ignored if '-b' is set), (Windows only).
--no-native-pixels 
	Do not use native pixel size, for high resolution displays (MacBook 'Retina').
--no-window-focus 
	Open behind other windows and without taking focus.

Python Options:
-y or --enable-autoexec 
	Enable automatic Python script execution.
-Y or --disable-autoexec 
	Disable automatic Python script execution (pydrivers & startup scripts), (compiled as non-standard default).

-P or --python <filename>
	Run the given Python script file.
--python-text <name>
	Run the given Python script text block.
--python-expr <expression>
	Run the given expression as a Python script.
--python-console 
	Run Blender with an interactive console.
--python-exit-code <code>
	Set the exit-code in [0..255] to exit if a Python exception is raised
	(only for scripts executed from the command line), zero disables.
--python-use-system-env 
	Allow Python to use system environment variables such as 'PYTHONPATH'.
--addons <addon(s)>
	Comma separated list of add-ons (no spaces).

Logging Options:
--log <match>
	Enable logging categories, taking a single comma separated argument.
	Multiple categories can be matched using a '.*' suffix,
	so '--log "wm.*"' logs every kind of window-manager message.
	Use "^" prefix to ignore, so '--log "*,^wm.operator.*"' logs all except for 'wm.operators.*'
	Use "*" to log everything.
--log-level <level>
	Set the logging verbosity level (higher for more details) defaults to 1,
	use -1 to log all levels.
--log-show-basename 
	Only show file name in output (not the leading path).
--log-show-backtrace 
	Show a back trace for each log message (debug builds only).
--log-show-timestamp 
	Show a timestamp for each log message in seconds since start.
--log-file <filename>
	Set a file to output the log to.

Debug Options:
-d or --debug 
	Turn debugging on.
	* Enables memory error detection
	* Disables mouse grab (to interact with a debugger in some cases)
	* Keeps Python's 'sys.stdin' rather than setting it to None
--debug-value <value>
	Set debug value of <value> on startup.

--debug-events 
	Enable debug messages for the event system.
--debug-ffmpeg 
	Enable debug messages from FFmpeg library.
--debug-handlers 
	Enable debug messages for event handling.
--debug-libmv 
	Enable debug messages from libmv library.
--debug-cycles 
	Enable debug messages from Cycles.
--debug-memory 
	Enable fully guarded memory allocation and debugging.
--debug-jobs 
	Enable time profiling for background jobs.
--debug-python 
	Enable debug messages for Python.
--debug-depsgraph 
	Enable all debug messages from dependency graph.
--debug-depsgraph-eval 
	Enable debug messages from dependency graph related on evaluation.
--debug-depsgraph-build 
	Enable debug messages from dependency graph related on graph construction.
--debug-depsgraph-tag 
	Enable debug messages from dependency graph related on tagging.
--debug-depsgraph-no-threads 
	Switch dependency graph to a single threaded evaluation.
--debug-depsgraph-time 
	Enable debug messages from dependency graph related on timing.
--debug-depsgraph-pretty 
	Enable colors for dependency graph debug messages.
--debug-gpu 
	Enable gpu debug context and information for OpenGL 4.3+.
--debug-gpumem 
	Enable GPU memory stats in status bar.
--debug-gpu-shaders 
	Enable GPU memory stats in status bar.
--debug-gpu-force-workarounds 
	Enable GPU memory stats in status bar.
--debug-wm 
	Enable debug messages for the window manager, shows all operators in search, shows keymap errors.
--debug-all 
	Enable all debug messages.
--debug-io 
	Enable debug messages for I/O (collada, ...).

--debug-fpe 
	Enable floating point exceptions.
--disable-crash-handler 
	Disable the crash handler.
--disable-abort-handler 
	Disable the abort handler.

Misc Options:
--app-template <template>
	Set the application template (matching the directory name), use 'default' for none.
--factory-startup 
	Skip reading the BLENDER_STARTUP_FILE in the users home directory.
--enable-event-simulate 
	Enable event simulation testing feature 'bpy.types.Window.event_simulate'.

--env-system-datafiles 
	Set the BLENDER_SYSTEM_DATAFILES environment variable.
--env-system-scripts 
	Set the BLENDER_SYSTEM_SCRIPTS environment variable.
--env-system-python 
	Set the BLENDER_SYSTEM_PYTHON environment variable.

-noaudio 
	Force sound system to None.
-setaudio 
	Force sound system to a specific device.
	'NULL' 'SDL' 'OPENAL' 'JACK'.

-h or --help 
	Print this help text and exit.
-R 
	Register blend-file extension, then exit (Windows only).
-r 
	Silently register blend-file extension, then exit (Windows only).
-v or --version 
	Print Blender version and exit.
-- 
	End option processing, following arguments passed unchanged. Access via Python's 'sys.argv'.

Other Options:
/? 
	Print this help text and exit (windows only).
--debug-freestyle 
	Enable debug messages for Freestyle.
--debug-ghost 
	Enable debug messages for event handling.
--verbose <verbose>
	Set logging verbosity level for debug messages which supports it.
--disable-library-override 
	Enable Library Override features in the UI.

Argument Parsing:
	Arguments must be separated by white space, eg:
	# blender -ba test.blend
	...will exit since '-ba' is an unknown argument.
Argument Order:
	Arguments are executed in the order they are given. eg:
	# blender --background test.blend --render-frame 1 --render-output '/tmp'
	...will not render to '/tmp' because '--render-frame 1' renders before the output path is set.
	# blender --background --render-output /tmp test.blend --render-frame 1
	...will not render to '/tmp' because loading the blend-file overwrites the render output that was set.
	# blender --background test.blend --render-output /tmp --render-frame 1
	...works as expected.
Environment Variables:
  $BLENDER_USER_CONFIG      Directory for user configuration files.
  $BLENDER_USER_SCRIPTS     Directory for user scripts.
  $BLENDER_SYSTEM_SCRIPTS   Directory for system wide scripts.
  $BLENDER_USER_DATAFILES   Directory for user data files (icons, translations, ..).
  $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.
  $BLENDER_SYSTEM_PYTHON    Directory for system Python libraries.
  $TEMP                     Store temporary files here.
  $SDL_AUDIODRIVER          LibSDL audio driver - alsa, esd, dma.
  $PYTHONHOME               Path to the Python directory, eg. /usr/lib/python.
===========================================
BlenderLauncher.run("-BLENDER_PATH", "C:\Program Files\Blender Foundation\Blender 2.82\")
parameters: "-BLENDER_PATH" "C:\Program Files\Blender Foundation\Blender 2.82\" for setting Blender path
===========================================
BlenderLauncher.run("-properties X3DJSAIL.properties")
BlenderLauncher parameter: "-properties" "X3DJSAIL.properties" for properties file name root X3DJSAIL
X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
X3DJSAIL.properties loading complete.
===========================================
BlenderLauncher.run("CleatClamp.x3d -toImage")
BlenderLauncher parameter: source file CleatClamp.x3d filesize 172231 bytes
BlenderLauncher parameter: "-toImage" for creating screenshot image of default viewpoint
*** [diagnostic] System java.class.path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples;C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar
[diagnostic] jarPath=jar:file:X3DJSAIL.3.3.full.jar!/, filePath=/python/blenderScripts/BlenderX3dToPng.py
executeCommand("C:\Program Files\Blender Foundation\Blender 2.82\blender.exe --background --factory-startup --python C:\Users\BRUTZM~1.IT1\AppData\Local\Temp\BlenderX3dToPng2832036334199030377.py -- CleatClamp.x3d")
Blender 2.82 (sub 7) (hash 375c7dc4caf4 built 2020-03-12 15:41:08)
found bundled python: C:\Program Files\Blender Foundation\Blender 2.82\2.82\python
Info: Deleted 1 object(s)
Command line: 7 args ['C:\\Program Files\\Blender Foundation\\Blender 2.82\\blender.exe', '--background', '--factory-startup', '--python', 'C:\\Users\\BRUTZM~1.IT1\\AppData\\Local\\Temp\\BlenderX3dToPng2832036334199030377.py', '--', 'CleatClamp.x3d']
outputPath= C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
Info: Deleted 1 object(s)

Blender quit

CommandLine.run("CleatClamp.x3d -toImage") tests pass through
parameter: source file CleatClamp.x3d filesize 172231 bytes
CommandLine parameter: "-toImage" for creating screenshot image of default viewpoint
Pass through to BlenderLauncher...
BlenderLauncher parameter: source file CleatClamp.x3d filesize 172231 bytes
BlenderLauncher parameter: "-toImage" for creating screenshot image of default viewpoint
executeCommand("C:\Program Files\Blender Foundation\Blender 2.82\blender.exe --background --factory-startup --python C:\Users\BRUTZM~1.IT1\AppData\Local\Temp\BlenderX3dToPng2832036334199030377.py -- CleatClamp.x3d")
Blender 2.82 (sub 7) (hash 375c7dc4caf4 built 2020-03-12 15:41:08)
found bundled python: C:\Program Files\Blender Foundation\Blender 2.82\2.82\python
Info: Deleted 1 object(s)
Command line: 7 args ['C:\\Program Files\\Blender Foundation\\Blender 2.82\\blender.exe', '--background', '--factory-startup', '--python', 'C:\\Users\\BRUTZM~1.IT1\\AppData\\Local\\Temp\\BlenderX3dToPng2832036334199030377.py', '--', 'CleatClamp.x3d']
outputPath= C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
Info: Deleted 1 object(s)

Blender quit

CommandLine.run("CleatClamp.x3d -toJava   -toFile CleatClamp.java") tests pass through
parameter: source file CleatClamp.x3d filesize 172231 bytes
CommandLine parameter: "-toJava" for conversion to Java source code
CommandLine parameter: "-toFile" "CleatClamp.java" for result file name root CleatClamp
convert to Java:
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.java

*** [diagnostic] System java.class.path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples;C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar
[diagnostic] jarPath=jar:file:X3DJSAIL.3.3.full.jar!/, filePath=/stylesheets/X3dToJava.xslt
no className provided, using normalized meta title value='CleatClamp'
[meta] name='warning' content='Do not use for climbing or yachting.'
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.java

CommandLine.run("CleatClamp.x3d -toJSON   -toFile CleatClamp.json") tests pass through
parameter: source file CleatClamp.x3d filesize 172231 bytes
CommandLine parameter: "-toJSON" for conversion to JSON encoding
CommandLine parameter: "-toFile" "CleatClamp.json" for result file name root CleatClamp
convert to JSON:
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.json

*** [diagnostic] System java.class.path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples;C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar
[diagnostic] jarPath=jar:file:X3DJSAIL.3.3.full.jar!/, filePath=/stylesheets/X3dToJson.xslt
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.json
Warning: fileStylesheetConversion() is overwriting prior file CleatClamp.json
CommandLine.run("CleatClamp.x3d -toPython -toFile CleatClamp.py")   tests pass through
parameter: source file CleatClamp.x3d filesize 172231 bytes
CommandLine parameter: "-toPython" for conversion to Python source code
CommandLine parameter: "-toFile" "CleatClamp.py" for result file name root CleatClamp
convert to Python:
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.py

*** [diagnostic] System java.class.path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples;C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar
[diagnostic] jarPath=jar:file:X3DJSAIL.3.3.full.jar!/, filePath=/stylesheets/X3dToPython.xslt
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.py
Warning: fileStylesheetConversion() is overwriting prior file CleatClamp.py
===========================================
testMeshLabLauncher();  // check MeshLab capabilities
.run("-version"
MeshLabServer version: 2020.03
===========================================
MeshLabLauncher.run("-help"
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.MeshLabLauncher sourceFile [-convert [resultFile]] [-home | -help | -properties fileName.properties | -MESHLAB_PATH directoryPath]
https://www.MeshLab.net
Meshlab help:
MeshLabServer version: 2020.03
Usage:
meshlabserver [logargs] [args]


  where logargs can be:

    -d filename         dump on a text file a list of all the
                        filtering functions
    -l filename         log of the filters is output on a file


  where args can be:

    -p filename         meshlab project (.mlp) to be loaded

    -w filename [-x]    output meshlab project (.mlp) to be saved.
                        If -x flag is specified a 3D model meshfile.ext
                        contained in the input project will be 
                        overwritten, otherwise it will be saved in the 
                        same directory of input mesh as a new file 
                        called meshfile_out.ext.
                        ALL the mesh attributes will be exported in the
                        saved files

    -i filename         mesh that has to be loaded

    -o filename [-l <opt_layer>][-m <opt_mask>]  the name of the file 
                        where to write the current layer of the project
                        If -l parameter is set the specified layer is
                        going to be saved with the chosen filename
                        Valid values for <opt_layer> can be:
                          [0,last_layer_in_the_project] to indicate the
                             desired layer by its index
                          c  to indicate the CURRENT layer in the project
                          x  to indicate the LAST layer in the project
                        If -l param is not specified, by default the 
                        CURRENT layer will be saved
                        If -m is specified the listed mesh attributes
                        will be saved in the output file
                        The param <opt_mask> can be a space-separated
                        list of the following attributes:
                          vc -> vertex colors,
                          vf -> vertex flags,
                          vq -> vertex quality,
                          vn-> vertex normals,
                          vt -> vertex texture coords,
                          vr -> vertex radius,
                          fc -> face colors,
                          ff -> face flags,
                          fq -> face quality,
                          fn-> face normals,
                          wc -> wedge colors,
                          wn-> wedge normals,
                          wt -> wedge texture coords,
                          mp -> polygonal mesh info
                          sa -> save in ascii format
 
    -s filename         the script to be applied


   Examples:

'meshlabserver -i input.obj -o output.ply -m vc fq wt -s meshclean.mlx'
           the script contained in file 'meshclean.mlx' will be applied
           to the mesh contained into 'input.obj'. The per-vertex-color,
           the per-face-quality and the per-wedge-texture attributes 
           contained in the current layer will be saved into the
           output.ply file

'meshlabserver -i input.obj -o output.ply -l 2 -m vc fq wt -o output_last.ply -l l -s meshclean.mlx'
           the script contained in file 'meshclean.mlx' will be applied
           to the mesh contained into 'input.obj'.
           The per-vertex-color, the per-face-quality and the 
           per-wedge-texture attributes contained in the layer 2 
           (if it exists!) will be saved into the output.ply file
           The last layer of the project will be saved in the file
           output_last, with the default geometric attributes.

'meshlabserver -i input0.obj -i input1.ply -w outproj.mlp -x -s meshclean.mlx'
           the script file meshclean.mlx will be applied to the project
           composed by input0.obj and input1.ply meshes.
           The mesh input1.ply will become the current mesh of the 
           project (e.g. the mesh to which the filters operating on a
           single model will be applied).
           A new output project outproj.mlp file will be generated
           (containing references to the input0.obj an input1.ply).
           The files input0.obj and input1.ply will be overwritten.

'meshlabserver -l logfile.txt -p proj.mlp -i input.obj -w outproj.mlp -s meshclean.mlx'
           the mesh file input.obj will be added to the meshes referred
           by the loaded meshlab project file proj.mlp. The mesh 
           input.obj will become the current mesh of the project, the 
           script file meshclean.mlx will be applied to the meshes
           contained into the resulting project.
           The project file outproj.mlp will be generated.
           A 3D model meshfile.ext contained in the input project 
           proj.mlp will be saved in a new file called meshfile_out.ext.
           (if you want to overwrite the original files use the -v flag
           after the outproject filename) all the attributes of the 
           meshes will be saved into the output files; the log info 
           will be saved into the file logfile.txt.

   Notes:
   There can be multiple meshes loaded and the order they are listed
   matters because filters that use meshes as parameters choose the 
   mesh based on the order.
   The format of the output mesh is guessed by the used extension.
   Script is optional and must be in the xml format saved by MeshLab.
===========================================
MeshLab default path=C:\Program Files\VCG\MeshLab\
MeshLab.checkMeshLabPath() updated path=C:\Program Files\VCG\MeshLab\
=================================
MeshLabLauncher.hasMeshLab()=true
=================================
MeshLabLauncher.getMeshLabVersion()=MeshLabServer version: 2020.03
=================================
MeshLabLauncher.run("-MESHLAB_PATH", "C:\Program Files\VCG\MeshLab\")
parameters: "-MESHLAB_PATH" "C:\Program Files\VCG\MeshLab\" for setting MeshLab path
===========================================
MeshLabLauncher.run("-properties X3DJSAIL.properties")
MeshLabLauncher parameter: "-properties" "X3DJSAIL.properties" for properties file name root X3DJSAIL
X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
X3DJSAIL.properties loading complete.
===========================================
MeshLabLauncher.convertModel(".", "CleatClamp.stl", "CleatClamp_RoundTrip.stl");
C:\Program Files\VCG\MeshLab\meshlabserver.exe -l .\CleatClamp_RoundTrip.MeshLab.log.txt -i .\CleatClamp.stl -o .\CleatClamp_RoundTrip.stl
MeshLabLauncher.wasPriorCommandSuccessful()=false conversionResult=false
meshLabLauncher.importModel(".", "CleatClamp.stl"); produces CleatClamp.MeshLab.x3d and CleatClamp.MeshLab.log.txt
C:\Program Files\VCG\MeshLab\meshlabserver.exe -l .\CleatClamp.MeshLab.log.txt -i .\CleatClamp.stl -o .\CleatClamp.MeshLab.x3d
meshLabLauncher.getPriorMeshLabTraceLogFileName()=.\CleatClamp.MeshLab.log.txt
meshLabLauncher.getPriorMeshLabTraceLogContents()=
[Mesh C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/CleatClamp.stl loaded has 1452 vn 2912 fn, output mesh  C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/CleatClamp.MeshLab.x3d, Mesh C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/CleatClamp.stl saved as C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/CleatClamp.MeshLab.x3d (1452 vn 2912 fn)]
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_MeshLabImport.x3d

Warning: toFileX3D() is overwriting prior file HelloWorldProgramOutput_MeshLabImport.x3d
[diagnostic] Output file path=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_MeshLabImport.java

Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file HelloWorldProgramOutput_MeshLabImport.json
===========================================
===========================================
HelloWorldProgram self validation: <meta content='continued development and testing in progress' name='info'/>
ProtoInstance ArtDeco01Material DEF='' has corresponding ProtoDeclare
ProtoInstance ArtDeco02Material DEF='ArtDeco02MaterialDEF' has corresponding ExternProtoDeclare (but node type is unconfirmed)
ProtoInstance MaterialModulator DEF='MyMaterialModulator' has corresponding ProtoDeclare
ProtoInstance NewWorldInfo DEF='Proto1' has corresponding ProtoDeclare
ProtoInstance NewWorldInfo DEF='Proto3' has corresponding ProtoDeclare
ProtoInstance ShaderProto DEF='TestShader3' has corresponding ProtoDeclare
===========================================
Quick test of CommandLine capability:
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.CommandLine
       [-help | -version | -home | -javadoc | -resources | -hints | -regexes | -tooltips | -X3DUOM]
       [-properties [propertiesFile]]
       [sourceModel.x3d | sourceModel.exi [-fromEXI] | sourceModel.gz [-fromGZIP] | sourceModel.zip [-fromZIP]]
       [-canonical] [-validate] [-EXIFICIENT | -OpenEXI]
       [-Tidy | -toX3D | -toXML | -toClassicVrml | -toJava | -toJSON | -toPython | -toVRML97]
       [-toHTML | -toX3DOM | -toX_ITE | -toMarkdown | -toEXI | -toGZIP | -toZIP]
       [-tofile [resultFile.*]] [-toImage [snapshotName.*]]

-classpath X3DJSAIL.*.jar         # optional classpath, can be set as environment variable
org.web3d.x3d.jsail.CommandLine   # invoke CommandLine application
==================================#====== informational ======================
-help                             # provide this help message
-version                          # version date when this X3DJSAIL build was autogenerated
-home                             # launch X3DJSAIL home page
-javadoc                          # launch X3DJSAIL javadoc page
-resources                        # launch X3D Resources page
-hints                            # launch X3D Scene Authoring Hints page
-regex                            # launch X3D Regular Expressions page
-tooltips                         # launch X3D Tooltips page
-X3DUOM                           # launch X3D Unified Object Model (X3DUOM) page
 =================================#====== properties, inputs =================
-properties [propertiesFile]      # override X3DJSAIL properties (default file: X3DJSAIL.properties)
-EXIFICIENT                       # use Exificient (default) as EXI_ENGINE
-OpenEXI                          # use OpenEXI (Nagasena)   as EXI_ENGINE (testing in progress)
sourceModel.x3d                   # source model file name, X3D  format
sourceModel.exi [-fromEXI]        # source model file name, EXI  format
sourceModel.gz  [-fromGZIP]       # source model file name, GZIP format
sourceModel.zip [-fromZIP]        # source model file name, ZIP  format
==================================#====== operations =========================
-canonical                        # canonical XML output using X3D Canonicalization (c14n)
-validate                         # validate correctness of loaded model
-Tidy                             # X3D-Tidy cleanup in .x3d (XML) format
-toX3D                            # output in .x3d (XML) format
-toXML                            # output in .xml (X3D) format
-toClassicVrml                    # output in .x3dv (ClassicVrml) X3D format
-toJava                           # output in .java source code using X3DJSAIL
-toJSON                           # output in .json (JavaScript Object Notation) format
-toPython                         # output in .py Python source code
-toVRML97                         # output in .wrl  (VRML97) format
-toHTML                           # output in .html  pretty-print documentation
-toX3DOM                          # output in .xhtml page with X3DOM display of X3D model
-toX_ITE                          # output in .html  page with X_ITE display of X3D model
-toMarkdown                       # output document metadata (meta tags) in .md (Markdown) format
-toEXI                            # output in .exi (Efficient XML Interchange) compressed-XML format
-toGZIP                           # output in .gz  (X3D XML) format, with gzip compression
-toZIP                            # output in .zip (X3D XML) format, with zip  compression
==================================#====== outputs ============================
-tofile  [resultFile.*]           # specify output filename (otherwise original name with extension)
-toImage [snapshotName.*]         # create output images for each Viewpoint using Blender

===========================================
test.examples.java:
===========================================
compile HelloWorldProgramOutput.java source...
     (i.e. new source program which was just produced by HelloWorldProgram execution)
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
warning: [path] Invalid filename: ${toString:lib.path.ref}
1 warning
test HelloWorldProgramOutput.java execution and self-validation:
Java program "HelloWorldProgramOutput" self-validation test results: WARNING_MESSAGE: ProtoInstance name='ShaderProto' DEF='TestShader3' USE='' is missing containerField relationship to parent node, assuming containerField='shaders' from initial node in corresponding ProtoDeclare. Need to fix ProtoInstance definition in model source.
<meta content='continued development and testing in progress' name='info'/>
WARNING_MESSAGE: ProtoInstance name='ShaderProto' DEF='TestShader3' USE='' is missing containerField relationship to parent node, assuming containerField='shaders' from initial node in corresponding ProtoDeclare. Need to fix ProtoInstance definition in model source.
Deleting: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.class
===========================================
Error checking with jslint: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.json
jslint:C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.json:503:1:JavaScript URL.
jslint:C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.json:902:1:JavaScript URL.
Java Result: 1
Error checking with json-schema-validator: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.json
Schema is invalid! Aborting...
Java Result: 101
===========================================
HelloWorldProgramOutput.x3d
1 file(s) have been successfully validated.
1 file(s) have been successfully validated.
===========================================
HelloWorldProgramOutput_CommandLine.x3d
1 file(s) have been successfully validated.
1 file(s) have been successfully validated.
matches HelloWorldProgramOutput.x3d: true
===========================================
HelloWorldProgramOutput.xml
1 file(s) have been successfully validated.
1 file(s) have been successfully validated.
matches HelloWorldProgramOutput.x3d: true
===========================================
HelloWorldProgramOutput_ReloadedDOM.x3d
1 file(s) have been successfully validated.
1 file(s) have been successfully validated.
matches HelloWorldProgramOutput.x3d: true
===========================================
compile.X3DJSAIL.tests:
Compiling java/tests classes
test.X3DJSAIL.unitTests:
===========================================
ant antfile=java/build.xml target=test.junit5
X3DJSAIL: X3D Java SAI Library.antVersionCheck:
X3DJSAIL: X3D Java SAI Library.test.junit5.directly:
FieldObjectTests start...
FieldObjectTests.fieldObjectInitializationsTest() start...
Preliminary tests...
SFBoolObjectTests...
MFBoolObjectTests...
SFImageObjectTests...
MFImageObjectTests...
SFInt32ObjectTests...
MFInt32ObjectTests...
SFFloatObjectTests...
SFDoubleObjectTests...
SFTimeObjectTests...
MFFloatObjectTests...
MFDoubleObjectTests...
MFTimeObjectTests...
SFVec2fObjectTests...
SFVec2dObjectTests...
MFVec2fObjectTests...
MFVec2dObjectTests...
SFVec3fObjectTests...
SFVec3fBboxSizeObjectTests for bounding box (bbox) constraints...
SFVec3dObjectTests...
MFVec3fObjectTests...
MFVec3dObjectTests...
SFVec4fObjectTests...
SFVec4dObjectTests...
MFVec4fObjectTests...
MFVec4dObjectTests...
SFColorObjectTests...
MFColorObjectTests...
SFColorRGBAObjectTests...
MFColorRGBAObjectTests...
SFRotationObjectTests...
MFRotationObjectTests...
SFMatrix3fObjectTests...
SFMatrix3dObjectTests...
MFMatrix3fObjectTests...
MFMatrix3dObjectTests...
SFMatrix4fObjectTests...
SFMatrix4dObjectTests...
MFMatrix4fObjectTests...
MFMatrix4dObjectTests...
FieldObjectTests.fieldObjectInitializationsTest() complete
FieldObjectTests complete
===========================================
test.EXI:
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d -EXIFICIENT -toEXI -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.exificient.exi
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-EXIFICIENT" invoked ConfigurationProperties.setExiEngine(EXIFICIENT);
CommandLine parameter: "-toEXI" for conversion to compressed EXI containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.exificient.exi" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.exificient
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to EXI using EXIFICIENT:
source: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput.exificient.exi filesize 3331 bytes, compression 14.93% of original
===========================================
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.exificient.exi -EXIFICIENT -fromEXI -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ExificientRoundTrip.x3d
parameter: source file HelloWorldProgramOutput.exificient.exi filesize 3331 bytes
CommandLine parameter: "-EXIFICIENT" invoked ConfigurationProperties.setExiEngine(EXIFICIENT);
CommandLine parameter: "-fromEXI" for conversion from compressed EXI containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ExificientRoundTrip.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ExificientRoundTrip
Warning: fromFileEXI() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.exificient.exi
EXI decompressed examples\temp.exiInputTransformed.x3d size=22451 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d -OpenEXI -toEXI -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.openexi.exi
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-OpenEXI" invoked ConfigurationProperties.setExiEngine(OPENEXI);
  Warning: "OPENEXI" testing in progress, can also use EXIFICIENT instead.
CommandLine parameter: "-toEXI" for conversion to compressed EXI containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.openexi.exi" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.openexi
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to EXI using OPENEXI:
source: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput.openexi.exi filesize 3387 bytes, compression 15.18% of original
===========================================
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.openexi.exi -OpenEXI -fromEXI -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.OpenExiRoundTrip.x3d
parameter: source file HelloWorldProgramOutput.openexi.exi filesize 3387 bytes
CommandLine parameter: "-OpenEXI" invoked ConfigurationProperties.setExiEngine(OPENEXI);
  Warning: "OPENEXI" testing in progress, can also use EXIFICIENT instead.
CommandLine parameter: "-fromEXI" for conversion from compressed EXI containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.OpenExiRoundTrip.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.OpenExiRoundTrip
Warning: fromFileEXI() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.openexi.exi
EXI decompressed examples\temp.exiInputTransformed.x3d size=22588 bytes
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
load success: true
===========================================
===========================================
test.mkdir:
test.X3dToJava.xslt.one:
===========================================
org.web3d.x3d.jsail.CommandLine test/HelloWorld.x3d -toJava -toFile test/HelloWorld.java
compile HelloWorld.java source...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\test
test HelloWorld.java execution and self-validation:
Java program "HelloWorld" self-validation test results: success
===========================================
test.X3dToJava.xslt:
translation input: test/CameraExamples.x3d
..expected output: test/CameraExamples.java
[meta] name='TODO' content='Schematron rules, backed up by initialize() checks'
compile...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\test
test CameraExamples.java execution and self-validation:
Warning: meta name newValue="documentation" has an unrecognized value not matching any of the optional string tokens. Suggested meta term: name='reference'
Java program "CameraExamples" self-validation test results: Warning: meta name newValue="documentation" has an unrecognized value not matching any of the optional string tokens. Suggested meta term: name='reference'
<meta content='Schematron rules, backed up by initialize() checks' name='TODO'/>
 ROUTE toNode='MoveAimPoint3.1' was not found in connected scene graph. 
<ROUTE fromNode='BoxPath' fromField='value_changed' toNode='MoveAimPoint3.1' toField='goalAimPoint'/>
 ROUTE toNode='MoveAimPoint3.2' was not found in connected scene graph. 
<ROUTE fromNode='BoxPath' fromField='value_changed' toNode='MoveAimPoint3.2' toField='goalAimPoint'/>
 ROUTE toNode='MoveAimPoint3.3' was not found in connected scene graph. 
<ROUTE fromNode='BoxPath' fromField='value_changed' toNode='MoveAimPoint3.3' toField='goalAimPoint'/>
===========================================
org.web3d.x3d.jsail.CommandLine test/arc.x3d -toJava -toFile test/arc.java
parameter: source file arc.x3d filesize 7592 bytes
CommandLine parameter: "-toJava" for conversion to Java source code
CommandLine parameter: "-toFile" "test/arc.java" for result file name root test/arc
convert to Java:
no className provided, using normalized meta title value='arc'
compile arc.java source...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\test
test arc.java execution and self-validation:
Java program "arc" self-validation test results: success
===========================================
org.web3d.x3d.jsail.CommandLine test/flowers4.x3d -toJava -toFile test/flowers4.java
parameter: source file flowers4.x3d filesize 9114 bytes
CommandLine parameter: "-toJava" for conversion to Java source code
CommandLine parameter: "-toFile" "test/flowers4.java" for result file name root test/flowers4
convert to Java:
no className provided, using normalized meta title value='flowers4'
compile...
Compiling 1 source file to C:\x3d-code\www.web3d.org\x3d\stylesheets\test
test flowers4.java execution and self-validation:
Java program "flowers4" self-validation test results: success
===========================================
===========================================
test.X3DJSAIL.BlenderLauncher:
===========================================
org.web3d.x3d.jsail.BlenderLauncher -version
Blender version: Blender 2.82 (sub 7)
===========================================
org.web3d.x3d.jsail.BlenderLauncher -help
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.BlenderLauncher sourceFile [-convert [resultFile]] [-toImage [snapshotName.*]] [-home | -help | -version | -properties fileName.properties | -BLENDER_PATH directoryPath]
http://www.blender.org
Blender help:
Blender 2.82 (sub 7)
Usage: blender [args ...] [file] [args ...]
Render Options:
-b or --background 
	Run in background (often used for UI-less rendering).
-a or --render-anim 
	Render frames from start to end (inclusive).
-S or --scene <name>
	Set the active scene <name> for rendering.
-f or --render-frame <frame>
	Render frame <frame> and save it.
	* +<frame> start frame relative, -<frame> end frame relative.
	* A comma separated list of frames can also be used (no spaces).
	* A range of frames can be expressed using '..' separator between the first and last frames (inclusive).

-s or --frame-start <frame>
	Set start to frame <frame>, supports +/- for relative frames too.
-e or --frame-end <frame>
	Set end to frame <frame>, supports +/- for relative frames too.
-j or --frame-jump <frames>
	Set number of frames to step forward after each rendered frame.
-o or --render-output <path>
	Set the render path and file name.
	Use '//' at the start of the path to render relative to the blend-file.
	The '#' characters are replaced by the frame number, and used to define zero padding.
	* 'animation_##_test.png' becomes 'animation_01_test.png'
	* 'test-######.png' becomes 'test-000001.png'
	When the filename does not contain '#', The suffix '####' is added to the filename.
	The frame number will be added at the end of the filename, eg:
	# blender -b animation.blend -o //render_ -F PNG -x 1 -a
	'//render_' becomes '//render_####', writing frames as '//render_0001.png'
-E or --engine <engine>
	Specify the render engine.
	Use '-E' help to list available engines.
-t or --threads <threads>
	Use amount of <threads> for rendering and other operations
	[1-1024], 0 for systems processor count.

Format Options:
-F or --render-format <format>
	Set the render format.
	Valid options are:
	'TGA' 'RAWTGA' 'JPEG' 'IRIS' 'IRIZ' 'AVIRAW' 'AVIJPEG' 'PNG' 'BMP'
	Formats that can be compiled into Blender, not available on all systems:
	'HDR' 'TIFF' 'OPEN_EXR' 'OPEN_EXR_MULTILAYER' 'MPEG' 'CINEON' 'DPX' 'DDS' 'JP2'
-x or --use-extension <bool>
	Set option to add the file extension to the end of the file.

Animation Playback Options:
-a <options> <file(s)>
	Instead of showing Blender's user interface, this runs Blender as an animation player,
	to view movies and image sequences rendered in Blender (ignored if '-b' is set).
	Playback Arguments:
	-p <sx> <sy>
		Open with lower left corner at <sx>, <sy>.
	-m
		Read from disk (Do not buffer).
	-f <fps> <fps-base>
		Specify FPS to start with.
	-j <frame>
		Set frame step to <frame>.
	-s <frame>
		Play from <frame>.
	-e <frame>
		Play until <frame>.

Window Options:
-w or --window-border 
	Force opening with borders.
-W or --window-fullscreen 
	Force opening in fullscreen mode.
-p or --window-geometry <sx> <sy> <w> <h>
	Open with lower left corner at <sx>, <sy> and width and height as <w>, <h>.
-M or --window-maximized 
	Force opening maximized.
-con or --start-console 
	Start with the console window open (ignored if '-b' is set), (Windows only).
--no-native-pixels 
	Do not use native pixel size, for high resolution displays (MacBook 'Retina').
--no-window-focus 
	Open behind other windows and without taking focus.

Python Options:
-y or --enable-autoexec 
	Enable automatic Python script execution.
-Y or --disable-autoexec 
	Disable automatic Python script execution (pydrivers & startup scripts), (compiled as non-standard default).

-P or --python <filename>
	Run the given Python script file.
--python-text <name>
	Run the given Python script text block.
--python-expr <expression>
	Run the given expression as a Python script.
--python-console 
	Run Blender with an interactive console.
--python-exit-code <code>
	Set the exit-code in [0..255] to exit if a Python exception is raised
	(only for scripts executed from the command line), zero disables.
--python-use-system-env 
	Allow Python to use system environment variables such as 'PYTHONPATH'.
--addons <addon(s)>
	Comma separated list of add-ons (no spaces).

Logging Options:
--log <match>
	Enable logging categories, taking a single comma separated argument.
	Multiple categories can be matched using a '.*' suffix,
	so '--log "wm.*"' logs every kind of window-manager message.
	Use "^" prefix to ignore, so '--log "*,^wm.operator.*"' logs all except for 'wm.operators.*'
	Use "*" to log everything.
--log-level <level>
	Set the logging verbosity level (higher for more details) defaults to 1,
	use -1 to log all levels.
--log-show-basename 
	Only show file name in output (not the leading path).
--log-show-backtrace 
	Show a back trace for each log message (debug builds only).
--log-show-timestamp 
	Show a timestamp for each log message in seconds since start.
--log-file <filename>
	Set a file to output the log to.

Debug Options:
-d or --debug 
	Turn debugging on.
	* Enables memory error detection
	* Disables mouse grab (to interact with a debugger in some cases)
	* Keeps Python's 'sys.stdin' rather than setting it to None
--debug-value <value>
	Set debug value of <value> on startup.

--debug-events 
	Enable debug messages for the event system.
--debug-ffmpeg 
	Enable debug messages from FFmpeg library.
--debug-handlers 
	Enable debug messages for event handling.
--debug-libmv 
	Enable debug messages from libmv library.
--debug-cycles 
	Enable debug messages from Cycles.
--debug-memory 
	Enable fully guarded memory allocation and debugging.
--debug-jobs 
	Enable time profiling for background jobs.
--debug-python 
	Enable debug messages for Python.
--debug-depsgraph 
	Enable all debug messages from dependency graph.
--debug-depsgraph-eval 
	Enable debug messages from dependency graph related on evaluation.
--debug-depsgraph-build 
	Enable debug messages from dependency graph related on graph construction.
--debug-depsgraph-tag 
	Enable debug messages from dependency graph related on tagging.
--debug-depsgraph-no-threads 
	Switch dependency graph to a single threaded evaluation.
--debug-depsgraph-time 
	Enable debug messages from dependency graph related on timing.
--debug-depsgraph-pretty 
	Enable colors for dependency graph debug messages.
--debug-gpu 
	Enable gpu debug context and information for OpenGL 4.3+.
--debug-gpumem 
	Enable GPU memory stats in status bar.
--debug-gpu-shaders 
	Enable GPU memory stats in status bar.
--debug-gpu-force-workarounds 
	Enable GPU memory stats in status bar.
--debug-wm 
	Enable debug messages for the window manager, shows all operators in search, shows keymap errors.
--debug-all 
	Enable all debug messages.
--debug-io 
	Enable debug messages for I/O (collada, ...).

--debug-fpe 
	Enable floating point exceptions.
--disable-crash-handler 
	Disable the crash handler.
--disable-abort-handler 
	Disable the abort handler.

Misc Options:
--app-template <template>
	Set the application template (matching the directory name), use 'default' for none.
--factory-startup 
	Skip reading the BLENDER_STARTUP_FILE in the users home directory.
--enable-event-simulate 
	Enable event simulation testing feature 'bpy.types.Window.event_simulate'.

--env-system-datafiles 
	Set the BLENDER_SYSTEM_DATAFILES environment variable.
--env-system-scripts 
	Set the BLENDER_SYSTEM_SCRIPTS environment variable.
--env-system-python 
	Set the BLENDER_SYSTEM_PYTHON environment variable.

-noaudio 
	Force sound system to None.
-setaudio 
	Force sound system to a specific device.
	'NULL' 'SDL' 'OPENAL' 'JACK'.

-h or --help 
	Print this help text and exit.
-R 
	Register blend-file extension, then exit (Windows only).
-r 
	Silently register blend-file extension, then exit (Windows only).
-v or --version 
	Print Blender version and exit.
-- 
	End option processing, following arguments passed unchanged. Access via Python's 'sys.argv'.

Other Options:
/? 
	Print this help text and exit (windows only).
--debug-freestyle 
	Enable debug messages for Freestyle.
--debug-ghost 
	Enable debug messages for event handling.
--verbose <verbose>
	Set logging verbosity level for debug messages which supports it.
--disable-library-override 
	Enable Library Override features in the UI.

Argument Parsing:
	Arguments must be separated by white space, eg:
	# blender -ba test.blend
	...will exit since '-ba' is an unknown argument.
Argument Order:
	Arguments are executed in the order they are given. eg:
	# blender --background test.blend --render-frame 1 --render-output '/tmp'
	...will not render to '/tmp' because '--render-frame 1' renders before the output path is set.
	# blender --background --render-output /tmp test.blend --render-frame 1
	...will not render to '/tmp' because loading the blend-file overwrites the render output that was set.
	# blender --background test.blend --render-output /tmp --render-frame 1
	...works as expected.
Environment Variables:
  $BLENDER_USER_CONFIG      Directory for user configuration files.
  $BLENDER_USER_SCRIPTS     Directory for user scripts.
  $BLENDER_SYSTEM_SCRIPTS   Directory for system wide scripts.
  $BLENDER_USER_DATAFILES   Directory for user data files (icons, translations, ..).
  $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.
  $BLENDER_SYSTEM_PYTHON    Directory for system Python libraries.
  $TEMP                     Store temporary files here.
  $SDL_AUDIODRIVER          LibSDL audio driver - alsa, esd, dma.
  $PYTHONHOME               Path to the Python directory, eg. /usr/lib/python.
===========================================
org.web3d.x3d.jsail.BlenderLauncher -properties C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties
BlenderLauncher parameter: "-properties" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties" for properties file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties loading complete.
===========================================
org.web3d.x3d.jsail.BlenderLauncher -BLENDER_PATH C:\Program Files\Blender Foundation\Blender 2.82
parameters: "-BLENDER_PATH" "C:\Program Files\Blender Foundation\Blender 2.82" for setting Blender path
===========================================
org.web3d.x3d.jsail.BlenderLauncher C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.x3d -toImage
BlenderLauncher parameter: source file CleatClamp.x3d filesize 172231 bytes
BlenderLauncher parameter: "-toImage" for creating screenshot image of default viewpoint
executeCommand("C:\Program Files\Blender Foundation\Blender 2.82\blender.exe --background --factory-startup --python C:\Users\BRUTZM~1.IT1\AppData\Local\Temp\BlenderX3dToPng9102696631321144361.py -- C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.x3d")
Blender 2.82 (sub 7) (hash 375c7dc4caf4 built 2020-03-12 15:41:08)
found bundled python: C:\Program Files\Blender Foundation\Blender 2.82\2.82\python
Info: Deleted 1 object(s)
Command line: 7 args ['C:\\Program Files\\Blender Foundation\\Blender 2.82\\blender.exe', '--background', '--factory-startup', '--python', 'C:\\Users\\BRUTZM~1.IT1\\AppData\\Local\\Temp\\BlenderX3dToPng9102696631321144361.py', '--', 'C:\\x3d-code\\www.web3d.org\\x3d\\stylesheets\\java\\examples/CleatClamp.x3d']
outputPath= C:\x3d-code\www.web3d.org\x3d\stylesheets
Info: Deleted 1 object(s)

Blender quit

===========================================
now test .stl to image (not yet supported):
org.web3d.x3d.jsail.BlenderLauncher C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl -toImage
parameter: source file CleatClamp.stl filesize 542534 bytes
CommandLine parameter: "-toImage" for creating screenshot image of default viewpoint
Pass through to BlenderLauncher...
BlenderLauncher parameter: source file CleatClamp.stl filesize 542534 bytes
BlenderLauncher parameter: "-toImage" for creating screenshot image of default viewpoint
executeCommand("C:\Program Files\Blender Foundation\Blender 2.82\blender.exe --background --factory-startup --python C:\Users\BRUTZM~1.IT1\AppData\Local\Temp\BlenderX3dToPng9351193947108017176.py -- C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl")
Blender 2.82 (sub 7) (hash 375c7dc4caf4 built 2020-03-12 15:41:08)
found bundled python: C:\Program Files\Blender Foundation\Blender 2.82\2.82\python
Info: Deleted 1 object(s)
Command line: 7 args ['C:\\Program Files\\Blender Foundation\\Blender 2.82\\blender.exe', '--background', '--factory-startup', '--python', 'C:\\Users\\BRUTZM~1.IT1\\AppData\\Local\\Temp\\BlenderX3dToPng9351193947108017176.py', '--', 'C:\\x3d-code\\www.web3d.org\\x3d\\stylesheets\\java\\examples/CleatClamp.stl']
outputPath= C:\x3d-code\www.web3d.org\x3d\stylesheets
Info: Deleted 1 object(s)

Blender quit

===========================================
test.X3DJSAIL.MeshlabLauncher:
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.MeshLab.log.txt
Deleting C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_RoundTrip.MeshLab.log.txt
===========================================
org.web3d.x3d.jsail.MeshLabLauncher -version
MeshLabServer version: 2020.03
===========================================
org.web3d.x3d.jsail.MeshLabLauncher -help
Usage: java [-classpath X3DJSAIL.*.jar] org.web3d.x3d.jsail.MeshLabLauncher sourceFile [-convert [resultFile]] [-home | -help | -properties fileName.properties | -MESHLAB_PATH directoryPath]
https://www.MeshLab.net
Meshlab help:
MeshLabServer version: 2020.03
Usage:
meshlabserver [logargs] [args]


  where logargs can be:

    -d filename         dump on a text file a list of all the
                        filtering functions
    -l filename         log of the filters is output on a file


  where args can be:

    -p filename         meshlab project (.mlp) to be loaded

    -w filename [-x]    output meshlab project (.mlp) to be saved.
                        If -x flag is specified a 3D model meshfile.ext
                        contained in the input project will be 
                        overwritten, otherwise it will be saved in the 
                        same directory of input mesh as a new file 
                        called meshfile_out.ext.
                        ALL the mesh attributes will be exported in the
                        saved files

    -i filename         mesh that has to be loaded

    -o filename [-l <opt_layer>][-m <opt_mask>]  the name of the file 
                        where to write the current layer of the project
                        If -l parameter is set the specified layer is
                        going to be saved with the chosen filename
                        Valid values for <opt_layer> can be:
                          [0,last_layer_in_the_project] to indicate the
                             desired layer by its index
                          c  to indicate the CURRENT layer in the project
                          x  to indicate the LAST layer in the project
                        If -l param is not specified, by default the 
                        CURRENT layer will be saved
                        If -m is specified the listed mesh attributes
                        will be saved in the output file
                        The param <opt_mask> can be a space-separated
                        list of the following attributes:
                          vc -> vertex colors,
                          vf -> vertex flags,
                          vq -> vertex quality,
                          vn-> vertex normals,
                          vt -> vertex texture coords,
                          vr -> vertex radius,
                          fc -> face colors,
                          ff -> face flags,
                          fq -> face quality,
                          fn-> face normals,
                          wc -> wedge colors,
                          wn-> wedge normals,
                          wt -> wedge texture coords,
                          mp -> polygonal mesh info
                          sa -> save in ascii format
 
    -s filename         the script to be applied


   Examples:

'meshlabserver -i input.obj -o output.ply -m vc fq wt -s meshclean.mlx'
           the script contained in file 'meshclean.mlx' will be applied
           to the mesh contained into 'input.obj'. The per-vertex-color,
           the per-face-quality and the per-wedge-texture attributes 
           contained in the current layer will be saved into the
           output.ply file

'meshlabserver -i input.obj -o output.ply -l 2 -m vc fq wt -o output_last.ply -l l -s meshclean.mlx'
           the script contained in file 'meshclean.mlx' will be applied
           to the mesh contained into 'input.obj'.
           The per-vertex-color, the per-face-quality and the 
           per-wedge-texture attributes contained in the layer 2 
           (if it exists!) will be saved into the output.ply file
           The last layer of the project will be saved in the file
           output_last, with the default geometric attributes.

'meshlabserver -i input0.obj -i input1.ply -w outproj.mlp -x -s meshclean.mlx'
           the script file meshclean.mlx will be applied to the project
           composed by input0.obj and input1.ply meshes.
           The mesh input1.ply will become the current mesh of the 
           project (e.g. the mesh to which the filters operating on a
           single model will be applied).
           A new output project outproj.mlp file will be generated
           (containing references to the input0.obj an input1.ply).
           The files input0.obj and input1.ply will be overwritten.

'meshlabserver -l logfile.txt -p proj.mlp -i input.obj -w outproj.mlp -s meshclean.mlx'
           the mesh file input.obj will be added to the meshes referred
           by the loaded meshlab project file proj.mlp. The mesh 
           input.obj will become the current mesh of the project, the 
           script file meshclean.mlx will be applied to the meshes
           contained into the resulting project.
           The project file outproj.mlp will be generated.
           A 3D model meshfile.ext contained in the input project 
           proj.mlp will be saved in a new file called meshfile_out.ext.
           (if you want to overwrite the original files use the -v flag
           after the outproject filename) all the attributes of the 
           meshes will be saved into the output files; the log info 
           will be saved into the file logfile.txt.

   Notes:
   There can be multiple meshes loaded and the order they are listed
   matters because filters that use meshes as parameters choose the 
   mesh based on the order.
   The format of the output mesh is guessed by the used extension.
   Script is optional and must be in the xml format saved by MeshLab.
===========================================
org.web3d.x3d.jsail.MeshLabLauncher -properties C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties
MeshLabLauncher parameter: "-properties" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties" for properties file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties includes 12 properties:
-- listing properties --
deleteIntermediateFiles=true
BLENDER_PATH=
indentCharacter=SPACE
MESHLAB_PATH=
XSLT_ENGINE=SAXON
overwriteExistingFiles=true
indentIncrement=2
EXI_ENGINE=EXIFICIENT
SFImagePixelOutputHexadecimal=true
stripTrailingZeroes=true
validationExceptionAllowed=false
stripDefaultAttributes=true
------------------------
C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/X3DJSAIL.properties loading complete.
===========================================
org.web3d.x3d.jsail.MeshLabLauncher -MESHLAB_PATH C:\Program Files\VCG\MeshLab
parameters: "-MESHLAB_PATH" "C:\Program Files\VCG\MeshLab" for setting MeshLab path
===========================================
Convert CleatClamp.stl to .x3d version ...
org.web3d.x3d.jsail.MeshLabLauncher C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.x3d
MeshLabLauncher parameter: source file CleatClamp.stl filesize 542534 bytes
C:\Program Files\VCG\MeshLab\meshlabserver.exe -l C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.MeshLab.log.txt -i C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl -o C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.x3d
load success: false
and then canonicalize ...
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.x3d -canonicalize C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalize.x3d
parameter: source file CleatClamp_MeshLabLauncher.x3d filesize 80019 bytes
CommandLine parameter: "-canonicalize" for X3D and XML canonicalization (C14N)
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalize.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalize
CommandLine invocation: changed resultFileName=C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalizeCanonical.xml to meet X3dC14n requirement
CommandLine invocation: new X3dCanonicalizer(C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabLauncher.x3d,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalizeCanonical.xml)
 INFO [main] (X3dHeaderChecker.java:434) - final canonical 3.1 DOCTYPE found
 INFO [main] (X3dHeaderChecker.java:509) - -f final DTD was set, no action taken
 INFO [main] (X3dHeaderChecker.java:647) - Scene "C:/x3d-code/www.web3d.org/x3d/stylesheets/java/examples/CleatClamp_MeshLabLauncher.x3d" was not modified
...x3dCanonicalizer.isCanonical()=false
Warning: x3dCanonicalizer is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherCanonicalizeCanonical.xml
and then tidy ...
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.x3d C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherTidy.x3d
parameter: source file CleatClamp_MeshLabLauncher.x3d filesize 80019 bytes
CommandLine parameter: "-tidy" for producing X3D-Tidy cleanup of .x3d
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherTidy.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncherTidy
convert to X3D Tidy cleaned-up version
*** insertMissingMetaLicense: &lt;meta content='https://www.web3d.org/x3d/content/examples/license.html' name='license'/&gt;
*** prepend &lt;WorldInfo title='CleatClamp_MeshLabLauncher.x3d'/&gt;
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp_MeshLabLauncherTidy.x3d
and then .java version ...
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.x3d C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.x3d
parameter: source file CleatClamp.x3d filesize 172231 bytes
CommandLine parameter: "-toJava" for conversion to Java source code
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.java" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp
convert to Java:
no className provided, using normalized meta title value='CleatClamp'
[meta] name='warning' content='Do not use for climbing or yachting.'
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.java
===========================================
... and then back to .stl for visual comparison
org.web3d.x3d.jsail.MeshLabLauncher C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.stl
MeshLabLauncher parameter: source file CleatClamp.stl filesize 542534 bytes
C:\Program Files\VCG\MeshLab\meshlabserver.exe -l C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.MeshLab.log.txt -i C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp.stl -o C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/CleatClamp_MeshLabLauncher.stl
load success: false
===========================================
Continuing with individual tests
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d -toZIP -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant.zip
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toZIP" for conversion to compressed ZIP containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant.zip" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to ZIP:
source: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput.ant.zip filesize 6361 bytes, compression 28.50% of original
===========================================
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.x3d -toJava -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.java
parameter: source file flowers4.x3d filesize 7176 bytes
CommandLine parameter: "-toJava" for conversion to Java source code
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.java" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4
convert to Java:
no className provided, using normalized meta title value='flowers4'
compile flowers4.java source...
Compiling 4 source files to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples
test flowers4.java execution and self-validation:
Java program "flowers4" self-validation test results: success
===========================================
org.web3d.x3d.jsail.CommandLine C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.x3d -toJSON -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.json
parameter: source file flowers4.x3d filesize 7176 bytes
CommandLine parameter: "-toJSON" for conversion to JSON encoding
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4.json" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/flowers4
convert to JSON:
Script DEF=OrbitScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\flowers4.json
===========================================
org.web3d.x3d.jsail.CommandLine -toGZIP -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant.gz
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toGZIP" for conversion to compressed GZIP containing model
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant.gz" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to GZIP:
source: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.x3d filesize 22318 bytes
result: HelloWorldProgramOutput.ant.gz  filesize 5993 bytes, compression 26.85% of original
===========================================
org.web3d.x3d.jsail.CommandLine -toGZIP -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput.ant.gz
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toX3D" for conversion to X3D encoding
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to X3D:
Warning: toFileX3D() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.x3d
file conversion successful: HelloWorldProgramOutput_CommandLine.x3d (22318 bytes)
===========================================
org.web3d.x3d.jsail.CommandLine -toXML -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.xml
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toXML" for conversion to XML encoding
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.xml" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to XML:
Warning: toFileX3D() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.xml
file conversion successful: HelloWorldProgramOutput_CommandLine.xml (22318 bytes)
===========================================
org.web3d.x3d.jsail.CommandLine -toHTML -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.html (pretty print)
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toHTML" for producing .html pretty-print documentation
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.html" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine
convert to HTML using files:
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_CommandLine.html
===========================================
org.web3d.x3d.jsail.CommandLine -markdown -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.md
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-markdown" for producing .md model meta information markdown
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine.md" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutput_CommandLine
convert to .md model meta information markdown, include subdirectories in meta links: true
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_CommandLine.md
## Model Metadata for HelloWorldProgramOutput.x3d

|    attribute | value      |
| ------------ | ---------- |
| `title` | [HelloWorldProgramOutput.x3d](HelloWorldProgramOutput.x3d) |
| `info` | continued development and testing in progress |
| `description` | Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface
Library (X3DJSAIL) |
| `reference` | [https://www.web3d.org/specifications/java/X3DJSAIL.html](https://www.web3d.org/specifications/java/X3DJSAIL.html) |
| `generator` | HelloWorldProgramOutput.java |
| `created` | 6 September 2016 |
| `modified` | 7 April 2020 |
| `generator` | X3D Java Scene Access Interface Library (X3DJSAIL) |
| `generator` | [https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java](https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java) |
| `generator` | Netbeans http://www.netbeans.org |
| `creator` | Don Brutzman |
| `reference` | [https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d](https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d) |
| `reference` | Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation: |
| `reference` | [HelloWorldProgramOutput.txt](HelloWorldProgramOutput.txt) |
| `reference` | [HelloWorldProgramOutput.x3dv](HelloWorldProgramOutput.x3dv) |
| `reference` | [HelloWorldProgramOutput.wrl](HelloWorldProgramOutput.wrl) |
| `reference` | [HelloWorldProgramOutput.html](HelloWorldProgramOutput.html) |
| `reference` | [https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d](https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d) |
| `identifier` | [https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d](https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d) |
| `license` | [../license.html](../license.html) |

[HelloWorldProgramOutput.README.md](HelloWorldProgramOutput.README.md) contains additional file links and information.
===========================================
org.web3d.x3d.jsail.CommandLine -tidy -toFile C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutputTidy.CommandLine.x3d
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-tidy" for producing X3D-Tidy cleanup of .x3d
CommandLine parameter: "-toFile" "C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutputTidy_CommandLine.x3d" for result file name root C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples/HelloWorldProgramOutputTidy_CommandLine
convert to X3D Tidy cleaned-up version
*** revision: &lt;meta name='modified' content='7 April 2020'/&gt;
Warning: fileStylesheetConversion() is overwriting prior file C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutputTidy_CommandLine.x3d
===========================================
ant antfile=java/nashorn/build.xml target=test.nashorn (direct invocation)
X3D Nashorn SAI Library.test.nashorn:
Compile:
Compiling 4 source files to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes
warning: [options] bootstrap class path not set in conjunction with -source 8
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\CleatClamp.java]]
[parsing completed 212ms]
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.java]]
[parsing completed 23ms]
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput_MeshLabImport.java]]
[parsing completed 3ms]
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\flowers4.java]]
[parsing completed 5ms]
[search path for source files: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples]
[search path for class files: C:\Program Files\Java\openjdk\jdk-14\lib\modules,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\jars\X3DJSAIL.3.3.full.jar,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\nashorn]
[loading /modules/java.base/java/lang/Object.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFInt32Object.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec3fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\X3DObject.class]
[loading /modules/java.base/java/lang/String.class]
[loading /modules/java.base/java/lang/Deprecated.class]
[loading /modules/java.base/jdk/internal/PreviewFeature.class]
[loading /modules/java.base/jdk/internal/PreviewFeature$Feature.class]
[loading /modules/java.base/java/lang/annotation/Retention.class]
[loading /modules/java.base/java/lang/annotation/RetentionPolicy.class]
[loading /modules/java.base/java/lang/annotation/Target.class]
[loading /modules/java.base/java/lang/annotation/ElementType.class]
[checking CleatClamp]
[loading /modules/java.base/java/io/Serializable.class]
[loading /modules/java.base/java/lang/AutoCloseable.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Rendering\NormalObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\Normal.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\X3DNormalNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\X3DGeometricPropertyNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\X3DConcreteNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\X3DConcreteElement.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\X3DConcreteField.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Rendering\CoordinateObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\Coordinate.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\X3DCoordinateNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\IndexedFaceSetObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\IndexedFaceSet.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\X3DComposedGeometryNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\X3DGeometryNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFBoolObject.class]
[loading /modules/java.base/java/util/ArrayList.class]
[loading /modules/java.base/java/lang/Integer.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ProtoInstanceObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shape\MaterialObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\Material.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\X3DMaterialNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\X3DAppearanceChildNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFFloatObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shape\AppearanceObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\Appearance.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\X3DAppearanceNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shape\ShapeObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\Shape.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shape\X3DShapeNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DChildNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Grouping\X3DBoundedObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Grouping\GroupObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Grouping\Group.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Grouping\X3DGroupingNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Grouping\TransformObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Grouping\Transform.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Navigation\ViewpointObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Navigation\Viewpoint.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Navigation\X3DViewpointNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DBindableNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFStringObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Networking\InlineObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Networking\Inline.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Networking\X3DUrlObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFStringObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Grouping\SwitchObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Grouping\Switch.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFInt32Object.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\SceneObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\X3DConcreteStatement.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\CommentsBlock.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\metaObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\headObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\MFInt32.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\MField.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\X3DField.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec3fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\MFVec3f.class]
[loading /modules/java.base/java/lang/Comparable.class]
[loading /modules/java.base/java/lang/CharSequence.class]
[loading /modules/java.base/java/lang/constant/Constable.class]
[loading /modules/java.base/java/lang/constant/ConstantDesc.class]
[loading /modules/java.base/java/lang/Byte.class]
[loading /modules/java.base/java/lang/Character.class]
[loading /modules/java.base/java/lang/Short.class]
[loading /modules/java.base/java/lang/Long.class]
[loading /modules/java.base/java/lang/Float.class]
[loading /modules/java.base/java/lang/Double.class]
[loading /modules/java.base/java/lang/Boolean.class]
[loading /modules/java.base/java/lang/Void.class]
[loading /modules/java.base/java/lang/System.class]
[loading /modules/java.base/java/io/PrintStream.class]
[loading /modules/java.base/java/lang/Appendable.class]
[loading /modules/java.base/java/io/Closeable.class]
[loading /modules/java.base/java/io/FilterOutputStream.class]
[loading /modules/java.base/java/io/OutputStream.class]
[loading /modules/java.base/java/io/Flushable.class]
[loading /modules/java.base/java/lang/StringBuilder.class]
[loading /modules/java.base/java/lang/AbstractStringBuilder.class]
[loading /modules/java.base/java/lang/StringBuffer.class]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\CleatClamp.class]
[checking HelloWorldProgramOutput]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\DISEntityTypeMappingObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\DISEntityManagerObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\DIS\DISEntityManager.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\TransmitterPduObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\DIS\TransmitterPdu.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Networking\X3DNetworkSensorNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DSensorNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\SignalPduObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\ReceiverPduObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\DIS\ReceiverPdu.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\DIS\EspduTransformObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\CADGeometry\CADFaceObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\CADGeometry\CADPartObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CADGeometry\CADPart.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CADGeometry\X3DProductStructureChildNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CADGeometry\CADFace.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\CADGeometry\CADAssemblyObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CADGeometry\CADAssembly.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\CADGeometry\CADLayerObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CADGeometry\CADLayer.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\DIS\EspduTransform.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\DIS\SignalPdu.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shaders\ShaderPartObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shaders\ComposedShaderObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shaders\ComposedShader.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shaders\X3DShaderNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shaders\X3DProgrammableShaderObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shaders\ShaderProgramObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Shaders\ProgramShaderObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shaders\ProgramShader.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\ProtoInstance.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DPrototypeInstance.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ProtoBodyObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ProtoDeclareObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\fieldValueObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec4fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec4fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec4dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec4dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec3dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec3dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec2fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec2fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFVec2dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFVec2dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFTimeObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFTimeObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFRotationObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFRotationObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFMatrix4fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFMatrix4fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFMatrix4dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFMatrix4dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFMatrix3fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFMatrix3fObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFMatrix3dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFMatrix3dObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFImageObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFImageObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFFloatObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFDoubleObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFDoubleObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFColorRGBAObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFColorRGBAObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFColorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\SFColorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\fields\MFBoolObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\WorldInfoObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\WorldInfo.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DInfoNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\fieldObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ProtoInterfaceObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\ExtrusionObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\Extrusion.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Texturing\MovieTextureObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Texturing\MovieTexture.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Sound\X3DSoundSourceNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Time\X3DTimeDependentNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Texturing\X3DTexture2DNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Texturing\X3DTextureNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Sound\SoundObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Sound\Sound.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Sound\X3DSoundNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Sound\AudioClipObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Sound\AudioClip.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\ConeObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\Cone.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\MetadataStringObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\MetadataString.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\X3DMetadataObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\connectObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ISObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Scripting\ScriptObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Scripting\Script.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Scripting\X3DScriptNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Networking\EXPORTObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Networking\IMPORTObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\CylinderObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\Cylinder.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\SphereObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\Sphere.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ExternProtoDeclareObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\PointingDeviceSensor\TouchSensorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\PointingDeviceSensor\TouchSensor.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\PointingDeviceSensor\X3DTouchSensorNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\PointingDeviceSensor\X3DPointingDeviceSensorNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\ROUTEObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Time\TimeSensorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Time\TimeSensor.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Interpolation\ColorInterpolatorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Interpolation\ColorInterpolator.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Interpolation\X3DInterpolatorNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\EnvironmentalEffects\BackgroundObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\EnvironmentalEffects\Background.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\EnvironmentalEffects\X3DBackgroundNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Interpolation\OrientationInterpolatorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Interpolation\OrientationInterpolator.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Text\TextObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Text\Text.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Navigation\CollisionObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Navigation\Collision.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Text\FontStyleObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Text\FontStyle.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Text\X3DFontStyleNode.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\MetadataSetObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Core\MetadataSet.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Interpolation\PositionInterpolatorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Interpolation\PositionInterpolator.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Rendering\IndexedLineSetObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Rendering\IndexedLineSet.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Geometry3D\BoxObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Geometry3D\Box.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Texturing\ImageTextureObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Texturing\ImageTexture.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Networking\AnchorObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Networking\Anchor.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Layering\LayerSetObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Navigation\NavigationInfoObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Navigation\NavigationInfo.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Navigation\ViewpointGroupObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Navigation\ViewpointGroup.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\unitObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\Core\componentObject.class]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\HelloWorldProgramOutput.class]
[checking HelloWorldProgramOutput_MeshLabImport]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\HelloWorldProgramOutput_MeshLabImport.class]
[checking flowers4]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\Shaders\ShaderPart.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\jsail\CubeMapTexturing\ComposedCubeMapTextureObject.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CubeMapTexturing\ComposedCubeMapTexture.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\org\web3d\x3d\sai\CubeMapTexturing\X3DEnvironmentTextureNode.class]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\flowers4.class]
[total 2171ms]
1 warning
Compiling 2 source files to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes
warning: [options] bootstrap class path not set in conjunction with -source 8
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\src\net\coderextreme\MyInputStream.java]]
[parsing completed 18ms]
[parsing started SimpleFileObject[C:\x3d-code\www.web3d.org\x3d\stylesheets\java\src\net\coderextreme\X3DJSONLD.java]]
[parsing completed 17ms]
[search path for source files: C:\x3d-code\www.web3d.org\x3d\stylesheets\java\src\net\coderextreme]
[search path for class files: C:\Program Files\Java\openjdk\jdk-14\lib\modules,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes,C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar]
[loading /modules/java.base/java/io/InputStream.class]
[loading /modules/java.base/java/io/Closeable.class]
[loading /modules/java.base/java/lang/AutoCloseable.class]
[loading /modules/java.base/java/lang/Object.class]
[loading /modules/java.base/java/io/FileNotFoundException.class]
[loading /modules/java.base/java/io/IOException.class]
[loading /modules/java.base/java/lang/String.class]
[loading /modules/java.xml/org/w3c/dom/Element.class]
[loading /modules/java.base/java/util/List.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonValue.class)]
[loading /modules/java.xml/org/w3c/dom/Document.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonArray.class)]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonObject.class)]
[loading /modules/java.xml/javax/xml/parsers/ParserConfigurationException.class]
[loading /modules/java.base/java/io/File.class]
[loading /modules/java.base/java/lang/Deprecated.class]
[loading /modules/java.base/java/lang/Override.class]
[loading /modules/java.base/java/lang/annotation/Annotation.class]
[loading /modules/java.base/jdk/internal/PreviewFeature.class]
[loading /modules/java.base/jdk/internal/PreviewFeature$Feature.class]
[loading /modules/java.base/java/lang/annotation/Retention.class]
[loading /modules/java.base/java/lang/annotation/RetentionPolicy.class]
[loading /modules/java.base/java/lang/annotation/Target.class]
[loading /modules/java.base/java/lang/annotation/ElementType.class]
[checking net.coderextreme.MyInputStream]
[loading /modules/java.base/java/io/Serializable.class]
[loading /modules/java.base/java/lang/Error.class]
[loading /modules/java.base/java/lang/Exception.class]
[loading /modules/java.base/java/lang/Throwable.class]
[loading /modules/java.base/java/lang/RuntimeException.class]
[loading /modules/java.base/java/lang/InterruptedException.class]
[loading /modules/java.base/java/lang/Integer.class]
[loading /modules/java.base/java/lang/OutOfMemoryError.class]
[loading /modules/java.base/java/lang/VirtualMachineError.class]
[loading /modules/java.base/java/util/Arrays.class]
[loading /modules/java.base/java/lang/Class.class]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\net\coderextreme\MyInputStream.class]
[checking net.coderextreme.X3DJSONLD]
[loading /modules/java.base/java/lang/Comparable.class]
[loading /modules/java.base/java/lang/CharSequence.class]
[loading /modules/java.base/java/lang/constant/Constable.class]
[loading /modules/java.base/java/lang/constant/ConstantDesc.class]
[loading /modules/java.base/java/lang/StringBuffer.class]
[loading /modules/java.base/java/util/Collection.class]
[loading /modules/java.base/java/lang/Iterable.class]
[loading /modules/java.base/java/lang/AbstractStringBuilder.class]
[loading /modules/java.base/java/lang/Appendable.class]
[loading /modules/java.xml/org/w3c/dom/Node.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonStructure.class)]
[loading /modules/java.xml/org/w3c/dom/CDATASection.class]
[loading /modules/java.xml/org/w3c/dom/Text.class]
[loading /modules/java.xml/org/w3c/dom/CharacterData.class]
[loading /modules/java.base/java/util/Map.class]
[loading /modules/java.xml/org/w3c/dom/Comment.class]
[loading /modules/java.base/java/lang/Byte.class]
[loading /modules/java.base/java/lang/Character.class]
[loading /modules/java.base/java/lang/Short.class]
[loading /modules/java.base/java/lang/Long.class]
[loading /modules/java.base/java/lang/Float.class]
[loading /modules/java.base/java/lang/Double.class]
[loading /modules/java.base/java/lang/Boolean.class]
[loading /modules/java.base/java/lang/Void.class]
[loading /modules/java.base/java/lang/System.class]
[loading /modules/java.base/java/io/PrintStream.class]
[loading /modules/java.base/java/io/FilterOutputStream.class]
[loading /modules/java.base/java/io/OutputStream.class]
[loading /modules/java.base/java/io/Flushable.class]
[loading /modules/java.base/java/lang/Number.class]
[loading /modules/java.base/java/util/Iterator.class]
[loading /modules/java.base/java/util/Set.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonNumber.class)]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonString.class)]
[loading /modules/java.base/java/util/ArrayList.class]
[loading /modules/java.base/java/util/AbstractList.class]
[loading /modules/java.base/java/util/AbstractCollection.class]
[loading /modules/java.xml/javax/xml/parsers/DocumentBuilderFactory.class]
[loading /modules/java.xml/javax/xml/parsers/DocumentBuilder.class]
[loading /modules/java.base/java/io/FileInputStream.class]
[loading /modules/java.base/java/io/FileDescriptor.class]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/JsonReader.class)]
[loading C:\x3d-code\www.web3d.org\x3d\stylesheets\java\lib\javax.json-api-1.0.jar(/javax/json/Json.class)]
[loading /modules/java.base/java/io/Reader.class]
[loading /modules/java.base/java/net/URI.class]
[loading /modules/java.xml/org/w3c/dom/ls/DOMImplementationLS.class]
[loading /modules/java.xml/org/w3c/dom/DOMImplementation.class]
[loading /modules/java.xml/org/w3c/dom/ls/LSOutput.class]
[loading /modules/java.xml/org/w3c/dom/ls/LSSerializer.class]
[loading /modules/java.xml/org/w3c/dom/DOMConfiguration.class]
[loading /modules/java.base/java/io/StringWriter.class]
[loading /modules/java.base/java/io/Writer.class]
[loading /modules/java.xml/org/w3c/dom/DOMException.class]
[loading /modules/java.base/java/lang/NumberFormatException.class]
[loading /modules/java.base/java/lang/IllegalArgumentException.class]
[loading /modules/java.xml/org/w3c/dom/ls/LSException.class]
[loading /modules/java.base/java/lang/StringBuilder.class]
[wrote C:\x3d-code\www.web3d.org\x3d\stylesheets\java\classes\net\coderextreme\X3DJSONLD.class]
[total 885ms]
1 warning
Copy:
Copying 1 file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\nashorn\examples
Copying C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.x3d to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\nashorn\examples\HelloWorldProgramOutput.x3d
Copying 1 file to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\nashorn\examples
Copying C:\x3d-code\www.web3d.org\x3d\stylesheets\java\examples\HelloWorldProgramOutput.json to C:\x3d-code\www.web3d.org\x3d\stylesheets\java\nashorn\examples\HelloWorldProgramOutput.json
===========
Run test 1:
org.web3d.x3d.jsail.CommandLine examples/HelloWorldProgramOutput.x3d -tojs -toFile examples/HelloWorldProgramOutput.Nashorn.js
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-tojs" for conversion to X3DJSONLD JavaScript source
CommandLine parameter: "-toFile" "examples/HelloWorldProgramOutput.Nashorn.js" for result file name root examples/HelloWorldProgramOutput.Nashorn
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to JS JavaScript:
Warning: toFileJavaScript() is overwriting prior file examples/HelloWorldProgramOutput.Nashorn.js
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Warning: Nashorn engine is planned to be removed from a future JDK release
nashorn diagnostic: toFileJavaScript(examples/HelloWorldProgramOutput.Nashorn.js) is running engine.eval(load(...)) using intermediateJSFileName='examples/HelloWorldProgramOutput.Nashorn.js.intermediate.js'
Returning with <X3D profile="Immersive" version="3.3" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.3.xsd"><!--x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true--><head><!--comment #1--><!--comment #2--><!--comment #3--><!--comment #4--><component name="Navigation" level="3"/>
<component name="Shaders" level="1"/>
<component name="CADGeometry" level="2"/>
<component name="DIS" level="2"/>
<component name="H-Anim" level="1"/>
<component name="Grouping" level="1"/>
<component name="Layering" level="1"/>
<unit name="AngleUnitConversion" category="angle" conversionFactor="1"/>
<unit name="LengthUnitConversion" category="length" conversionFactor="1"/>
<unit name="ForceFromPoundsToNewtons" category="force" conversionFactor="4.4482"/>
<meta name="title" content="HelloWorldProgramOutput.x3d"/>
<meta name="info" content="continued development and testing in progress"/>
<meta name="description" content="Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)"/>
<meta name="reference" content="https://www.web3d.org/specifications/java/X3DJSAIL.html"/>
<meta name="generator" content="HelloWorldProgramOutput.java"/>
<meta name="created" content="6 September 2016"/>
<meta name="modified" content="7 April 2020"/>
<meta name="generator" content="X3D Java Scene Access Interface Library (X3DJSAIL)"/>
<meta name="generator" content="https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java"/>
<meta name="generator" content="Netbeans http://www.netbeans.org"/>
<meta name="creator" content="Don Brutzman"/>
<meta name="reference" content="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d"/>
<meta name="reference" content="Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:"/>
<meta name="reference" content="HelloWorldProgramOutput.txt"/>
<meta name="reference" content="HelloWorldProgramOutput.x3dv"/>
<meta name="reference" content="HelloWorldProgramOutput.wrl"/>
<meta name="reference" content="HelloWorldProgramOutput.html"/>
<meta name="reference" content="https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"/>
<meta name="identifier" content="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d"/>
<meta name="license" content="../license.html"/>
</head>
<Scene><ViewpointGroup description="Available viewpoints"><Viewpoint DEF="DefaultView" description="Hello X3DJSAIL"/>
<Viewpoint DEF="TopDownView" description="top-down view from above" orientation="1 0 0 -1.570796" position="0 100 0"/>
</ViewpointGroup>
<NavigationInfo type="&quot;EXAMINE&quot; &quot;FLY&quot; &quot;ANY&quot;"/>
<WorldInfo DEF="WorldInfoDEF" title="HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"/>
<WorldInfo USE="WorldInfoDEF"/>
<WorldInfo USE="WorldInfoDEF"/>
<MetadataString name="test" DEF="scene.addChildMetadata" value="&quot;Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding&quot;"/>
<LayerSet DEF="scene.addChildLayerSetTest"/>
<Transform DEF="LogoGeometryTransform" translation="0 1.5 0"><Anchor description="select for X3D Java SAI Library (X3DJSAIL) description" url="&quot;../X3DJSAIL.html&quot; &quot;https://www.web3d.org/specifications/java/X3DJSAIL.html&quot;"><Shape DEF="BoxShape"><Appearance><Material DEF="GreenMaterial" diffuseColor="0 1 1" emissiveColor="0.8 0 0" transparency="0.1"/>
<ImageTexture containerField="texture" url="&quot;images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot; &quot;https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot;"/>
</Appearance>
<Box containerField="geometry" DEF="test-NMTOKEN_regex.0123456789" class="untextured"/>
</Shape>
</Anchor>
</Transform>
<Shape DEF="LineShape"><Appearance><Material emissiveColor="0.6 0.19607843 0.8"/>
</Appearance>
<IndexedLineSet containerField="geometry" coordIndex="0 1 2 3 4 0"><!--Coordinate 3-tuple point count: 6--><Coordinate containerField="coord" point="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
</IndexedLineSet>
</Shape>
<PositionInterpolator DEF="BoxPathAnimator" key="0 0.125 0.375 0.625 0.875 1" keyValue="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
<TimeSensor DEF="OrbitClock" cycleInterval="8" loop="true"/>
<ROUTE fromField="fraction_changed" fromNode="OrbitClock" toField="set_fraction" toNode="BoxPathAnimator"/>
<ROUTE fromField="value_changed" fromNode="BoxPathAnimator" toField="set_translation" toNode="LogoGeometryTransform"/>
<Transform DEF="TextTransform" translation="0 -1.5 0"><Shape><Appearance><Material USE="GreenMaterial"/>
</Appearance>
<Text containerField="geometry" string="&quot;X3D Java&quot; &quot;SAI Library&quot; &quot;X3DJSAIL&quot;"><!--Comment example A, plain quotation marks: He said, "Immel did it!"--><!--Comment example B, XML character entities: He said, &quot;Immel did it!&quot;--><MetadataSet containerField="metadata" name="EscapedQuotationMarksMetadataSet"><MetadataString name="quotesTestC" value="&quot;MFString example C, backslash-escaped quotes: He said, \&quot;Immel did it!\&quot;&quot;"/>
<MetadataString name="extraChildTest" value="&quot;checks MetadataSetObject addValue() method&quot;"/>
</MetadataSet>
<FontStyle justify="&quot;MIDDLE&quot; &quot;MIDDLE&quot;"/>
</Text>
</Shape>
<Collision><!--test containerField='proxy'--><Shape containerField="proxy" DEF="ProxyShape"><!--alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"'--><!--alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""'--><!--alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \""Immel did it!\"""})--><!--reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html--><Text containerField="geometry" string="&quot;One, Two, Text&quot; &quot;&quot; &quot;He said, \&quot;Immel did it!\&quot; \&quot;\&quot;&quot;"/>
</Shape>
</Collision>
<!--It's a beautiful world--><!--... for you!--><!--https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)--></Transform>
<!--repeatedly spin 180 degrees as a readable special effect--><OrientationInterpolator DEF="SpinInterpolator" key="0 0.5 1" keyValue="0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964"/>
<TimeSensor DEF="SpinClock" cycleInterval="5" loop="true"/>
<ROUTE fromField="fraction_changed" fromNode="SpinClock" toField="set_fraction" toNode="SpinInterpolator"/>
<ROUTE fromField="value_changed" fromNode="SpinInterpolator" toField="rotation" toNode="TextTransform"/>
<Group DEF="BackgroundGroup"><Background DEF="GradualBackground"/>
<Script DEF="colorTypeConversionScript"><field name="colorInput" accessType="inputOnly" type="SFColor"/>
<field name="colorsOutput" accessType="outputOnly" type="MFColor"/>
<![CDATA[

ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}


]]></Script>
<ColorInterpolator DEF="ColorAnimator" key="0 0.5 1" keyValue="0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1"><!--AZURE to INDIGO and back again--></ColorInterpolator>
<TimeSensor DEF="ColorClock" cycleInterval="60" loop="true"/>
<ROUTE fromField="colorsOutput" fromNode="colorTypeConversionScript" toField="skyColor" toNode="GradualBackground"/>
<ROUTE fromField="value_changed" fromNode="ColorAnimator" toField="colorInput" toNode="colorTypeConversionScript"/>
<ROUTE fromField="fraction_changed" fromNode="ColorClock" toField="set_fraction" toNode="ColorAnimator"/>
</Group>
<ProtoDeclare name="ArtDeco01Material" appinfo="tooltip: ArtDeco01Material prototype is a Material node"><ProtoInterface><field name="description" accessType="inputOutput" appinfo="tooltip for descriptionField" type="SFString" value="ArtDeco01Material prototype is a Material node"/>
<field name="enabled" accessType="inputOutput" type="SFBool" value="true"/>
</ProtoInterface>
<ProtoBody><!--Initial node of ProtoBody determines prototype node type--><Material ambientIntensity="0.25" diffuseColor="0.282435 0.085159 0.134462" shininess="0.127273" specularColor="0.276305 0.11431 0.139857"/>
<!--[HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material"--><!--presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types--><TouchSensor description="within ProtoBody"><IS><connect nodeField="description" protoField="description"/>
<connect nodeField="enabled" protoField="enabled"/>
</IS>
</TouchSensor>
</ProtoBody>
</ProtoDeclare>
<ExternProtoDeclare name="ArtDeco02Material" appinfo="this is a different Material node" url="&quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material&quot; &quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material&quot;"><!--[HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."--><field name="description" accessType="inputOutput" appinfo="tooltip for descriptionField" type="SFString"/>
</ExternProtoDeclare>
<!--Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place--><Shape DEF="TestShape1"><Appearance DEF="TestAppearance1"><!--ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java--><ProtoInstance containerField="material" name="ArtDeco01Material"><!--[HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material"--><fieldValue name="description" value="ArtDeco01Material can substitute for a Material node"/>
</ProtoInstance>
</Appearance>
<Sphere containerField="geometry" radius="0.001"/>
</Shape>
<Shape DEF="TestShape2"><Appearance DEF="TestAppearance2"><!--ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java--><ProtoInstance containerField="material" name="ArtDeco02Material" DEF="ArtDeco02MaterialDEF"><!--[HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."--><fieldValue name="description" value="ArtDeco02Material can substitute for another Material node"/>
</ProtoInstance>
</Appearance>
<Cone containerField="geometry" bottomRadius="0.001" height="0.001"/>
</Shape>
<Shape DEF="TestShape3"><Appearance DEF="TestAppearance3"><!--ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE.--><ProtoInstance containerField="material" USE="ArtDeco02MaterialDEF"/>
</Appearance>
<Cylinder containerField="geometry" height="0.001" radius="0.001"/>
</Shape>
<Inline DEF="inlineSceneDef" url="&quot;someOtherScene.x3d&quot; &quot;https://www.web3d.org/specifications/java/examples/someOtherScene.x3d&quot;"/>
<IMPORT AS="WorldInfoDEF2" importedDEF="WorldInfoDEF" inlineDEF="inlineSceneDef"/>
<EXPORT AS="WorldInfoDEF3" localDEF="WorldInfoDEF"/>
<ProtoDeclare name="MaterialModulator" appinfo="mimic a Material node and modulate fields as an animation effect" documentation="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html"><ProtoInterface><field name="enabled" accessType="inputOutput" type="SFBool" value="true"/>
<field name="diffuseColor" accessType="inputOutput" type="SFColor" value="0 0 0"/>
<field name="emissiveColor" accessType="inputOutput" type="SFColor" value="0.05 0.05 0.5"/>
<field name="specularColor" accessType="inputOutput" type="SFColor" value="0 0 0"/>
<field name="transparency" accessType="inputOutput" type="SFFloat" value="0"/>
<field name="shininess" accessType="inputOutput" type="SFFloat" value="0"/>
<field name="ambientIntensity" accessType="inputOutput" type="SFFloat" value="0"/>
</ProtoInterface>
<ProtoBody><Material DEF="MaterialNode"><IS><connect nodeField="diffuseColor" protoField="diffuseColor"/>
<connect nodeField="emissiveColor" protoField="emissiveColor"/>
<connect nodeField="specularColor" protoField="specularColor"/>
<connect nodeField="transparency" protoField="transparency"/>
<connect nodeField="shininess" protoField="shininess"/>
<connect nodeField="ambientIntensity" protoField="ambientIntensity"/>
</IS>
</Material>
<!--Only first node (the node type) is renderable, others are along for the ride--><Script DEF="MaterialModulatorScript"><field name="enabled" accessType="inputOutput" type="SFBool"/>
<field name="diffuseColor" accessType="inputOutput" type="SFColor"/>
<field name="newColor" accessType="outputOnly" type="SFColor"/>
<field name="clockTrigger" accessType="inputOnly" type="SFTime"/>
<IS><connect nodeField="enabled" protoField="enabled"/>
<connect nodeField="diffuseColor" protoField="diffuseColor"/>
</IS>
<![CDATA[

ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;

    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}


]]></Script>
</ProtoBody>
</ProtoDeclare>
<!--Test success: declarative statement createDeclarativeShapeTests()--><Group DEF="DeclarativeGroupExample"><Shape><MetadataString containerField="metadata" name="findThisNameValue" DEF="FindableMetadataStringTest" value="&quot;test case&quot;"/>
<Appearance DEF="DeclarativeAppearanceExample"><!--DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance--><ProtoInstance containerField="material" name="MaterialModulator" DEF="MyMaterialModulator"/>
</Appearance>
<Cone containerField="geometry" bottom="false" bottomRadius="0.05" height="0.1"/>
</Shape>
<!--Test success: declarativeGroup.addChild() singleton pipeline method--></Group>
<!--Test success: declarative statement addChild()--><!--Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance>--><!--Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/>--><!--Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found--><!--Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found--><!--Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found--><Group DEF="TestFieldObjectsGroup"><!--testFieldObjects() results--><!--SFBool default=true, true=true, false=false, negate()=true--><!--MFBool default=, initial=true false true, negate()=false true false--><!--SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0--><!--MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7--><!--... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear=--><!--SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true--><!--regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value--></Group>
<Sound location="0 1.6 0"><!--set sound-ellipsoid location height at 1.6m to match typical avatar height--><AudioClip containerField="source" description="chimes" url="&quot;chimes.wav&quot; &quot;https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav&quot;"><!--Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d--></AudioClip>
</Sound>
<Sound location="0 1.6 0"><!--set sound-ellipsoid location height at 1.6m to match typical avatar height--><MovieTexture containerField="source" description="mpgsys.mpg from ConformanceNist suite" url="&quot;mpgsys.mpg&quot; &quot;https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg&quot;"><!--Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d--><!--Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList"--></MovieTexture>
</Sound>
<!--Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true--><!--Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false--><!--Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false--><!--Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true--><!--Test success: CommentsBlock.isNode()=false, testComments.isNode()=false--><!--Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true--><Shape DEF="ExtrusionShape"><!--ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]'--><!--ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]'--><Appearance DEF="TransparentAppearance"><Material transparency="1"/>
</Appearance>
<Extrusion containerField="geometry" DEF="ExampleExtrusion"/>
</Shape>
<Group><!--Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes--><ProtoDeclare name="NewWorldInfo"><ProtoInterface><field name="description" accessType="initializeOnly" type="SFString"/>
</ProtoInterface>
<ProtoBody><WorldInfo/>
</ProtoBody>
</ProtoDeclare>
<ProtoInstance name="NewWorldInfo" DEF="Proto1"><fieldValue name="description" value="testing 1 2 3"/>
</ProtoInstance>
<Group DEF="Node2"><!--intentionally empty--></Group>
<ProtoInstance name="NewWorldInfo" DEF="Proto3"/>
<Transform DEF="Node4"><!--intentionally empty--></Transform>
<!--Test satisfactorily creates MFNode children array as an ordered list with mixed content--></Group>
<ProtoDeclare name="ShaderProto"><ProtoBody><ProgramShader/>
</ProtoBody>
</ProtoDeclare>
<Shape><Appearance><!--Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes--><!--Test satisfactorily creates MFNode shaders array as an ordered list with mixed content--><ProgramShader DEF="TestShader1"><ShaderProgram DEF="TestShader2" type="VERTEX"/>
</ProgramShader>
<ProtoInstance name="ShaderProto" DEF="TestShader3"/>
<ComposedShader DEF="TestShader4"><ShaderPart DEF="TestShader5" type="VERTEX"/>
</ComposedShader>
</Appearance>
</Shape>
<Transform DEF="SpecialtyNodes"><CADLayer><CADAssembly><CADPart><CADFace/>
</CADPart>
</CADAssembly>
</CADLayer>
<EspduTransform/>
<ReceiverPdu/>
<SignalPdu/>
<TransmitterPdu/>
<DISEntityManager><DISEntityTypeMapping/>
</DISEntityManager>
</Transform>
</Scene>
</X3D>
Hello World!
file conversion successful: HelloWorldProgramOutput.Nashorn.js (31274 bytes)
===========
Run test 2:
org.web3d.x3d.jsail.CommandLine examples/HelloWorldProgramOutput.x3d -toJSON -toFile examples/HelloWorldProgramOutput.Java.json
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toJSON" for conversion to JSON encoding
CommandLine parameter: "-toFile" "examples/HelloWorldProgramOutput.Java.json" for result file name root examples/HelloWorldProgramOutput.Java
convert to JSON:
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Warning: fileStylesheetConversion() is overwriting prior file examples\HelloWorldProgramOutput.Java.json
===========
Run test 3:
org.web3d.x3d.jsail.CommandLine examples/HelloWorldProgramOutput.x3d -toX3D -toFile examples/HelloWorldProgramOutput.Java.x3d
parameter: source file HelloWorldProgramOutput.x3d filesize 22318 bytes
CommandLine parameter: "-toX3D" for conversion to X3D encoding
CommandLine parameter: "-toFile" "examples/HelloWorldProgramOutput.Java.x3d" for result file name root examples/HelloWorldProgramOutput.Java
Parsing using Document Object Model (DOM) based X3DLoaderDOM...
[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
convert to X3D:
Warning: toFileX3D() is overwriting prior file examples/HelloWorldProgramOutput.Java.x3d
file conversion successful: HelloWorldProgramOutput.Java.x3d (22318 bytes)
===========================================
HelloWorldProgramOutput.Java.x3d
1 file(s) have been successfully validated.
1 file(s) have been successfully validated.
matches HelloWorldProgramOutput.x3d: true
===========================================
===========================================
HelloWorldProgramOutput.Java.json
matches HelloWorldProgramOutput.json: true
===========================================
script:
Warning: The jjs tool is planned to be removed from a future JDK release
Warning: toFileX3D() is overwriting prior file examples/HelloWorldProgramOutput.Nashorn.js.new.x3d
Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file examples/HelloWorldProgramOutput.Nashorn.js.new.json
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
===========================================
HelloWorldProgramOutput.Java.x3d
matches HelloWorldProgramOutput.Nashorn.js.new.x3d: false
===========================================
===========================================
HelloWorldProgramOutput.Java.json
matches HelloWorldProgramOutput.Nashorn.js.new.json: false
===========================================
Run test 4
jjs examples/Nashorn.js
Warning: The jjs tool is planned to be removed from a future JDK release
Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file ./examples/Nashorn.json
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">

<X3D profile="Immersive" version="3.3"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.3.xsd">
    <head>
        <!-- comment #1 -->
        <!-- comment #2 -->
        <!-- comment #3 -->
        <!-- comment #4 -->
        <component level="3" name="Navigation"/>
        <component level="1" name="Layering"/>
        <unit category="angle" conversionFactor="1.0" name="AngleUnitConversion"/>
        <unit category="length" conversionFactor="1.0" name="LengthUnitConversion"/>
        <meta content="HelloWorldProgramOutput.x3d" name="title"/>
        <meta
            content="Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface (SAI) Library" name="description"/>
        <meta
            content="http://www.web3d.org/specifications/java/X3DJSAIL.html" name="reference"/>
        <meta content="HelloWorldProgramOutput.java" name="generator"/>
        <meta content="6 September 2016" name="created"/>
        <meta content="28 June 2018" name="modified"/>
        <meta
            content="X3D Java Scene Access Interface Library (X3DJSAIL)" name="generator"/>
        <meta
            content="http://www.web3d.org/specifications/java/examples/HelloWorldProgram.java" name="generator"/>
        <meta content="Netbeans http://www.netbeans.org" name="generator"/>
        <meta content="Don Brutzman" name="creator"/>
        <meta
            content="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d" name="reference"/>
        <meta
            content="Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:" name="reference"/>
        <meta content="HelloWorldProgramOutput.txt" name="reference"/>
        <meta content="HelloWorldProgramOutput.x3dv" name="reference"/>
        <meta content="HelloWorldProgramOutput.wrl" name="reference"/>
        <meta content="HelloWorldProgramOutput.html" name="reference"/>
        <meta
            content="X3dValidator https://savage.nps.edu/X3dValidator?url=http://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" name="reference"/>
        <meta
            content="http://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" name="identifier"/>
        <meta content="../license.html" name="license"/>
        <meta
            content="tested sat: name value cannot contain embedded space character" name="info"/>
        <meta content="07 April 2020" name="translated"/>
        <meta
            content="X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html" name="generator"/>
        <meta
            content="X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding" name="reference"/>
    </head>
    <Scene>
        <ViewpointGroup description="Available viewpoints">
            <Viewpoint DEF="DefaultView" description="Hello X3DJSAIL"/>
            <Viewpoint DEF="TopDownView"
                description="top-down view from above"
                orientation="1 0 0 -1.570796" position="0 100 0"/>
        </ViewpointGroup>
        <WorldInfo DEF="WorldInfoDEF" title="HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"/>
        <WorldInfo USE="WorldInfoDEF"/>
        <WorldInfo USE="WorldInfoDEF"/>
        <MetadataString DEF="scene.addChildMetadata" name="test" value="&quot;Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding&quot;"/>
        <LayerSet DEF="scene.addChildLayerSetTest"/>
        <Transform DEF="LogoGeometryTransform" translation="0 1.5 0">
            <Anchor
                description="select for X3D Java SAI Library (X3DJSAIL) description" url="&quot;../X3DJSAIL.html&quot; &quot;http://www.web3d.org/specifications/java/X3DJSAIL.html&quot;">
                <Shape DEF="BoxShape">
                    <Appearance>
                        <Material DEF="GreenMaterial"
                            diffuseColor="0 1 1" emissiveColor="0.8 0 0" transparency="0.1"/>
                        <ImageTexture containerField="texture" url="&quot;images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot; &quot;http://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot;"/>
                    </Appearance>
                    <Box DEF="test-NMTOKEN_regex.0123456789"
                        class="untextured" containerField="geometry"/>
                </Shape>
            </Anchor>
        </Transform>
        <Shape DEF="LineShape">
            <Appearance>
                <Material emissiveColor="0.6 0.19607843 0.8"/>
            </Appearance>
            <IndexedLineSet containerField="geometry" coordIndex="0 1 2 3 4 0">
                <!-- Coordinate 3-tuple point count: 6 -->
                <Coordinate containerField="coord" point="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
            </IndexedLineSet>
        </Shape>
        <PositionInterpolator DEF="BoxPathAnimator"
            key="0 0.125 0.375 0.625 0.875 1" keyValue="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
        <TimeSensor DEF="OrbitClock" cycleInterval="8.0" loop="true"/>
        <ROUTE fromField="fraction_changed" fromNode="OrbitClock"
            toField="set_fraction" toNode="BoxPathAnimator"/>
        <ROUTE fromField="value_changed" fromNode="BoxPathAnimator"
            toField="set_translation" toNode="LogoGeometryTransform"/>
        <Transform DEF="TextTransform" translation="0 -1.5 0">
            <Shape>
                <Appearance>
                    <Material USE="GreenMaterial"/>
                </Appearance>
                <Text containerField="geometry" string="&quot;X3D Java&quot; &quot;SAI Library&quot; &quot;X3DJSAIL&quot;">
                    <!-- Comment example A, plain quotation marks: He said, "Immel did it!" -->
                    <!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
                    <MetadataSet containerField="metadata" name="EscapedQuotationMarksMetadataSet">
                        <MetadataString containerField="value"
                            name="quotesTestC" value="&quot;MFString example C, backslash-escaped quotes: He said, \&quot;Immel did it!\&quot;&quot;"/>
                        <MetadataString containerField="value"
                            name="extraChildTest" value="&quot;checks MetadataSetObject addValue() method&quot;"/>
                    </MetadataSet>
                    <FontStyle justify="&quot;MIDDLE&quot; &quot;MIDDLE&quot;"/>
                </Text>
            </Shape>
            <Collision>
                <!-- test containerField='proxy' -->
                <Shape DEF="ProxyShape" containerField="proxy">
                    <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' -->
                    <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' -->
                    <!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \""Immel did it!\"\"}) -->
                    <!-- reference: http://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
                    <Text containerField="geometry" string="&quot;One, Two, Text&quot; &quot;&quot; &quot;He said, \&quot;Immel did it!\&quot; \&quot;\&quot;&quot;"/>
                </Shape>
            </Collision>
            <!-- It's a beautiful world -->
            <!-- ... for you! -->
            <!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
        </Transform>
        <!-- repeatedly spin 180 degrees as a readable special effect -->
        <OrientationInterpolator DEF="SpinInterpolator" key="0 0.5 1" keyValue="0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964"/>
        <TimeSensor DEF="SpinClock" cycleInterval="5.0" loop="true"/>
        <ROUTE fromField="fraction_changed" fromNode="SpinClock"
            toField="set_fraction" toNode="SpinInterpolator"/>
        <ROUTE fromField="value_changed" fromNode="SpinInterpolator"
            toField="rotation" toNode="TextTransform"/>
        <Group DEF="BackgroundGroup">
            <Background DEF="GradualBackground"/>
            <Script DEF="colorTypeConversionScript">
                <field accessType="inputOnly" name="colorInput" type="SFColor"/>
                <field accessType="outputOnly" name="colorsOutput" type="MFColor"/><![CDATA[



ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}




]]></Script>
            <ColorInterpolator DEF="ColorAnimator" key="0 0.5 1" keyValue="0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1">
                <!-- AZURE to INDIGO and back again -->
            </ColorInterpolator>
            <TimeSensor DEF="ColorClock" cycleInterval="60.0" loop="true"/>
            <ROUTE fromField="colorsOutput"
                fromNode="colorTypeConversionScript" toField="skyColor" toNode="GradualBackground"/>
            <ROUTE fromField="value_changed" fromNode="ColorAnimator"
                toField="colorInput" toNode="colorTypeConversionScript"/>
            <ROUTE fromField="fraction_changed" fromNode="ColorClock"
                toField="set_fraction" toNode="ColorAnimator"/>
        </Group>
        <ProtoDeclare
            appinfo="tooltip: ArtDeco01Material prototype is a Material node" name="ArtDeco01Material">
            <ProtoInterface>
                <field accessType="inputOutput"
                    appinfo="tooltip for descriptionField"
                    name="description" type="SFString" value="ArtDeco01Material prototype is a Material node"/>
                <field accessType="inputOutput" name="enabled"
                    type="SFBool" value="true"/>
            </ProtoInterface>
            <ProtoBody>
                <!-- Initial node of ProtoBody determines prototype node type -->
                <Material ambientIntensity="0.25"
                    diffuseColor="0.282435 0.085159 0.134462"
                    shininess="0.127273" specularColor="0.276305 0.11431 0.139857"/>
                <!-- [HelloWorldProgram diagnostic] should be connected to scene graph: ArtDeco01ProtoDeclare.getNodeType()="Material" -->
                <!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
                <TouchSensor description="within ProtoBody">
                    <IS>
                        <connect nodeField="description" protoField="description"/>
                        <connect nodeField="enabled" protoField="enabled"/>
                    </IS>
                </TouchSensor>
            </ProtoBody>
        </ProtoDeclare>
        <ExternProtoDeclare appinfo="this is a different Material node"
            name="ArtDeco02Material" url="&quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material&quot; &quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material&quot;">
            <!-- [HelloWorldProgram diagnostic] ArtDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time, TODO X3DJSAIL needs to add further capability." -->
            <field accessType="inputOutput"
                appinfo="tooltip for descriptionField"
                name="description" type="SFString"/>
        </ExternProtoDeclare>
        <!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
        <Shape DEF="TestShape1">
            <Appearance DEF="TestAppearance1">
                <!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
                <ProtoInstance containerField="material" name="ArtDeco01Material">
                    <!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" -->
                    <fieldValue containerField="material"
                        name="description" value="ArtDeco01Material can substitute for a Material node"/>
                </ProtoInstance>
            </Appearance>
            <Sphere containerField="geometry" radius="0.001"/>
        </Shape>
        <Shape DEF="TestShape2">
            <Appearance DEF="TestAppearance2">
                <!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
                <ProtoInstance DEF="ArtDeco02MaterialDEF"
                    containerField="material" name="ArtDeco02Material">
                    <!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time, TODO X3DJSAIL needs to add further capability." -->
                    <fieldValue containerField="material"
                        name="description" value="ArtDeco02Material can substitute for another Material node"/>
                </ProtoInstance>
            </Appearance>
            <Cone bottomRadius="0.001" containerField="geometry" height="0.001"/>
        </Shape>
        <Shape DEF="TestShape3">
            <Appearance DEF="TestAppearance3">
                <!-- ArtDeco02Material ProtoInstance USE goes here... -->
                <ProtoInstance USE="ArtDeco02MaterialDEF" containerField="material"/>
            </Appearance>
            <Cylinder containerField="geometry" height="0.001" radius="0.001"/>
        </Shape>
        <Inline DEF="inlineSceneDef" url="&quot;someOtherScene.x3d&quot;"/>
        <IMPORT AS="WorldInfoDEF2" importedDEF="WorldInfoDEF" inlineDEF="inlineSceneDef"/>
        <EXPORT AS="WorldInfoDEF3" localDEF="WorldInfoDEF"/>
        <ProtoDeclare
            appinfo="mimic a Material node and modulate fields as an animation effect"
            documentation="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html" name="MaterialModulator">
            <ProtoInterface>
                <field accessType="inputOutput" name="enabled"
                    type="SFBool" value="true"/>
                <field accessType="inputOutput" name="diffuseColor"
                    type="SFColor" value="0 0 0"/>
                <field accessType="inputOutput" name="emissiveColor"
                    type="SFColor" value="0.05 0.05 0.5"/>
                <field accessType="inputOutput" name="specularColor"
                    type="SFColor" value="0 0 0"/>
                <field accessType="inputOutput" name="transparency"
                    type="SFFloat" value="0.0"/>
                <field accessType="inputOutput" name="shininess"
                    type="SFFloat" value="0.0"/>
                <field accessType="inputOutput" name="ambientIntensity"
                    type="SFFloat" value="0.0"/>
            </ProtoInterface>
            <ProtoBody>
                <Material DEF="MaterialNode">
                    <IS>
                        <connect nodeField="diffuseColor" protoField="diffuseColor"/>
                        <connect nodeField="emissiveColor" protoField="emissiveColor"/>
                        <connect nodeField="specularColor" protoField="specularColor"/>
                        <connect nodeField="transparency" protoField="transparency"/>
                        <connect nodeField="shininess" protoField="shininess"/>
                        <connect nodeField="ambientIntensity" protoField="ambientIntensity"/>
                    </IS>
                </Material>
                <!-- Only first node (the node type) is renderable, others are along for the ride -->
                <Script DEF="MaterialModulatorScript">
                    <field accessType="inputOutput" name="enabled" type="SFBool"/>
                    <field accessType="inputOutput" name="diffuseColor" type="SFColor"/>
                    <field accessType="outputOnly" name="newColor" type="SFColor"/>
                    <field accessType="inputOnly" name="clockTrigger" type="SFTime"/>
                    <IS>
                        <connect nodeField="enabled" protoField="enabled"/>
                        <connect nodeField="diffuseColor" protoField="diffuseColor"/>
                    </IS><![CDATA[



ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;

    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}




]]></Script>
            </ProtoBody>
        </ProtoDeclare>
        <!-- Test success: declarative statement createDeclarativeShapeTests() -->
        <Group DEF="DeclarativeGroupExample">
            <Shape>
                <MetadataString DEF="FindableMetadataStringTest"
                    containerField="metadata" name="findThisNameValue" value="&quot;test case&quot;"/>
                <Appearance DEF="DeclarativeAppearanceExample">
                    <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
                    <ProtoInstance DEF="MyMaterialModulator"
                        containerField="material" name="MaterialModulator"/>
                </Appearance>
                <Cone bottom="false" bottomRadius="0.05"
                    containerField="geometry" height="0.1"/>
            </Shape>
            <!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
        </Group>
        <!-- Test success: declarative statement addChild() -->
        <!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
        <!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
        <!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
        <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
        <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
        <Group DEF="TestFieldObjectsGroup">
            <!-- testFieldObjects() results -->
            <!-- SFBool default=true, true=true, false=false, negate()=true -->
            <!-- MFBool default=, initial=true false true, negate()=false true false -->
            <!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
            <!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
            <!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
            <!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
            <!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
        </Group>
        <Sound location="0 1.6 0">
            <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
            <AudioClip containerField="source" description="chimes" url="&quot;chimes.wav&quot; &quot;http://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav&quot;">
                <!-- Scene example fragment from http://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d -->
            </AudioClip>
        </Sound>
        <Sound location="0 1.6 0">
            <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
            <MovieTexture containerField="source"
                description="mpgsys.mpg from ConformanceNist suite" url="&quot;mpgsys.mpg&quot; &quot;http://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg&quot;">
                <!-- Scene example fragment from http://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
                <!-- Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList" -->
            </MovieTexture>
        </Sound>
        <!-- Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true -->
        <!-- Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false -->
        <!-- Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false -->
        <!-- Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
        <!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
        <!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
        <Shape DEF="ExtrusionShape">
            <!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
            <!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
            <Appearance DEF="TransparentAppearance">
                <Material transparency="1.0"/>
            </Appearance>
            <Extrusion DEF="ExampleExtrusion" containerField="geometry"/>
        </Shape>
    </Scene>
</X3D>

[X3DLoaderDOM] <meta name='info' content='tested sat: name value cannot contain embedded space character'/>
Warning: toFileX3D() is overwriting prior file ./examples/Nashorn.x3d
===========================================
Run test 5
HelloWorldProgramOutput.x3d
matches Nashorn.x3d: false
===========================================
===========================================
HelloWorldProgramOutput.x3d
matches Nashorn0.x3d: false
===========================================
Warning: The jjs tool is planned to be removed from a future JDK release
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">

<X3D profile="Immersive" version="3.3"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.3.xsd">
    <!-- x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true -->
    <head>
        <!-- comment #1 -->
        <!-- comment #2 -->
        <!-- comment #3 -->
        <!-- comment #4 -->
        <component level="3" name="Navigation"/>
        <component level="1" name="Shaders"/>
        <component level="2" name="CADGeometry"/>
        <component level="2" name="DIS"/>
        <component level="1" name="H-Anim"/>
        <component level="1" name="Grouping"/>
        <component level="1" name="Layering"/>
        <unit category="angle" conversionFactor="1.0" name="AngleUnitConversion"/>
        <unit category="length" conversionFactor="1.0" name="LengthUnitConversion"/>
        <unit category="force" conversionFactor="4.4482" name="ForceFromPoundsToNewtons"/>
        <meta content="HelloWorldProgramOutput.x3d" name="title"/>
        <meta content="continued development and testing in progress" name="info"/>
        <meta
            content="Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)" name="description"/>
        <meta
            content="https://www.web3d.org/specifications/java/X3DJSAIL.html" name="reference"/>
        <meta content="HelloWorldProgramOutput.java" name="generator"/>
        <meta content="6 September 2016" name="created"/>
        <meta content="7 April 2020" name="modified"/>
        <meta
            content="X3D Java Scene Access Interface Library (X3DJSAIL)" name="generator"/>
        <meta
            content="https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java" name="generator"/>
        <meta content="Netbeans http://www.netbeans.org" name="generator"/>
        <meta content="Don Brutzman" name="creator"/>
        <meta
            content="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d" name="reference"/>
        <meta
            content="Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:" name="reference"/>
        <meta content="HelloWorldProgramOutput.txt" name="reference"/>
        <meta content="HelloWorldProgramOutput.x3dv" name="reference"/>
        <meta content="HelloWorldProgramOutput.wrl" name="reference"/>
        <meta content="HelloWorldProgramOutput.html" name="reference"/>
        <meta
            content="https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" name="reference"/>
        <meta
            content="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d" name="identifier"/>
        <meta content="../license.html" name="license"/>
        <meta content="07 April 2020" name="translated"/>
        <meta
            content="X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html" name="generator"/>
        <meta
            content="X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding" name="reference"/>
    </head>
    <Scene>
        <ViewpointGroup description="Available viewpoints">
            <Viewpoint DEF="DefaultView" description="Hello X3DJSAIL"/>
            <Viewpoint DEF="TopDownView"
                description="top-down view from above"
                orientation="1 0 0 -1.570796" position="0 100 0"/>
        </ViewpointGroup>
        <NavigationInfo type="&quot;EXAMINE&quot; &quot;FLY&quot; &quot;ANY&quot;"/>
        <WorldInfo DEF="WorldInfoDEF" title="HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"/>
        <WorldInfo USE="WorldInfoDEF"/>
        <WorldInfo USE="WorldInfoDEF"/>
        <MetadataString DEF="scene.addChildMetadata" name="test" value="&quot;Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding&quot;"/>
        <LayerSet DEF="scene.addChildLayerSetTest"/>
        <Transform DEF="LogoGeometryTransform" translation="0 1.5 0">
            <Anchor
                description="select for X3D Java SAI Library (X3DJSAIL) description" url="&quot;../X3DJSAIL.html&quot; &quot;https://www.web3d.org/specifications/java/X3DJSAIL.html&quot;">
                <Shape DEF="BoxShape">
                    <Appearance>
                        <Material DEF="GreenMaterial"
                            diffuseColor="0 1 1" emissiveColor="0.8 0 0" transparency="0.1"/>
                        <ImageTexture containerField="texture" url="&quot;images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot; &quot;https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png&quot;"/>
                    </Appearance>
                    <Box DEF="test-NMTOKEN_regex.0123456789"
                        class="untextured" containerField="geometry"/>
                </Shape>
            </Anchor>
        </Transform>
        <Shape DEF="LineShape">
            <Appearance>
                <Material emissiveColor="0.6 0.19607843 0.8"/>
            </Appearance>
            <IndexedLineSet containerField="geometry" coordIndex="0 1 2 3 4 0">
                <!-- Coordinate 3-tuple point count: 6 -->
                <Coordinate containerField="coord" point="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
            </IndexedLineSet>
        </Shape>
        <PositionInterpolator DEF="BoxPathAnimator"
            key="0 0.125 0.375 0.625 0.875 1" keyValue="0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0"/>
        <TimeSensor DEF="OrbitClock" cycleInterval="8.0" loop="true"/>
        <ROUTE fromField="fraction_changed" fromNode="OrbitClock"
            toField="set_fraction" toNode="BoxPathAnimator"/>
        <ROUTE fromField="value_changed" fromNode="BoxPathAnimator"
            toField="set_translation" toNode="LogoGeometryTransform"/>
        <Transform DEF="TextTransform" translation="0 -1.5 0">
            <Shape>
                <Appearance>
                    <Material USE="GreenMaterial"/>
                </Appearance>
                <Text containerField="geometry" string="&quot;X3D Java&quot; &quot;SAI Library&quot; &quot;X3DJSAIL&quot;">
                    <!-- Comment example A, plain quotation marks: He said, "Immel did it!" -->
                    <!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
                    <MetadataSet containerField="metadata" name="EscapedQuotationMarksMetadataSet">
                        <MetadataString containerField="value"
                            name="quotesTestC" value="&quot;MFString example C, backslash-escaped quotes: He said, \&quot;Immel did it!\&quot;&quot;"/>
                        <MetadataString containerField="value"
                            name="extraChildTest" value="&quot;checks MetadataSetObject addValue() method&quot;"/>
                    </MetadataSet>
                    <FontStyle justify="&quot;MIDDLE&quot; &quot;MIDDLE&quot;"/>
                </Text>
            </Shape>
            <Collision>
                <!-- test containerField='proxy' -->
                <Shape DEF="ProxyShape" containerField="proxy">
                    <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;"' -->
                    <!-- alternative XML encoding: Text string='"One, Two, Comment" "" "He said, \&quot;Immel did it!\&quot;" ""' -->
                    <!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""}) -->
                    <!-- reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
                    <Text containerField="geometry" string="&quot;One, Two, Text&quot; &quot;&quot; &quot;He said, \&quot;Immel did it!\&quot; \&quot;\&quot;&quot;"/>
                </Shape>
            </Collision>
            <!-- It's a beautiful world -->
            <!-- ... for you! -->
            <!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
        </Transform>
        <!-- repeatedly spin 180 degrees as a readable special effect -->
        <OrientationInterpolator DEF="SpinInterpolator" key="0 0.5 1" keyValue="0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964"/>
        <TimeSensor DEF="SpinClock" cycleInterval="5.0" loop="true"/>
        <ROUTE fromField="fraction_changed" fromNode="SpinClock"
            toField="set_fraction" toNode="SpinInterpolator"/>
        <ROUTE fromField="value_changed" fromNode="SpinInterpolator"
            toField="rotation" toNode="TextTransform"/>
        <Group DEF="BackgroundGroup">
            <Background DEF="GradualBackground"/>
            <Script DEF="colorTypeConversionScript">
                <field accessType="inputOnly" name="colorInput" type="SFColor"/>
                <field accessType="outputOnly" name="colorsOutput" type="MFColor"/><![CDATA[

ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}

]]></Script>
            <ColorInterpolator DEF="ColorAnimator" key="0 0.5 1" keyValue="0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1">
                <!-- AZURE to INDIGO and back again -->
            </ColorInterpolator>
            <TimeSensor DEF="ColorClock" cycleInterval="60.0" loop="true"/>
            <ROUTE fromField="colorsOutput"
                fromNode="colorTypeConversionScript" toField="skyColor" toNode="GradualBackground"/>
            <ROUTE fromField="value_changed" fromNode="ColorAnimator"
                toField="colorInput" toNode="colorTypeConversionScript"/>
            <ROUTE fromField="fraction_changed" fromNode="ColorClock"
                toField="set_fraction" toNode="ColorAnimator"/>
        </Group>
        <ProtoDeclare
            appinfo="tooltip: ArtDeco01Material prototype is a Material node" name="ArtDeco01Material">
            <ProtoInterface>
                <field accessType="inputOutput"
                    appinfo="tooltip for descriptionField"
                    name="description" type="SFString" value="ArtDeco01Material prototype is a Material node"/>
                <field accessType="inputOutput" name="enabled"
                    type="SFBool" value="true"/>
            </ProtoInterface>
            <ProtoBody>
                <!-- Initial node of ProtoBody determines prototype node type -->
                <Material ambientIntensity="0.25"
                    diffuseColor="0.282435 0.085159 0.134462"
                    shininess="0.127273" specularColor="0.276305 0.11431 0.139857"/>
                <!-- [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material" -->
                <!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
                <TouchSensor description="within ProtoBody">
                    <IS>
                        <connect nodeField="description" protoField="description"/>
                        <connect nodeField="enabled" protoField="enabled"/>
                    </IS>
                </TouchSensor>
            </ProtoBody>
        </ProtoDeclare>
        <ExternProtoDeclare appinfo="this is a different Material node"
            name="ArtDeco02Material" url="&quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material&quot; &quot;http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material&quot;">
            <!-- [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
            <field accessType="inputOutput"
                appinfo="tooltip for descriptionField"
                name="description" type="SFString"/>
        </ExternProtoDeclare>
        <!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
        <Shape DEF="TestShape1">
            <Appearance DEF="TestAppearance1">
                <!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
                <ProtoInstance containerField="material" name="ArtDeco01Material">
                    <!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material" -->
                    <fieldValue containerField="material"
                        name="description" value="ArtDeco01Material can substitute for a Material node"/>
                </ProtoInstance>
            </Appearance>
            <Sphere containerField="geometry" radius="0.001"/>
        </Shape>
        <Shape DEF="TestShape2">
            <Appearance DEF="TestAppearance2">
                <!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
                <ProtoInstance DEF="ArtDeco02MaterialDEF"
                    containerField="material" name="ArtDeco02Material">
                    <!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file." -->
                    <fieldValue containerField="material"
                        name="description" value="ArtDeco02Material can substitute for another Material node"/>
                </ProtoInstance>
            </Appearance>
            <Cone bottomRadius="0.001" containerField="geometry" height="0.001"/>
        </Shape>
        <Shape DEF="TestShape3">
            <Appearance DEF="TestAppearance3">
                <!-- ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. -->
                <ProtoInstance USE="ArtDeco02MaterialDEF" containerField="material"/>
            </Appearance>
            <Cylinder containerField="geometry" height="0.001" radius="0.001"/>
        </Shape>
        <Inline DEF="inlineSceneDef" url="&quot;someOtherScene.x3d&quot; &quot;https://www.web3d.org/specifications/java/examples/someOtherScene.x3d&quot;"/>
        <IMPORT AS="WorldInfoDEF2" importedDEF="WorldInfoDEF" inlineDEF="inlineSceneDef"/>
        <EXPORT AS="WorldInfoDEF3" localDEF="WorldInfoDEF"/>
        <ProtoDeclare
            appinfo="mimic a Material node and modulate fields as an animation effect"
            documentation="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html" name="MaterialModulator">
            <ProtoInterface>
                <field accessType="inputOutput" name="enabled"
                    type="SFBool" value="true"/>
                <field accessType="inputOutput" name="diffuseColor"
                    type="SFColor" value="0 0 0"/>
                <field accessType="inputOutput" name="emissiveColor"
                    type="SFColor" value="0.05 0.05 0.5"/>
                <field accessType="inputOutput" name="specularColor"
                    type="SFColor" value="0 0 0"/>
                <field accessType="inputOutput" name="transparency"
                    type="SFFloat" value="0.0"/>
                <field accessType="inputOutput" name="shininess"
                    type="SFFloat" value="0.0"/>
                <field accessType="inputOutput" name="ambientIntensity"
                    type="SFFloat" value="0.0"/>
            </ProtoInterface>
            <ProtoBody>
                <Material DEF="MaterialNode">
                    <IS>
                        <connect nodeField="diffuseColor" protoField="diffuseColor"/>
                        <connect nodeField="emissiveColor" protoField="emissiveColor"/>
                        <connect nodeField="specularColor" protoField="specularColor"/>
                        <connect nodeField="transparency" protoField="transparency"/>
                        <connect nodeField="shininess" protoField="shininess"/>
                        <connect nodeField="ambientIntensity" protoField="ambientIntensity"/>
                    </IS>
                </Material>
                <!-- Only first node (the node type) is renderable, others are along for the ride -->
                <Script DEF="MaterialModulatorScript">
                    <field accessType="inputOutput" name="enabled" type="SFBool"/>
                    <field accessType="inputOutput" name="diffuseColor" type="SFColor"/>
                    <field accessType="outputOnly" name="newColor" type="SFColor"/>
                    <field accessType="inputOnly" name="clockTrigger" type="SFTime"/>
                    <IS>
                        <connect nodeField="enabled" protoField="enabled"/>
                        <connect nodeField="diffuseColor" protoField="diffuseColor"/>
                    </IS><![CDATA[

ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;

    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}

]]></Script>
            </ProtoBody>
        </ProtoDeclare>
        <!-- Test success: declarative statement createDeclarativeShapeTests() -->
        <Group DEF="DeclarativeGroupExample">
            <Shape>
                <MetadataString DEF="FindableMetadataStringTest"
                    containerField="metadata" name="findThisNameValue" value="&quot;test case&quot;"/>
                <Appearance DEF="DeclarativeAppearanceExample">
                    <!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
                    <ProtoInstance DEF="MyMaterialModulator"
                        containerField="material" name="MaterialModulator"/>
                </Appearance>
                <Cone bottom="false" bottomRadius="0.05"
                    containerField="geometry" height="0.1"/>
            </Shape>
            <!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
        </Group>
        <!-- Test success: declarative statement addChild() -->
        <!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
        <!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
        <!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
        <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
        <!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
        <Group DEF="TestFieldObjectsGroup">
            <!-- testFieldObjects() results -->
            <!-- SFBool default=true, true=true, false=false, negate()=true -->
            <!-- MFBool default=, initial=true false true, negate()=false true false -->
            <!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
            <!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
            <!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
            <!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
            <!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotationObject.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
        </Group>
        <Sound location="0 1.6 0">
            <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
            <AudioClip containerField="source" description="chimes" url="&quot;chimes.wav&quot; &quot;https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav&quot;">
                <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d -->
            </AudioClip>
        </Sound>
        <Sound location="0 1.6 0">
            <!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
            <MovieTexture containerField="source"
                description="mpgsys.mpg from ConformanceNist suite" url="&quot;mpgsys.mpg&quot; &quot;https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg&quot;">
                <!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
                <!-- Expected containerField='source', allowed containerField values="texture" "source" "back" "bottom" "front" "left" "right" "top" "backTexture" "bottomTexture" "frontTexture" "leftTexture" "rightTexture" "topTexture" "watchList" -->
            </MovieTexture>
        </Sound>
        <!-- Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true -->
        <!-- Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false -->
        <!-- Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false -->
        <!-- Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
        <!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
        <!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
        <Shape DEF="ExtrusionShape">
            <!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
            <!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
            <Appearance DEF="TransparentAppearance">
                <Material transparency="1.0"/>
            </Appearance>
            <Extrusion DEF="ExampleExtrusion" containerField="geometry"/>
        </Shape>
        <Group>
            <!-- Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes -->
            <ProtoDeclare name="NewWorldInfo">
                <ProtoInterface>
                    <field accessType="initializeOnly"
                        name="description" type="SFString"/>
                </ProtoInterface>
                <ProtoBody>
                    <WorldInfo/>
                </ProtoBody>
            </ProtoDeclare>
            <ProtoInstance DEF="Proto1" name="NewWorldInfo">
                <fieldValue name="description" value="testing 1 2 3"/>
            </ProtoInstance>
            <Group DEF="Node2">
                <!-- intentionally empty -->
            </Group>
            <ProtoInstance DEF="Proto3" name="NewWorldInfo"/>
            <Transform DEF="Node4">
                <!-- intentionally empty -->
            </Transform>
            <!-- Test satisfactorily creates MFNode children array as an ordered list with mixed content -->
        </Group>
        <ProtoDeclare name="ShaderProto">
            <ProtoBody>
                <ProgramShader/>
            </ProtoBody>
        </ProtoDeclare>
        <Shape>
            <Appearance>
                <!-- Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes -->
                <!-- Test satisfactorily creates MFNode shaders array as an ordered list with mixed content -->
                <ProgramShader DEF="TestShader1" containerField="shaders">
                    <ShaderProgram DEF="TestShader2"
                        containerField="programs" type="VERTEX"/>
                </ProgramShader>
                <ProtoInstance DEF="TestShader3"
                    containerField="shaders" name="ShaderProto"/>
                <ComposedShader DEF="TestShader4" containerField="shaders">
                    <ShaderPart DEF="TestShader5" containerField="parts" type="VERTEX"/>
                </ComposedShader>
            </Appearance>
        </Shape>
        <Transform DEF="SpecialtyNodes">
            <CADLayer>
                <CADAssembly>
                    <CADPart>
                        <CADFace/>
                    </CADPart>
                </CADAssembly>
            </CADLayer>
            <EspduTransform/>
            <ReceiverPdu/>
            <SignalPdu/>
            <TransmitterPdu/>
            <DISEntityManager>
                <DISEntityTypeMapping containerField="mapping"/>
            </DISEntityManager>
        </Transform>
    </Scene>
</X3D>

[X3DLoaderDOM] <meta name='info' content='continued development and testing in progress'/>
***[X3DLoaderDOM warning] ProtoInstance NewWorldInfo found and node type is WorldInfo but containerField is missing, assuming default value 'children'
***[X3DLoaderDOM warning] ProtoInstance NewWorldInfo found and node type is WorldInfo but containerField is missing, assuming default value 'children'
Warning: toFileX3D() is overwriting prior file ./examples/Json.x3d
Warning: toFileStylesheetConversion(X3dToJson.xslt) is overwriting prior file ./examples/Json.json
Script DEF=colorTypeConversionScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
Script DEF=MaterialModulatorScript contains CDATA source-code text, copied as "#sourceText" using "strings" mode
===========================================
HelloWorldProgramOutput.x3d
matches Json.x3d: false
===========================================
HelloWorldProgramOutput.json
matches Json.json: false
===========================================
test X3DUnifiedObjectModel JAXB invocations
compile.X3DJSAIL.tests:
Compiling java/tests classes
test.X3DUnifiedObjectModelJaxbTests:
X3DUnifiedObjectModelJaxbTests start...
X3DUnifiedObjectModelJaxbTests.x3duomInspectionsTest() start...
Preliminary tests...
X3DUOM:
x3duomInstanceXml.length()=1076224
X3DUnifiedObjectModelJaxbTests.x3duomInspectionsTest() complete
X3DUnifiedObjectModelJaxbTests complete
===========================================
HelloWorldProgramOutputLog.txt holds output results
===========================================
BUILD SUCCESSFUL (total time: 5 minutes 37 seconds)
