Index: /Evidence/Config.cc
===================================================================
--- /Evidence/Config.cc	(revision 170)
+++ /Evidence/Config.cc	(revision 171)
@@ -116,7 +116,8 @@
     if(Token1==NULL || Token2==NULL || Token3==NULL) continue;
 
-    // Check for match and then send data (removing trainlin whitespace)
+    // Check for match and then send data (removing whitespace and both ends)
     if (strstr(Request, Token1)!=NULL && strstr(Request, Token2)!=NULL) {
 	  while (isspace(*Token3) != 0) Token3++;
+	  while ((strlen(Token3)>0) && isspace(*(Token3+strlen(Token3)-1))) *(Token3+strlen(Token3)-1) = '\0';
       setData(Token3);
       break;
Index: /Evidence/Edd/Edd.cc
===================================================================
--- /Evidence/Edd/Edd.cc	(revision 170)
+++ /Evidence/Edd/Edd.cc	(revision 171)
@@ -31,5 +31,5 @@
 
   Browser.getServices(Service);
-  if (Browser.getNextService(Name, Format) != DimSERVICE) return NULL;
+  if (Browser.getNextService(Name, Format) != DimSERVICE) return new Edd_Plot(Service, Index);//return NULL;
   
   if (strlen(Format) == 1 && *Format != 'C') return new Edd_Plot(Service, Index);
@@ -52,5 +52,5 @@
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
     printf("Failed connection for %s\n", Name.toAscii().data());
   }
@@ -73,7 +73,7 @@
 
 // Update widget
-void Edd_Indicator::Update(DimInfo *Info, int Time, QByteArray Array, QString Text) {
-
-  if (ServiceName != Info->getName()) return;
+void Edd_Indicator::Update(QString Name, int Time, QByteArray Array, QString Format, QString Text) {
+
+  if (ServiceName != Name) return;
 
   QPalette Pal = palette();  
@@ -82,5 +82,5 @@
   if (Time == -1) {
     setText("n/a");
-	setStatusTip(QString("%1:  unavailable").arg(Info->getName()));
+	setStatusTip(QString("%1:  unavailable").arg(ServiceName));
     Pal.setColor(QPalette::Base, Qt::lightGray);
   }
@@ -95,5 +95,5 @@
     }
 	
-	if (toupper(*(Info->getFormat()) != 'C')) Text = Text.section(' ', Index, Index);
+	if (Format[0].toUpper() != 'C') Text = Text.section(' ', Index, Index);
 
 	if (!ShowAsTime) setText(Text);
@@ -102,5 +102,5 @@
 
     // Update status tip
-    setStatusTip(QString("%1:  Last update %2   Format '%3'   Index %4").arg(Info->getName()).arg(  QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()).arg(Index));
+    setStatusTip(QString("%1 (%4):  Last update %2   Format '%3'").arg(ServiceName).arg( QDateTime::fromTime_t(Time).toString()).arg(Format).arg(Index));
   }
   
@@ -140,5 +140,6 @@
   QDrag *Drag = new QDrag(this);
   QMimeData *MimeData = new QMimeData;
-  MimeData->setText(ServiceName);
+  QByteArray Data;
+  MimeData->setData("Edd/Service", Data.append(ServiceName + " " + QString::number(Index)));
   Drag->setMimeData(MimeData);
   Drag->exec();
@@ -163,12 +164,16 @@
 void Edd_Indicator::MenuCopyService() {
   
-  QApplication::clipboard()->setText(ServiceName);
+  QMimeData *MimeData = new QMimeData;
+  QByteArray Data;
+  MimeData->setData("Edd/Service", Data.append(ServiceName + " " + QString::number(Index)));
+  QApplication::clipboard()->setMimeData(MimeData);
 }
 
 // Menu: Copy data
 void Edd_Indicator::MenuCopyData() {
-  
+
   QApplication::clipboard()->setText(text());
 }
+
 
 //////////////////////////////////
