<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Interactive'  version='3.3 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' https://www.web3d.org/specifications/x3d-3.3.xsd ' >
<head>
<meta name='titlecontent='Colors.x3d'/>
<meta name='descriptioncontent='This scene presents some colorful frames. See the source comments regarding animation details.'/>
<meta name='creatorcontent='David R. Nadeau'/>
<meta name='translatorcontent='Don Brutzman'/>
<meta name='createdcontent='1 July 1998'/>
<meta name='translatedcontent='2 February 2014'/>
<meta name='modifiedcontent='20 October 2019'/>
<meta name='referencecontent='originals/colors.wrl'/>
<meta name='referencecontent=' http://www.siggraph.org/s98 '/>
<meta name='referencecontent=' http://www.siggraph.org/s98/conference/courses/18.html '/>
<meta name='referencecontent=' http://www.sdsc.edu/~moreland/courses/Siggraph98/vrml97/slides/mt0073.htm '/>
<meta name='referencecontent=' http://www.sdsc.edu/~moreland/courses/Siggraph98/vrml97/slides/mt0130.htm '/>
<meta name='referencecontent=' http://www.sdsc.edu/~moreland/courses/Siggraph98/vrml97/slides/mt0167.htm '/>
<meta name='referencecontent=' http://www.sdsc.edu/~moreland/courses/Siggraph98/vrml97/vrml97.htm '/>
<meta name='referencecontent=' https://www.web3d.org/x3d/content/examples/X3dResources.html '/>
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Siggraph98Course/Colors.x3d '/>
<meta name='generatorcontent='Vrml97ToX3dNist, http://ovrt.nist.gov/v2_x3d.html'/>
<meta name='generatorcontent='X3D-Edit, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: Entry, Frame, Frame1, Frame2, Frame3, Frame4, Frame5, Frame6, Frame7, Frame8, Frame9, Rot1, Rot2, Rot3, Rot4, Rot5, Rot6, Rot7, Rot8, Rot9, Timer1, Timer2, Timer3, Timer4, Timer5, Timer6, Timer7, Timer8, Timer9, Touch

Index for Viewpoint node: Entry
-->
<Scene>
<!-- Orientation interpolators slowly spin 9 frames, each with a slightly different speed. At first there is a clear structure, but as the animation evolves the structure dissolves in to chaos. If you wait long enough, they'll all get back in sync again... after about 560 years! -->
<!-- Things to experiment with: Try using other time keyValue for the rotation speed of the 9 squares. If the keyValue are multiples of a common factor, the squares will get in sync sooner than if they don't have a common factor. -->
<WorldInfo info='"Copyright (c) 1996, David R. Nadeau"title='Colors'/>
<Viewpoint DEF='Entrydescription='Entry viewposition='0.0 0.0 3.0'/>
<NavigationInfo/>
<Background/>
<!-- ROUTE information for Frame1 node:  [from Rot1.value_changed to set_rotation ] -->
<Transform DEF='Frame1'>
<Shape>
<Appearance>
<Material diffuseColor='1.0 0.0 0.0'/>
</Appearance>
<IndexedFaceSet DEF='FramecoordIndex='0 1 6 7 -1 1 2 17 16 -1 2 3 4 5 -1 19 18 5 6 -1 11 10 13 12 -1 10 9 20 21 -1 9 8 15 14 -1 22 23 14 13 -1 3 11 12 4 -1 4 12 15 7 -1 8 0 7 15 -1 0 8 11 3 -1 16 17 21 20 -1 21 17 18 22 -1 19 23 22 18 -1 16 20 23 19 -1'>
<Coordinate point='-1.0 -1.0 0.1 -0.9 -1.0 0.1 0.9 -1.0 0.1 1.0 -1.0 0.1 1.0 1.0 0.1 0.9 1.0 0.1 -0.9 1.0 0.1 -1.0 1.0 0.1 -1.0 -1.0 -0.1 -0.9 -1.0 -0.1 0.9 -1.0 -0.1 1.0 -1.0 -0.1 1.0 1.0 -0.1 0.9 1.0 -0.1 -0.9 1.0 -0.1 -1.0 1.0 -0.1 -0.9 -0.9 0.1 0.9 -0.9 0.1 0.9 0.9 0.1 -0.9 0.9 0.1 -0.9 -0.9 -0.1 0.9 -0.9 -0.1 0.9 0.9 -0.1 -0.9 0.9 -0.1'/>
</IndexedFaceSet>
</Shape>
</Transform>
<!-- ROUTE information for Frame2 node:  [from Rot2.value_changed to set_rotation ] -->
<Transform DEF='Frame2translation='0.0 0.0 -0.4'>
<Shape>
<Appearance>
<Material diffuseColor='1.0 0.5 0.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame3 node:  [from Rot3.value_changed to set_rotation ] -->
<Transform DEF='Frame3translation='0.0 0.0 -0.8'>
<Shape>
<Appearance>
<Material diffuseColor='1.0 1.0 0.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame4 node:  [from Rot4.value_changed to set_rotation ] -->
<Transform DEF='Frame4translation='0.0 0.0 -1.2'>
<Shape>
<Appearance>
<Material diffuseColor='0.5 1.0 0.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame5 node:  [from Rot5.value_changed to set_rotation ] -->
<Transform DEF='Frame5translation='0.0 0.0 -1.6'>
<Shape>
<Appearance>
<Material diffuseColor='0.0 1.0 0.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame6 node:  [from Rot6.value_changed to set_rotation ] -->
<Transform DEF='Frame6translation='0.0 0.0 -2.0'>
<Shape>
<Appearance>
<Material diffuseColor='0.0 1.0 0.5'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame7 node:  [from Rot7.value_changed to set_rotation ] -->
<Transform DEF='Frame7translation='0.0 0.0 -2.4'>
<Shape>
<Appearance>
<Material diffuseColor='0.0 1.0 1.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame8 node:  [from Rot8.value_changed to set_rotation ] -->
<Transform DEF='Frame8translation='0.0 0.0 -2.8'>
<Shape>
<Appearance>
<Material diffuseColor='0.0 0.5 1.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>
<!-- ROUTE information for Frame9 node:  [from Rot9.value_changed to set_rotation ] -->
<Transform DEF='Frame9translation='0.0 0.0 -3.2'>
<Shape>
<Appearance>
<Material diffuseColor='0.0 0.0 1.0'/>
</Appearance>
<IndexedFaceSet USE=' Frame'/>
</Shape>
</Transform>

