main() {}

class DeltaBlue {
  void run() {}
}

class Strength {
  final int value;
  final String name;
  const Strength(this.value, this.name);
  Strength nextWeaker() => const <Strength>[
        STRONG_PREFERRED,
        PREFERRED,
        STRONG_DEFAULT,
        NORMAL,
        WEAK_DEFAULT,
        WEAKEST
      ][value];
  static bool stronger(Strength s1, Strength s2) {}
  static bool weaker(Strength s1, Strength s2) {}
  static Strength weakest(Strength s1, Strength s2) {}
  static Strength strongest(Strength s1, Strength s2) {}
}

const REQUIRED = const Strength(0, "required");
const STRONG_PREFERRED = const Strength(1, "strongPreferred");
const PREFERRED = const Strength(2, "preferred");
const STRONG_DEFAULT = const Strength(3, "strongDefault");
const NORMAL = const Strength(4, "normal");
const WEAK_DEFAULT = const Strength(5, "weakDefault");
const WEAKEST = const Strength(6, "weakest");

abstract class Constraint {
  final Strength strength;
  const Constraint(this.strength);
  bool isSatisfied();
  void markUnsatisfied();
  void addToGraph();
  void removeFromGraph();
  void chooseMethod(int mark);
  void markInputs(int mark);
  bool inputsKnown(int mark);
  Variable output();
  void execute();
  void recalculate();
  void addConstraint() {}
  Constraint? satisfy(mark) {}
  void destroyConstraint() {}
  bool isInput() => false;
}

abstract class UnaryConstraint extends Constraint {
  final Variable myOutput;
  bool satisfied = false;
  UnaryConstraint(this.myOutput, Strength strength) : super(strength) {}
  void addToGraph() {}
  void chooseMethod(int mark) {}
  bool isSatisfied() => satisfied;
  void markInputs(int mark) {}
  Variable output() => myOutput;
  void recalculate() {}
  void markUnsatisfied() {}
  bool inputsKnown(int mark) => true;
  void removeFromGraph() {}
}

class StayConstraint extends UnaryConstraint {
  StayConstraint(Variable v, Strength str) : super(v, str);
  void execute() {}
}

class EditConstraint extends UnaryConstraint {
  EditConstraint(Variable v, Strength str) : super(v, str);
  bool isInput() => true;
  void execute() {}
}

const int NONE = 1;
const int FORWARD = 2;
const int BACKWARD = 0;

abstract class BinaryConstraint extends Constraint {
  Variable v1;
  Variable v2;
  int direction = NONE;
  BinaryConstraint(this.v1, this.v2, Strength strength) : super(strength) {}
  void chooseMethod(int mark) {}
  void addToGraph() {}
  bool isSatisfied() => direction != NONE;
  void markInputs(int mark) {}
  Variable input() => direction == FORWARD ? v1 : v2;
  Variable output() => direction == FORWARD ? v2 : v1;
  void recalculate() {}
  void markUnsatisfied() {}
  bool inputsKnown(int mark) {}
  void removeFromGraph() {}
}

class ScaleConstraint extends BinaryConstraint {
  final Variable scale;
  final Variable offset;
  ScaleConstraint(
      Variable src, this.scale, this.offset, Variable dest, Strength strength)
      : super(src, dest, strength);
  void addToGraph() {}
  void removeFromGraph() {}
  void markInputs(int mark) {}
  void execute() {}
  void recalculate() {}
}

class EqualityConstraint extends BinaryConstraint {
  EqualityConstraint(Variable v1, Variable v2, Strength strength)
      : super(v1, v2, strength);
  void execute() {}
}

class Variable {
  List<Constraint> constraints = <Constraint>[];
  Constraint? determinedBy;
  int mark = 0;
  Strength walkStrength = WEAKEST;
  bool stay = true;
  int value;
  final String name;
  Variable(this.name, this.value);
  void addConstraint(Constraint c) {}
  void removeConstraint(Constraint c) {}
}

class Planner {
  int currentMark = 0;
  void incrementalAdd(Constraint c) {}
  void incrementalRemove(Constraint c) {}
  int newMark() => ++currentMark;
  Plan makePlan(List<Constraint> sources) {}
  Plan extractPlanFromConstraints(List<Constraint> constraints) {}
  bool addPropagate(Constraint c, int mark) {}
  List<Constraint> removePropagateFrom(Variable out) {}
  void addConstraintsConsumingTo(Variable v, List<Constraint> coll) {}
}

class Plan {
  List<Constraint> list = <Constraint>[];
  void addConstraint(Constraint c) {}
  int size() => list.length;
  void execute() {}
}

void chainTest(int n) {}
void projectionTest(int n) {}
void change(Variable v, int newValue) {}
late Planner planner;