@@ -205,5 +210,5 @@
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(DimInfo *, int, QByteArray, QString)), SLOT(Update(DimInfo *, int, QByteArray, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
     printf("Failed connection for %s\n", DIMService.toAscii().data());
   }
@@ -247,5 +252,5 @@
 //
 void Edd_Plot::AddService(QString Name, int Index) {
-return;
+
   // Lock before accessing Items list
   QMutexLocker Locker(Mutex);
@@ -254,5 +259,5 @@
   for (int i=0; i<Items.size(); i++) {
     if (Name == Items[i].Name && Index == Items[i].Index) {
-      QMessageBox::warning(this, "Edd Message",Name+" (index "+QString::number(Index)+") already present",QMessageBox::Ok);
+      QMessageBox::warning(this, "Edd Message",Name+" ("+QString::number(Index)+") already present",QMessageBox::Ok);
       return;
     }
@@ -275,11 +280,5 @@
 
 // Update widget (must happen in GUI thread)
-void Edd_Plot::Update(DimInfo *Info, int Time, QByteArray, QString Text) {
-
-  // Check if service available
-  if (Time == -1) {
-	setStatusTip(QString("%1:  unavailable").arg(Info->getName()));
-	return;
-  }
+void Edd_Plot::Update(QString Name, int Time, QByteArray, QString Format, QString Text) {
 
   // Lock before accessing Items list
@@ -288,5 +287,11 @@
   // Determine which plot item this call belongs to
   int ItemNo;
-  for (ItemNo=0; ItemNo<Items.size(); ItemNo++) if (Items[ItemNo].Name == Info->getName()) {
+  for (ItemNo=0; ItemNo<Items.size(); ItemNo++) if (Items[ItemNo].Name == Name) {
+
+	// Check if service available
+	if (Time == -1) {
+	  setStatusTip(QString("%1:  unavailable").arg(Name));
+	  return;
+	}
   
 	// If size limit reached, clear buffer
@@ -305,5 +310,5 @@
 		double Number=0;
 		while (Next(Time, Size, Data)) {
-		  switch (toupper(*(Info->getFormat()))) {
+		  switch (Format[0].toUpper().toAscii()) {
     		case 'I':
 			case 'L':  Number = *((int *) Data + Items[ItemNo].Index);   break;
@@ -314,5 +319,4 @@
     		default: break;
 		  }
-
 		  Items[ItemNo].x.append(Time);
 		  Items[ItemNo].y.append(Number);
@@ -333,8 +337,8 @@
 
     // Append data
-	Text = Text.section(' ', Items[ItemNo].Index, Items[ItemNo].Index);
-
+	QString Txt = Text;
+	Txt = Txt.section(' ', Items[ItemNo].Index, Items[ItemNo].Index);
     Items[ItemNo].x.append(Time);
-    Items[ItemNo].y.append(atof(Text.toAscii().data()));
+    Items[ItemNo].y.append(atof(Txt.toAscii().data()));
 
     // Update largest and smallest value    
@@ -344,5 +348,5 @@
     // Update status tip
     QDateTime Timex = QDateTime::fromTime_t(Time); 
-    setStatusTip(QString("%1:  Last update %2   Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat()));
+    setStatusTip(QString("%1:  Last update %2   Format '%3'").arg(Name).arg(Timex.toString()).arg(Format));
   }
 
@@ -415,10 +419,11 @@
 void Edd_Plot::dragEnterEvent(QDragEnterEvent *Event) {
     
-  if (Event->mimeData()->hasFormat("text/plain")) Event->acceptProposedAction();
+  if (Event->mimeData()->hasFormat("Edd/Service")) Event->acceptProposedAction();
 }
 
 void Edd_Plot::dropEvent(QDropEvent *Event) {
 
-  AddService(Event->mimeData()->text().toAscii().data());
+  QByteArray D(Event->mimeData()->data("Edd/Service"));
+  AddService(D.left(D.lastIndexOf(' ')), D.right(D.size()-D.lastIndexOf(' ')).toInt());
 }
     
@@ -432,7 +437,12 @@
 void Edd_Plot::LegendClicked(QwtPlotItem *Item) {
 
+
+  QString D(Item->title().text());
+  D.replace('(',' ').chop(1);
+  
   QDrag *Drag = new QDrag(this);
   QMimeData *MimeData = new QMimeData;
-  MimeData->setText(Item->title().text().remove(".hist"));
+  QByteArray Data;
+  MimeData->setData("Edd/Service", Data.append(D));
   Drag->setMimeData(MimeData);
   Drag->exec();
@@ -516,9 +526,13 @@
 void Edd_Plot::MenuPasteService() {
 
-  AddService(QApplication::clipboard()->text().toAscii().data());
-}
-
-
-///////////////////////////////////////
+  const QMimeData *D = QApplication::clipboard()->mimeData();
+  if (!D->hasFormat("Edd/Service")) return;
+  
+  QByteArray E(D->data("Edd/Service"));
+  AddService(E.left(E.lastIndexOf(' ')), E.right(E.size()-E.lastIndexOf(' ')).toInt());
+}
+
+
+//////////////////////////////////////
 // History text box for DIM service //
 //////////////////////////////////////
@@ -527,6 +541,6 @@
 // Constructor
 //
-Edd_TextHist::Edd_TextHist(QString Name, QWidget *P):
-	QTextEdit(P), EvidenceHistory(), Name(Name) {
+Edd_TextHist::Edd_TextHist(QString Name, bool Pure, QWidget *P):
+	QTextEdit(P), EvidenceHistory(), Name(Name), Pure(Pure) {
   
   // Widget properties
@@ -535,19 +549,22 @@
   setAutoFillBackground(true);
   document()->setMaximumBlockCount(1000);
+  Accumulate = true;
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
     printf("Failed connection for %s\n", Name.toAscii().data());
   }
 
-  // Get history for this service 
-  int Time, Size;
-  void *Data;
-
-  if (GetHistory(Name.toAscii().data())) {
-	while (Next(Time, Size, Data)) {
-	  moveCursor (QTextCursor::Start);
-	  insertPlainText(QString("(")+QDateTime::fromTime_t(Time).toString()+") ");	  
-	  insertPlainText(QString((char *) Data) + "\n");	  
+  if (!Pure) {
+	// Get history for this service 
+	int Time, Size;
+	void *Data;
+
+	if (GetHistory(Name.toAscii().data())) {
+	  while (Next(Time, Size, Data)) {
+		moveCursor (QTextCursor::Start);
+		insertPlainText(QString("(")+QDateTime::fromTime_t(Time).toString()+") ");	  
+		insertPlainText(QString((char *) Data) + "\n");	  
+	  }
 	}
   }
@@ -565,78 +582,33 @@
 
 // Update widget (must happen in GUI thread)
-void Edd_TextHist::Update(DimInfo *Info, int Time, QByteArray, QString Text) {
-
-  if (Name != Info->getName()) return;
+void Edd_TextHist::Update(QString Name, int Time, QByteArray, QString Format, QString Text) {
+
+  if (this->Name != Name) return;
+  QPalette Pal = palette();  
 
   // Check if service available
   if (Time == -1) {
-	setStatusTip(QString("%1:  unavailable").arg(Info->getName()));
+	setStatusTip(QString("%1:  unavailable").arg(Name));
+    Pal.setColor(QPalette::Base, Qt::lightGray);
+	setPalette(Pal);
 	return;
   }
 
+  Pal.setColor(QPalette::Base, Qt::white);
+  setPalette(Pal);
   QDateTime Timex = QDateTime::fromTime_t(Time); 
 
-  moveCursor(QTextCursor::Start);
-  insertPlainText(QString("(")+Timex.toString()+QString(") "));	  
-  insertPlainText(Text + "\n");	  
-	
+  // Clear display in case text should not accumulate
+  if (Accumulate == false) clear();
+
+  if (!Pure) {
+    moveCursor(QTextCursor::Start);
+    insertPlainText(QString("(")+Timex.toString()+QString(") "));	  
+    insertPlainText(Text + "\n");	  
+  }
+  else 	if (Format == "C") insertPlainText(Text);
+
   // Update status tip
-  setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), Timex.toString()).arg(Info->getFormat()));
-}
-
-
-//////////////////
-// Text display //
-//////////////////
-
-// Constructor
-Edd_Textout::Edd_Textout(QString Name, QWidget *P): QTextEdit(P), Name(Name) {
-
-  // Widget properties
-  setReadOnly(true);
-  setAutoFillBackground(true);
-  document()->setMaximumBlockCount(1000);
-  Accumulate = true;
-  
-  // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
-    printf("Failed connection for %s\n", Name.toAscii().data());
-  }
-
-  // Subscribe to service
-  Handler->Subscribe(Name);
-}
-
-// Destructor
-Edd_Textout::~Edd_Textout() {
-
-  Handler->Unsubscribe(Name);
-}
-
-// Handling of DIM service update
-void Edd_Textout::Update(DimInfo *Info, int Time, QByteArray, QString Text) {
-
-  if (Name != Info->getName()) return;
-  
-  QPalette Pal = palette();  
-
-  // Check if service available
-  if (Time == -1) {
-	setStatusTip(QString("%1:  unavailable").arg(Info->getName()));
-    Pal.setColor(QPalette::Base, Qt::lightGray);
-  }
-  else {
-    Pal.setColor(QPalette::Base, Qt::white);
-
-	// Clear display in case text should not accumulate
-	if (Accumulate == false) clear();
-	
-	// Add if service contains only a string
-	if (strcmp(Info->getFormat(), "C") == 0) insertPlainText(Text);
-
-	// Update status tip
-	setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Info->getName(), QDateTime::fromTime_t(Time).toString()).arg(Info->getFormat()));
-  }
-  setPalette(Pal);
+  setStatusTip(QString("%1:  Last update %2  Format '%3'").arg(Name).arg(Timex.toString()).arg(Format));
 }
 
@@ -649,6 +621,13 @@
   Mutex = new QMutex(QMutex::Recursive);
 
+  MinuteVolume = 0;
+  TotalVolume = 0;
+
+  QTimer *Timer = new QTimer(this);
+  Timer->connect(Timer, SIGNAL(timeout()), this, SLOT(UpdateStatistics()));
+  Timer->start(10000);
+
   // Connect to DIM handler
-  if (connect(this, SIGNAL(YEP(DimInfo*, int, QByteArray, QString)), SLOT(Update(DimInfo*, int, QByteArray, QString))) == false) {
+  if (connect(this, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
     printf("Failed connection in Edd_DIM()\n");
   }
@@ -666,8 +645,11 @@
   QMutexLocker Locker(Mutex);
 
-  // Check if already subscribed to service, then increase usage count and emit last service data
+  // If already subscribed to service, increase usage count
   for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Name) {
 	ServiceList[i].Count++;
-	YEP(ServiceList[i].DIMService, ServiceList[i].TimeStamp, ServiceList[i].ByteArray, ServiceList[i].Text);
+	// If service already reveived, reemit for new subscriber
+	if (!ServiceList[i].ByteArray.isEmpty()) {
+	  YEP(Name, ServiceList[i].TimeStamp, ServiceList[i].ByteArray, ServiceList[i].Format, ServiceList[i].Text);
+	}
 	return;
   }
@@ -676,4 +658,5 @@
   struct Item New;
   New.Name = Name;
+  New.ByteArray = QByteArray();
   New.DIMService = new DimStampedInfo(Name.toAscii().data(), INT_MAX, NO_LINK, this);
   New.Count = 1;
@@ -699,14 +682,35 @@
 }
 
-// Store service information for usage by Subscribe()
-void Edd_DIM::Update(DimInfo *Info, int Time, QByteArray Data, QString Text) {
+// Update throughput statistics
+void Edd_DIM::UpdateStatistics() {
+
+  // Lock before accessing internal variables
+  QMutexLocker Locker(Mutex);
+
+  float Rate = MinuteVolume/1024.0 * 6;
+  float Total = TotalVolume/1024.0/1024.0;
+
+  YEP("Edd/Rate_kBMin", time(NULL), QByteArray::number(Rate), "F", QString::number(Rate));
+  YEP("Edd/Total_MB", time(NULL), QByteArray::number(Total), "F", QString::number(Total));
+  MinuteVolume = 0;
+}
+
+// Store service information for usage by Subscribe() and update statistics
+void Edd_DIM::Update(QString Name, int Time, QByteArray Data, QString Format, QString Text) {
 
   // Lock before accessing list
   QMutexLocker Locker(Mutex);
 
-  for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Info->getName()) {
+  for (int i=0; i<ServiceList.size(); i++) if (ServiceList[i].Name == Name) {
 	  ServiceList[i].TimeStamp = Time;
 	  ServiceList[i].ByteArray = Data;
+	  ServiceList[i].Format = Format;
 	  ServiceList[i].Text = Text;
+  }
+
+  // Update statistics only for Dim services
+  if (!Name.startsWith("Edd/")) {  
+	TotalVolume += Data.size();
+	MinuteVolume += Data.size();
   }
 }
@@ -715,9 +719,9 @@
 void Edd_DIM::infoHandler() {
 
-  if (!EvidenceServer::ServiceOK(getInfo())) YEP(getInfo(), -1);
+  if (!EvidenceServer::ServiceOK(getInfo())) YEP(getInfo()->getName(), -1);
   else {
-	char *Txt = EvidenceServer::ToString(getInfo());
-	YEP(getInfo(), getInfo()->getTimestamp(), QByteArray((char *) getInfo()->getData(), getInfo()->getSize()), QString(Txt));
-	free(Txt);
+	char *Text = EvidenceServer::ToString(getInfo());
+	YEP(getInfo()->getName(), getInfo()->getTimestamp(), QByteArray((char *) getInfo()->getData(), getInfo()->getSize()), getInfo()->getFormat(), Text);
+	free(Text);
   }
 }
@@ -740,5 +744,5 @@
   Edd_Indicator *Value;
   Edd_Plot *Graph;
-  Edd_Textout *Textout; 
+  Edd_TextHist *Textout; 
   QString Text;
 
@@ -771,5 +775,5 @@
   MainLayout->addWidget(Value, 0, 1, 1, 1);
 
-  Textout = new Edd_Textout("Alarm/Summary");
+  Textout = new Edd_TextHist("Alarm/Summary", true);
   Textout->Accumulate = false;
   Textout->setMaximumWidth(200);
@@ -804,4 +808,9 @@
   connect(Button, SIGNAL(released()), SLOT(StartDIMBrowser()));
   MainLayout->addWidget(Button, 7, 1, 1, 1);
+
+  Value = new Edd_Indicator("Edd/Rate_kBMin");
+  MainLayout->addWidget(Value, 8, 0, 1, 1);
+  Value = new Edd_Indicator("Edd/Total_MB");
+  MainLayout->addWidget(Value, 8, 1, 1, 1);
 
   // Layout of all widgets
@@ -819,11 +828,9 @@
   Graph = new Edd_Plot();
   for (int i=0; i<36; i++) {
-    //Text = Text.sprintf("Feedback/Average/ID%.2d/%.2d-%.3d",i/16, (i%16)/8, i%8);
-    Text = Text.sprintf("Feedback/AverageTest/ID%.2d",i/16);
-    Value = new Edd_Indicator(Text, i%16);
+    Value = new Edd_Indicator("Feedback/Average", i);
     FeedbackLayout->addWidget(Value, i%9+1, 0+i/9, 1, 1);
-    //Graph->AddService(Text);
-  }
-  FeedbackLayout->addWidget(Graph, 0, 4, 11, 3);
+    Graph->AddService("Feedback/Average", i);
+  }
+  FeedbackLayout->addWidget(Graph, 0, 4, 10, 3);
 
   //Graph = new Edd_Plot();
@@ -847,9 +854,9 @@
     Value = new Edd_Indicator("Bias/VOLT/ID00", i);
     BiasLayout->addWidget(Value, i%9+1, 0+i/9, 1, 1);
-    //Graph->AddService(Text, i);
+    Graph->AddService("Bias/VOLT/ID00", i);
 
     Value = new Edd_Indicator("Bias/VOLT/ID00", i+32);
     BiasLayout->addWidget(Value, i%9+1, 2+i/9, 1, 1);
-    //Graph->AddService(Text,i+32);
+    Graph->AddService("Bias/VOLT/ID00",i+32);
   }
 
@@ -859,5 +866,5 @@
   BiasLayout->addWidget(Value, 0, 0, 1, 3);      
 
-  Textout = new Edd_Textout("Bias/Textout");
+  Textout = new Edd_TextHist("Bias/Textout", true);
   Textout->setFixedWidth(400);
   BiasLayout->addWidget(Textout, 10, 0, 4, 4);      
@@ -876,5 +883,5 @@
     Graph->AddService("ARDUINO/Data", i);
   }
-  EnvironmentLayout->addWidget(Graph, 0, 3, 7, 4);      
+  EnvironmentLayout->addWidget(Graph, 0, 3, 6, 4);      
 
   Value = new Edd_Indicator("SQM/NSB");
Index: /Evidence/Edd/Edd.h
===================================================================
--- /Evidence/Edd/Edd.h	(revision 170)
+++ /Evidence/Edd/Edd.h	(revision 171)
@@ -60,5 +60,5 @@
 	
   private slots:
-	void Update(DimInfo *, int, QByteArray, QString);
+	void Update(QString, int, QByteArray, QString, QString);
     void contextMenuEvent(QContextMenuEvent *);    
     void MenuOpenHistory();
@@ -104,6 +104,6 @@
 
   private slots:
+	void Update(QString, int, QByteArray, QString, QString);
     void UpdatePlot();
-	void Update(DimInfo* Info, int, QByteArray, QString);
 
     void HandleZoom(const QwtDoubleRect &);
@@ -118,32 +118,19 @@
 };
 
-// Text history class
+// Text history and output class
 class Edd_TextHist: public QTextEdit, public EvidenceHistory {
     Q_OBJECT
 
 	QString Name;
+	bool Pure;
 	
   public:
-    Edd_TextHist(QString, QWidget * = NULL);
+    Edd_TextHist(QString, bool = false, QWidget * = NULL);
     ~Edd_TextHist();
 
+	bool Accumulate;
+
   private slots:
-	void Update(DimInfo* Info, int, QByteArray, QString);
-};
-
-// Textout indicator for DIM service
-class Edd_Textout: public QTextEdit, public EvidenceHistory {
-    Q_OBJECT
-
-    QString Name;
-
-  public:
-    Edd_Textout(QString, QWidget * = NULL);
-    ~Edd_Textout();
-	
-	bool Accumulate;
-	
-  private slots:
-	void Update(DimInfo* Info, int, QByteArray, QString);
+	void Update(QString, int, QByteArray, QString, QString);
 };
 
@@ -158,4 +145,5 @@
 	  int TimeStamp;
 	  QByteArray ByteArray;
+	  QString Format;
 	  QString Text;
 	};
@@ -163,8 +151,12 @@
     QMutex *Mutex;
 
+	long long TotalVolume;
+	long long MinuteVolume;
+
 	void infoHandler();
 
   private slots:
-	void Update(DimInfo *, int, QByteArray, QString);
+	void Update(QString, int, QByteArray, QString, QString);
+	void UpdateStatistics();
 
   public:
@@ -176,5 +168,5 @@
 
   signals:
-    void YEP(DimInfo *, int, QByteArray = QByteArray(), QString = QString());
+    void YEP(QString, int, QByteArray = QByteArray(), QString = QString(), QString = QString());
 };
 