<!-- ROUTE information for Timer1 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot1.set_fraction ] -->
<TimeSensor DEF='Timer1cycleInterval='10.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer2 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot2.set_fraction ] -->
<TimeSensor DEF='Timer2cycleInterval='11.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer3 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot3.set_fraction ] -->
<TimeSensor DEF='Timer3cycleInterval='12.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer4 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot4.set_fraction ] -->
<TimeSensor DEF='Timer4cycleInterval='13.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer5 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot5.set_fraction ] -->
<TimeSensor DEF='Timer5cycleInterval='14.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer6 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot6.set_fraction ] -->
<TimeSensor DEF='Timer6cycleInterval='15.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer7 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot7.set_fraction ] -->
<TimeSensor DEF='Timer7cycleInterval='16.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer8 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot8.set_fraction ] -->
<TimeSensor DEF='Timer8cycleInterval='17.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Timer9 node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to Rot9.set_fraction ] -->
<TimeSensor DEF='Timer9cycleInterval='18.0loop='truestartTime='-1.0'/>

<!-- ROUTE information for Rot1 node:  [from Timer1.fraction_changed to set_fraction ] [from value_changed to Frame1.set_rotation ] -->
<OrientationInterpolator DEF='Rot1key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot2 node:  [from Timer2.fraction_changed to set_fraction ] [from value_changed to Frame2.set_rotation ] -->
<OrientationInterpolator DEF='Rot2key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot3 node:  [from Timer3.fraction_changed to set_fraction ] [from value_changed to Frame3.set_rotation ] -->
<OrientationInterpolator DEF='Rot3key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot4 node:  [from Timer4.fraction_changed to set_fraction ] [from value_changed to Frame4.set_rotation ] -->
<OrientationInterpolator DEF='Rot4key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot5 node:  [from Timer5.fraction_changed to set_fraction ] [from value_changed to Frame5.set_rotation ] -->
<OrientationInterpolator DEF='Rot5key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot6 node:  [from Timer6.fraction_changed to set_fraction ] [from value_changed to Frame6.set_rotation ] -->
<OrientationInterpolator DEF='Rot6key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot7 node:  [from Timer7.fraction_changed to set_fraction ] [from value_changed to Frame7.set_rotation ] -->
<OrientationInterpolator DEF='Rot7key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot8 node:  [from Timer8.fraction_changed to set_fraction ] [from value_changed to Frame8.set_rotation ] -->
<OrientationInterpolator DEF='Rot8key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

<!-- ROUTE information for Rot9 node:  [from Timer9.fraction_changed to set_fraction ] [from value_changed to Frame9.set_rotation ] -->
<OrientationInterpolator DEF='Rot9key='0.0 0.5 1.0keyValue='0.0 0.0 1.0 0.0 0.0 0.0 1.0 3.14 0.0 0.0 1.0 6.28'/>

< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer1' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer2' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer3' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer4' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer5' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer6' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer7' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer8' toField='set_startTime'/>
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Timer9' toField='set_startTime'/>
< ROUTE  fromNode=' Timer1' fromField='fraction_changed' toNode=' Rot1' toField='set_fraction'/>
< ROUTE  fromNode=' Timer2' fromField='fraction_changed' toNode=' Rot2' toField='set_fraction'/>
< ROUTE  fromNode=' Timer3' fromField='fraction_changed' toNode=' Rot3' toField='set_fraction'/>
< ROUTE  fromNode=' Timer4' fromField='fraction_changed' toNode=' Rot4' toField='set_fraction'/>
< ROUTE  fromNode=' Timer5' fromField='fraction_changed' toNode=' Rot5' toField='set_fraction'/>
< ROUTE  fromNode=' Timer6' fromField='fraction_changed' toNode=' Rot6' toField='set_fraction'/>
< ROUTE  fromNode=' Timer7' fromField='fraction_changed' toNode=' Rot7' toField='set_fraction'/>
< ROUTE  fromNode=' Timer8' fromField='fraction_changed' toNode=' Rot8' toField='set_fraction'/>
< ROUTE  fromNode=' Timer9' fromField='fraction_changed' toNode=' Rot9' toField='set_fraction'/>
< ROUTE  fromNode=' Rot1' fromField='value_changed' toNode=' Frame1' toField='set_rotation'/>
< ROUTE  fromNode=' Rot2' fromField='value_changed' toNode=' Frame2' toField='set_rotation'/>
< ROUTE  fromNode=' Rot3' fromField='value_changed' toNode=' Frame3' toField='set_rotation'/>
< ROUTE  fromNode=' Rot4' fromField='value_changed' toNode=' Frame4' toField='set_rotation'/>
< ROUTE  fromNode=' Rot5' fromField='value_changed' toNode=' Frame5' toField='set_rotation'/>
< ROUTE  fromNode=' Rot6' fromField='value_changed' toNode=' Frame6' toField='set_rotation'/>
< ROUTE  fromNode=' Rot7' fromField='value_changed' toNode=' Frame7' toField='set_rotation'/>
< ROUTE  fromNode=' Rot8' fromField='value_changed' toNode=' Frame8' toField='set_rotation'/>
< ROUTE  fromNode=' Rot9' fromField='value_changed' toNode=' Frame9' toField='set_rotation'/>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: Entry, Frame, Frame1, Frame2, Frame3, Frame4, Frame5, Frame6, Frame7, Frame8, Frame9, Rot1, Rot2, Rot3, Rot4, Rot5, Rot6, Rot7, Rot8, Rot9, Timer1, Timer2, Timer3, Timer4, Timer5, Timer6, Timer7, Timer8, Timer9, Touch

Index for Viewpoint node: Entry
-->

Event Graph ROUTE Table entries with 27 ROUTE connections total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

This node has 9 outgoing ROUTEs, which is greater than $maxROUTEdepth=8
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer1
TimeSensor
set_startTime
SFTime

 
 
then
Timer1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot1
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot1
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame1
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer2
TimeSensor
set_startTime
SFTime

 
 
then
Timer2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot2
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot2
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame2
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer3
TimeSensor
set_startTime
SFTime

 
 
then
Timer3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot3
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot3
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame3
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer4
TimeSensor
set_startTime
SFTime

 
 
then
Timer4
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot4
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot4
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame4
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer5
TimeSensor
set_startTime
SFTime

 
 
then
Timer5
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot5
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot5
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame5
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer6
TimeSensor
set_startTime
SFTime

 
 
then
Timer6
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot6
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot6
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame6
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer7
TimeSensor
set_startTime
SFTime

 
 
then
Timer7
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot7
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot7
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame7
Transform
set_rotation
SFRotation
Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer8
TimeSensor
set_startTime
SFTime

 
 
then
Timer8
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
Rot8
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot8
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
Frame8
Transform
set_rotation
SFRotation


Timer1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot1
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot1
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame1
Transform
set_rotation
SFRotation


Timer2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot2
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot2
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame2
Transform
set_rotation
SFRotation


Timer3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot3
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot3
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame3
Transform
set_rotation
SFRotation


Timer4
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot4
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot4
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame4
Transform
set_rotation
SFRotation


Timer5
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot5
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot5
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame5
Transform
set_rotation
SFRotation


Timer6
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot6
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot6
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame6
Transform
set_rotation
SFRotation


Timer7
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot7
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot7
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame7
Transform
set_rotation
SFRotation


Timer8
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot8
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot8
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame8
Transform
set_rotation
SFRotation


Timer9
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rot9
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rot9
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
Frame9
Transform
set_rotation
SFRotation


-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Siggraph98Course/ColorsIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Siggraph98Course/Colors.x3d -->

<!-- Color legend: X3D terminology <X3dNode DEF='idName' field='value'/> matches XML terminology <XmlElement DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
-->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->