protected void updateArc()
	{
		// arc was fully matched - save it
		addToPath( arc );
		if ( arc.to != forbidden )
		{
			ListIterator<Arc> iter = arc.to.outgoingArcs( graph );
			while ( iter.hasNext() )
			{
				Arc a = iter.next();
				if ( a.versions.intersects(versions)&&(!a.isParent()
					||!a.hasChildInVersion(mum.version)) )
				{
					this.arc = a;
                    //this.first = 0;
                    MatchThreadDirect mtd = new MatchThreadDirect( this );
                    mtd.run();
                    // extended is true iff at least one child  
                    // mtd matched at least one character
                    extended |= mtd.extended();
				}
			}
		}
		// important! if none of the child incarnations of run
		// matched anything BUT we did, THEN call mismatch
		if ( !extended && first > 0 )
			mismatch();
	}