point call(side s, int dir, edge base, point o) throws Coordinator.KilledException {
								// o is at far end of base
							if (s.a == bottom) {						
								// region is a singleton
								return null;
							}
							point c = s.a.points[1-s.ai];
							if (externAngle(o, s.p, c, dir)) {
								// no more candidates
								return null;
							}
							while (true) {
								edge na = s.a.neighbors[s.ai][dir];
									// next edge into region
								if (na == base) {
									// wrapped all the way around
									return c;
								}
								int nai = na.indexOf(s.p);
								point nc = na.points[1-nai];
									// next potential candidate
								if (encircled(o, c, s.p, nc, dir)) {
									// have to break an edge
									s.a.destroy();
									s.a = na;
									s.ai = nai;
									c = nc;
								} else return c;
							}
						}