/**
  * Traverse this node, updating the results array that is used by
  * {@link stack_potentialresponse_tree::evaluate_response()}.
  *
  * @param stack_potentialresponse_tree_state $results to be updated.
  * @param int $key the index of this node.
  * @param stack_cas_session $cascontext the CAS context that holds all the relevant variables.
  * @param stack_options $options
  * @return array with two elements, the updated $results and the index of the next node.
  */
 public function traverse($results, $key, $cascontext, $options)
 {
     $errorfree = true;
     if ($cascontext->get_errors_key('PRSANS' . $key)) {
         $results->_errors .= $cascontext->get_errors_key('PRSANS' . $key);
         $results->add_feedback(' ' . stack_string('prtruntimeerror', array('node' => 'PRSANS' . ($key + 1), 'error' => $cascontext->get_errors_key('PRSANS' . $key))));
         $errorfree = false;
     }
     if ($cascontext->get_errors_key('PRTANS' . $key)) {
         $results->_errors .= $cascontext->get_errors_key('PRTANS' . $key);
         $results->add_feedback(' ' . stack_string('prtruntimeerror', array('node' => 'PRTANS' . ($key + 1), 'error' => $cascontext->get_errors_key('PRTANS' . $key))));
         $errorfree = false;
     }
     if ($cascontext->get_errors_key('PRATOPT' . $key)) {
         $results->_errors .= $cascontext->get_errors_key('PRATOPT' . $key);
         $results->add_feedback(' ' . stack_string('prtruntimeerror', array('node' => 'PRATOPT' . ($key + 1), 'error' => $cascontext->get_errors_key('PRATOPT' . $key))));
         $errorfree = false;
     }
     if (!$errorfree) {
         return -1;
     }
     $sans = $cascontext->get_value_key('PRSANS' . $key);
     $tans = $cascontext->get_value_key('PRTANS' . $key);
     $atopts = $cascontext->get_value_key('PRATOPT' . $key);
     // If we can't find atopts then they were not processed by the CAS.
     // They might still be some in the potential response which do not
     // need to be processed.
     if (false === $atopts) {
         $atopts = null;
     }
     $nextnode = $this->do_test($sans, $tans, $atopts, $options, $results);
     return $nextnode;
 }