// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


import java.util.List;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.io.IOException;
import java.util.ArrayList;

    createAtoms(mol, atomBlock, 5);
    createBonds(mol, bondBlock, 5 + atomCount);

    return 5 + atomCount + bondCount;
  }

  private void createAtoms(Molecule mol, String[] lines, int startLine)
  {
    for (int i = 0; i < lines.length; i++)
    {
      String line = MDLStringKit.padRight(lines[i], 69);

      try
      {
        createAtom(mol, line);
      } catch (Exception e)
      {
        throw new RuntimeException("Can't parse line " + (startLine + i) + " as atom.\n" + e.getLocalizedMessage() + "\n" + line, e);
      }
    }
  }

  private void createAtom(Molecule mol, String line)
  {
    float x = MDLStringKit.extractFloat(line, 0, 10);
    float y = MDLStringKit.extractFloat(line, 10, 20);
    float z = MDLStringKit.extractFloat(line, 20, 30);
    String symbol = MDLStringKit.extractString(line, 31, 34);

// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


// Path: src/com/metamolecular/mx/io/mdl/MolfileReader.java
import java.util.List;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.io.IOException;
import java.util.ArrayList;


    createAtoms(mol, atomBlock, 5);
    createBonds(mol, bondBlock, 5 + atomCount);

    return 5 + atomCount + bondCount;
  }

  private void createAtoms(Molecule mol, String[] lines, int startLine)
  {
    for (int i = 0; i < lines.length; i++)
    {
      String line = MDLStringKit.padRight(lines[i], 69);

      try
      {
        createAtom(mol, line);
      } catch (Exception e)
      {
        throw new RuntimeException("Can't parse line " + (startLine + i) + " as atom.\n" + e.getLocalizedMessage() + "\n" + line, e);
      }
    }
  }

  private void createAtom(Molecule mol, String line)
  {
    float x = MDLStringKit.extractFloat(line, 0, 10);
    float y = MDLStringKit.extractFloat(line, 10, 20);
    float z = MDLStringKit.extractFloat(line, 20, 30);
    String symbol = MDLStringKit.extractString(line, 31, 34);

    Atom atom = mol.addAtom(symbol, x, y, z);