private boolean evaluateDelayClause(String str) throws InterruptedException {
		if (str.matches(REGEX_NONNEGATIVE_DECIMAL)) {
			float sec = Float.valueOf(str).floatValue();
			int millis = (int) (sec * 1000);
			while (!stop && millis > 0) {
				try {
					Thread.sleep(millis > DELAY_FRACTION ? DELAY_FRACTION : millis);
					millis -= DELAY_FRACTION;
				}
				catch (InterruptedException e) {
					stop();
					interrupted = true;
					throw new InterruptedException();
				}
			}
			view.repaint();
			return true;
		}
		if (str.toLowerCase().startsWith("modeltime")) {
			str = str.substring(9).trim();
			if (str.matches(REGEX_NONNEGATIVE_DECIMAL)) {
				int i = Math.round(Float.valueOf(str).floatValue() / model.getTimeStep());
				int step0 = model.job != null ? model.job.getIndexOfStep() : 0;
				DelayModelTimeLoadable l = new DelayModelTimeLoadable(i) {
					public void execute() {
						// if (model.job.getIndexOfStep() - step0 < i - 1) return; // what the hell is this?
						synchronized (Eval3D.this) {
							Eval3D.this.notifyAll();
						}
						setCompleted(true);
					}
				};
				l.setPriority(Thread.NORM_PRIORITY);
				l.setName("Delay " + i + " steps from step " + step0);
				l.setDescription("This task delays the script execution for " + i + " steps.");
				model.job.add(l);
				try {
					synchronized (this) {
						Eval3D.this.wait();
					}
				}
				catch (InterruptedException e) {
					interrupted = true;
					stop();
					throw new InterruptedException();
				}
				return true;
			}
		}
		out(ScriptEvent.FAILED, "Unable to parse number: " + str);
		return false;
	}