@Override
 public void propagate(int evtmask) throws ContradictionException {
   ISet nei;
   IntVar v;
   for (int i = 0; i < n; i++) {
     nei = g.getEnvelopGraph().getSuccessorsOf(i);
     for (int j = nei.getFirstElement(); j >= 0; j = nei.getNextElement()) {
       if (!intVars[i].contains(j)) {
         g.removeArc(i, j, aCause);
       }
     }
     v = intVars[i];
     int ub = v.getUB();
     for (int j = v.getLB(); j <= ub; j = v.nextValue(j)) {
       if (j < n && !g.getEnvelopGraph().arcExists(i, j)) {
         v.removeValue(j, aCause);
       }
     }
     if (!v.hasEnumeratedDomain()) {
       ub = v.getUB();
       while (ub >= 0 && ub < n && !g.getEnvelopGraph().arcExists(i, ub)) {
         v.removeValue(ub, aCause);
         ub--;
       }
     }
   }
   gdm.unfreeze();
   for (int i = 0; i < idms.length; i++) {
     idms[i].unfreeze();
   }
 }