private synchronized Area createMultiStoneBorder(Location firstStoneLoc) {
GoBoard boardCopy = board_.copy();
List<BoardPosition> q = new ArrayList<BoardPosition>();
GoBoardPositionSet qset = new GoBoardPositionSet();
GoBoardPositionList visitedSet = new GoBoardPositionList();
GoBoardPosition firstStone = (GoBoardPosition) boardCopy.getPosition(firstStoneLoc);
q.add( firstStone );
qset.add( firstStone );
Area area = new Area();
NeighborAnalyzer nbrAnalyzer = new NeighborAnalyzer(boardCopy);
while ( !q.isEmpty() ) {
GoBoardPosition stone = (GoBoardPosition) q.remove( 0 );
qset.remove( stone );
stone.setVisited( true );
visitedSet.add(stone);
GoBoardPositionSet nbrs = nbrAnalyzer.findGroupNeighbors( stone, true );
for (GoBoardPosition nbrStone : nbrs) {
// accumulate all the borders to arrive at the final group border
area.add( new Area( getBorderBetween( stone, nbrStone ) ) );
if ( !nbrStone.isVisited() && !qset.contains( nbrStone ) ) {
q.add( nbrStone );