anchor.diff:                  text += spaceChar;
               }
           }
  +
  +        return stripLastPseudoChar(text);
  +    }
  +
  +    // avoid space as last char
  +    String stripLastPseudoChar(String text) {
  +        if(text[text.length-1] == spaceChar) {
  +            text = text.substring(0, text.length-1);
  +        }
  +
           return text;
       }
   
  
positive.code: 
  #import('dart:html');
  #import('dart:math');
  
  class TypeTrainer {
      MarqueeElement marquee;
  
negative.code:         """);
          document.body.elements.add(tenFingerLayout);
  
          ButtonElement restartButton = new Element.html("""
              <button>Restart</button>
          """);
          restartButton.on.click.add((ClickEvent event) {
              restart();
          });
          document.body.elements.add(restartButton);
      }
  
      void restart() {
          active = true;
          marquee.remove();
          int totalChars = number.valueAsNumber;
          print(totalChars);
                      marquee.text = generateText(totalChars: totalChars);
                      marquee.scrollAmount = scrollAmount;
                      marquee.scrollDelay = scrollDelay;
  //                    bindHandlers();
                      container.elements.add(marquee);
      }
  
  //                                          accomponement = new AudioElement('http://upload.wikimedia.org/wikipedia/commons/6/68/10_-_Vivaldi_Winter_mvt_1_Allegro_non_molto_-_John_Harrison_violin.ogg') {
  //                                          accomponement = new AudioElement('http://ia600400.us.archive.org/21/items/TheFourSeasonsWinter/USAFB_Winter.mp3') {
      TypeTrainer() : spaceChar = new String.fromCharCodes([spaceCharCode]),
                                            accomponement = new AudioElement('http://www.archive.org/download/TheFourSeasonsWinter/USAFB_Winter.ogg'),
                                             number = new InputElement('number'),
                                              container = new DivElement() {
          bindHandlers();
          String scrollingText = generateText();
  
          marquee = new Element.html("""
            <marquee style="font-size: 4em; padding: .1em; border: solid; color: yellow; height: 1.3em;">$scrollingText</marquee>
          """);
          marquee.behavior = 'slide';
          container.elements.add(marquee);
          document.body.elements.add(container);
          marquee.scrollAmount = scrollAmount;
          marquee.scrollDelay = scrollDelay;
          marquee.loop = -1;
          marquee.bgColor = '#119';
          marquee.width = '100%';
  
          buildControls();
  //        accomponement.play();
          initWidget();
      }
  
      void bindHandlers() {
          keyPressHandler = (final KeyboardEvent event) {
              if(event.keyIdentifier == 'Enter') {
                  restart();
              }
  
              if(active) {
                  final String char = new String.fromCharCodes([event.charCode]);
                  validateChar(char);
              }
          };
  
          document.on.keyPress.add(keyPressHandler);
      }
  
      void unbindHandlers() {
          active = false;
  //        document.on.keyPress.remove(keyPressHandler);
      }
  
      void validateChar(final String keyLiteral) {
          if(typeTrainer.marquee.text[comparableIdx] == keyLiteral) {
              marquee.bgColor = '#119';
              marquee.text = cursor + typeTrainer.marquee.text.substring(comparableIdx + 1);
              if(hasFinished()) finished();
          } else {
              showMistake();
  