import java.applet.Applet;
import java.awt.*;
import java.lang.Math;

class MerryXmas extends Canvas implements Runnable {
  Font font;
  FontMetrics fm;
  int fh;
  Thread worker;
  String message;
  Color color;
  boolean first;
  
  void randomColor() {
    int red, green, blue;
    do {
      red=(int)(Math.random()*256);
      green=(int)(Math.random()*256);
      blue=(int)(Math.random()*256);
    } while (red<128 && green<128 && blue<128);
    color=new Color(red,green,blue);
  }

  MerryXmas() {
    setBackground(new Color(64,64,64));
    message="Merry Christmas!";
    font=new java.awt.Font("Helvetica",Font.BOLD,24);
    fh=font.getSize();
    resize(size().width,fh+6);
    randomColor();
    first=true;
  }

  public void update(Graphics g) {
    g.setColor(color);
    g.setFont(font);
    if (first) {
      fm=g.getFontMetrics();
//      resize(size().width,fh+fm.getMaxDescent());
      first=false;
    }
    g.drawString(message,(size().width-fm.stringWidth(message))/2,fh);
  }

  public void run() {
    while (true) {
      randomColor();
      repaint();
      try {
        Thread.currentThread().sleep(1000);
      } catch (InterruptedException e) {}
    }
  }

  public void start() {
    worker=new Thread(this);
    worker.start();
  }

  public void stop() {
    worker.stop();
  }
}

class XmasTree extends Canvas implements Runnable {
  Thread worker;
  double x, y;

  XmasTree() {
    setBackground(new Color(64,64,64));
    x=0;
    y=0;
  }

  public void update(Graphics g) {
    int i, map, sx=0, sy=0, leaf=0;
    double w=size().width, h=size().height;
    g.setColor(Color.green);
    for (i=0; i<200; i++) {
      double nx, ny;          
      map=(int)(Math.random()*7);
      switch (map) {
        case 0:
          nx=0;
          ny=0.1*y;
          leaf=0;
          break;
        case 1:
          nx=y*0.333;
          ny=x*0.333+0.11;
          leaf+=3;
          break;
        case 2:
          nx=-y*0.333;
          ny=x*0.333+0.1;
          leaf+=3;
          break;
        default:
          nx=0.9*x;
          ny=0.1+0.9*y;
          leaf++;
          break;
      }
      x=nx; y=ny;
      sx=(int)(0.5+w*(1.25*x+0.5));
      sy=(int)(0.5+h*(1-1.1*y));
      g.drawLine(sx,sy,sx,sy);
    }
    if (leaf>=6) {
      switch ((int)(Math.random()*4)) {
        case 0:
          g.setColor(Color.red);
          break;
        case 1:
          g.setColor(Color.blue);
          break;
        case 2:
          g.setColor(Color.white);
          break;
        case 3:
        default:
          g.setColor(Color.yellow);
          break;
      }
      g.fillOval(sx,sy,5,5);
    }
  }

  public void run() {
    while (true) {
      repaint();
      try {
        Thread.currentThread().sleep(50);
      } catch (InterruptedException e) {}
    }
  }

  public void start() {
    worker=new Thread(this);
    worker.start();
  }

  public void stop() {
    worker.stop();
  }
}


public class HelloWorld extends Applet {
  MerryXmas message;
  XmasTree tree;

  public void init() {
    setBackground(new Color(64,64,64));
    setLayout(new BorderLayout());
    message=new MerryXmas();
    tree=new XmasTree();
    add("North",message);
    add("Center",tree);
  }

  public void start() {
    message.start();
    tree.start();
  }

  public void stop() {
    message.stop();
    tree.stop();
  }
}


