]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Add the Ceph monitoring GUI
authorMichael McThrow <mmcthrow@gmail.com>
Wed, 27 Oct 2010 20:31:26 +0000 (13:31 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 28 Oct 2010 22:51:19 +0000 (15:51 -0700)
This adds a graphical monitoring mode to the ceph cluster monitoring tool.  Its
functionality is similar to ./ceph -w. With ./ceph -g, you can watch over the
whole cluster graphically. It uses GTK2.

Signed-off-by: Colin McCabe <colinm@hq.newdream.net>
24 files changed:
configure.ac
src/Makefile.am
src/tools/ceph.cc
src/tools/ceph.h [new file with mode: 0644]
src/tools/gui.cc [new file with mode: 0644]
src/tools/gui.h [new file with mode: 0644]
src/tools/gui_resources.h [new file with mode: 0644]
src/tools/gui_resources/blacklist.svg [new file with mode: 0644]
src/tools/gui_resources/client.svg [new file with mode: 0644]
src/tools/gui_resources/cluster_stats_window.glade [new file with mode: 0644]
src/tools/gui_resources/down_osd.svg [new file with mode: 0644]
src/tools/gui_resources/failed_mds.svg [new file with mode: 0644]
src/tools/gui_resources/gui_monitor.build [new file with mode: 0644]
src/tools/gui_resources/gui_monitor.glade [new file with mode: 0644]
src/tools/gui_resources/gui_monitor_old.glade [new file with mode: 0644]
src/tools/gui_resources/main-window.glade [new file with mode: 0644]
src/tools/gui_resources/mds.svg [new file with mode: 0644]
src/tools/gui_resources/monitor.svg [new file with mode: 0644]
src/tools/gui_resources/node_stats_window.glade [new file with mode: 0644]
src/tools/gui_resources/osd.svg [new file with mode: 0644]
src/tools/gui_resources/out_osd.svg [new file with mode: 0644]
src/tools/gui_resources/pg.svg [new file with mode: 0644]
src/tools/gui_resources/stats_window.glade [new file with mode: 0644]
src/tools/gui_resources/stopped_mds.svg [new file with mode: 0644]

index 39244910825213faa21e7ba42c9abdce4b0b3dce..5805ad818410880c152409100e2faa4b756773af 100644 (file)
@@ -220,6 +220,8 @@ AM_CONDITIONAL(WITH_GTK2, [test "x$HAVE_GTK2" = "xyes"])
 
 if test "x$HAVE_GTK2" == "xyes"; then
        PKG_CHECK_MODULES(GTKMM, [gtkmm-2.4 >= 1.0.0])
+       AC_DEFINE([HAVE_GTK2], [1],
+                [Define if you have GTK2])
 fi
 
 AC_CONFIG_HEADERS([src/acconfig.h])
index 2c8e78300f9dd68e33f303cbe044ef0670d24338..b57000df8caa5b3943f3549465286e6247b19e3d 100644 (file)
@@ -29,6 +29,14 @@ cmds_CXXFLAGS = ${AM_CFLAGS}
 # admin tools
 ceph_SOURCES = tools/ceph.cc msg/SimpleMessenger.cc
 ceph_LDADD = libcrush.a libcommon.a -ledit -lpthread -lm -lcrypto
+ceph_CXXFLAGS = ${AM_CFLAGS}
+
+if WITH_GTK2
+ceph_SOURCES += tools/gui.cc
+ceph_LDADD += $(GTKMM_LIBS)
+ceph_CXXFLAGS += $(GTKMM_CFLAGS)
+endif
+
 cconf_SOURCES = cconf.cc
 cconf_LDADD = libcommon.a -lpthread -lm -lcrypto
 cauthtool_SOURCES = cauthtool.cc
index 8486a8d15a645b400bb8de5595bb3137e38f1479..d0cc82d0654fddd28300965afce88fb066e05b11 100644 (file)
 #include <string>
 using namespace std;
 
-#include "config.h"
-
-#include "mon/MonMap.h"
-#include "mon/MonClient.h"
-#include "msg/SimpleMessenger.h"
+#include "acconfig.h"
 #include "messages/MMonCommand.h"
 #include "messages/MMonCommandAck.h"
+#include "mon/MonClient.h"
+#include "mon/MonMap.h"
+#include "msg/SimpleMessenger.h"
+#include "tools/ceph.h"
 
+#include "common/Cond.h"
+#include "common/Mutex.h"
 #include "common/Timer.h"
 #include "common/common_init.h"
 
@@ -40,15 +42,22 @@ extern "C" {
 #include <histedit.h>
 }
 
+enum CephToolMode {
+  CEPH_TOOL_MODE_CLI_INPUT = 0,
+  CEPH_TOOL_MODE_OBSERVER = 1,
+  CEPH_TOOL_MODE_ONE_SHOT_OBSERVER = 2,
+  CEPH_TOOL_MODE_GUI = 3
+};
+
+static enum CephToolMode ceph_tool_mode(CEPH_TOOL_MODE_CLI_INPUT);
 
+struct ceph_tool_data g;
 
-Mutex lock("ceph.cc lock");
-Cond cond;
-SimpleMessenger *messenger = 0;
-SafeTimer timer(lock);
-MonClient mc;
+static Cond cmd_cond;
+static SimpleMessenger *messenger = 0;
+static SafeTimer timer(g.lock);
 
-const char *outfile = 0;
+static const char *outfile = 0;
 
 
 
@@ -76,27 +85,22 @@ Context *resend_event = 0;
 #include "messages/MMonObserve.h"
 #include "messages/MMonObserveNotify.h"
 
-int observe = 0;
-bool one_shot = false;
-static PGMap pgmap;
-static MDSMap mdsmap;
-static OSDMap osdmap;
 
 static set<int> registered, seen;
 
 version_t map_ver[PAXOS_NUM];
 
-void handle_observe(MMonObserve *observe)
+static void handle_observe(MMonObserve *observe)
 {
   dout(1) << observe->get_source() << " -> " << get_paxos_name(observe->machine_id)
          << " registered" << dendl;
-  lock.Lock();
+  g.lock.Lock();
   registered.insert(observe->machine_id);  
-  lock.Unlock();
+  g.lock.Unlock();
   observe->put();
 }
 
-void handle_notify(MMonObserveNotify *notify)
+static void handle_notify(MMonObserveNotify *notify)
 {
   utime_t now = g_clock.now();
 
@@ -105,8 +109,8 @@ void handle_notify(MMonObserveNotify *notify)
          << (notify->is_latest ? " (latest)" : "")
          << dendl;
   
-  if (ceph_fsid_compare(&notify->fsid, &mc.monmap.fsid)) {
-    dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << mc.monmap.fsid << dendl;
+  if (ceph_fsid_compare(&notify->fsid, &g.mc.monmap.fsid)) {
+    dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << g.mc.monmap.fsid << dendl;
     notify->put();
     return;
   }
@@ -119,31 +123,34 @@ void handle_notify(MMonObserveNotify *notify)
     {
       bufferlist::iterator p = notify->bl.begin();
       if (notify->is_latest) {
-       pgmap.decode(p);
+       g.pgmap.decode(p);
       } else {
        PGMap::Incremental inc;
        inc.decode(p);
-       pgmap.apply_incremental(inc);
+       g.pgmap.apply_incremental(inc);
       }
-      cout << now << "    pg " << pgmap << std::endl;
+      *g.log << now << "    pg " << g.pgmap << std::endl;
+      g.updates |= PG_MON_UPDATE;
       break;
     }
 
   case PAXOS_MDSMAP:
-    mdsmap.decode(notify->bl);
-    cout << now << "   mds " << mdsmap << std::endl;
+    g.mdsmap.decode(notify->bl);
+    *g.log << now << "   mds " << g.mdsmap << std::endl;
+    g.updates |= MDS_MON_UPDATE;
     break;
 
   case PAXOS_OSDMAP:
     {
       if (notify->is_latest) {
-       osdmap.decode(notify->bl);
+       g.osdmap.decode(notify->bl);
       } else {
        OSDMap::Incremental inc(notify->bl);
-       osdmap.apply_incremental(inc);
+       g.osdmap.apply_incremental(inc);
       }
-      cout << now << "   osd " << osdmap << std::endl;
+      *g.log << now << "   osd " << g.osdmap << std::endl;
     }
+    g.updates |= OSD_MON_UPDATE;
     break;
 
   case PAXOS_LOG:
@@ -154,14 +161,14 @@ void handle_notify(MMonObserveNotify *notify)
        ::decode(summary, p);
        // show last log message
        if (!summary.tail.empty())
-         cout << now << "   log " << summary.tail.back() << std::endl;
+         *g.log << now << "   log " << summary.tail.back() << std::endl;
       } else {
        LogEntry le;
        __u8 v;
        ::decode(v, p);
        while (!p.end()) {
          le.decode(p);
-         cout << now << "   log " << le << std::endl;
+         *g.log << now << "   log " << le << std::endl;
        }
       }
       break;
@@ -180,7 +187,7 @@ void handle_notify(MMonObserveNotify *notify)
           tClassVersionMap::iterator iter = map.begin();
 
           if (iter != map.end())
-           cout << now << "   class " <<  iter->second << std::endl;
+           *g.log << now << "   class " <<  iter->second << std::endl;
        }
       } else {
        __u8 v;
@@ -190,7 +197,7 @@ void handle_notify(MMonObserveNotify *notify)
           ::decode(inc, p);
          ClassInfo info;
          inc.decode_info(info);
-         cout << now << "   class " << info << std::endl;
+         *g.log << now << "   class " << info << std::endl;
        }
       }
       break;
@@ -203,12 +210,12 @@ void handle_notify(MMonObserveNotify *notify)
       if (notify->is_latest) {
        KeyServerData data;
        ::decode(data, p);
-       cout << now << "   auth " << std::endl;
+       *g.log << now << "   auth " << std::endl;
       } else {
        while (!p.end()) {
          AuthMonitor::Incremental inc;
           inc.decode(p);
-         cout << now << "   auth " << inc.name.to_str() << std::endl;
+         *g.log << now << "   auth " << inc.name.to_str() << std::endl;
        }
       }
 #endif
@@ -218,22 +225,32 @@ void handle_notify(MMonObserveNotify *notify)
 
   case PAXOS_MONMAP:
     {
-      mc.monmap.decode(notify->bl);
-      cout << now << "   mon " << mc.monmap << std::endl;
+      g.mc.monmap.decode(notify->bl);
+      *g.log << now << "   mon " << g.mc.monmap << std::endl;
     }
     break;
 
   default:
-    cout << now << "  ignoring unknown machine id " << notify->machine_id << std::endl;
+    *g.log << now << "  ignoring unknown machine id " << notify->machine_id << std::endl;
   }
 
   map_ver[notify->machine_id] = notify->ver;
 
   // have we seen them all?
   seen.insert(notify->machine_id);
-  if (one_shot && seen.size() == PAXOS_NUM) {
-    messenger->shutdown();
-  }  
+  switch (ceph_tool_mode) {
+    case CEPH_TOOL_MODE_ONE_SHOT_OBSERVER:
+      if (seen.size() == PAXOS_NUM) {
+       messenger->shutdown();
+      }
+      break;
+    case CEPH_TOOL_MODE_GUI:
+      g.gui_cond.Signal();
+      break;
+    default:
+      // do nothing
+      break;
+  }
 
   notify->put();
 }
@@ -255,9 +272,9 @@ static void send_observe_requests()
 
   bool sent = false;
   for (int i=0; i<PAXOS_NUM; i++) {
-    MMonObserve *m = new MMonObserve(mc.monmap.fsid, i, map_ver[i]);
+    MMonObserve *m = new MMonObserve(g.mc.monmap.fsid, i, map_ver[i]);
     dout(1) << "mon" << " <- observe " << get_paxos_name(i) << dendl;
-    mc.send_mon_message(m);
+    g.mc.send_mon_message(m);
     sent = true;
   }
 
@@ -267,35 +284,34 @@ static void send_observe_requests()
   timer.add_event_after(seconds, new C_ObserverRefresh(false));
 }
 
-void handle_ack(MMonCommandAck *ack)
+static void handle_ack(MMonCommandAck *ack)
 {
-  lock.Lock();
+  g.lock.Lock();
   reply = true;
   reply_from = ack->get_source_inst();
   reply_rs = ack->rs;
   reply_rc = ack->r;
   reply_bl = ack->get_data();
-  cond.Signal();
+  cmd_cond.Signal();
   if (resend_event) {
     timer.cancel_event(resend_event);
     resend_event = 0;
   }
-  lock.Unlock();
+  g.lock.Unlock();
   ack->put();
 }
 
-void send_command()
+static void send_command()
 {
   version_t last_seen_version = 0;
-  MMonCommand *m = new MMonCommand(mc.monmap.fsid, last_seen_version);
+  MMonCommand *m = new MMonCommand(g.mc.monmap.fsid, last_seen_version);
   m->cmd = pending_cmd;
   m->set_data(pending_bl);
 
-  cout << g_clock.now() << " mon" << " <- " << pending_cmd << std::endl;
-  mc.send_mon_message(m);
+  *g.log << g_clock.now() << " mon" << " <- " << pending_cmd << std::endl;
+  g.mc.send_mon_message(m);
 }
 
-
 class Admin : public Dispatcher {
   bool ms_dispatch(Message *m) {
     switch (m->get_type()) {
@@ -319,12 +335,13 @@ class Admin : public Dispatcher {
 
   void ms_handle_connect(Connection *con) {
     if (con->get_peer_type() == CEPH_ENTITY_TYPE_MON) {
-      lock.Lock();
-      if (observe)
+      g.lock.Lock();
+      if (ceph_tool_mode != CEPH_TOOL_MODE_CLI_INPUT) {
        send_observe_requests();
+      }
       if (pending_cmd.size())
        send_command();
-      lock.Unlock();
+      g.lock.Unlock();
     }
   }
   bool ms_handle_reset(Connection *con) { return false; }
@@ -334,7 +351,7 @@ class Admin : public Dispatcher {
 
 int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
 {
-  Mutex::Locker l(lock);
+  Mutex::Locker l(g.lock);
 
   pending_cmd = cmd;
   pending_bl = bl;
@@ -343,11 +360,11 @@ int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
   send_command();
 
   while (!reply)
-    cond.Wait(lock);
+    cmd_cond.Wait(g.lock);
 
   rs = rs;
   rbl = reply_bl;
-  cout << g_clock.now() << " "
+  *g.log << g_clock.now() << " "
        << reply_from.name << " -> '"
        << reply_rs << "' (" << reply_rc << ")"
        << std::endl;
@@ -355,9 +372,7 @@ int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
   return reply_rc;
 }
 
-
-
-void usage() 
+static void usage() 
 {
   cerr << "usage: ceph [options] [commands]" << std::endl;
   cerr << "If no commands are specified, enter interactive mode.\n";
@@ -373,11 +388,13 @@ void usage()
   cerr << "        print current system status\n";
   cerr << "   -w or --watch\n";
   cerr << "        watch system status changes in real time (push)\n";
+  cerr << "   -g or --gui\n";
+  cerr << "        watch system status changes graphically\n";
   generic_client_usage();
 }
 
-
-const char *cli_prompt(EditLine *e) {
+static const char *cli_prompt(EditLine *e)
+{
   return "ceph> ";
 }
 
@@ -402,109 +419,118 @@ int do_cli()
   /* This sets up the call back functions for history functionality */
   el_set(el, EL_HIST, history, myhistory);
 
-  Tokenizer *tok = tok_init(NULL);
-
-  bufferlist in;
   while (1) {
-    int count;  // # chars read
-    const char *line = el_gets(el, &count);
+    int chars_read;
+    const char *line = el_gets(el, &chars_read);
+
+    //*g.log << "typed '" << line << "'" << std::endl;
 
-    if (!count) {
-      cout << "quit" << std::endl;
+    if (chars_read == 0) {
+      *g.log << "quit" << std::endl;
       break;
     }
 
-    //cout << "typed '" << line << "'" << std::endl;
+    history(myhistory, &ev, H_ENTER, line);
 
-    if (strcmp(line, "quit\n") == 0)
+    if (run_command(line))
       break;
+  }
 
-    history(myhistory, &ev, H_ENTER, line);
+  history_end(myhistory);
+  el_end(el);
 
-    int argc;
-    const char **argv;
-    tok_str(tok, line, &argc, &argv);
-    tok_reset(tok);
-
-    vector<string> cmd;
-    const char *infile = 0;
-    const char *outfile = 0;
-    for (int i=0; i<argc; i++) {
-      if (strcmp(argv[i], ">") == 0 && i < argc-1) {
-       outfile = argv[++i];
-       continue;
-      }
-      if (argv[i][0] == '>') {
-       outfile = argv[i] + 1;
-       while (*outfile == ' ') outfile++;
-       continue;
-      }
-      if (strcmp(argv[i], "<") == 0 && i < argc-1) {
-       infile = argv[++i];
-       continue;
-      }
-      if (argv[i][0] == '<') {
-       infile = argv[i] + 1;
-       while (*infile == ' ') infile++;
-       continue;
-      }
-      cmd.push_back(argv[i]);
+  return 0;
+}
+
+int run_command(const char *line)
+{
+  if (strcmp(line, "quit\n") == 0)
+    return 1;
+
+  int argc;
+  const char **argv;
+  Tokenizer *tok = tok_init(NULL);
+  tok_str(tok, line, &argc, &argv);
+  tok_reset(tok);
+  tok_end(tok);
+
+  vector<string> cmd;
+  const char *infile = 0;
+  const char *outfile = 0;
+  for (int i=0; i<argc; i++) {
+    if (strcmp(argv[i], ">") == 0 && i < argc-1) {
+      outfile = argv[++i];
+      continue;
     }
-    if (cmd.empty())
+    if (argv[i][0] == '>') {
+      outfile = argv[i] + 1;
+      while (*outfile == ' ') outfile++;
       continue;
-
-    if (cmd.size() == 1 && cmd[0] == "print") {
-      cout << "----" << std::endl;
-      write(1, in.c_str(), in.length());
-      cout << "---- (" << in.length() << " bytes)" << std::endl;
+    }
+    if (strcmp(argv[i], "<") == 0 && i < argc-1) {
+      infile = argv[++i];
       continue;
     }
-
-    //cout << "cmd is " << cmd << std::endl;
-
-    bufferlist out;
-    if (infile) {
-      if (out.read_file(infile) == 0) {
-       cout << "read " << out.length() << " from " << infile << std::endl;
-      } else {
-       char buf[80];
-       cerr << "couldn't read from " << infile << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl;
-       continue;
-      }
+    if (argv[i][0] == '<') {
+      infile = argv[i] + 1;
+      while (*infile == ' ') infile++;
+      continue;
     }
+    cmd.push_back(argv[i]);
+  }
+  if (cmd.empty())
+    return 0;
 
-    in.clear();
-    string rs;
-    do_command(cmd, out, rs, in);
+  bufferlist in;
+  if (cmd.size() == 1 && cmd[0] == "print") {
+    *g.log << "----" << std::endl;
+    write(1, in.c_str(), in.length());
+    *g.log << "---- (" << in.length() << " bytes)" << std::endl;
+    return 0;
+  }
 
-    if (in.length()) {
-      if (outfile) {
-       if (strcmp(outfile, "-") == 0) {
-         cout << "----" << std::endl;
-         write(1, in.c_str(), in.length());
-         cout << "---- (" << in.length() << " bytes)" << std::endl;
-       } else {
-         in.write_file(outfile);
-         cout << "wrote " << in.length() << " to " << outfile << std::endl;
-       }
-      } else {
-       cout << "got " << in.length() << " byte payload; 'print' to dump to terminal, or add '>-' to command." << std::endl;
-      }
+  //out << "cmd is " << cmd << std::endl;
+
+  bufferlist out;
+  if (infile) {
+    if (out.read_file(infile) == 0) {
+      *g.log << "read " << out.length() << " from " << infile << std::endl;
+    } else {
+      char buf[80];
+      *g.log << "couldn't read from " << infile << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl;
+      return 0;
     }
   }
 
-  history_end(myhistory);
-  el_end(el);
+  in.clear();
+  string rs;
+  do_command(cmd, out, rs, in);
+
+  if (in.length() == 0)
+    return 0;
 
+  if (outfile) {
+    if (strcmp(outfile, "-") == 0) {
+      *g.log << "----" << std::endl;
+      write(1, in.c_str(), in.length());
+      *g.log << "---- (" << in.length() << " bytes)" << std::endl;
+    }
+    else {
+      in.write_file(outfile);
+      *g.log << "wrote " << in.length() << " to "
+            << outfile << std::endl;
+    }
+  }
+  else {
+    *g.log << "got " << in.length() << " byte payload; 'print' "
+      << "to dump to terminal, or add '>-' to command." << std::endl;
+  }
   return 0;
 }
 
-
-
-
-
-int main(int argc, const char **argv, const char *envp[])
+int main(int argc, const char **argv)
 {
+  ostringstream gss;
   DEFINE_CONF_VARS(usage);
   vector<const char*> args;
   argv_to_vec(argc, argv, args);
@@ -542,12 +568,13 @@ int main(int argc, const char **argv, const char *envp[])
        cout << "read " << st.st_size << " bytes from " << args[i] << std::endl;
       }
     } else if (CONF_ARG_EQ("status", 's')) {
-      CONF_SAFE_SET_ARG_VAL(&observe, OPT_BOOL);
-      one_shot = true;
+      ceph_tool_mode = CEPH_TOOL_MODE_ONE_SHOT_OBSERVER;
     } else if (CONF_ARG_EQ("watch", 'w')) {
-      CONF_SAFE_SET_ARG_VAL(&observe, OPT_BOOL);
+      ceph_tool_mode = CEPH_TOOL_MODE_OBSERVER;
     } else if (CONF_ARG_EQ("help", 'h')) {
       usage();
+    } else if (CONF_ARG_EQ("gui", 'g')) {
+      ceph_tool_mode = CEPH_TOOL_MODE_GUI;
     } else if (args[i][0] == '-' && nargs.empty()) {
       cerr << "unrecognized option " << args[i] << std::endl;
       usage();
@@ -565,7 +592,7 @@ int main(int argc, const char **argv, const char *envp[])
   }
 
   // get monmap
-  if (mc.build_initial_monmap() < 0)
+  if (g.mc.build_initial_monmap() < 0)
     return -1;
   
   // start up network
@@ -575,31 +602,39 @@ int main(int argc, const char **argv, const char *envp[])
 
   messenger->start();
 
-  mc.set_messenger(messenger);
-  mc.init();
+  g.mc.set_messenger(messenger);
+  g.mc.init();
 
-  if (mc.authenticate() < 0) {
+  if (g.mc.authenticate() < 0) {
     cerr << "unable to authenticate as " << *g_conf.entity_name << std::endl;
     return -1;
   }
-  if (mc.get_monmap() < 0) {
+  if (g.mc.get_monmap() < 0) {
     cerr << "unable to get monmap" << std::endl;
     return -1;
   }
 
   int ret = 0;
 
-  if (observe) {
-    lock.Lock();
-    send_observe_requests();
-    lock.Unlock();
-  } else {
-    if (vcmd.size()) {
-      
+  switch (ceph_tool_mode)
+  {
+    case CEPH_TOOL_MODE_OBSERVER:
+    case CEPH_TOOL_MODE_ONE_SHOT_OBSERVER:
+      g.lock.Lock();
+      send_observe_requests();
+      g.lock.Unlock();
+      break;
+
+    case CEPH_TOOL_MODE_CLI_INPUT: {
+      if (vcmd.empty()) {
+       // interactive mode
+       do_cli();
+       messenger->shutdown();
+       break;
+      }
       string rs;
       bufferlist odata;
       ret = do_command(vcmd, indata, rs, odata);
-      
       int len = odata.length();
       if (len) {
        if (outfile) {
@@ -613,18 +648,37 @@ int main(int argc, const char **argv, const char *envp[])
          cout << g_clock.now() << " got " << len << " byte payload, discarding (specify -o <outfile)" << std::endl;
        }
       }
-    } else {
-      // interactive mode
-      do_cli();
+      messenger->shutdown();
+      break;
+    }
+
+    case CEPH_TOOL_MODE_GUI: {
+#ifdef HAVE_GTK2
+      g.log = &gss;
+      g.slog = &gss;
+
+      // TODO: make sure that we capture the log this generates in the GUI
+      g.lock.Lock();
+      send_observe_requests();
+      g.lock.Unlock();
+
+      run_gui(argc, (char **)argv);
+#else
+      cerr << "I'm sorry. This tool was not compiled with support for  "
+          << "GTK2." << std::endl;
+      ret = EXIT_FAILURE;
+#endif
+      messenger->shutdown();
+      break;
     }
-    
-    messenger->shutdown();
-  }
 
+    default:
+      assert(0);
+      break;
+  }
 
   // wait for messenger to finish
   messenger->wait();
   messenger->destroy();
   return ret;
 }
-
diff --git a/src/tools/ceph.h b/src/tools/ceph.h
new file mode 100644 (file)
index 0000000..ca15c2c
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef CEPH_TOOL_H
+#define CEPH_TOOL_H
+
+#include "common/Cond.h"
+#include "common/Mutex.h"
+#include "mon/MonClient.h"
+#include "mon/PGMap.h"
+#include "mds/MDSMap.h"
+#include "osd/OSDMap.h"
+
+#include <iosfwd>
+#include <stdint.h>
+
+#define OSD_MON_UPDATE     (1<<0)
+#define MDS_MON_UPDATE     (1<<1)
+#define PG_MON_UPDATE      (1<<2)
+#define MON_MON_UPDATE     (1<<3)
+#define EVERYTHING_UPDATE   0xffffffff
+
+// tool/ceph.cc
+struct ceph_tool_data
+{
+  PGMap pgmap;
+  MDSMap mdsmap;
+  OSDMap osdmap;
+  MonClient mc;
+
+  // Which aspects of the cluster have been updated recently?
+  uint32_t updates;
+
+  // The main log for ceph-tool
+  std::ostream *log;
+
+  // Used by the GUI to read from the log.
+  // NULL if there is no GUI active.
+  std::ostringstream *slog;
+
+  // The ceph-tool lock
+  Mutex lock;
+
+  // A condition variable used to wake up the GUI thread
+  Cond gui_cond;
+
+  ceph_tool_data()
+    : updates(EVERYTHING_UPDATE),
+      log(&std::cout),
+      slog(NULL),
+      lock("ceph.cc lock")
+  {
+  }
+};
+
+// tool/ceph.cc
+extern struct ceph_tool_data g;
+int run_command(const char *line);
+
+// tool/gyi.cc
+int run_gui(int argc, char **argv);
+
+#endif
diff --git a/src/tools/gui.cc b/src/tools/gui.cc
new file mode 100644 (file)
index 0000000..79e3758
--- /dev/null
@@ -0,0 +1,1727 @@
+/*
+ * gui_monitor_interface.cc -- Handles the GUI of the Ceph monitor
+ *
+ * 2009-10 Michael McThrow
+ */
+
+#include "common/Clock.h"
+#include "common/Cond.h"
+#include "common/Mutex.h"
+#include "mon/MonClient.h"
+#include "mon/MonMap.h"
+#include "tools/ceph.h"
+#include "tools/gui.h"
+#include "tools/gui_resources.h"
+
+#include <set>
+#include <string>
+
+using std::set;
+using std::string;
+
+#define MAX_VIEW_ICONS 6
+
+// Computes floor(m/n), where m and n are integers.
+#define FLOOR(x, y) ((x) % (y)) ? ((x) / (y) + 1) : ((x) / (y))
+
+#define MY_GET_WIDGET(x) do { builder->get_widget(#x, x); } while(0);
+
+///////////////// Functions /////////////////
+
+// Given an integer m and an array of length n, divides m into n categories of
+// equal or near-equal values.
+static void gen_ranges(unsigned int m, unsigned int n,
+                      unsigned int *ranges)
+{
+   unsigned int multiple = FLOOR(m, n);
+   unsigned int remainder = m % n;
+   long int i, j;
+
+   if (m <= n) {
+      for (i = 0; i < n; i++)
+         ranges[i] = (i < m) ? 1 : 0;
+   }
+   else {
+      for (i = n - 1, j = (remainder) ? n - remainder: 0; i >= 0; i--) {
+         if (j) {
+            ranges[i] = multiple - 1;
+            --j;
+         }
+         else
+            ranges[i] = multiple;
+      }
+   }
+}
+
+// Converts a Ceph entity_addr_t to a C++ string.
+static std::string addr_to_str(const entity_addr_t& addr)
+{
+  ostringstream oss;
+  oss << addr;
+  return oss.str();
+}
+
+///////////////// Classes /////////////////
+
+class GuiMonitorThread : public Thread
+{
+public:
+  GuiMonitorThread(GuiMonitor *gui_)
+    : gui(gui_),
+      shutting_down(false)
+  {
+  }
+
+  void *entry()
+  {
+    g.lock.Lock();
+    while (true) {
+      utime_t t(g_clock.now());
+      t += 3.0;
+      g.gui_cond.WaitUntil(g.lock, t);
+      if (shutting_down) {
+       g.lock.Unlock();
+       return NULL;
+      }
+      gui->check_status();
+    }
+  }
+
+  void shutdown()
+  {
+    shutting_down = true;
+    g.gui_cond.Signal();
+  }
+
+private:
+  GuiMonitor *gui;
+  bool shutting_down;
+};
+
+GuiMonitor::GuiMonitor(Glib::RefPtr<Gtk::Builder> builder)
+  : pg_cluster_zoom(0),
+    osd_cluster_zoom(0),
+    mds_cluster_zoom(0),
+    send_command_success(false),
+    view_node_success(false),
+    thread(NULL)
+{
+  MY_GET_WIDGET(guiMonitorWindow);
+  MY_GET_WIDGET(guiMonitorQuitImageMenuItem);
+  MY_GET_WIDGET(guiMonitorCopyImageMenuItem);
+  MY_GET_WIDGET(guiMonitorSendCommandMenuItem);
+  MY_GET_WIDGET(guiMonitorViewNodeMenuItem);
+  MY_GET_WIDGET(guiMonitorAboutImageMenuItem);
+  MY_GET_WIDGET(guiMonitorPGClusterStatsLabel);
+  MY_GET_WIDGET(guiMonitorPGClusterIconView);
+  MY_GET_WIDGET(guiMonitorPGClusterBackButton);
+  MY_GET_WIDGET(guiMonitorPGClusterViewAllButton);
+  MY_GET_WIDGET(guiMonitorPGClusterStatsButton);
+  MY_GET_WIDGET(guiMonitorMonitorClusterStatsLabel);
+  MY_GET_WIDGET(guiMonitorMonitorClusterTreeView);
+  MY_GET_WIDGET(guiMonitorMonitorClusterStatsButton);
+  MY_GET_WIDGET(guiMonitorOSDClusterStatsLabel);
+  MY_GET_WIDGET(guiMonitorOSDClusterIconView);
+  MY_GET_WIDGET(guiMonitorOSDClusterBackButton);
+  MY_GET_WIDGET(guiMonitorOSDClusterViewAllButton);
+  MY_GET_WIDGET(guiMonitorOSDClusterStatsButton);
+  MY_GET_WIDGET(guiMonitorMDSClusterStatsLabel);
+  MY_GET_WIDGET(guiMonitorMDSClusterIconView);
+  MY_GET_WIDGET(guiMonitorMDSClusterBackButton);
+  MY_GET_WIDGET(guiMonitorMDSClusterViewAllButton);
+  MY_GET_WIDGET(guiMonitorMDSClusterStatsButton);
+  MY_GET_WIDGET(guiMonitorLogTextView);
+  MY_GET_WIDGET(guiMonitorStatusbar);
+  MY_GET_WIDGET(guiMonitorAboutDialog);
+  MY_GET_WIDGET(viewNodeDialog);
+  MY_GET_WIDGET(viewNodeNameEntry);
+  MY_GET_WIDGET(viewNodeTypeComboBox);
+  MY_GET_WIDGET(viewNodeNameLabel);
+  MY_GET_WIDGET(sendCommandDialog);
+  MY_GET_WIDGET(sendCommandPromptEntry);
+}
+
+GuiMonitor::~GuiMonitor()
+{
+   delete guiMonitorWindow;
+   delete viewNodeDialog;
+   delete sendCommandDialog;
+   delete guiMonitorAboutDialog;
+}
+
+bool GuiMonitor::open_icon(Glib::RefPtr<Gdk::Pixbuf> &icon, std::string path)
+{
+   try {
+      icon = Gdk::Pixbuf::create_from_file(path);
+   }
+   catch (const Gdk::PixbufError& e) {
+      cerr << "Problem making graphic from " << path << "; error code: " <<
+       e.code() << std::endl;
+      return false;
+   }
+   catch (const Glib::FileError& e) {
+      cerr << "Problem open " << path << std::endl;
+      return false;
+   }
+
+   return true;
+}
+
+bool GuiMonitor::init()
+{
+  assert(!thread);
+
+  if (!guiMonitorWindow)
+    return false;
+  if (!open_icon(blacklistIcon, BLACKLIST_ICON_PATH))
+    return false;
+  if (!open_icon(clientIcon, CLIENT_ICON_PATH))
+    return false;
+  if (!open_icon(MDSIcon, MDS_ICON_PATH))
+    return false;
+  //if (!open_icon(failedMDSIcon, FAILED_MDS_ICON_PATH))
+  //  return false;
+  //if (!open_icon(stoppedMDSIcon, STOPPED_MDS_ICON_PATH))
+  //  return false;
+  if (!open_icon(monitorIcon, MONITOR_ICON_PATH))
+    return false;
+  if (!open_icon(upOSDIcon, UP_OSD_ICON_PATH))
+    return false;
+  if (!open_icon(downOSDIcon, DOWN_OSD_ICON_PATH))
+    return false;
+  if (!open_icon(outOSDIcon, OUT_OSD_ICON_PATH))
+    return false;
+  if (!open_icon(PGIcon, PG_ICON_PATH))
+    return false;
+
+  // connect callbacks to their corresponding signals.
+  connect_signals();
+
+  // Link elements (e.g., text buffers, list stores, etc.) to their
+  // containers (e.g., text views, list views, etc.)
+  link_elements();
+
+  thread = new GuiMonitorThread(this);
+  thread->create();
+  return true;
+}
+
+void GuiMonitor::run_main_loop(Gtk::Main &kit)
+{
+  kit.run(*guiMonitorWindow);
+}
+
+// Connects signals to the GUI elements such that they respond to events.
+void GuiMonitor::connect_signals()
+{
+   //Gtk::Main::signal_run().connect(sigc::mem_fun(this,
+   //   &GuiMonitor::init_check_status));
+
+   Gtk::Main::signal_quit().connect(sigc::mem_fun(this,
+    &GuiMonitor::quit_signal_handler));
+
+   // guiMonitorWindow
+   guiMonitorWindow->signal_delete_event().connect(
+    sigc::mem_fun(this, &GuiMonitor::quit_gui));
+
+   // guiMonitorQuitImageMenuItem
+   guiMonitorQuitImageMenuItem->signal_activate().connect(
+    sigc::mem_fun(this, &GuiMonitor::gui_monitor_quit));
+
+   // guiMonitorCopyImageMenuItem
+   guiMonitorCopyImageMenuItem->signal_activate().connect(
+    sigc::mem_fun(this, &GuiMonitor::copy_log));
+
+   // grey out the copy menu item until the log text box gets data in it.
+   guiMonitorCopyImageMenuItem->set_sensitive(false);
+
+   // guiMonitorSendCommandMenuItem
+   guiMonitorSendCommandMenuItem->signal_activate().connect(
+    sigc::mem_fun(this, &GuiMonitor::open_send_command));
+
+   // guiMonitorViewNodeMenuItem
+   guiMonitorViewNodeMenuItem->signal_activate().connect(
+    sigc::mem_fun(this, &GuiMonitor::open_view_mode));
+
+   // guiMonitorAboutImageMenuItem
+   guiMonitorAboutImageMenuItem->signal_activate().connect(
+    sigc::mem_fun(this, &GuiMonitor::open_about_dialog));
+
+   // sendCommandDialog
+   sendCommandDialog->signal_response().connect(sigc::mem_fun(this,
+    &GuiMonitor::handle_send_command_response));
+
+   // viewNodeDialog
+  viewNodeDialog->signal_response().connect(sigc::mem_fun(this,
+      &GuiMonitor::handle_view_node_response));
+   viewNodeTypeComboBox->signal_changed().connect(sigc::mem_fun(this,
+      &GuiMonitor::handle_view_node_change));
+
+   /*
+    * OSD Cluster
+    */
+   // guiMonitorOSDClusterIconView
+  guiMonitorOSDClusterIconView->signal_item_activated().connect(
+      sigc::mem_fun(this, &GuiMonitor::osdc_cluster_zoom_in));
+
+  // guiMonitorOSDClusterBackButton
+  guiMonitorOSDClusterBackButton->signal_activate().connect(sigc::mem_fun(this,
+      &GuiMonitor::osdc_cluster_back));
+  guiMonitorOSDClusterBackButton->signal_clicked().connect(sigc::mem_fun(this,
+      &GuiMonitor::osdc_cluster_back));
+
+   // guiMonitorOSDClusterViewAllButton
+  guiMonitorOSDClusterViewAllButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::osdc_cluster_view_all));
+  guiMonitorOSDClusterViewAllButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::osdc_cluster_view_all));
+
+   // Grey out the "Back" and "View All" icons of the OSD cluster until the
+   // OSDCluterZoom > 0.
+  guiMonitorOSDClusterBackButton->set_sensitive(false);
+  guiMonitorOSDClusterViewAllButton->set_sensitive(false);
+
+  // guiMonitorOSDClusterStatsButton
+  guiMonitorOSDClusterStatsButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::osdc_cluster_stats));
+  guiMonitorOSDClusterStatsButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::osdc_cluster_stats));
+
+  /*
+  * MDS Cluster
+  */
+  // guiMonitorMDSClusterIconView
+  guiMonitorMDSClusterIconView->signal_item_activated().connect(
+      sigc::mem_fun(this, &GuiMonitor::mds_cluster_zoom_in));
+
+  // guiMonitorMDSClusterBackButton
+  guiMonitorMDSClusterBackButton->signal_activate().connect(sigc::mem_fun(this,
+      &GuiMonitor::mds_cluster_back));
+  guiMonitorMDSClusterBackButton->signal_clicked().connect(sigc::mem_fun(this,
+      &GuiMonitor::mds_cluster_back));
+
+  // guiMonitorMDSClusterViewAllButton
+  guiMonitorMDSClusterViewAllButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::mds_cluster_view_all));
+  guiMonitorMDSClusterViewAllButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::mds_cluster_view_all));
+
+  // Grey out the "Back" and "View All" icons of the MDS cluster until the
+  // MDSCluterZoom > 0.
+  guiMonitorMDSClusterBackButton->set_sensitive(false);
+  guiMonitorMDSClusterViewAllButton->set_sensitive(false);
+
+  // guiMonitorMDSClusterStatsButton
+  guiMonitorMDSClusterStatsButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::mds_cluster_stats));
+  guiMonitorMDSClusterStatsButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::mds_cluster_stats));
+
+  /*
+  * PG Cluster
+  */
+  // guiMonitorPGClusterIconView
+  guiMonitorPGClusterIconView->signal_item_activated().connect(
+      sigc::mem_fun(this, &GuiMonitor::pg_cluster_zoom_in));
+
+  // guiMonitorPGClusterBackButton
+  guiMonitorPGClusterBackButton->signal_activate().connect(sigc::mem_fun(this,
+      &GuiMonitor::pg_cluster_back));
+  guiMonitorPGClusterBackButton->signal_clicked().connect(sigc::mem_fun(this,
+      &GuiMonitor::pg_cluster_back));
+
+  // guiMonitorPGClusterViewAllButton
+  guiMonitorPGClusterViewAllButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::pg_cluster_view_all));
+  guiMonitorPGClusterViewAllButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::pg_cluster_view_all));
+
+  // Grey out the "Back" and "View All" icons of the PG cluster until the
+  // PGCluterZoom > 0.
+  guiMonitorPGClusterBackButton->set_sensitive(false);
+  guiMonitorPGClusterViewAllButton->set_sensitive(false);
+
+  // guiMonitorPGClusterStatsButton
+  guiMonitorPGClusterStatsButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::pg_cluster_stats));
+  guiMonitorPGClusterStatsButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::pg_cluster_stats));
+
+  /*
+  * Monitor Cluster
+  */
+  // guiMonitorMonitorClusterStatsButton
+  guiMonitorMonitorClusterStatsButton->signal_activate().connect(
+      sigc::mem_fun(this, &GuiMonitor::monitor_cluster_stats));
+  guiMonitorMonitorClusterStatsButton->signal_clicked().connect(
+      sigc::mem_fun(this, &GuiMonitor::monitor_cluster_stats));
+}
+
+// Connects elements to their GUI containers.
+void GuiMonitor::link_elements()
+{
+   // get the buffer from the log's TextView
+   guiMonitorLogTextBuffer = guiMonitorLogTextView->get_buffer();
+
+   // create tree models
+   guiMonitorMonitorClusterEntries = Gtk::ListStore::create(monitorColumns);
+   guiMonitorOSDClusterIcons = Gtk::ListStore::create(icon_columns);
+   guiMonitorMDSClusterIcons = Gtk::ListStore::create(icon_columns);
+   guiMonitorPGClusterIcons = Gtk::ListStore::create(icon_columns);
+
+   // connect the list stores to the tree views and icon views
+   guiMonitorMonitorClusterTreeView->set_model(
+    guiMonitorMonitorClusterEntries);
+   guiMonitorMonitorClusterTreeView->append_column("Monitor #",
+    monitorColumns.key);
+   guiMonitorMonitorClusterTreeView->append_column("Address",
+    monitorColumns.value);
+
+   guiMonitorOSDClusterIconView->set_model(guiMonitorOSDClusterIcons);
+   guiMonitorOSDClusterIconView->set_text_column(icon_columns.caption);
+   guiMonitorOSDClusterIconView->set_pixbuf_column(icon_columns.icon);
+
+   guiMonitorMDSClusterIconView->set_model(guiMonitorMDSClusterIcons);
+   guiMonitorMDSClusterIconView->set_text_column(icon_columns.caption);
+   guiMonitorMDSClusterIconView->set_pixbuf_column(icon_columns.icon);
+
+   guiMonitorPGClusterIconView->set_model(guiMonitorPGClusterIcons);
+   guiMonitorPGClusterIconView->set_text_column(icon_columns.caption);
+   guiMonitorPGClusterIconView->set_pixbuf_column(icon_columns.icon);
+
+   viewNodeNodeTypeListStore = Gtk::ListStore::create(viewNodeColumns);
+   viewNodeTypeComboBox->set_model(viewNodeNodeTypeListStore);
+   Gtk::TreeModel::Row currentRow;
+
+   // Set contents of the list store for use in the the combo box in the "View
+   // Node..." dialog box
+   for (int i = 0; i < NUM_NODE_TYPES; i++) {
+      enum NodeType type = (NodeType)i;
+
+      if (type == MON_NODE)
+         continue;
+
+      currentRow = *(viewNodeNodeTypeListStore->append());
+
+      currentRow[viewNodeColumns.type] = type;
+
+      currentRow[viewNodeColumns.name] = (type == OSD_NODE) ?
+                                  "Object Storage Device" :
+                                  (type == PG_NODE) ? "Placement Group" :
+                                  (type == MDS_NODE) ? "Metadata Server" :
+                                  "Monitor";
+   }
+}
+
+/*
+ * For the OSD, MDS, and PG clusters, the program should limit the amount
+ * of cluster icons displayed in their respective cluster view areas in
+ * order to ensure that users are not overwhelmed by the amount of
+ * clusters in large Ceph installations.  Activating an icon corresponding
+ * to a node will open a window that displays information about the node.
+ * The number of icons shown in each view should not take up more than the
+ * display area of each view.  If the amount of icons cannot be displayed
+ * in the view without a heavy amount of scrolling, then some or all icons
+ * will correspond to a *range* of nodes (for example, nodes 0 to 9 may be
+ * represented by one icon in the view).  Activating an icon corresponding
+ * to a range of nodes will update the view to include only information
+ * about the nodes in that range; this can be conceputalized as "zooming
+ * into" a group of nodes.  Range information corresponding to previous
+ * clusters will be preserved, but not updated.  The stats label
+ * correspnding to the cluster will state if any updates are available.
+ * If the user clicks "View All," then this has the effect of updating the
+ * entire cluster view again.
+ *
+ * For the monitor cluster, a simple list containing information about
+ * each monitor cluster is shown.  Activating an entry will open a window
+ * that displays more information about the monitor cluster.  Unlike the
+ * other clusters, no "zoom in" or "zoom out" functionality is
+ * implemented.
+ */
+void GuiMonitor::update_osd_cluster_view()
+{
+  int num_osds = g.osdmap.get_max_osd();
+
+  // Do not update the OSD cluster view if the zoom level is not zero.
+  if (!osd_cluster_zoom)
+     view_osd_nodes(0, num_osds);
+
+  ostringstream oss;
+  oss << num_osds << " OSD" << ((num_osds == 1) ? "" : "s")
+      << " Total: " << g.osdmap.get_num_up_osds() << " Up, "
+      << g.osdmap.get_num_in_osds() << " In";
+  guiMonitorOSDClusterStatsLabel->set_label(oss.str());
+}
+
+void GuiMonitor::update_mds_cluster_view()
+{
+  // Do not update the MDS cluster view if the zoom level is not zero.
+  if (!mds_cluster_zoom)
+     view_mds_nodes();
+
+  ostringstream oss;
+  oss << g.mdsmap.get_num_mds() << " In, "
+      << g.mdsmap.get_num_failed() << " Failed, "
+      << g.mdsmap.get_num_mds(MDSMap::STATE_STOPPED) << " Stopped, "
+      << g.mdsmap.get_max_mds() << " Max";
+  guiMonitorMDSClusterStatsLabel->set_label(oss.str());
+}
+
+void GuiMonitor::update_pg_cluster_view()
+{
+  // Do not update the PG cluster view if the zoom level is not zero.
+  if (!pg_cluster_zoom)
+     view_pg_nodes(0, 0, true);
+
+  ostringstream oss;
+  oss << g.pgmap.pg_stat.size() << " Placement Groups\n"
+      << kb_t(g.pgmap.pg_sum.num_kb) << " Data, "
+      << kb_t(g.pgmap.osd_sum.kb_used) << " Used, "
+      << kb_t(g.pgmap.osd_sum.kb_avail) << " / "
+      << kb_t(g.pgmap.osd_sum.kb) << " Available";
+  guiMonitorPGClusterStatsLabel->set_label(oss.str());
+}
+
+void GuiMonitor::update_mon_cluster_view()
+{
+  stringstream input;
+  Gtk::TreeModel::Row current_row;
+  entity_inst_t currentMonitor;
+  string currentAddress;
+  unsigned int monitors = g.mc.monmap.size();
+
+  // Clear current contents of the monitor cluster area of the GUI.
+  guiMonitorMonitorClusterEntries->clear();
+
+  string label = str(boost::format("%lu Monitors") % monitors);
+
+  guiMonitorMonitorClusterStatsLabel->set_label(label);
+
+  // For each monitor in the monitor map, output its ID and its address.
+  for (unsigned int i = 0; i < monitors; i++) {
+     currentMonitor = g.mc.monmap.get_inst(i);
+
+     input << currentMonitor.addr;
+     currentAddress = input.str();
+     input.str("");
+     input.flush();
+     currentAddress = addr_to_str(currentMonitor.addr);
+
+     current_row = *(guiMonitorMonitorClusterEntries->append());
+
+     current_row[monitorColumns.key] = str(boost::format("%d") % i);
+     current_row[monitorColumns.value] = currentAddress;
+  }
+}
+
+std::string GuiMonitor::gen_osd_icon_caption(unsigned int begin, unsigned int end)
+{
+   boost::format rangeFormatter("OSDs %lu-%lu");
+   boost::format singleFormatter("OSD %lu");
+
+   return (end - begin) ?  str(rangeFormatter % begin % end) :
+    str(singleFormatter % begin);
+}
+
+void GuiMonitor::view_osd_nodes(unsigned int begin, unsigned int end, bool
+ viewAll)
+{
+   unsigned int size = end - begin;
+   unsigned int *ranges = new unsigned int[MAX_VIEW_ICONS];
+   //unsigned int maxViewIcons = getMaxViewIcons();
+
+   gen_ranges(size, MAX_VIEW_ICONS, ranges);
+
+   // remove old icons
+   if (viewAll) {
+      while (!old_osd_cluster_zoom_states.empty())
+         old_osd_cluster_zoom_states.pop();
+
+      osd_cluster_zoom = 0;
+   }
+
+   guiMonitorOSDClusterIcons->clear();
+
+   unsigned int i = 0, j, range_offset = begin, begin_range, end_range;
+   int icon_status = CEPH_OSD_UP;
+   Gtk::TreeModel::Row row;
+
+   string caption;
+
+   // create and display icons
+   for (i = 0; i < MAX_VIEW_ICONS; i++) {
+      if (ranges[i]) {
+         icon_status = CEPH_OSD_UP;
+         row = *(guiMonitorOSDClusterIcons->append());
+
+         begin_range = range_offset;
+         end_range = ranges[i] - 1 + range_offset;
+
+         caption = gen_osd_icon_caption(begin_range, end_range);
+
+         for (j = begin_range; j <= end_range; j++) {
+            if (g.osdmap.is_out(j)) {
+               icon_status = CEPH_OSD_OUT;
+               break;
+            }
+            else if (g.osdmap.is_down(j))
+               icon_status = ~CEPH_OSD_UP;
+            else
+               ;
+         }
+
+         row[icon_columns.status] = icon_status;
+
+         switch (icon_status) {
+         case CEPH_OSD_OUT:
+            row[icon_columns.icon] = outOSDIcon;
+            break;
+         case ~CEPH_OSD_UP:
+            row[icon_columns.icon] = downOSDIcon;
+            break;
+         default:
+            row[icon_columns.icon] = upOSDIcon;
+            break;
+         }
+
+         row[icon_columns.caption] = caption;
+         row[icon_columns.begin_range] = begin_range;
+         row[icon_columns.end_range] = end_range;
+
+         range_offset += ranges[i];
+      }
+   }
+
+   if (viewAll) {
+      guiMonitorOSDClusterBackButton->set_sensitive(false);
+      guiMonitorOSDClusterViewAllButton->set_sensitive(false);
+   }
+
+   delete[] ranges;
+}
+
+std::string GuiMonitor::
+gen_mds_icon_caption(unsigned int begin, unsigned int end)
+{
+   if (end == begin) {
+     ostringstream oss;
+     oss << "MDS " << current_up_mds.at(begin);
+     return oss.str();
+   }
+
+   ostringstream oss;
+   oss << "MDSes " << current_up_mds.at(begin)
+       << "-" << current_up_mds.at(end);
+   return oss.str();
+}
+
+void GuiMonitor::view_mds_nodes(unsigned int begin, unsigned int end, bool
+ viewAll)
+{
+   unsigned int size;
+   unsigned int *ranges = new unsigned int[MAX_VIEW_ICONS];
+
+   // If viewAll is set, then the names set will be filled with all of the names
+   // of the MDSes that are up.
+   if (viewAll) {
+      // Gather all of the names of the up MDSes
+      set<int> up_mds;
+      g.mdsmap.get_up_mds_set(up_mds);
+      current_up_mds.clear();
+      for (set<int>::const_iterator mds_id = up_mds.begin();
+          mds_id != up_mds.end();
+          ++mds_id)
+      {
+         const MDSMap::mds_info_t& info = g.mdsmap.get_mds_info(*mds_id);
+
+         current_up_mds.push_back(info.name);
+      }
+      size = current_up_mds.size();
+   }
+   else
+      size = end - begin;
+
+   // Remove old icons
+   if (viewAll) {
+      while (!old_mds_cluster_zoom_states.empty())
+         old_mds_cluster_zoom_states.pop();
+
+      mds_cluster_zoom = 0;
+   }
+
+   guiMonitorMDSClusterIcons->clear();
+
+   gen_ranges(size, MAX_VIEW_ICONS, ranges);
+
+   // Create and display icons
+   Gtk::TreeModel::Row row;
+   string caption;
+
+   int i = 0;
+
+   for (unsigned int mdsIndex = viewAll ?  0 : begin;
+       i < MAX_VIEW_ICONS;
+       i++, mdsIndex += ranges[i])
+   {
+      if (ranges[i]) {
+         row = *(guiMonitorMDSClusterIcons->append());
+
+         row[icon_columns.icon] = MDSIcon;
+         row[icon_columns.caption] =
+            gen_mds_icon_caption(mdsIndex, mdsIndex + ranges[i] - 1);
+         row[icon_columns.begin_range] = mdsIndex;
+         row[icon_columns.end_range] = mdsIndex + ranges[i] - 1;
+      }
+   }
+
+   if (viewAll) {
+      guiMonitorMDSClusterBackButton->set_sensitive(false);
+      guiMonitorMDSClusterViewAllButton->set_sensitive(false);
+   }
+
+   delete[] ranges;
+}
+
+std::string GuiMonitor::gen_pg_icon_caption(unsigned int begin, unsigned int end)
+{
+   boost::format rangeFormatter("PGs %lu-%lu");
+   boost::format singleFormatter("PG %lu");
+
+   return (end - begin) ?  str(rangeFormatter % begin % end) :
+    str(singleFormatter % begin);
+}
+
+void GuiMonitor::
+view_pg_nodes(unsigned int begin, unsigned int end, bool view_all)
+{
+   unsigned int size;
+   unsigned int *ranges = new unsigned int[MAX_VIEW_ICONS];
+
+   // remove old icons
+   if (view_all) {
+      while (!old_pg_cluster_zoom_states.empty())
+         old_pg_cluster_zoom_states.pop();
+
+      size = g.pgmap.pg_stat.size();
+      pg_cluster_zoom = 0;
+
+      current_pgs.clear();
+      std::copy(g.pgmap.pg_set.begin(), g.pgmap.pg_set.end(),
+                 std::inserter(current_pgs, current_pgs.begin() ) );
+   }
+   else
+      size = end - begin;
+
+   guiMonitorPGClusterIcons->clear();
+
+   unsigned int i = 0, range_offset = begin, begin_range, end_range;
+   Gtk::TreeModel::Row currentRow;
+
+   string caption;
+
+   gen_ranges(size, MAX_VIEW_ICONS, ranges);
+
+   // create and display icons
+   for (i = 0; i < MAX_VIEW_ICONS; i++) {
+      if (ranges[i]) {
+         currentRow = *(guiMonitorPGClusterIcons->append());
+
+         begin_range = range_offset;
+         end_range = ranges[i] - 1 + range_offset;
+
+         caption = gen_pg_icon_caption(begin_range, end_range);
+
+         currentRow[icon_columns.icon] = PGIcon;
+         currentRow[icon_columns.caption] = caption;
+         currentRow[icon_columns.begin_range] = begin_range;
+         currentRow[icon_columns.end_range] = end_range;
+
+         range_offset += ranges[i];
+      }
+   }
+
+   if (view_all) {
+      guiMonitorPGClusterBackButton->set_sensitive(false);
+      guiMonitorPGClusterViewAllButton->set_sensitive(false);
+   }
+
+   delete[] ranges;
+}
+
+void GuiMonitor::check_status()
+{
+  // Check isCephUpdated to see if the placement groups, OSDs, metadata
+  // servers, and the monitors have been updated.  If any of these have been
+  // updated, then update the GUI accordingly.
+
+  assert(g.lock.is_locked());
+  if (g.updates & OSD_MON_UPDATE)
+    update_osd_cluster_view();
+  if (g.updates & MDS_MON_UPDATE)
+    update_mds_cluster_view();
+  if (g.updates & PG_MON_UPDATE)
+    update_pg_cluster_view();
+  if (g.updates & MON_MON_UPDATE)
+    update_mon_cluster_view();
+  g.updates = 0;
+
+  // See if the log has been updated. If it has, then
+  // update the log text box in the GUI and then clear the log stream.
+  string log(g.slog->str());
+  if (!log.empty()) {
+    if (!guiMonitorCopyImageMenuItem->is_sensitive())
+      guiMonitorCopyImageMenuItem->set_sensitive(true);
+    Gtk::TextIter end = guiMonitorLogTextBuffer->insert(
+                         guiMonitorLogTextBuffer->end(), log);
+    end.backward_line();
+    guiMonitorLogTextView->scroll_to(
+                   guiMonitorLogTextBuffer->create_mark(end));
+    g.slog->str("");
+    g.slog->flush();
+  }
+}
+
+// Handler for quitting the GUI via the "x" button on the window.
+bool GuiMonitor::quit_gui(GdkEventAny *event)
+{
+  if (thread)
+    thread->shutdown();
+  guiMonitorWindow->hide();
+  return true;
+}
+
+// Handler for quitting the GUI via the menu option.
+void GuiMonitor::gui_monitor_quit()
+{
+  if (thread)
+    thread->shutdown();
+  guiMonitorWindow->hide();
+}
+
+// Called when the main window is closed.  Ends the program.
+bool GuiMonitor::quit_signal_handler()
+{
+  Gtk::Main::quit();
+  return false; // never executed
+}
+
+// Called when the "Copy" menu option in the Edit menu bar is clicked.  Copies
+// the contents of the log to the clipboard.
+void GuiMonitor::copy_log()
+{
+   Glib::RefPtr<Gtk::Clipboard> clipboard =
+    Gtk::Clipboard::get(GDK_SELECTION_CLIPBOARD);
+
+   clipboard->set_text(guiMonitorLogTextBuffer->get_text());
+   clipboard->store();
+}
+
+// Called when the "Send Command..." menu option in the Ceph menu is clicked.
+// Displays the "Send Command..." dialog box.
+void GuiMonitor::open_send_command()
+{
+   sendCommandPromptEntry->set_text("");
+   int result = sendCommandDialog->run();
+
+   if (result == Gtk::RESPONSE_OK) {
+      if (send_command_success) {
+         send_command_success = false;
+         sendCommandDialog->hide();
+      }
+      else
+         open_send_command(); // needs to continue running
+   }
+   else
+      sendCommandDialog->hide();
+}
+
+// Called when a button is pressed in the "Send Command..." dialog box.
+void GuiMonitor::handle_send_command_response(int response)
+{
+  send_command_success = false;
+  if (response != Gtk::RESPONSE_OK) {
+    // todo: show error?
+    return;
+  }
+  string command_str(sendCommandPromptEntry->get_text());
+  boost::trim(command_str);
+
+  if (command_str.empty()) {
+     dialog_error("Please enter a Ceph command.", Gtk::MESSAGE_INFO);
+     return;
+  }
+
+  run_command(command_str.c_str());
+
+  send_command_success = true;
+}
+
+// Called when the "View Node..." menu option in the Ceph menu is clicked.
+// Displays the "View Node..." dialog box.
+void GuiMonitor::open_view_mode()
+{
+   viewNodeTypeComboBox->set_active(-1);
+   viewNodeNameEntry->set_text("");
+   viewNodeNameLabel->set_label("Node ID:");
+
+   int result = viewNodeDialog->run();
+
+   if (result == Gtk::RESPONSE_OK) {
+      if (view_node_success) {
+         view_node_success = false;
+         viewNodeDialog->hide();
+      }
+      else
+         open_view_mode(); // needs to continue running
+   }
+   else
+      viewNodeDialog->hide();
+}
+
+std::vector<NodeInfo *> GuiMonitor::gen_node_info_from_icons
+      (Glib::RefPtr<Gtk::ListStore> iconStore, enum NodeType type)
+{
+   vector<NodeInfo *> clusterInfo;
+   Gtk::TreeModel::Children icons = iconStore->children();
+   Gtk::TreeModel::iterator iter;
+   Gtk::TreeModel::Row currentRow;
+   NodeInfo *currentNodeInfo;
+   int status;
+
+   for (iter = icons.begin(); iter != icons.end(); iter++) {
+      currentRow = *iter;
+
+      currentNodeInfo = new NodeInfo(currentRow[icon_columns.begin_range],
+       currentRow[icon_columns.end_range], type, status);
+
+      clusterInfo.push_back(currentNodeInfo);
+   }
+
+   return clusterInfo;
+}
+
+void GuiMonitor::gen_icons_from_node_info(vector<NodeInfo *>& nodeInfo)
+{
+   Glib::RefPtr<Gtk::ListStore> icons;
+   Gtk::TreeModel::Row row;
+   NodeInfo *node;
+
+   switch (nodeInfo[0]->type) {
+   case OSD_NODE:
+      icons = guiMonitorOSDClusterIcons;
+      break;
+   case MDS_NODE:
+      icons = guiMonitorMDSClusterIcons;
+      break;
+   case PG_NODE:
+      icons = guiMonitorPGClusterIcons;
+      break;
+   default:
+      break;
+   }
+
+   icons->clear();
+
+   for (unsigned int i = 0; i < nodeInfo.size(); i++) {
+      node = nodeInfo[i];
+      row = *(icons->append());
+
+      row[icon_columns.begin_range] = node->begin_range;
+      row[icon_columns.end_range] = node->end_range;
+
+      switch (node->type) {
+      case OSD_NODE:
+         row[icon_columns.caption] =
+          gen_osd_icon_caption(node->begin_range, node->end_range);
+
+         switch (node->status) {
+         case CEPH_OSD_OUT:
+            row[icon_columns.icon] = outOSDIcon;
+            break;
+         case CEPH_OSD_UP:
+            row[icon_columns.icon] = upOSDIcon;
+            break;
+         default: // ~CEPH_OSD_UP
+            row[icon_columns.icon] = downOSDIcon;
+            break;
+         }
+
+         break;
+      case MDS_NODE:
+       row[icon_columns.caption] =
+           gen_mds_icon_caption(node->begin_range, node->end_range);
+        row[icon_columns.icon] = MDSIcon;
+
+        break;
+      case PG_NODE:
+        row[icon_columns.caption] =
+           gen_pg_icon_caption(node->begin_range, node->end_range);
+        row[icon_columns.icon] = PGIcon;
+
+        break;
+      default:
+        break;
+      }
+
+      delete node;
+   }
+
+   nodeInfo.clear();
+}
+
+// Constructs a StatsWindowInfo object and opens a window containing the stats
+// of a node or cluster.
+void GuiMonitor::open_stats(enum NodeType type, bool is_cluster, int id)
+{
+  Glib::RefPtr<Gtk::Builder> builder_file =
+    Gtk::Builder::create_from_file(STATS_WINDOW_BUILDER_FILE);
+
+  /* note that node_stats will be deleted once the stats window closes */
+  StatsWindowInfo *node_stats =
+      new StatsWindowInfo(this, builder_file, is_cluster, type, id);
+  node_stats->init();
+  node_stats->stats_window->show_all();
+}
+
+// Called when an icon in the OSD icon view is activated.
+void GuiMonitor::osdc_cluster_zoom_in(const Gtk::TreeModel::Path& path)
+{
+   Gtk::TreeModel::iterator iter = guiMonitorOSDClusterIcons->get_iter(path);
+
+   if (!iter)
+     return;
+
+  Gtk::TreeModel::Row row = *iter;
+
+  int begin_range = row[icon_columns.begin_range];
+  int end_range = row[icon_columns.end_range];
+
+  if (end_range == begin_range) {
+    if (begin_range >= g.osdmap.get_max_osd()) {
+      dialog_error("OSD map has changed and the node no longer exists.",
+                   Gtk::MESSAGE_ERROR);
+
+      view_osd_nodes(0, g.osdmap.get_max_osd());
+    }
+    else {
+      open_stats(OSD_NODE, false, begin_range);
+    }
+  }
+  else {
+    open_stats(OSD_NODE, false, begin_range);
+    // Zoom in, since this is a range.  Place the old icons on the stack
+    // and then call view_osd_icons() on the narrower range.
+    vector<NodeInfo *> oldOSDInfo =
+    gen_node_info_from_icons(guiMonitorOSDClusterIcons, OSD_NODE);
+
+    //Glib::RefPtr<Gtk::ListStore> oldOSDIcons(guiMonitorOSDClusterIcons);
+
+    old_osd_cluster_zoom_states.push(oldOSDInfo);
+    osd_cluster_zoom++;
+
+    guiMonitorOSDClusterBackButton->set_sensitive(true);
+    guiMonitorOSDClusterViewAllButton->set_sensitive(true);
+
+    view_osd_nodes(begin_range, end_range + 1, false);
+  }
+}
+
+// Called when the "Back" button is activated in the OSD cluster view area.
+// Displays the previous level of OSDs.  Note that no updates occur to these
+// nodes, however.
+void GuiMonitor::osdc_cluster_back()
+{
+   if (osd_cluster_zoom) {
+      vector<NodeInfo *> oldOSDInfo = old_osd_cluster_zoom_states.top();
+      old_osd_cluster_zoom_states.pop();
+
+      gen_icons_from_node_info(oldOSDInfo);
+      osd_cluster_zoom--;
+
+      if (!osd_cluster_zoom) {
+         guiMonitorOSDClusterBackButton->set_sensitive(false);
+         guiMonitorOSDClusterViewAllButton->set_sensitive(false);
+      }
+   }
+}
+
+// Called when the "View All" button is activated in the OSD cluster view area.
+// Displays all OSDs, with recent updates.
+void GuiMonitor::osdc_cluster_view_all()
+{
+   view_osd_nodes(0, g.osdmap.get_max_osd());
+}
+
+// Allows user to obtain the statistics of the OSD cluster.  Called by
+// guiMonitorOSDClusterStatsButton by signal_clicked.
+void GuiMonitor::osdc_cluster_stats()
+{
+   open_stats(OSD_NODE, true, 0);
+}
+
+// Called when an icon in the MDS icon view is activated.
+void GuiMonitor::mds_cluster_zoom_in(const Gtk::TreeModel::Path& path)
+{
+   Gtk::TreeModel::iterator iter =
+     guiMonitorMDSClusterIcons->get_iter(path);
+
+  if (!iter)
+    return;
+  Gtk::TreeModel::Row row = *iter;
+
+  unsigned int begin_range = row[icon_columns.begin_range];
+  unsigned int end_range = row[icon_columns.end_range];
+
+  if (end_range - begin_range) {
+    // Zoom in, since this is a range.  Place the old icons on the stack
+    // and then call viewMDSIcons() on the narrower range.
+    vector<NodeInfo *> old_mds_info =
+         gen_node_info_from_icons(guiMonitorMDSClusterIcons, MDS_NODE);
+
+    old_mds_cluster_zoom_states.push(old_mds_info);
+    mds_cluster_zoom++;
+
+    guiMonitorMDSClusterBackButton->set_sensitive(true);
+    guiMonitorMDSClusterViewAllButton->set_sensitive(true);
+
+    view_mds_nodes(begin_range, end_range + 1, false);
+  }
+  else {
+    set<int> up_mds;
+    g.mdsmap.get_up_mds_set(up_mds);
+
+    if (begin_range >= up_mds.size()) {
+      dialog_error("Metadata server map has changed and the node no "
+                   "longer exists.", Gtk::MESSAGE_ERROR);
+
+      view_mds_nodes(0, 0, true);
+    }
+    else {
+      open_stats(MDS_NODE, false, (int)begin_range);
+    }
+  }
+}
+
+// Called when the "Back" button is activated in the MDS cluster view area.
+// Displays the previous level of MDSes.  Note that no updates occur to these
+// nodes, however.
+void GuiMonitor::mds_cluster_back()
+{
+  if (!mds_cluster_zoom)
+    return;
+  vector<NodeInfo *> old_mds_info = old_mds_cluster_zoom_states.top();
+  old_mds_cluster_zoom_states.pop();
+
+  gen_icons_from_node_info(old_mds_info);
+  mds_cluster_zoom--;
+
+  if (!mds_cluster_zoom) {
+    guiMonitorMDSClusterBackButton->set_sensitive(false);
+    guiMonitorMDSClusterViewAllButton->set_sensitive(false);
+   }
+}
+
+// Called when the "View All" button is activated in the MDS cluster view area.
+// Displays all MDSes, with recent updates.
+void GuiMonitor::mds_cluster_view_all()
+{
+   view_mds_nodes();
+}
+
+// Allows user to obtain the statistics of the MDS cluster.  Called by
+// guiMonitorMDSClusterStatsButton by signal_clicked.
+void GuiMonitor::mds_cluster_stats()
+{
+   open_stats(MDS_NODE, true, 0);
+}
+
+// Called when an icon in the PG icon view is activated.
+void GuiMonitor::pg_cluster_zoom_in(const Gtk::TreeModel::Path& path)
+{
+  Gtk::TreeModel::iterator iter(guiMonitorPGClusterIcons->get_iter(path));
+
+  if (!iter)
+    return;
+  Gtk::TreeModel::Row row = *iter;
+
+  unsigned int begin_range = row[icon_columns.begin_range];
+  unsigned int end_range = row[icon_columns.end_range];
+
+  if (end_range - begin_range) {
+    // Zoom in, since this is a range.  Place the old icons on the stack
+    // and then call viewPGIcons() on the narrower range.
+    vector<NodeInfo *> oldPGInfo =
+     gen_node_info_from_icons(guiMonitorPGClusterIcons, PG_NODE);
+
+    old_pg_cluster_zoom_states.push(oldPGInfo);
+    pg_cluster_zoom++;
+
+    guiMonitorPGClusterBackButton->set_sensitive(true);
+    guiMonitorPGClusterViewAllButton->set_sensitive(true);
+
+    view_pg_nodes(begin_range, end_range + 1, false);
+  }
+  else {
+    if (begin_range >= g.pgmap.pg_stat.size()) {
+      dialog_error("Placement group map has changed and the node no "
+                   "longer exists.", Gtk::MESSAGE_ERROR);
+
+      view_pg_nodes(0, 0, true);
+    }
+    else
+      open_stats(PG_NODE, false, (int)begin_range);
+  }
+}
+
+// Called when the "Back" button is activated in the PG cluster view area.
+// Displays the previous level of PGs.  Note that no updates occur to these
+// nodes, however.
+void GuiMonitor::pg_cluster_back()
+{
+  if (!pg_cluster_zoom)
+    return;
+  vector<NodeInfo *> oldPGInfo = old_pg_cluster_zoom_states.top();
+  old_pg_cluster_zoom_states.pop();
+
+  gen_icons_from_node_info(oldPGInfo);
+  pg_cluster_zoom--;
+
+  if (!pg_cluster_zoom) {
+    guiMonitorPGClusterBackButton->set_sensitive(false);
+    guiMonitorPGClusterViewAllButton->set_sensitive(false);
+  }
+}
+
+// Called when the "View All" button is activated in the PG cluster view area.
+// Displays all PGs, with recent updates.
+void GuiMonitor::pg_cluster_view_all()
+{
+  view_pg_nodes(0, 0, true);
+}
+
+// Allows user to obtain the statistics of the PG cluster.  Called by
+// guiMonitorPCClusterStatsButton by signal_clicked.
+void GuiMonitor::pg_cluster_stats()
+{
+  open_stats(PG_NODE, true, 0);
+}
+
+// Allows user to obtain the statistics of the monitor cluster.  Called by
+// guiMonitorMonitorClusterStatsButton by signal_clicked.
+void GuiMonitor::monitor_cluster_stats()
+{
+  open_stats(MON_NODE, true, 0);
+}
+
+void GuiMonitor::dialog_error(const std::string &msg, Gtk::MessageType type)
+{
+  Gtk::MessageDialog errorMsg(msg, false, type, Gtk::BUTTONS_OK, true);
+
+  errorMsg.run();
+  errorMsg.hide();
+}
+
+// Finds a metadata server in the metadata server map that is up based on its
+// name.  Returns the ID of the metadata server or returns -1 if not found.
+int GuiMonitor::find_mds_id(const std::string &name)
+{
+   set<int> upMDSes;
+   g.mdsmap.get_up_mds_set(upMDSes);
+
+   for (set<int>::const_iterator MDSId = upMDSes.begin();
+       MDSId != upMDSes.end(); MDSId++)
+   {
+      const MDSMap::mds_info_t& current_mds_info =
+         g.mdsmap.get_mds_info(*MDSId);
+      if (current_mds_info.name == name)
+       return *MDSId;
+   }
+
+   return -1;
+}
+
+// Called when a button is pressed in the "View Node..." dialog box.
+void GuiMonitor::handle_view_node_response(int response)
+{
+  view_node_success = false;
+  if (response != Gtk::RESPONSE_OK) {
+    // todo: display error?
+    return;
+  }
+  Gtk::TreeModel::iterator selected_type_iter =
+      viewNodeTypeComboBox->get_active();
+
+  if (!selected_type_iter) {
+    dialog_error("Type of node needs to be selected.",
+      Gtk::MESSAGE_INFO);
+    return;
+  }
+  Gtk::TreeRow selected_row = *selected_type_iter;
+  enum NodeType selected_type = selected_row[viewNodeColumns.type];
+  string id_entry = viewNodeNameEntry->get_text();
+  boost::trim(id_entry);
+
+  if (id_entry.empty()) {
+    dialog_error("Please enter the node ID.", Gtk::MESSAGE_INFO);
+    return;
+  }
+
+  switch (selected_type) {
+    case OSD_NODE: {
+      long id;
+
+      try {
+       id = boost::lexical_cast<long>(id_entry);
+      }
+      catch (const boost::bad_lexical_cast &) {
+       dialog_error("Node ID must be a number.", Gtk::MESSAGE_ERROR);
+       return;
+      }
+      if (id < 0) {
+       dialog_error("ID must be a positive number.", Gtk::MESSAGE_ERROR);
+       return;
+      }
+      if (id >= g.osdmap.get_max_osd()) {
+       dialog_error("OSD does not exist.", Gtk::MESSAGE_ERROR);
+       return;
+      }
+      open_stats(selected_type, false, (int)id);
+      break;
+    }
+
+    case MDS_NODE: {
+      int id = find_mds_id(id_entry);
+      if (id == -1) {
+       string error("Can't find MDS ");
+       error += id_entry;
+       dialog_error(error, Gtk::MESSAGE_ERROR);
+       return;
+      }
+      open_stats(selected_type, false, id);
+      break;
+    }
+
+    case PG_NODE: {
+      unsigned int id;
+
+      try {
+       id = boost::lexical_cast<unsigned int>(id_entry);
+      }
+      catch (const boost::bad_lexical_cast &) {
+       dialog_error("Node ID must be a number.", Gtk::MESSAGE_ERROR);
+       return;
+      }
+
+      if (id >= g.pgmap.pg_stat.size()) {
+       dialog_error("PG does not exist.", Gtk::MESSAGE_ERROR);
+       return;
+      }
+      open_stats(selected_type, false, (int)id);
+      break;
+    }
+
+    default:
+      break;
+  }
+  view_node_success = true;
+}
+
+// Called when a node type is selected in the combo box in the "View Node..."
+// dialog box.  Activated by signal_changed().
+void GuiMonitor::handle_view_node_change()
+{
+   if (viewNodeTypeComboBox->get_active_row_number() == -1)
+      return;
+
+   Gtk::TreeModel::iterator selected_type_iter =
+       viewNodeTypeComboBox->get_active();
+
+   Gtk::TreeRow selected_row = *selected_type_iter;
+   enum NodeType selected_type = selected_row[viewNodeColumns.type];
+   std::string request_type =
+    (selected_type == OSD_NODE || selected_type == PG_NODE ||
+    selected_type == MON_NODE) ? "Node ID:" : "MDS Name:";
+
+   viewNodeNameLabel->set_label(request_type);
+}
+
+// Called when the "About" menu option in the Help menu is clicked.  Displays
+// the "About" dialog box.
+void GuiMonitor::open_about_dialog()
+{
+   guiMonitorAboutDialog->run();
+   guiMonitorAboutDialog->hide();
+}
+
+/*
+ * GuiMonitor Subclass Methods
+ */
+GuiMonitor::StatsWindowInfo::StatsWindowInfo(GuiMonitor *gui_,
+         Glib::RefPtr<Gtk::Builder> builder,
+         bool is_cluster_, enum NodeType type_, int id_)
+  : gui(gui_),
+    is_cluster(is_cluster_),
+    type(type_),
+    id(id_)
+{
+   builder->get_widget("statsWindow", stats_window);
+   builder->get_widget("statsInfoLabel", stats_info_label);
+   builder->get_widget("statsInfoTreeView", stats_info_tree_view);
+   builder->get_widget("statsCopyButton", stats_copy_button);
+   builder->get_widget("statsCloseButton", stats_close_button);
+
+   stats = Gtk::ListStore::create(columns);
+
+   stats_info_tree_view->set_model(stats);
+   stats_info_tree_view->append_column("Name", columns.key);
+   stats_info_tree_view->append_column("Value", columns.value);
+
+   stats_window->signal_delete_event().connect(sigc::mem_fun(this,
+    &GuiMonitor::StatsWindowInfo::closeWindow));
+
+   stats_close_button->signal_activate().connect(sigc::mem_fun(this,
+    &GuiMonitor::StatsWindowInfo::close));
+   stats_close_button->signal_clicked().connect(sigc::mem_fun(this,
+    &GuiMonitor::StatsWindowInfo::close));
+
+   stats_copy_button->signal_activate().connect(sigc::mem_fun(this,
+    &GuiMonitor::StatsWindowInfo::copy));
+   stats_copy_button->signal_clicked().connect(sigc::mem_fun(this,
+    &GuiMonitor::StatsWindowInfo::copy));
+}
+
+GuiMonitor::StatsWindowInfo::~StatsWindowInfo()
+{
+   delete stats_window;
+}
+
+void GuiMonitor::StatsWindowInfo::init()
+{
+   if (is_cluster) {
+      if (type == OSD_NODE)
+         gen_osd_cluster_columns();
+      else if (type == PG_NODE)
+         gen_pg_cluster_columns();
+      else if (type == MDS_NODE)
+         gen_mds_cluster_columns();
+      else
+         gen_monitor_cluster_columns();
+   }
+   else {
+      if (type == OSD_NODE)
+         gen_osd_node_columns();
+      else if (type == PG_NODE)
+         gen_pg_node_columns();
+      else // type == MDS_NODE
+         gen_mds_node_columns();
+   }
+}
+
+void GuiMonitor::StatsWindowInfo::gen_osd_cluster_columns()
+{
+   string label("OSD Cluster Statistics");
+
+   stats_window->set_title(label);
+   stats_info_label->set_label(label);
+
+   {
+     ostringstream oss;
+     oss << g.osdmap.get_epoch();
+     insert_stats("Epoch", oss.str());
+   }
+   {
+     ostringstream oss;
+     oss << g.osdmap.get_max_osd();
+     insert_stats("Maximum Amount of OSDs", oss.str());
+   }
+   {
+     ostringstream oss;
+     oss << g.osdmap.get_num_up_osds();
+     insert_stats("Amount of Up OSDs", oss.str());
+   }
+   {
+     ostringstream oss;
+     oss << g.osdmap.get_num_in_osds();
+     insert_stats("Amount of In OSDs", oss.str());
+   }
+}
+
+void GuiMonitor::StatsWindowInfo::gen_mds_cluster_columns()
+{
+   string label("MDS Cluster Statistics");
+
+   stats_window->set_title(label);
+   stats_info_label->set_label(label);
+
+   set<int> up_mds;
+   set<int> stopped_mds;
+
+   g.mdsmap.get_up_mds_set(up_mds);
+   g.mdsmap.get_stopped_mds_set(stopped_mds);
+
+   insert_stats("Epoch", str(boost::format("%llu") % g.mdsmap.get_epoch()));
+   insert_stats("Maximum Amount of MDSes", str(boost::format("%u") %
+    g.mdsmap.get_max_mds()));
+   insert_stats("Amount of Up MDSes", str(boost::format("%d") % up_mds.size()));
+   insert_stats("Amount of In MDSes", str(boost::format("%u") %
+    g.mdsmap.get_num_mds()));
+   insert_stats("Amount of Failed MDSes", str(boost::format("%d") %
+    g.mdsmap.get_num_failed()));
+   insert_stats("Amount of Stopped MDSes", str(boost::format("%d") %
+    stopped_mds.size()));
+}
+
+void GuiMonitor::StatsWindowInfo::gen_pg_cluster_columns()
+{
+   string label("PG Cluster Statistics");
+
+   stats_window->set_title(label);
+   stats_info_label->set_label(label);
+
+   {
+     ostringstream oss;
+     oss << g.pgmap.version;
+     insert_stats("Version", oss.str());
+   }
+
+   {
+     ostringstream oss;
+     oss << g.pgmap.pg_stat.size();
+     insert_stats("Amount of PGs", oss.str());
+   }
+
+   {
+     ostringstream oss;
+     oss << kb_t(g.pgmap.pg_sum.num_kb);
+     insert_stats("Data ", oss.str());
+   }
+
+   {
+     ostringstream oss;
+     oss << kb_t(g.pgmap.osd_sum.kb_used);
+     insert_stats("Amount of Storage Used", oss.str());
+   }
+
+   {
+     ostringstream oss;
+     oss << kb_t(g.pgmap.osd_sum.kb_avail);
+     insert_stats("Amount of Storage Available", oss.str());
+   }
+
+   {
+     ostringstream oss;
+     oss << kb_t(g.pgmap.osd_sum.kb);
+     insert_stats("Total Storage", oss.str());
+   }
+}
+
+void GuiMonitor::StatsWindowInfo::gen_monitor_cluster_columns()
+{
+  string label("Monitor Cluster Statistics");
+  stats_window->set_title(label);
+  stats_info_label->set_label(label);
+  {
+    ostringstream oss;
+    oss << g.mc.monmap.size();
+    insert_stats("Amount of Monitors", oss.str());
+  }
+  {
+    ostringstream oss;
+    oss << g.mc.monmap.epoch;
+    insert_stats("Epoch", oss.str());
+  }
+  {
+    ostringstream oss;
+    oss << g.mc.monmap.fsid;
+    insert_stats("File System ID", oss.str());
+  }
+  {
+    ostringstream oss;
+    oss << g.mc.monmap.last_changed;
+    insert_stats("Last Changed", oss.str());
+  }
+  {
+    ostringstream oss;
+    oss << g.mc.monmap.created;
+    insert_stats("Created", oss.str());
+  }
+}
+
+void GuiMonitor::StatsWindowInfo::gen_osd_node_columns()
+{
+   bool isIn = g.osdmap.is_in(id);
+   const entity_addr_t& addr = g.osdmap.get_addr(id);
+   const osd_info_t& osdInfo = g.osdmap.get_info(id);
+
+   string label(str(boost::format("OSD %lu Statistics:") % id));
+
+   stats_window->set_title(label);
+   stats_info_label->set_label(label);
+
+   insert_stats("OSD ID", str(boost::format("%lu") % id));
+   insert_stats("Address", isIn ? addr_to_str(addr) : "None");
+   insert_stats("Up?", g.osdmap.is_up(id) ? "Up" : "Down");
+   insert_stats("In?", isIn ? "In" : "Out");
+   insert_stats("Weight", isIn ? str(boost::format("%f") %
+      g.osdmap.get_weightf(id)) : "None");
+   insert_stats("Up From", str(boost::format("%lu") % osdInfo.up_from));
+   insert_stats("Up Through", str(boost::format("%lu") % osdInfo.up_thru));
+   insert_stats("Down At", str(boost::format("%lu") % osdInfo.down_at));
+   insert_stats("Last Clean", str(boost::format("First: %lu, Last: %lu") %
+    osdInfo.last_clean_first % osdInfo.last_clean_last));
+}
+
+void GuiMonitor::StatsWindowInfo::gen_mds_node_columns()
+{
+   const MDSMap::mds_info_t &mdsInfo = g.mdsmap.get_mds_info(id);
+
+   string label(str(boost::format("MDS %s Statistics:") % mdsInfo.name));
+
+   stats_window->set_title(label);
+   stats_info_label->set_label(label);
+
+   insert_stats("Name", mdsInfo.name);
+   insert_stats("Address", addr_to_str(mdsInfo.addr));
+   insert_stats("Rank", str(boost::format("%lu") % mdsInfo.rank));
+   insert_stats("Laggy?", mdsInfo.laggy() ? "Yes" : "No");
+   insert_stats("State", ceph_mds_state_name(mdsInfo.state));
+}
+
+void GuiMonitor::StatsWindowInfo::gen_pg_node_columns()
+{
+  pg_t pg(gui->current_pgs.at(id));
+
+  hash_map<pg_t,pg_stat_t>::const_iterator s = g.pgmap.pg_stat.find(pg);
+  assert(s != g.pgmap.pg_stat.end());
+
+  const pg_stat_t &stat(s->second);
+  std::stringstream converter;
+
+  string label(str(boost::format("PG %lu Statistics:") % id));
+
+  stats_window->set_title(label);
+  stats_info_label->set_label(label);
+
+  insert_stats("Number of Objects",
+     str(boost::format("%llu") % stat.num_objects));
+  insert_stats("Number of Objects Missing on Primary",
+     str(boost::format("%llu") % stat.num_objects_missing_on_primary));
+  insert_stats("Number of Objects Degraded",
+     str(boost::format("%llu") % stat.num_objects_degraded));
+  insert_stats("KB", str(boost::format("%llu") % stat.num_kb));
+  insert_stats("Bytes", str(boost::format("%llu") % stat.num_bytes));
+  insert_stats("Log Size", str(boost::format("%llu") % stat.log_size));
+  insert_stats("On-Disk Log Size", str(boost::format("%llu") %
+   stat.ondisk_log_size));
+  insert_stats("State", pg_state_string(stat.state));
+
+  ostringstream vss;
+  vss << stat.version;
+  insert_stats("Version", vss.str());
+
+  ostringstream rss;
+  rss << stat.reported;
+  insert_stats("Reported", rss.str());
+
+  converter << stat.up;
+
+  insert_stats("Up", converter.str());
+
+  converter.str("");
+  converter.flush();
+
+  converter << stat.acting;
+
+  insert_stats("Acting", converter.str());
+
+  converter.str("");
+  converter.flush();
+
+  converter << stat.last_scrub;
+
+  insert_stats("Last Scrub", converter.str());
+
+  converter.str("");
+  converter.flush();
+
+  converter << stat.last_scrub_stamp;
+
+  insert_stats("Last Scrub Timestamp", converter.str());
+
+  converter.str("");
+  converter.flush();
+}
+
+// Copies the information inside of the tree view object that contains the
+// information about a node or cluster.  Called by nodeStatsCopyButton by
+// signal_clicked.
+void GuiMonitor::StatsWindowInfo::copy()
+{
+  Glib::RefPtr<Gtk::Clipboard> clipboard =
+      Gtk::Clipboard::get(GDK_SELECTION_CLIPBOARD);
+
+  clipboard->set_text(stats_string());
+  clipboard->store();
+}
+
+// Converts the statistics into a string
+std::string GuiMonitor::StatsWindowInfo::stats_string()
+{
+  ostringstream oss;
+  Gtk::TreeModel::Children rows = stats->children();
+  string delim;
+
+  for (Gtk::TreeModel::iterator iter = rows.begin();
+      iter != rows.end(); iter++)
+  {
+    oss << delim;
+    Gtk::TreeModel::Row currentRow(*iter);
+    Glib::ustring key(currentRow[columns.key]);
+    Glib::ustring value(currentRow[columns.value]);
+    oss << key << '\t' << value;
+    delim = "\n";
+  }
+
+  return oss.str();
+}
+
+void GuiMonitor::StatsWindowInfo::insert_stats(const std::string &key,
+                               const std::string &value)
+{
+  Gtk::TreeModel::Row currentRow = *(stats->append());
+  currentRow[columns.key] = key;
+  currentRow[columns.value] = value;
+}
+
+int run_gui(int argc, char **argv)
+{
+  int ret = EXIT_SUCCESS;
+
+  // Now that the monitor map is up and running, initialize the GUI and start
+  // sending observe requests.  The observe requests will update the
+  // guiMonitorWindow (the main window of the Ceph monitor).  Observe requests
+  // will continue to be sent until the application is closed or until the file
+  // system is no longer running.
+  Gtk::Main kit(&argc, &argv);
+
+  // read the Gtk::Builder file that contains the layout of the windows.
+  Glib::RefPtr<Gtk::Builder> builder =
+       Gtk::Builder::create_from_file(GUI_MONITOR_BUILDER_FILE);
+
+  // stores pointers to all GUI elements
+  GuiMonitor *gui = new GuiMonitor(builder);
+
+  if (!gui->init()) {
+     cerr << "There was a problem with initializing the GUI." << std::endl;
+     ret = EXIT_FAILURE;
+     goto done;
+  }
+
+  // The GUI will now enter its main run loop and will
+  // not exit until the GUI closes.
+  gui->run_main_loop(kit);
+
+done:
+  delete gui;
+  return ret;
+}
diff --git a/src/tools/gui.h b/src/tools/gui.h
new file mode 100644 (file)
index 0000000..8982efd
--- /dev/null
@@ -0,0 +1,394 @@
+/* -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+ * vim: ts=8 sw=2 smarttab
+ *
+ * gui_monitor_interface.h
+ *
+ * Michael McThrow <mmcthrow@gmail.com>
+ */
+#ifndef CEPH_GUI_H
+#define CEPH_GUI_H
+
+#include "common/common_init.h"
+#include "mds/MDSMap.h"
+#include "mon/MonMap.h"
+#include "mon/PGMap.h"
+#include "msg/tcp.h"
+#include "osd/OSDMap.h"
+
+#include <boost/algorithm/string.hpp>
+#include <boost/format.hpp>
+#include <boost/lexical_cast.hpp>
+#include <gtkmm.h>
+#include <iosfwd>
+
+enum NodeType {
+   OSD_NODE = 0,
+   PG_NODE,
+   MDS_NODE,
+   MON_NODE,
+   NUM_NODE_TYPES
+};
+
+class GuiMonitorThread;
+
+// Contains information about a range of nodes (or a specific node)
+class NodeInfo {
+public:
+   unsigned int begin_range;
+   unsigned int end_range;
+   enum NodeType type;
+   int status;
+
+   NodeInfo(unsigned int begin_range_, unsigned int end_range_,
+           enum NodeType type_, int status_)
+     : begin_range(begin_range_),
+       end_range(end_range_),
+       type(type_),
+       status(status_)
+   {
+   }
+};
+
+// Variables, classes, and methods releated to handling the main window and
+// dialog boxes are stored in the GuiMonitor class.
+class GuiMonitor
+{
+private:
+  // Used for displaying icons of the nodes in a cluster.
+  class NodeIconColumns : public Gtk::TreeModel::ColumnRecord {
+  public:
+    Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;
+    Gtk::TreeModelColumn<Glib::ustring> caption;
+    Gtk::TreeModelColumn<unsigned int> begin_range;
+    Gtk::TreeModelColumn<unsigned int> end_range;
+    Gtk::TreeModelColumn<int> status;
+
+    NodeIconColumns() {
+      add(icon);
+      add(caption);
+      add(begin_range);
+      add(end_range);
+      add(status);
+    }
+  };
+
+   // Used for displaying information about either a cluter or a node.
+   class KeyValueModelColumns : public Gtk::TreeModel::ColumnRecord {
+   public:
+      Gtk::TreeModelColumn<Glib::ustring> key;
+      Gtk::TreeModelColumn<Glib::ustring> value;
+
+      KeyValueModelColumns() {
+         add(key);
+         add(value);
+      }
+   };
+
+   // Used for displaying different types of nodes in the "View Node..." dialog
+   // box.
+   class ViewNodeOptionColumns : public Gtk::TreeModel::ColumnRecord {
+   public:
+      Gtk::TreeModelColumn<enum NodeType> type;
+      Gtk::TreeModelColumn<Glib::ustring> name;
+
+      ViewNodeOptionColumns() {
+         add(type);
+         add(name);
+      }
+   };
+
+   // Variables, classes, and methods related to the node statistics and cluster
+   // statistics windows.
+   class StatsWindowInfo {
+    public:
+      StatsWindowInfo(GuiMonitor *gui_,
+         Glib::RefPtr<Gtk::Builder> builder,
+         bool is_cluster_, enum NodeType type_, int id_);
+
+      ~StatsWindowInfo();
+      void init();
+
+   public:
+      /*
+       * GUI Elements
+       */
+      GuiMonitor *gui;
+      Gtk::Window *stats_window;
+      Gtk::Label *stats_info_label;
+      Gtk::TreeView *stats_info_tree_view;
+      Gtk::Button *stats_copy_button;
+      Gtk::Button *stats_save_button;
+      Gtk::Button *stats_close_button;
+
+    private:
+      KeyValueModelColumns columns;
+      Glib::RefPtr<Gtk::ListStore> stats;
+
+      bool is_cluster;
+      enum NodeType type;
+      int id;
+
+      /*
+       * Private Functions
+       */
+   private:
+      // Closes the window that contains the statistics of a node or cluster.
+      // Called by nodeStatsWindow by signal_delete_event.
+      bool closeWindow(GdkEventAny *event) {
+         delete this;
+        return true;
+      }
+
+      void copy();
+
+      // Closes the window that contains the statistics of a node or cluster.
+      // Called by nodeStatsCloseButton by signal_clicked.
+      void close() {
+         delete this;
+      }
+
+      void gen_osd_cluster_columns();
+      void gen_mds_cluster_columns();
+      void gen_pg_cluster_columns();
+      void gen_monitor_cluster_columns();
+
+      void gen_osd_node_columns();
+      void gen_mds_node_columns();
+      void gen_pg_node_columns();
+
+      std::string stats_string();
+
+      void insert_stats(const std::string &key, const std::string &value);
+   };
+
+   friend class StatsWindowInfo;
+
+public:
+  GuiMonitor(Glib::RefPtr<Gtk::Builder> builder);
+  ~GuiMonitor();
+
+  bool init();
+  void run_main_loop(Gtk::Main &kit);
+
+  void check_status();
+
+private:
+  /*
+   * Private Functions
+   */
+  void get_widgets(Glib::RefPtr<Gtk::Builder> builder_object);
+  bool open_icon(Glib::RefPtr<Gdk::Pixbuf> &icon, std::string path);
+  void connect_signals();
+  void link_elements();
+  void update_osd_cluster_view();
+  void update_mds_cluster_view();
+  void update_pg_cluster_view();
+  void update_mon_cluster_view();
+
+  std::string gen_osd_icon_caption(unsigned int begin, unsigned int end);
+  std::string gen_mds_icon_caption(unsigned int begin, unsigned int end);
+  std::string gen_pg_icon_caption(unsigned int begin, unsigned int end);
+
+  std::vector<NodeInfo *> gen_node_info_from_icons
+      (Glib::RefPtr<Gtk::ListStore> iconStore, enum NodeType type);
+  void gen_icons_from_node_info(vector<NodeInfo *>& node_info);
+
+  void view_osd_nodes(unsigned int begin, unsigned int end,
+                     bool view_all = true);
+  void view_mds_nodes(unsigned int begin = 0, unsigned int end = 0,
+                     bool view_all = true);
+  void view_pg_nodes(unsigned int begin, unsigned int end,
+                    bool view_all);
+  int find_mds_id(const std::string &name);
+  void open_stats(enum NodeType type, bool is_cluster, int id);
+  void dialog_error(const std::string &msg, Gtk::MessageType type);
+
+  /*
+   * Signal handlers
+   */
+  // Exits the program.  Called by Gtk::Main by signal_quit
+  bool quit_signal_handler();
+
+  // Quits the GUI.  Called by guiMonitorWindow by signal_delete_event.
+  bool quit_gui(GdkEventAny *event);
+
+  // Quits the GUI.  Called by guiMonitorQuitImageMenuItem by signal_activate.
+  void gui_monitor_quit();
+
+  // Copies the text in guiMonitorLogTextView onto the clipboard.  Called by
+  // guiMonitorCopyImageMenuItem by signal_activate.
+  void copy_log();
+
+  // Opens the "Send Command...." window.  Called by
+  // guiMonitorSendCommandMenuItem for signal_activate.
+  void open_send_command();
+
+  // Opens the "View Node..." window.  Called by guiMonitorViewNodeMenuItem by
+  // signal_activate.
+  void open_view_mode();
+
+  // Opens the "About" dialog box.  Called by guiMonitorAboutImageMenuItem by
+  // signal_activate.
+  void open_about_dialog();
+
+  // Performs "zoom in" option for the PG cluster icon view area.  Allows the
+  // user to "zoom in" on a narrower range of nodes until he or she selects a
+  // specific node of interest.  Called by guiMonitorPGClusterIconView by
+  // signal_item_activated.
+  void pg_cluster_zoom_in(const Gtk::TreeModel::Path& path);
+
+  // Allows user to "zoom out" one level of the PG cluster view area to obtain
+  // a broader range of nodes until he or she views the overall amount of
+  // nodes.  Called by guiMonitorPGClusterBackButton by signal_clicked
+  void pg_cluster_back();
+
+  // Allows user to view the broadest range of nodes in the PG cluster.  Called
+  // by guiMonitorPGClusterViewAllButton by signal_clicked.
+  void pg_cluster_view_all();
+
+  // Allows user to obtain the statistics of the PG cluster.  Called by
+  // guiMonitorPCClusterStatsButton by signal_clicked.
+  void pg_cluster_stats();
+
+  // Allows user to obtain the statistics of the monitor cluster.  Called by
+  // guiMonitorMonitorClusterStatsButton by signal_clicked.
+  void monitor_cluster_stats();
+
+  // Performs "zoom in" option for the OSD cluster icon view area.  Allows the
+  // user to "zoom in" on a narrower range of nodes until he or she selects a
+  // specific node of interest.  Called by guiMonitorOSDClusterIconView by
+  // signal_item_activated.
+  void osdc_cluster_zoom_in(const Gtk::TreeModel::Path& path);
+
+  // Allows user to "zoom out" one level of the OSD cluster view area to obtain
+  // a broader range of nodes until he or she views the overall amount of
+  // nodes.  Called by guiMonitorOSDClusterBackButton by signal_clicked
+  void osdc_cluster_back();
+
+  // Allows user to view the broadest range of nodes in the PG cluster.  Called
+  // by guiMonitorOSDClusterViewAllButton by signal_clicked.
+  void osdc_cluster_view_all();
+
+  // Allows user to obtain the statistics of the OSD cluster.  Called by
+  // guiMonitorOSDClusterStatsButton by signal_clicked.
+  void osdc_cluster_stats();
+
+  // Performs "zoom in" option for the MDS cluster icon view area.  Allows the
+  // user to "zoom in" on a narrower range of nodes until he or she selects a
+  // specific node of interest.  Called by guiMonitorMDSClusterIconView by
+  // signal_item_activated.
+  void mds_cluster_zoom_in(const Gtk::TreeModel::Path& path);
+
+  // Allows user to "zoom out" one level of the MDS cluster view area to obtain
+  // a broader range of nodes until he or she views the overall amount of
+  // nodes.  Called by guiMonitorMDSClusterBackButton by signal_clicked.
+  void mds_cluster_back();
+
+  // Allows user to view the broadest range of nodes in the MDS cluster.
+  // Called by guiMonitorMDSClusterViewAllButton by signal_clicked.
+  void mds_cluster_view_all();
+
+  // Allows user to obtain the statistics of the MDS cluster.  Called by
+  // guiMonitorMDSClusterStatsButton by signal_clicked.
+  void mds_cluster_stats();
+
+  // Called when a button is pressed in the "View Node..." dialog box.
+  void handle_view_node_response(int response);
+
+  // Called when a node type is selected in the "View Node..." dialog box.
+  void handle_view_node_change();
+
+  // Called when a button is pressed in the "Send Command..." dialog box.
+  void handle_send_command_response(int response);
+
+  unsigned int pg_cluster_zoom;  // current zoom level of the PG cluster view
+  unsigned int osd_cluster_zoom; // current zoom level of the OSD cluster view
+  unsigned int mds_cluster_zoom; // current zoom level of the MDS cluster view
+
+  stack<vector<NodeInfo *> > old_pg_cluster_zoom_states;
+  stack<vector<NodeInfo *> > old_osd_cluster_zoom_states;
+  stack<vector<NodeInfo *> > old_mds_cluster_zoom_states;
+
+  std::vector <std::string> current_up_mds;
+  std::vector <pg_t> current_pgs;
+
+  bool send_command_success; // did "Send Command..." end without errors?
+  bool view_node_success;    // did "View Node..." end without errors?"
+
+  GuiMonitorThread *thread;
+
+  ///// GUI Elements /////
+  // Main Window
+  Gtk::Window *guiMonitorWindow;
+
+  Gtk::ImageMenuItem *guiMonitorQuitImageMenuItem;
+  Gtk::ImageMenuItem *guiMonitorCopyImageMenuItem;
+  Gtk::MenuItem *guiMonitorSendCommandMenuItem;
+  Gtk::MenuItem *guiMonitorViewNodeMenuItem;
+  Gtk::ImageMenuItem *guiMonitorAboutImageMenuItem;
+  Gtk::TextView *guiMonitorLogTextView;
+  Glib::RefPtr<Gtk::TextBuffer> guiMonitorLogTextBuffer;
+  Gtk::Statusbar *guiMonitorStatusbar;
+
+  // Main Window -- Placement Groups Section
+  Gtk::Label *guiMonitorPGClusterStatsLabel;
+  Gtk::IconView *guiMonitorPGClusterIconView;
+  Glib::RefPtr<Gtk::ListStore> guiMonitorPGClusterIcons;
+  Gtk::Button *guiMonitorPGClusterBackButton;
+  Gtk::Button *guiMonitorPGClusterViewAllButton;
+  Gtk::Button *guiMonitorPGClusterStatsButton;
+
+  // Main Window -- Monitor Cluster Section
+  Gtk::Label *guiMonitorMonitorClusterStatsLabel;
+  Gtk::Button *guiMonitorMonitorClusterStatsButton;
+  Gtk::TreeView *guiMonitorMonitorClusterTreeView;
+  Glib::RefPtr<Gtk::ListStore> guiMonitorMonitorClusterEntries;
+  KeyValueModelColumns monitorColumns;
+
+  // Main Window -- OSD Cluster Section
+  Gtk::Label *guiMonitorOSDClusterStatsLabel;
+  Gtk::IconView *guiMonitorOSDClusterIconView;
+  Glib::RefPtr<Gtk::ListStore> guiMonitorOSDClusterIcons;
+  Gtk::Button *guiMonitorOSDClusterBackButton;
+  Gtk::Button *guiMonitorOSDClusterViewAllButton;
+  Gtk::Button *guiMonitorOSDClusterStatsButton;
+
+  // Main Window -- Metadata Server Section
+  Gtk::Label *guiMonitorMDSClusterStatsLabel;
+  Gtk::IconView *guiMonitorMDSClusterIconView;
+  Glib::RefPtr<Gtk::ListStore> guiMonitorMDSClusterIcons;
+  Gtk::Button *guiMonitorMDSClusterBackButton;
+  Gtk::Button *guiMonitorMDSClusterViewAllButton;
+  Gtk::Button *guiMonitorMDSClusterStatsButton;
+
+  // View Node Dialog
+  Gtk::Dialog *viewNodeDialog;
+  Gtk::Entry *viewNodeNameEntry;
+  Gtk::ComboBox *viewNodeTypeComboBox;
+  Glib::RefPtr<Gtk::ListStore> viewNodeNodeTypeListStore;
+  Gtk::Label *viewNodeNameLabel;
+  ViewNodeOptionColumns viewNodeColumns;
+
+  // Send Command Window
+  Gtk::Dialog *sendCommandDialog;
+  Gtk::Entry *sendCommandPromptEntry;
+
+  // About Dialog
+  Gtk::AboutDialog *guiMonitorAboutDialog;
+
+  // Icons
+  Glib::RefPtr<Gdk::Pixbuf> blacklistIcon;
+  Glib::RefPtr<Gdk::Pixbuf> clientIcon;
+  //Glib::RefPtr<Gdk::Pixbuf> failedMDSIcon;
+  Glib::RefPtr<Gdk::Pixbuf> MDSIcon;
+  Glib::RefPtr<Gdk::Pixbuf> monitorIcon;
+  Glib::RefPtr<Gdk::Pixbuf> upOSDIcon;
+  Glib::RefPtr<Gdk::Pixbuf> downOSDIcon;
+  Glib::RefPtr<Gdk::Pixbuf> outOSDIcon;
+  Glib::RefPtr<Gdk::Pixbuf> PGIcon;
+  //Glib::RefPtr<Gdk::Pixbuf> stoppedMDSIcon;
+
+  NodeIconColumns icon_columns;
+};
+
+#endif
diff --git a/src/tools/gui_resources.h b/src/tools/gui_resources.h
new file mode 100644 (file)
index 0000000..71b4edf
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef GUI_RESOURCES_H
+#define GUI_RESOURCES_H
+
+/* TODO: Place these in a resource file or some other mechanism */
+#define GUI_MONITOR_BUILDER_FILE "gui_resources/gui_monitor.build"
+#define STATS_WINDOW_BUILDER_FILE "gui_resources/stats_window.glade"
+
+#define BLACKLIST_ICON_PATH "gui_resources/blacklist.svg"
+#define CLIENT_ICON_PATH "gui_resources/client.svg"
+#define FAILED_MDS_ICON_PATH "gui_resources/failed_mds.svg"
+#define MDS_ICON_PATH "gui_resources/mds.svg"
+#define MONITOR_ICON_PATH "gui_resources/monitor.svg"
+#define UP_OSD_ICON_PATH "gui_resources/osd.svg"
+#define DOWN_OSD_ICON_PATH "gui_resources/down_osd.svg"
+#define OUT_OSD_ICON_PATH "gui_resources/out_osd.svg"
+#define PG_ICON_PATH "gui_resources/pg.svg"
+#define STOPPED_MDS_ICON_PATH "gui_resources/stopped_mds.svg"
+
+#endif
diff --git a/src/tools/gui_resources/blacklist.svg b/src/tools/gui_resources/blacklist.svg
new file mode 100644 (file)
index 0000000..a4f84ec
--- /dev/null
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg2415"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="blacklist.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2417">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective2423" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="16"
+     inkscape:cy="16"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="921"
+     inkscape:window-height="719"
+     inkscape:window-x="50"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata2420">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.41997361;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect2425"
+       width="19.72674"
+       height="27.942638"
+       x="3.2642069"
+       y="2.0434015" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3758588,5.1197248 L 21.52208,5.1197248"
+       id="path3197" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3758591,8.0667317 L 21.52208,8.0667317"
+       id="path3199" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3762454,11.058391 L 21.522467,11.058391"
+       id="path3201" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3762464,14.005397 L 21.522467,14.005397"
+       id="path3203" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3756658,16.572866 L 21.521886,16.572866"
+       id="path3205" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3756658,19.519873 L 21.521886,19.519873"
+       id="path3207" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3760518,22.511532 L 21.522273,22.511532"
+       id="path3209" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3760528,25.458538 L 21.522273,25.458538"
+       id="path3211" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 4.3758595,27.892051 L 21.522079,27.892051"
+       id="path3213" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path2397"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="matrix(0.5814445,0,0,0.5814445,13.818618,5.6988945)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.58144444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 17.868759,10.233476 L 17.868759,20.306901"
+       id="path2399" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.58144444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 29.811478,10.233679 L 29.811478,20.307105"
+       id="path3217" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path3219"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="matrix(0.5814445,0,0,0.5814445,13.818618,15.77232)" />
+    <rect
+       style="fill:#00ffff"
+       id="rect3209"
+       width="11.363735"
+       height="3.7634339"
+       x="18.151155"
+       y="16.447802" />
+    <path
+       style="fill:#00ffff"
+       d="M 23.062728,21.445866 C 20.75216,21.369037 18.759365,20.914596 18.247239,20.347735 C 18.20989,20.306394 18.179331,20.260201 18.179331,20.245085 C 18.179331,20.220737 18.825693,20.2176 23.84284,20.2176 C 26.95777,20.2176 29.50635,20.22214 29.50635,20.227691 C 29.50635,20.256581 29.447128,20.343746 29.393177,20.39426 C 29.069698,20.69714 28.253961,20.992381 27.220752,21.180534 C 25.99472,21.403798 24.556887,21.49555 23.062728,21.445866 L 23.062728,21.445866 z"
+       id="path3222" />
+    <path
+       style="fill:#00ffff"
+       d="M 18.160974,13.966628 L 18.160974,11.497448 L 18.8081,11.497502 L 19.455227,11.497557 L 19.712242,11.560448 C 21.493043,11.996207 24.177934,12.10654 26.412991,11.835812 C 26.931922,11.772955 27.594646,11.654538 28.004492,11.55144 L 28.219127,11.497448 L 28.862739,11.497448 L 29.50635,11.497448 L 29.50635,13.966628 L 29.50635,16.435808 L 23.833661,16.435808 L 18.160974,16.435808 L 18.160974,13.966628 z"
+       id="path3224" />
+    <path
+       style="fill:#00ffff"
+       d="M 22.649558,21.418525 C 20.768039,21.310488 19.202972,20.978783 18.500763,20.539218 C 18.362071,20.452402 18.18672,20.28692 18.20392,20.259087 C 18.229752,20.217291 29.487993,20.215949 29.487993,20.257744 C 29.487993,20.28923 29.335027,20.438378 29.233782,20.505611 C 28.596874,20.928557 27.165744,21.264575 25.458363,21.392046 C 24.651585,21.452279 23.436811,21.463732 22.649558,21.418527 L 22.649558,21.418525 z"
+       id="path3215" />
+    <path
+       style="fill:#00ffff"
+       d="M 18.160974,18.326703 L 18.160974,16.454167 L 23.833661,16.454167 L 29.50635,16.454167 L 29.50635,18.326703 L 29.50635,20.199242 L 23.833661,20.199242 L 18.160974,20.199242 L 18.160974,18.326703 z"
+       id="path3227" />
+    <path
+       style="fill:#00ffff"
+       d="M 18.436347,20.216871 C 18.279843,20.211422 20.707946,20.205226 23.832132,20.203103 C 26.956318,20.200979 29.506422,20.205289 29.49903,20.212681 C 29.483706,20.228006 18.871564,20.232026 18.436347,20.216871 L 18.436347,20.216871 z"
+       id="path3229" />
+    <path
+       style="fill:#00ffff"
+       d="M 22.92692,20.408719 C 22.882071,20.404983 22.690446,20.393261 22.501086,20.382669 C 20.764506,20.285535 19.194515,19.942275 18.514565,19.51106 C 18.366626,19.417239 18.199464,19.253401 18.225426,19.227672 C 18.235823,19.217367 19.177744,19.203885 20.580307,19.193964 L 22.91786,19.177432 L 20.548594,19.174307 L 18.179331,19.171181 L 18.179331,17.298643 L 18.179331,15.426107 L 23.778587,15.426107 L 29.377843,15.426107 L 29.377843,17.298643 L 29.377843,19.171181 L 28.775334,19.173842 C 28.443953,19.175304 27.708032,19.181939 27.139953,19.188585 L 26.10708,19.20067 L 27.7334,19.204283 C 28.984962,19.207066 29.359723,19.21298 29.359723,19.229945 C 29.359723,19.270125 29.151757,19.457683 29.022225,19.534326 C 28.309579,19.955992 26.967795,20.249468 25.137629,20.383966 C 24.884502,20.402569 23.093792,20.422619 22.92692,20.408719 L 22.92692,20.408719 z"
+       id="path3221" />
+    <path
+       style="fill:#00ffff"
+       d="M 18.226422,20.216986 C 18.115274,20.211599 18.406836,20.205403 18.874334,20.203218 C 19.341832,20.20103 19.722338,20.202263 19.719901,20.205954 C 19.712118,20.217741 18.436453,20.227165 18.226422,20.216986 L 18.226422,20.216986 z"
+       id="path3223" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00183582;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 18.162847,11.24169 L 18.162847,10.985934 L 18.387736,11.100606 C 18.620678,11.219384 18.943751,11.345657 19.257397,11.440512 L 19.438743,11.495356 L 18.800795,11.496402 L 18.162847,11.497448 L 18.162847,11.24169 z"
+       id="path3233" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00183582;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 28.305761,11.476326 C 28.336052,11.466303 28.464102,11.424781 28.590314,11.384055 C 28.868781,11.2942 29.164004,11.17243 29.361402,11.066006 L 29.508224,10.986851 L 29.508224,11.242148 L 29.508224,11.497448 L 28.879456,11.495998 C 28.436837,11.494977 28.266992,11.489153 28.305761,11.476326 z"
+       id="path3235" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00183582;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 28.557011,20.222226 C 28.72549,20.2192 29.006371,20.219194 29.181191,20.222215 C 29.356012,20.225234 29.218165,20.227711 28.874867,20.227718 C 28.531567,20.227724 28.388533,20.225252 28.557011,20.222226 L 28.557011,20.222226 z"
+       id="path3231" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.916565,21.362905 C 25.936758,21.360706 26.020403,21.35161 26.102442,21.342693 C 27.33299,21.208944 28.334162,20.972875 28.966277,20.667422 C 29.252528,20.5291 29.42361,20.398585 29.493784,20.264999 C 29.501543,20.250227 29.50789,20.235254 29.50789,20.231725 C 29.50789,20.226396 29.486643,20.225214 29.382825,20.224769 C 29.31404,20.224475 29.244336,20.222724 29.227928,20.22088 C 29.209174,20.218773 29.24838,20.217253 29.333487,20.216786 C 29.407954,20.216381 29.479722,20.214745 29.492974,20.213153 C 29.520679,20.209826 29.520991,20.210435 29.51018,20.246841 C 29.495036,20.297835 29.43115,20.376712 29.350307,20.444228 C 29.275316,20.506857 29.135714,20.594845 29.016808,20.654424 C 28.422585,20.952173 27.459779,21.18921 26.267666,21.331249 C 26.083829,21.353153 25.934035,21.36816 25.905768,21.367505 C 25.880923,21.366929 25.88137,21.366739 25.916565,21.362905 z"
+       id="path3238" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 29.249728,20.222068 C 29.255407,20.220974 29.264702,20.220974 29.270382,20.222068 C 29.27606,20.223161 29.271414,20.224056 29.260054,20.224056 C 29.248696,20.224056 29.244048,20.223161 29.249728,20.222068 L 29.249728,20.222068 z"
+       id="path3240" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 29.15318,20.217339 C 29.16634,20.216416 29.189059,20.216407 29.203665,20.217321 C 29.218271,20.218234 29.207503,20.21899 29.179737,20.219 C 29.151971,20.21901 29.14002,20.218262 29.15318,20.217339 L 29.15318,20.217339 z"
+       id="path3237" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.023373,19.481798 L 24.023373,17.595491 L 26.767927,17.595491 L 29.51248,17.595491 L 29.51248,18.903514 L 29.51248,20.211538 L 29.431016,20.212572 L 29.349551,20.213606 L 29.431016,20.214973 L 29.51248,20.216338 L 29.51248,20.228585 C 29.51248,20.239364 29.511795,20.239923 29.506743,20.233247 C 29.502098,20.227106 29.489225,20.225175 29.439047,20.22309 C 29.322272,20.218239 28.422562,20.216136 28.266416,20.220348 C 28.147587,20.223555 28.208336,20.224015 28.521136,20.222276 C 28.954927,20.219865 29.5033,20.227575 29.5033,20.236086 C 29.5033,20.238573 29.496111,20.253687 29.487324,20.269673 C 29.468095,20.304655 29.469818,20.308783 29.489396,20.274645 C 29.496997,20.261392 29.503234,20.253712 29.503257,20.257577 C 29.503282,20.261442 29.495913,20.276415 29.486884,20.290851 C 29.470529,20.316999 29.463086,20.324334 29.468398,20.309066 C 29.470152,20.304024 29.46768,20.305305 29.461754,20.312509 C 29.456563,20.318819 29.440561,20.337992 29.426193,20.355113 C 29.37008,20.421982 29.247687,20.513169 29.114335,20.587455 C 29.085939,20.603276 29.062704,20.617217 29.062704,20.618435 C 29.062704,20.619654 29.078322,20.61203 29.097411,20.601492 C 29.1165,20.590955 29.133199,20.583413 29.134521,20.584734 C 29.140399,20.590614 28.944231,20.689943 28.83552,20.736132 C 28.70572,20.791284 28.560354,20.846494 28.552147,20.843759 C 28.549834,20.842988 28.577537,20.831344 28.61371,20.817881 C 28.700498,20.785579 28.792756,20.74782 28.790471,20.745537 C 28.789467,20.744532 28.772045,20.750816 28.751754,20.759501 C 28.645429,20.80501 28.39743,20.891045 28.222024,20.943274 C 28.06968,20.988636 27.792644,21.06045 27.661121,21.088675 C 27.640261,21.09315 27.63608,21.095332 27.642762,21.098254 C 27.648993,21.100979 27.64756,21.101449 27.637648,21.099937 C 27.617829,21.096911 27.52617,21.116361 27.537288,21.121232 C 27.543349,21.123886 27.541825,21.124356 27.532088,21.122832 C 27.511977,21.119689 27.438325,21.13452 27.449787,21.139406 C 27.455388,21.141793 27.451045,21.142352 27.438002,21.140923 C 27.422076,21.139177 27.41945,21.139725 27.426528,21.14332 C 27.434082,21.147157 27.433072,21.147582 27.42081,21.145718 C 27.412618,21.144473 27.357888,21.152544 27.299188,21.163653 C 26.878186,21.243329 26.402758,21.310468 25.916565,21.358903 C 25.828344,21.367692 25.789739,21.368049 24.924073,21.368075 L 24.023373,21.368105 L 24.023373,19.481798 z M 28.810279,20.739336 C 28.814065,20.73689 28.815097,20.734887 28.812572,20.734887 C 28.810049,20.734887 28.804885,20.73689 28.8011,20.739336 C 28.797313,20.741783 28.79628,20.743786 28.798805,20.743786 C 28.801328,20.743786 28.806492,20.741783 28.810279,20.739336 z M 28.837815,20.727863 C 28.844126,20.724255 28.847225,20.721303 28.8447,20.721303 C 28.842177,20.721303 28.834948,20.724255 28.828636,20.727863 C 28.822326,20.73147 28.819228,20.734422 28.821751,20.734422 C 28.824276,20.734422 28.831505,20.73147 28.837815,20.727863 z M 28.879122,20.709505 C 28.89048,20.703421 28.897709,20.698446 28.895186,20.698446 C 28.892661,20.698446 28.881303,20.703421 28.869943,20.709505 C 28.858583,20.715587 28.851354,20.720563 28.853879,20.720563 C 28.856404,20.720563 28.867762,20.715587 28.879122,20.709505 z M 28.934196,20.684262 C 28.943031,20.679425 28.948193,20.675468 28.94567,20.675468 C 28.943145,20.675468 28.933852,20.679425 28.925017,20.684262 C 28.916182,20.689098 28.91102,20.693057 28.913543,20.693057 C 28.916068,20.693055 28.925361,20.689098 28.934196,20.684262 z"
+       id="path3239" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.023373,19.481798 L 24.023373,17.595491 L 26.767927,17.595491 L 29.51248,17.595491 L 29.51248,18.903361 L 29.51248,20.211227 L 29.463142,20.212703 L 29.413804,20.214179 L 29.463142,20.215153 L 29.51248,20.216128 L 29.51241,20.228748 C 29.51237,20.235787 29.510848,20.239078 29.508967,20.236189 C 29.506949,20.233087 29.501568,20.239994 29.495562,20.253399 C 29.484697,20.277646 29.485015,20.283578 29.496087,20.263171 C 29.499973,20.256007 29.503012,20.253588 29.503117,20.257577 C 29.503367,20.267145 29.469872,20.320076 29.467697,20.313551 C 29.466742,20.310689 29.450844,20.326322 29.432364,20.348291 C 29.373376,20.418423 29.253904,20.509918 29.134989,20.576036 C 29.104134,20.593192 29.091192,20.603925 29.118204,20.589955 C 29.135308,20.58111 29.140755,20.583799 29.125707,20.593658 C 29.103255,20.60837 28.979459,20.671317 28.911748,20.70245 C 28.776801,20.764496 28.563054,20.847166 28.549057,20.842722 C 28.544937,20.841415 28.498246,20.854899 28.445298,20.872688 C 28.327662,20.912208 28.17304,20.959025 28.051436,20.991941 C 27.986398,21.009547 27.962788,21.017659 27.968824,21.020328 C 27.974727,21.022937 27.973058,21.023437 27.963283,21.021981 C 27.955588,21.020836 27.926675,21.025771 27.89903,21.032952 C 27.871386,21.040129 27.853931,21.046326 27.860241,21.046719 C 27.866551,21.047113 27.851156,21.052522 27.82603,21.058741 C 27.800903,21.064959 27.777318,21.068885 27.773618,21.067467 C 27.769919,21.066046 27.755604,21.067411 27.741807,21.070498 C 27.722203,21.074886 27.718612,21.076936 27.725374,21.079883 C 27.73113,21.082389 27.72865,21.082882 27.717965,21.081355 C 27.70913,21.080093 27.695705,21.080925 27.688133,21.083206 C 27.674949,21.087177 27.674852,21.087391 27.685838,21.088218 C 27.695586,21.088953 27.694895,21.089684 27.681248,21.093086 C 27.672413,21.095286 27.658988,21.095983 27.651416,21.094631 C 27.642269,21.093 27.639698,21.093592 27.643755,21.096396 C 27.651814,21.101965 27.625514,21.107498 27.608514,21.10381 C 27.598827,21.101707 27.597748,21.102217 27.603226,21.1063 C 27.608545,21.110263 27.605936,21.110858 27.591752,21.108916 C 27.577534,21.106969 27.575465,21.107445 27.582573,21.111026 C 27.589611,21.11457 27.586934,21.115121 27.571098,21.113385 C 27.555172,21.111639 27.552546,21.112189 27.559624,21.115784 C 27.567134,21.119596 27.566049,21.120025 27.55366,21.118132 C 27.545331,21.116859 27.539618,21.117601 27.540965,21.11978 C 27.544323,21.125216 27.519305,21.129718 27.501109,21.12695 C 27.488837,21.125086 27.48782,21.125511 27.495371,21.129344 C 27.502449,21.13294 27.499825,21.133489 27.483897,21.131744 C 27.46797,21.129998 27.465345,21.130547 27.472424,21.134141 C 27.479933,21.137955 27.478847,21.138383 27.466458,21.13649 C 27.455965,21.134887 27.452292,21.135759 27.454501,21.139331 C 27.456764,21.142996 27.452515,21.143592 27.439812,21.141388 C 27.426991,21.139162 27.423884,21.139612 27.428823,21.142976 C 27.435993,21.14786 27.432352,21.148567 27.392106,21.150102 C 27.383272,21.150438 27.369847,21.151237 27.362275,21.151877 C 27.349943,21.15292 27.349464,21.153497 27.357685,21.157397 C 27.364816,21.160779 27.363403,21.161219 27.351353,21.159364 C 27.342821,21.158052 27.322237,21.159485 27.30561,21.162547 C 27.280523,21.16717 27.277305,21.168722 27.286699,21.171667 C 27.294897,21.174237 27.293117,21.174654 27.280237,21.173179 C 27.270187,21.172031 27.206457,21.181028 27.133694,21.193869 C 26.891773,21.236561 26.593514,21.280988 26.343394,21.31159 C 26.261946,21.321554 26.242028,21.325208 26.256192,21.327583 C 26.267036,21.329401 26.258583,21.33002 26.235539,21.329093 C 26.205418,21.327884 26.200711,21.328428 26.214885,21.331484 C 26.230231,21.334793 26.228451,21.335112 26.204043,21.333431 C 26.187983,21.332326 26.148741,21.334459 26.116841,21.33817 C 26.084941,21.341881 26.006445,21.350134 25.942407,21.356512 L 25.825972,21.368105 L 24.924672,21.368105 L 24.023373,21.368105 L 24.023373,19.481798 z M 27.66834,21.089596 C 27.665027,21.088271 27.661068,21.088433 27.659544,21.089959 C 27.658019,21.091484 27.660729,21.092569 27.665567,21.092369 C 27.670914,21.092149 27.672001,21.091062 27.66834,21.089596 z M 27.787669,21.06206 C 27.784355,21.060733 27.780397,21.060897 27.778872,21.062422 C 27.777346,21.063946 27.780058,21.065032 27.784896,21.064833 C 27.790243,21.064611 27.79133,21.063524 27.787669,21.06206 z M 27.806027,21.05747 C 27.802713,21.056143 27.798754,21.056307 27.79723,21.057833 C 27.795705,21.059358 27.798416,21.060442 27.803254,21.060243 C 27.8086,21.060023 27.809687,21.058935 27.806027,21.05747 z M 27.824384,21.052881 C 27.821072,21.051554 27.817113,21.051718 27.815589,21.053243 C 27.814063,21.054767 27.816773,21.055852 27.821611,21.055654 C 27.826959,21.055434 27.828046,21.054345 27.824384,21.052881 z M 27.842743,21.048291 C 27.83943,21.046966 27.835471,21.047128 27.833947,21.048653 C 27.832422,21.050179 27.835132,21.051263 27.83997,21.051064 C 27.845317,21.050844 27.846404,21.049757 27.842743,21.048291 z M 28.583095,20.828312 C 28.594154,20.823278 28.594605,20.822596 28.58539,20.824858 C 28.579079,20.826406 28.56772,20.830495 28.560147,20.833943 C 28.54909,20.838978 28.548638,20.839658 28.557854,20.837397 C 28.564164,20.835849 28.575522,20.83176 28.583095,20.828312 L 28.583095,20.828312 z M 28.626697,20.811996 C 28.631481,20.809039 28.63008,20.808678 28.622107,20.810811 C 28.615795,20.812499 28.607534,20.815793 28.603748,20.818134 C 28.598964,20.821089 28.600363,20.82145 28.608338,20.819317 C 28.614648,20.817629 28.622909,20.814335 28.626697,20.811996 L 28.626697,20.811996 z M 28.649643,20.803591 C 28.65343,20.801144 28.654463,20.799142 28.65194,20.799142 C 28.649415,20.799142 28.644251,20.801144 28.640464,20.803591 C 28.636678,20.806038 28.635646,20.80804 28.638169,20.80804 C 28.640694,20.80804 28.645858,20.806038 28.649643,20.803591 z M 28.68636,20.789822 C 28.690148,20.787375 28.69118,20.785373 28.688655,20.785373 C 28.68613,20.785373 28.680968,20.787375 28.677181,20.789822 C 28.673395,20.792269 28.672361,20.794271 28.674886,20.794271 C 28.677411,20.794271 28.682575,20.792269 28.68636,20.789822 z M 28.709309,20.780642 C 28.713094,20.778195 28.714127,20.776193 28.711603,20.776193 C 28.709079,20.776193 28.703915,20.778195 28.700129,20.780642 C 28.696342,20.783089 28.69531,20.785091 28.697834,20.785091 C 28.700359,20.785091 28.705521,20.783089 28.709309,20.780642 z M 28.732255,20.771463 C 28.736042,20.769016 28.737075,20.767014 28.73455,20.767014 C 28.732027,20.767014 28.726863,20.769016 28.723077,20.771463 C 28.71929,20.77391 28.718258,20.775912 28.720783,20.775912 C 28.723306,20.775912 28.72847,20.77391 28.732255,20.771463 z M 28.755203,20.762284 C 28.758991,20.759837 28.760023,20.757835 28.757498,20.757835 C 28.754975,20.757835 28.749811,20.759837 28.746024,20.762284 C 28.742238,20.764731 28.741206,20.766733 28.743729,20.766733 C 28.746254,20.766733 28.751418,20.764731 28.755203,20.762284 z M 28.881384,20.707263 C 28.882992,20.70466 28.881149,20.703891 28.877065,20.705459 C 28.869114,20.708509 28.86766,20.711799 28.874261,20.711799 C 28.876637,20.711799 28.879842,20.709758 28.881384,20.707263 L 28.881384,20.707263 z M 28.934196,20.684262 C 28.937983,20.681814 28.939016,20.679813 28.936491,20.679813 C 28.933966,20.679813 28.928804,20.681814 28.925017,20.684262 C 28.921231,20.686709 28.920199,20.688711 28.922722,20.688711 C 28.925247,20.688711 28.930411,20.686709 28.934196,20.684262 z M 29.432163,20.22488 C 29.328052,20.219647 28.54538,20.215319 28.445409,20.219424 C 28.383856,20.22195 28.462475,20.222714 28.684065,20.221743 C 28.865811,20.220947 29.085767,20.222127 29.172853,20.224364 C 29.25994,20.226603 29.368367,20.228361 29.413804,20.228272 L 29.496416,20.22811 L 29.432163,20.22488 z"
+       id="path3241" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 29.219896,20.22202 C 29.226838,20.220967 29.238196,20.220967 29.245139,20.22202 C 29.252081,20.22307 29.246401,20.223931 29.232516,20.223931 C 29.218633,20.223931 29.212955,20.22307 29.219896,20.22202 z"
+       id="path3243" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.023373,19.481896 L 24.023373,17.595491 L 26.767942,17.595491 L 29.512511,17.595491 L 29.512465,18.917535 C 29.512438,19.644659 29.51067,20.238497 29.50853,20.237177 C 29.506393,20.235855 29.502276,20.239969 29.499382,20.246319 C 29.492993,20.260345 29.492597,20.266895 29.498712,20.257433 C 29.501904,20.252494 29.50318,20.252234 29.503231,20.256513 C 29.503396,20.270603 29.468696,20.323534 29.462003,20.319398 C 29.460048,20.318189 29.45563,20.32079 29.452189,20.325181 C 29.446527,20.332403 29.446694,20.332561 29.453963,20.326862 C 29.45838,20.323397 29.461995,20.322628 29.461995,20.325153 C 29.461995,20.331127 29.450422,20.340712 29.447154,20.337444 C 29.445768,20.336057 29.435632,20.34566 29.424629,20.358782 C 29.38256,20.408962 29.306697,20.467168 29.151625,20.568246 C 29.144334,20.572998 29.144248,20.57345 29.151053,20.571198 C 29.183486,20.560469 29.122979,20.59706 29.024781,20.647556 C 28.888932,20.717415 28.72661,20.785533 28.542749,20.849839 C 28.455895,20.880218 28.432333,20.886957 28.447704,20.877023 C 28.458844,20.869823 28.454426,20.87104 28.355913,20.902308 C 28.304166,20.918732 28.249608,20.93562 28.234673,20.939837 C 28.215298,20.945307 28.209932,20.948351 28.215945,20.950461 C 28.222231,20.952666 28.219021,20.954915 28.203303,20.959316 C 28.191716,20.96256 28.179862,20.963748 28.176961,20.961955 C 28.174061,20.960163 28.150964,20.964485 28.125633,20.971558 C 28.09451,20.980251 28.082339,20.985399 28.08809,20.987441 C 28.094869,20.989847 28.093497,20.991151 28.081358,20.993844 C 28.072974,20.995704 28.064885,20.995997 28.063383,20.994493 C 28.061881,20.99299 28.064437,20.991761 28.069065,20.991761 C 28.073693,20.991761 28.076353,20.990636 28.074978,20.989261 C 28.073602,20.987884 28.062526,20.989264 28.050365,20.992327 C 28.033833,20.99649 28.030437,20.99866 28.036904,21.000929 C 28.048674,21.005058 27.95299,21.028925 27.938023,21.025593 C 27.928808,21.023541 27.928027,21.024056 27.933674,21.028452 C 27.939244,21.032788 27.938159,21.033288 27.927979,21.031068 C 27.912454,21.027682 27.868277,21.037821 27.880251,21.04202 C 27.884938,21.043665 27.861388,21.051122 27.823805,21.059893 C 27.788335,21.06817 27.757189,21.073628 27.754591,21.072024 C 27.751994,21.070417 27.743447,21.070515 27.735599,21.072237 C 27.726832,21.074163 27.723435,21.076671 27.726787,21.078743 C 27.734347,21.083415 27.662094,21.098489 27.651545,21.094441 C 27.646045,21.092331 27.644091,21.092897 27.646033,21.096039 C 27.649771,21.102086 27.621513,21.107947 27.609973,21.103519 C 27.603853,21.10117 27.602691,21.101924 27.605481,21.106438 C 27.608444,21.111231 27.605923,21.111884 27.593613,21.109518 C 27.581831,21.107253 27.579679,21.107726 27.584867,21.111439 C 27.59002,21.115127 27.587134,21.11566 27.573393,21.113559 C 27.559288,21.111401 27.556631,21.111936 27.561919,21.115868 C 27.567439,21.119972 27.566332,21.120594 27.556343,21.119 C 27.549489,21.117908 27.543175,21.119136 27.54231,21.12173 C 27.541444,21.124323 27.530217,21.126605 27.517356,21.1268 C 27.503642,21.127008 27.496162,21.128734 27.499262,21.130976 C 27.502219,21.133113 27.496458,21.133676 27.486192,21.132253 C 27.4726,21.130369 27.469622,21.130959 27.474718,21.134528 C 27.480077,21.138279 27.478842,21.138906 27.469142,21.137359 C 27.462287,21.136267 27.456093,21.136777 27.455373,21.138494 C 27.453151,21.143797 27.381441,21.156297 27.366864,21.153921 C 27.355792,21.152117 27.354444,21.152715 27.35998,21.15697 C 27.36538,21.161121 27.362908,21.161657 27.348506,21.159453 C 27.334563,21.157321 27.331803,21.157855 27.337032,21.161675 C 27.342247,21.165487 27.338908,21.166088 27.323263,21.164157 C 27.30777,21.162243 27.304902,21.162746 27.311788,21.166164 C 27.318757,21.169625 27.315993,21.170178 27.300314,21.168459 C 27.286964,21.166996 27.282854,21.167552 27.28869,21.170032 C 27.295918,21.173103 27.293668,21.174412 27.277399,21.176594 C 27.266225,21.178092 27.250803,21.178384 27.243129,21.177245 C 27.231243,21.175476 27.230535,21.175875 27.238356,21.179933 C 27.245882,21.183841 27.244734,21.184266 27.231978,21.182302 C 27.223215,21.180952 27.164074,21.189003 27.096585,21.20073 C 26.964557,21.223672 26.730896,21.260244 26.609588,21.276953 C 26.551498,21.284954 26.535085,21.288548 26.545335,21.291019 C 26.555172,21.293392 26.553205,21.293753 26.53845,21.292287 C 26.52709,21.291157 26.488882,21.293772 26.453542,21.298101 C 26.402288,21.304376 26.392538,21.306638 26.405352,21.309279 C 26.417045,21.311689 26.414682,21.312063 26.396666,21.310654 C 26.383054,21.30959 26.359303,21.310137 26.343887,21.31187 C 26.317583,21.314828 26.316845,21.315223 26.331919,21.318301 C 26.341939,21.320344 26.335032,21.320953 26.313561,21.319916 C 26.287165,21.31864 26.282884,21.319191 26.295202,21.32228 C 26.308033,21.325496 26.305262,21.325951 26.281433,21.324537 C 26.263727,21.323484 26.256266,21.324171 26.263076,21.326226 C 26.278543,21.330892 26.220014,21.336593 26.185052,21.333827 C 26.166216,21.332336 26.163886,21.33271 26.175875,21.335299 C 26.187104,21.337725 26.178125,21.338807 26.146042,21.338891 C 26.120799,21.338959 26.051612,21.344978 25.992292,21.352266 L 25.884437,21.365519 L 24.953906,21.366909 L 24.023373,21.368299 L 24.023373,19.481896 z M 26.225125,21.328208 C 26.220659,21.327045 26.214463,21.327121 26.211356,21.328378 C 26.208249,21.329636 26.211902,21.330587 26.219475,21.330495 C 26.227048,21.3304 26.229591,21.329371 26.225125,21.328208 L 26.225125,21.328208 z M 27.691288,21.085008 C 27.687974,21.083681 27.684016,21.083845 27.682491,21.085369 C 27.680967,21.086894 27.683677,21.08798 27.688515,21.08778 C 27.693862,21.08756 27.694949,21.086472 27.691288,21.085008 z M 27.709646,21.080417 C 27.706332,21.079092 27.702375,21.079255 27.700849,21.080779 C 27.699324,21.082305 27.702036,21.08339 27.706873,21.08319 C 27.712219,21.08297 27.713308,21.081883 27.709646,21.080417 z M 27.76931,21.06665 C 27.765998,21.065323 27.762038,21.065487 27.760513,21.06701 C 27.758989,21.068536 27.761699,21.069621 27.766537,21.069423 C 27.771885,21.069203 27.772972,21.068114 27.76931,21.06665 z M 27.989608,21.011574 C 27.986296,21.010249 27.982336,21.010411 27.980813,21.011936 C 27.979287,21.013462 27.981997,21.014545 27.986835,21.014347 C 27.992182,21.014127 27.99327,21.01304 27.989608,21.011574 z M 28.01858,21.00553 C 28.024366,21.003045 28.025215,21.001586 28.020875,21.001586 C 28.017088,21.001586 28.009861,21.003361 28.004811,21.00553 C 27.999026,21.008017 27.998177,21.009474 28.002517,21.009474 C 28.006302,21.009474 28.013531,21.007699 28.01858,21.00553 z M 28.197573,20.955046 C 28.203359,20.952559 28.204206,20.951101 28.199868,20.951101 C 28.196081,20.951101 28.188852,20.952876 28.183804,20.955046 C 28.178018,20.957532 28.17717,20.95899 28.181509,20.95899 C 28.185297,20.95899 28.192525,20.957215 28.197573,20.955046 z M 29.140727,20.576172 C 29.140727,20.574909 29.134531,20.577082 29.126958,20.580996 C 29.119385,20.584912 29.113189,20.58915 29.113189,20.590412 C 29.113189,20.591674 29.119385,20.589502 29.126958,20.585586 C 29.134531,20.58167 29.140727,20.577434 29.140727,20.576172 L 29.140727,20.576172 z M 29.446911,20.2265 C 29.432305,20.225585 29.409587,20.225595 29.396427,20.226518 C 29.383266,20.227441 29.395217,20.228189 29.422983,20.228179 C 29.450751,20.228169 29.461517,20.227413 29.446911,20.2265 L 29.446911,20.2265 z M 29.295623,20.221879 C 29.265964,20.22108 29.217429,20.22108 29.18777,20.221879 C 29.158109,20.222678 29.182376,20.223332 29.241696,20.223332 C 29.301017,20.223332 29.325284,20.222678 29.295623,20.221879 z M 28.788477,20.217309 C 28.770177,20.216437 28.74023,20.216437 28.721929,20.217309 C 28.703629,20.218179 28.718602,20.218892 28.755203,20.218892 C 28.791805,20.218892 28.806778,20.218179 28.788477,20.217309 L 28.788477,20.217309 z M 29.495332,20.212897 C 29.489687,20.211806 29.479361,20.21178 29.472384,20.212834 C 29.465408,20.213889 29.470026,20.214779 29.482649,20.214814 C 29.495269,20.214849 29.500977,20.213985 29.495332,20.212897 L 29.495332,20.212897 z"
+       id="path3245" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 21.652869,21.358564 C 20.401661,21.222663 19.429597,21.003303 18.782103,20.710736 C 18.450563,20.560932 18.223202,20.389717 18.172297,20.251525 C 18.157567,20.211535 18.158123,20.210072 18.186609,20.213831 C 18.199862,20.21558 18.338752,20.21836 18.495257,20.220011 L 18.779808,20.223011 L 18.538857,20.226579 C 18.294123,20.230203 18.187802,20.234898 18.180287,20.242413 C 18.174911,20.247789 18.19346,20.282759 18.219936,20.317164 C 18.252608,20.359626 18.34828,20.447269 18.41035,20.491599 C 18.613444,20.636651 18.9144,20.774655 19.289248,20.894616 C 19.911749,21.09383 20.676775,21.242679 21.60457,21.345099 C 21.729284,21.358866 21.790531,21.367129 21.767608,21.367094 C 21.747415,21.367063 21.695782,21.363224 21.652869,21.358564 L 21.652869,21.358564 z"
+       id="path3247" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00045896;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 18.769482,20.221895 C 18.789045,20.221035 18.821057,20.221035 18.84062,20.221895 C 18.860183,20.222754 18.844177,20.223459 18.805051,20.223459 C 18.765925,20.223459 18.749919,20.222754 18.769482,20.221895 L 18.769482,20.221895 z"
+       id="path3249" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00022713;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 18.943571,20.778419 C 18.842805,20.73733 18.776148,20.707928 18.702816,20.672227 C 18.429867,20.539339 18.23962,20.392683 18.181983,20.27073 C 18.17102,20.247534 18.162534,20.222168 18.164243,20.217711 C 18.165261,20.215062 18.171199,20.214329 18.193414,20.214108 C 18.208756,20.213955 18.235617,20.213112 18.253106,20.212231 C 18.280662,20.210843 18.276041,20.210579 18.21847,20.210236 L 18.152034,20.209842 L 18.152034,19.565939 L 18.152034,18.922034 L 19.400096,18.922034 L 20.648157,18.922034 L 20.648157,19.855525 L 20.648157,20.789016 L 19.821806,20.789016 L 18.995455,20.789016 L 18.944785,20.768556 C 18.703753,20.671227 18.497225,20.560133 18.37178,20.46033 C 18.363348,20.453621 18.356449,20.448679 18.356449,20.449348 C 18.356449,20.451684 18.401836,20.486693 18.43025,20.506278 C 18.562151,20.597182 18.743327,20.690736 18.939029,20.768995 C 18.964012,20.778985 18.984881,20.787576 18.9854,20.788088 C 18.985922,20.788597 18.982344,20.788925 18.97745,20.788811 C 18.972558,20.7887 18.957313,20.784023 18.943571,20.778419 L 18.943571,20.778419 z M 18.354177,20.447542 C 18.354177,20.447111 18.351877,20.444811 18.349066,20.442432 L 18.343957,20.438105 L 18.348284,20.443216 C 18.352351,20.448019 18.354177,20.449359 18.354177,20.447542 L 18.354177,20.447542 z M 18.257401,20.356908 C 18.231572,20.330007 18.206428,20.297452 18.191283,20.271301 C 18.187261,20.264357 18.183938,20.259638 18.183902,20.260815 C 18.183793,20.264221 18.2017,20.293549 18.214569,20.311034 C 18.225968,20.326524 18.264701,20.368832 18.267482,20.368832 C 18.268235,20.368832 18.263698,20.363466 18.257401,20.356908 z M 18.193009,20.241048 C 18.198579,20.240046 18.212848,20.238293 18.224716,20.237157 L 18.246292,20.235087 L 18.221309,20.236108 C 18.207567,20.23667 18.192492,20.238192 18.187807,20.239491 C 18.18055,20.241505 18.179324,20.242762 18.179516,20.247994 L 18.179743,20.254132 L 18.181311,20.248502 C 18.182564,20.244008 18.184925,20.242503 18.193009,20.241048 L 18.193009,20.241048 z M 18.279717,20.23315 C 18.273117,20.23269 18.262897,20.232695 18.257005,20.233161 C 18.251114,20.233626 18.256514,20.234003 18.269006,20.233997 C 18.281497,20.233992 18.286317,20.233609 18.279717,20.23315 L 18.279717,20.23315 z M 18.341019,20.230866 C 18.331907,20.230434 18.317597,20.230438 18.30922,20.230873 C 18.300844,20.23131 18.308297,20.231662 18.325787,20.231659 C 18.343275,20.231655 18.35013,20.2313 18.341019,20.230866 L 18.341019,20.230866 z M 18.801618,20.225755 C 18.949648,20.224409 19.118288,20.223072 19.176377,20.222786 C 19.234464,20.222499 19.135834,20.222397 18.957199,20.222557 C 18.681855,20.222805 18.515304,20.224642 18.391654,20.228793 C 18.364912,20.229692 18.387762,20.229521 18.801618,20.225755 L 18.801618,20.225755 z"
+       id="path3251" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00022713;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 18.927672,20.772161 C 18.577882,20.630212 18.324224,20.471435 18.216195,20.326814 C 18.19014,20.291935 18.160029,20.228696 18.164243,20.217711 C 18.165246,20.215099 18.170768,20.214331 18.190007,20.214131 C 18.203475,20.213992 18.224205,20.213135 18.236071,20.212228 C 18.253412,20.210901 18.24728,20.210506 18.204842,20.21021 L 18.152034,20.209842 L 18.152034,19.565939 L 18.152034,18.922034 L 19.400096,18.922034 L 20.648157,18.922034 L 20.648157,19.855525 L 20.648157,20.789016 L 19.82165,20.789016 L 18.995144,20.789016 L 18.934153,20.764269 C 18.900608,20.750659 18.853323,20.730729 18.829078,20.719979 C 18.787692,20.701634 18.774776,20.696518 18.787989,20.703707 C 18.798653,20.70951 18.888598,20.74828 18.93657,20.767752 C 18.962906,20.778442 18.984881,20.7876 18.9854,20.788103 C 18.985922,20.788604 18.982344,20.788956 18.97745,20.788884 C 18.97189,20.788801 18.953228,20.782532 18.927672,20.772161 L 18.927672,20.772161 z M 18.72979,20.674419 C 18.700902,20.660304 18.662064,20.640887 18.643482,20.63127 C 18.624898,20.621654 18.61174,20.615453 18.614238,20.617492 C 18.619964,20.622166 18.776833,20.700499 18.779985,20.700259 C 18.781264,20.700161 18.758676,20.688533 18.72979,20.674419 L 18.72979,20.674419 z M 18.604017,20.610768 C 18.604017,20.610169 18.599928,20.607593 18.594932,20.605043 C 18.589935,20.602493 18.585847,20.600917 18.585847,20.601535 C 18.585847,20.602156 18.58968,20.604687 18.594364,20.607161 C 18.604002,20.612248 18.604017,20.612253 18.604017,20.610768 z M 18.583575,20.599423 C 18.583575,20.59883 18.580509,20.59676 18.576762,20.594823 C 18.568219,20.590405 18.567703,20.592325 18.576194,20.596931 C 18.583332,20.600802 18.583575,20.600885 18.583575,20.599423 L 18.583575,20.599423 z M 18.563135,20.588089 C 18.563135,20.587508 18.560835,20.585918 18.558024,20.584557 C 18.553117,20.582178 18.553089,20.582221 18.557323,20.585612 C 18.561957,20.589325 18.563135,20.589826 18.563135,20.588089 L 18.563135,20.588089 z M 18.547235,20.579004 C 18.547235,20.578423 18.544935,20.576833 18.542124,20.575472 C 18.537217,20.573093 18.53719,20.573136 18.541423,20.576527 C 18.546057,20.58024 18.547235,20.580741 18.547235,20.579004 L 18.547235,20.579004 z M 18.535878,20.572189 C 18.535878,20.57161 18.533579,20.57002 18.530769,20.568657 C 18.525862,20.566279 18.525834,20.566321 18.530068,20.569714 C 18.5347,20.573425 18.535878,20.573928 18.535878,20.572189 L 18.535878,20.572189 z M 18.521115,20.562787 C 18.515298,20.558303 18.508623,20.554626 18.508623,20.555909 C 18.508623,20.557062 18.522837,20.566372 18.524523,20.566321 C 18.525147,20.566302 18.523613,20.564712 18.521115,20.562787 L 18.521115,20.562787 z M 18.506352,20.554019 C 18.506352,20.553438 18.504054,20.55185 18.501243,20.550487 C 18.496335,20.548109 18.496307,20.548151 18.500541,20.551542 C 18.505174,20.555255 18.506352,20.555758 18.506352,20.554019 L 18.506352,20.554019 z M 18.490604,20.543912 C 18.483739,20.538635 18.470326,20.530894 18.473419,20.533993 C 18.476466,20.537047 18.493475,20.548275 18.494955,20.54821 C 18.495602,20.548184 18.493643,20.546248 18.490604,20.543912 L 18.490604,20.543912 z M 18.456385,20.522403 C 18.456385,20.521921 18.453574,20.519817 18.450139,20.517726 L 18.443892,20.513924 L 18.449254,20.518601 C 18.454487,20.523164 18.456385,20.524177 18.456385,20.522403 L 18.456385,20.522403 z M 18.438215,20.50965 C 18.417244,20.493808 18.378828,20.466887 18.382569,20.470658 C 18.38761,20.475737 18.44096,20.514187 18.442757,20.514036 C 18.443382,20.513983 18.441337,20.512009 18.438215,20.50965 z M 18.37689,20.465638 C 18.37689,20.465166 18.375102,20.463378 18.372916,20.461664 C 18.369313,20.458838 18.369233,20.458919 18.372058,20.462521 C 18.375026,20.466305 18.37689,20.467508 18.37689,20.465638 z M 18.252862,20.352364 C 18.239759,20.338524 18.222485,20.3176 18.211147,20.301829 C 18.199989,20.286308 18.194587,20.280358 18.200838,20.290472 C 18.212459,20.309277 18.256464,20.362019 18.260533,20.362019 C 18.26134,20.362019 18.257889,20.357674 18.252862,20.352364 z M 18.195189,20.27798 C 18.193852,20.275482 18.192247,20.273439 18.191622,20.273439 C 18.190997,20.273439 18.191581,20.275482 18.192918,20.27798 C 18.194254,20.280479 18.195859,20.282524 18.196485,20.282524 C 18.197108,20.282524 18.196526,20.280479 18.195189,20.27798 z M 18.204274,20.238671 C 18.207396,20.238108 18.204344,20.238072 18.197491,20.238591 C 18.190638,20.239111 18.184125,20.240439 18.183022,20.241545 C 18.181857,20.242708 18.184709,20.242741 18.189804,20.241622 C 18.19464,20.240562 18.20115,20.239233 18.204274,20.238671 L 18.204274,20.238671 z M 18.227413,20.235547 C 18.225773,20.23489 18.223814,20.234971 18.22306,20.235726 C 18.222305,20.23648 18.223645,20.237018 18.226041,20.236919 C 18.228687,20.236809 18.229224,20.236272 18.227413,20.235547 z M 18.581872,20.226315 C 18.564071,20.225931 18.534942,20.225931 18.517141,20.226315 C 18.49934,20.226699 18.513905,20.227013 18.549507,20.227013 C 18.585109,20.227013 18.599673,20.226699 18.581872,20.226315 L 18.581872,20.226315 z M 18.975369,20.223593 L 19.088932,20.222081 L 18.982182,20.22196 C 18.92347,20.221892 18.81973,20.222516 18.75165,20.223346 L 18.627865,20.224855 L 18.744836,20.224981 C 18.809169,20.225051 18.912909,20.224425 18.975369,20.223593 L 18.975369,20.223593 z"
+       id="path3253" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/client.svg b/src/tools/gui_resources/client.svg
new file mode 100644 (file)
index 0000000..36a4445
--- /dev/null
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg3515"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="client.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3517">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective3523" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="16"
+     inkscape:cy="16"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata3520">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path3525"
+       sodipodi:cx="17.012268"
+       sodipodi:cy="16.059372"
+       sodipodi:rx="9.6000986"
+       sodipodi:ry="9.3321886"
+       d="M 26.612367,16.059372 A 9.6000986,9.3321886 0 1 1 7.4121695,16.059372 A 9.6000986,9.3321886 0 1 1 26.612367,16.059372 z"
+       transform="translate(-1.3395486,-0.7144259)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path4036"
+       sodipodi:cx="12.189892"
+       sodipodi:cy="12.621197"
+       sodipodi:rx="1.4735035"
+       sodipodi:ry="1.4288518"
+       d="M 13.663395,12.621197 A 1.4735035,1.4288518 0 1 1 10.716388,12.621197 A 1.4735035,1.4288518 0 1 1 13.663395,12.621197 z"
+       transform="matrix(0.5306128,0,0,0.6721944,5.9896895,3.7354344)" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path4062"
+       sodipodi:cx="12.189892"
+       sodipodi:cy="12.621197"
+       sodipodi:rx="1.4735035"
+       sodipodi:ry="1.4288518"
+       d="M 13.663395,12.621197 A 1.4735035,1.4288518 0 1 1 10.716388,12.621197 A 1.4735035,1.4288518 0 1 1 13.663395,12.621197 z"
+       transform="matrix(0.5306128,0,0,0.6721944,12.374872,3.7350247)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 10.537782,17.086359 C 15.092248,21.015701 20.539745,17.175662 20.539745,17.175662"
+       id="path4066" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/cluster_stats_window.glade b/src/tools/gui_resources/cluster_stats_window.glade
new file mode 100644 (file)
index 0000000..88cea3b
--- /dev/null
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 2.8 -->
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="statsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <object class="GtkVBox" id="statsVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="clusterStatsInfoLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="clusterStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="clusterStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="clusterStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkHBox" id="clusterStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkButton" id="clusterStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="clusterStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="clusterStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/src/tools/gui_resources/down_osd.svg b/src/tools/gui_resources/down_osd.svg
new file mode 100644 (file)
index 0000000..53184a5
--- /dev/null
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg2383"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="out_osd.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2385">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective2391" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="7.2823362"
+     inkscape:cy="13.712442"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="989"
+     inkscape:window-height="719"
+     inkscape:window-x="100"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata2388">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path2397"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.625,0.6875)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 6.3406527,8.4863219 L 6.3406527,25.81115"
+       id="path2399" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 26.880397,8.4866719 L 26.880397,25.8115"
+       id="path3199" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path3205"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.6249998,18.012328)" />
+    <rect
+       style="fill:#00ffff"
+       id="rect3209"
+       width="19.543974"
+       height="6.4725599"
+       x="6.8263373"
+       y="19.174059" />
+    <path
+       style="fill:#cccccc"
+       d="M 15.273526,27.770004 C 11.299686,27.637867 7.872366,26.856295 6.9915854,25.881377 C 6.9273507,25.810276 6.8747945,25.730832 6.8747945,25.704834 C 6.8747945,25.662959 7.9864418,25.657565 16.615208,25.657565 C 21.972435,25.657565 26.355621,25.665374 26.355621,25.674919 C 26.355621,25.724606 26.253768,25.874516 26.160981,25.961394 C 25.604644,26.482303 24.201694,26.990077 22.424725,27.313669 C 20.316126,27.697653 17.843263,27.855451 15.273526,27.770003 L 15.273526,27.770004 z"
+       id="path3211" />
+    <path
+       style="fill:#cccccc"
+       d="M 6.843221,14.9068 L 6.843221,10.660169 L 7.9561856,10.660264 L 9.0691502,10.660358 L 9.511179,10.768521 C 12.573897,11.517963 17.19152,11.707721 21.035493,11.242107 C 21.927979,11.134002 23.067767,10.930343 23.772644,10.753028 L 24.141785,10.660169 L 25.248704,10.660169 L 26.355621,10.660169 L 26.355621,14.9068 L 26.355621,19.153431 L 16.599421,19.153431 L 6.843221,19.153431 L 6.843221,14.9068 z"
+       id="path3213" />
+    <path
+       style="fill:#cccccc"
+       d="M 14.562933,27.722982 C 11.326995,27.537172 8.6353059,26.966688 7.4276086,26.210701 C 7.1890805,26.061389 6.8874997,25.776785 6.9170843,25.728916 C 6.9615104,25.657033 26.324048,25.654726 26.324048,25.726605 C 26.324048,25.780756 26.06097,26.03727 25.886844,26.152901 C 24.791454,26.880307 22.330117,27.458208 19.393673,27.67744 C 18.006132,27.781033 15.916896,27.80073 14.562933,27.722983 L 14.562933,27.722982 z"
+       id="path3215" />
+    <path
+       style="fill:#cccccc"
+       d="M 6.843221,22.405498 L 6.843221,19.185005 L 16.599421,19.185005 L 26.355621,19.185005 L 26.355621,22.405498 L 26.355621,25.625991 L 16.599421,25.625991 L 6.843221,25.625991 L 6.843221,22.405498 z"
+       id="path3217" />
+    <path
+       style="fill:#00ffff"
+       d="M 7.316823,25.656311 C 7.0476592,25.646939 11.223644,25.636283 16.59679,25.632631 C 21.969935,25.628979 26.355745,25.636392 26.343032,25.649104 C 26.316676,25.675461 8.0653341,25.682374 7.316823,25.656311 L 7.316823,25.656311 z"
+       id="path3219" />
+    <path
+       style="fill:#cccccc"
+       d="M 15.003954,26.236028 C 14.92657,26.229416 14.595934,26.208668 14.269205,26.189921 C 11.272847,26.017996 8.5639285,25.41043 7.3907189,24.647187 C 7.135459,24.481126 6.8470319,24.191136 6.8918271,24.145595 C 6.9097659,24.127355 8.5349909,24.103493 10.955023,24.085935 L 14.988321,24.056672 L 10.900307,24.051141 L 6.8122945,24.04561 L 6.8122945,20.731251 L 6.8122945,17.416891 L 16.47345,17.416891 L 26.134606,17.416891 L 26.134606,20.731251 L 26.134606,24.04561 L 25.095016,24.050317 C 24.523241,24.052905 23.253456,24.064649 22.273271,24.076414 L 20.491116,24.097803 L 23.297228,24.1042 C 25.456715,24.109124 26.103341,24.11959 26.103341,24.149621 C 26.103341,24.220737 25.74451,24.552713 25.52101,24.68837 C 24.291386,25.434712 21.976225,25.954157 18.818391,26.192217 C 18.381637,26.225144 15.29188,26.26063 15.003954,26.236028 L 15.003954,26.236028 z"
+       id="path3221" />
+    <path
+       style="fill:#00ffff"
+       d="M 6.9557817,25.656508 C 6.7646254,25.647244 7.2660677,25.636588 8.0700981,25.632828 C 8.8741284,25.629068 9.52854,25.631186 9.52435,25.637535 C 9.510965,25.657808 7.3170063,25.674014 6.9557817,25.656508 L 6.9557817,25.656508 z"
+       id="path3223" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 6.8464444,10.220304 L 6.8464444,9.7804387 L 7.2332193,9.9776583 C 7.6338449,10.18194 8.1894851,10.399112 8.7289111,10.562248 L 9.0408001,10.656572 L 7.9436222,10.65837 L 6.8464444,10.660169 L 6.8464444,10.220304 z"
+       id="path3227" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.290783,10.623842 C 24.342879,10.606604 24.563104,10.535192 24.780172,10.465149 C 25.259094,10.310612 25.766836,10.101186 26.10633,9.9181537 L 26.358845,9.7820152 L 26.358845,10.221092 L 26.358845,10.660169 L 25.277454,10.657677 C 24.516214,10.655922 24.224106,10.645905 24.290783,10.623842 z"
+       id="path3229" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.722897,25.665521 C 25.012656,25.660315 25.49573,25.660306 25.796395,25.6655 C 26.09706,25.670694 25.859984,25.674953 25.26956,25.674965 C 24.679136,25.674976 24.433138,25.670726 24.722897,25.665521 L 24.722897,25.665521 z"
+       id="path3231" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 20.181712,27.627323 C 20.216442,27.62354 20.360299,27.607897 20.501393,27.592561 C 22.617756,27.36253 24.339627,26.956526 25.426774,26.431193 C 25.919083,26.193299 26.21332,25.968832 26.334008,25.739083 C 26.347353,25.71368 26.35827,25.687928 26.35827,25.681856 C 26.35827,25.672693 26.321727,25.670661 26.143176,25.669895 C 26.024874,25.669388 25.904994,25.666378 25.876775,25.663206 C 25.844523,25.659581 25.911951,25.656966 26.058322,25.656166 C 26.186392,25.655467 26.309825,25.652654 26.332617,25.649917 C 26.380266,25.644193 26.380801,25.645242 26.362207,25.707854 C 26.336163,25.795557 26.226288,25.931215 26.087248,26.047332 C 25.958274,26.155045 25.718181,26.30637 25.51368,26.408839 C 24.491701,26.920923 22.835817,27.328593 20.785554,27.572879 C 20.469382,27.610551 20.211759,27.63636 20.163141,27.635234 C 20.120413,27.634244 20.121182,27.633916 20.181712,27.627323 z"
+       id="path3233" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.914268,25.665247 C 25.924036,25.663366 25.940021,25.663366 25.949789,25.665247 C 25.959557,25.667129 25.951565,25.668668 25.932029,25.668668 C 25.912492,25.668668 25.9045,25.667129 25.914268,25.665247 L 25.914268,25.665247 z"
+       id="path3235" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.74822,25.657115 C 25.770853,25.655526 25.809925,25.655512 25.835047,25.657083 C 25.860168,25.658654 25.841649,25.659954 25.793895,25.659972 C 25.74614,25.65999 25.725586,25.658704 25.74822,25.657115 L 25.74822,25.657115 z"
+       id="path3237" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397529 L 26.366164,25.647138 L 26.226056,25.648917 L 26.085949,25.650696 L 26.226056,25.653046 L 26.366164,25.655395 L 26.366164,25.676455 C 26.366164,25.694996 26.364984,25.695956 26.356297,25.684475 C 26.348306,25.673913 26.326168,25.670592 26.23987,25.667007 C 26.039033,25.658664 24.491662,25.655046 24.223115,25.662292 C 24.018746,25.667806 24.123226,25.668597 24.661197,25.665607 C 25.407254,25.66146 26.350377,25.674721 26.350377,25.689357 C 26.350377,25.693634 26.338012,25.719629 26.322899,25.747123 C 26.28983,25.807285 26.292791,25.814386 26.326463,25.755672 C 26.339534,25.73288 26.350262,25.719671 26.350303,25.726319 C 26.350344,25.732966 26.337671,25.758719 26.322142,25.783545 C 26.294013,25.828516 26.281211,25.841129 26.290348,25.814872 C 26.293365,25.806201 26.289113,25.808404 26.278923,25.820792 C 26.269996,25.831645 26.242474,25.864619 26.217763,25.894066 C 26.121257,26.00907 25.910758,26.165899 25.681414,26.293663 C 25.632574,26.320872 25.592614,26.344847 25.592614,26.346943 C 25.592614,26.349039 25.619475,26.335926 25.652306,26.317803 C 25.685136,26.29968 25.713856,26.286711 25.716128,26.288982 C 25.726238,26.299093 25.388857,26.469926 25.201892,26.549366 C 24.978653,26.644218 24.728645,26.739172 24.714531,26.734467 C 24.710554,26.733141 24.758199,26.713113 24.820409,26.68996 C 24.969673,26.634407 25.128342,26.569467 25.124412,26.565538 C 25.122686,26.563811 25.092722,26.57462 25.057826,26.589556 C 24.874963,26.667824 24.44844,26.815793 24.146766,26.905618 C 23.884759,26.983633 23.408294,27.107145 23.182095,27.155685 C 23.146219,27.163384 23.139029,27.167136 23.150522,27.172162 C 23.161237,27.176847 23.158773,27.177657 23.141724,27.175055 C 23.107638,27.169851 22.949998,27.203302 22.96912,27.21168 C 22.979543,27.216246 22.976924,27.217052 22.960176,27.214433 C 22.92559,27.209025 22.798917,27.234533 22.818631,27.242937 C 22.828263,27.247042 22.820795,27.248003 22.798362,27.245544 C 22.770971,27.242542 22.766455,27.243486 22.778629,27.249669 C 22.791623,27.256268 22.789883,27.256998 22.768796,27.253793 C 22.754706,27.251652 22.660578,27.265532 22.559622,27.284638 C 21.835562,27.42167 21.017892,27.537138 20.181712,27.620439 C 20.029985,27.635554 19.96359,27.636168 18.474771,27.636216 L 16.925698,27.636266 L 16.925698,24.392093 z M 25.158479,26.554875 C 25.164991,26.550667 25.166767,26.547223 25.162425,26.547223 C 25.158084,26.547223 25.149204,26.550667 25.142692,26.554875 C 25.13618,26.559083 25.134404,26.562527 25.138745,26.562527 C 25.143087,26.562527 25.151967,26.559083 25.158479,26.554875 z M 25.205839,26.535142 C 25.216692,26.528937 25.22202,26.523861 25.217679,26.523861 C 25.213338,26.523861 25.200906,26.528937 25.190052,26.535142 C 25.179199,26.541346 25.173871,26.546422 25.178212,26.546422 C 25.182553,26.546422 25.194985,26.541346 25.205839,26.535142 z M 25.276879,26.503568 C 25.296415,26.493107 25.308847,26.484548 25.304506,26.484548 C 25.300165,26.484548 25.280629,26.493107 25.261092,26.503568 C 25.241556,26.514029 25.229124,26.522588 25.233466,26.522588 C 25.237807,26.522588 25.257343,26.514029 25.276879,26.503568 z M 25.3716,26.460155 C 25.386794,26.451836 25.395674,26.44503 25.391333,26.44503 C 25.386992,26.44503 25.371008,26.451836 25.355813,26.460155 C 25.340618,26.468473 25.331738,26.47528 25.336079,26.47528 C 25.340421,26.475279 25.356405,26.468473 25.3716,26.460155 z"
+       id="path3239" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397262 L 26.366164,25.646604 L 26.28131,25.649141 L 26.196456,25.651679 L 26.28131,25.653355 L 26.366164,25.655031 L 26.366043,25.676738 C 26.365975,25.688842 26.363357,25.694502 26.360123,25.689533 C 26.356651,25.684199 26.347396,25.69608 26.337066,25.719133 C 26.31838,25.760835 26.318928,25.771036 26.337969,25.735938 C 26.344653,25.723619 26.349881,25.719459 26.350061,25.726319 C 26.350491,25.742775 26.292885,25.833809 26.289143,25.822585 C 26.287502,25.817663 26.260158,25.844551 26.228377,25.882335 C 26.126925,26.00295 25.921451,26.16031 25.716934,26.274022 C 25.663866,26.303528 25.641609,26.321986 25.688067,26.297961 C 25.717482,26.28275 25.72685,26.287374 25.700971,26.304331 C 25.662356,26.329633 25.449444,26.43789 25.33299,26.491435 C 25.100904,26.598147 24.733288,26.740325 24.709214,26.732684 C 24.70213,26.730436 24.621828,26.753627 24.530765,26.784221 C 24.328449,26.852191 24.062521,26.932708 23.85338,26.989319 C 23.741524,27.019597 23.70092,27.033549 23.7113,27.038139 C 23.721452,27.042628 23.71858,27.043486 23.701771,27.040983 C 23.688536,27.039013 23.638808,27.047503 23.591263,27.05985 C 23.543719,27.072196 23.513699,27.082852 23.524552,27.083528 C 23.535405,27.084205 23.508928,27.093509 23.465714,27.104204 C 23.4225,27.114899 23.381937,27.121652 23.375574,27.119211 C 23.369211,27.116769 23.344591,27.119116 23.320863,27.124426 C 23.287147,27.131971 23.280972,27.135498 23.292602,27.140564 C 23.302502,27.144876 23.298235,27.145725 23.279858,27.143098 C 23.264663,27.140926 23.241575,27.142359 23.228551,27.146281 C 23.205877,27.153111 23.205709,27.153477 23.224604,27.1549 C 23.241369,27.156163 23.240182,27.157422 23.216711,27.163271 C 23.201516,27.167058 23.178428,27.168254 23.165404,27.165931 C 23.149673,27.163124 23.14525,27.164143 23.152227,27.168965 C 23.166088,27.178543 23.120857,27.188059 23.091619,27.181716 C 23.074958,27.178101 23.073101,27.178976 23.082523,27.185999 C 23.091671,27.192816 23.087184,27.19384 23.06279,27.190499 C 23.038339,27.18715 23.034778,27.187968 23.047003,27.194126 C 23.059108,27.200223 23.054505,27.201169 23.02727,27.198184 C 22.999878,27.195182 22.995362,27.196126 23.007536,27.202309 C 23.02045,27.208867 23.018584,27.209602 22.997277,27.206347 C 22.982952,27.204159 22.973126,27.205435 22.975443,27.209182 C 22.981221,27.218532 22.938193,27.226274 22.906896,27.221516 C 22.885792,27.218308 22.884042,27.219038 22.897029,27.225633 C 22.909203,27.231816 22.904688,27.23276 22.877296,27.229758 C 22.849904,27.226756 22.845389,27.2277 22.857563,27.233882 C 22.870477,27.240441 22.86861,27.241176 22.847303,27.237921 C 22.829256,27.235164 22.822941,27.236665 22.826738,27.242809 C 22.830632,27.249111 22.823324,27.250134 22.801477,27.246344 C 22.779426,27.242519 22.774083,27.243292 22.782576,27.249077 C 22.794908,27.257478 22.788646,27.258693 22.719429,27.261331 C 22.704234,27.26191 22.681146,27.263285 22.668122,27.264386 C 22.646916,27.266179 22.646091,27.26717 22.660228,27.273877 C 22.672493,27.279695 22.670063,27.280451 22.649338,27.277261 C 22.634666,27.275004 22.599264,27.277468 22.570668,27.282737 C 22.527521,27.290687 22.521987,27.293355 22.538144,27.29842 C 22.552245,27.30284 22.549181,27.303557 22.527029,27.301023 C 22.509746,27.299046 22.400138,27.31452 22.274998,27.336604 C 21.858929,27.410029 21.345967,27.486438 20.915795,27.539068 C 20.775719,27.556205 20.74146,27.562489 20.765821,27.566574 C 20.784472,27.569701 20.769934,27.570765 20.7303,27.569172 C 20.678496,27.567091 20.670402,27.568028 20.69478,27.573284 C 20.721172,27.578974 20.718111,27.579524 20.676132,27.576633 C 20.64851,27.574732 20.581022,27.578398 20.526158,27.584781 C 20.471294,27.591164 20.336294,27.605359 20.226156,27.616326 L 20.025906,27.636266 L 18.475802,27.636266 L 16.925698,27.636266 L 16.925698,24.392093 z M 23.194511,27.157272 C 23.188813,27.154992 23.182004,27.155272 23.179382,27.157895 C 23.176759,27.160518 23.181421,27.162384 23.189742,27.162041 C 23.198937,27.161662 23.200807,27.159792 23.194511,27.157272 z M 23.399738,27.109912 C 23.39404,27.107632 23.387232,27.107912 23.384609,27.110535 C 23.381986,27.113158 23.386648,27.115024 23.394969,27.114681 C 23.404165,27.114302 23.406035,27.112432 23.399738,27.109912 z M 23.431312,27.102019 C 23.425614,27.099738 23.418805,27.100019 23.416183,27.102642 C 23.41356,27.105265 23.418222,27.10713 23.426543,27.106787 C 23.435738,27.106409 23.437608,27.104538 23.431312,27.102019 z M 23.462885,27.094125 C 23.457187,27.091845 23.450379,27.092125 23.447756,27.094748 C 23.445133,27.097371 23.449795,27.099237 23.458116,27.098894 C 23.467312,27.098516 23.469182,27.096645 23.462885,27.094125 z M 23.494458,27.086232 C 23.48876,27.083952 23.481952,27.084232 23.47933,27.086855 C 23.476707,27.089478 23.481369,27.091343 23.48969,27.091001 C 23.498885,27.090622 23.500755,27.088752 23.494458,27.086232 z M 24.767757,26.707901 C 24.786775,26.699241 24.787552,26.698071 24.771704,26.701959 C 24.76085,26.704622 24.741314,26.711653 24.72829,26.717583 C 24.709272,26.726243 24.708495,26.727413 24.724344,26.723525 C 24.735197,26.720862 24.754733,26.713832 24.767757,26.707901 L 24.767757,26.707901 z M 24.842744,26.679837 C 24.850973,26.674753 24.848565,26.674132 24.834851,26.6778 C 24.823997,26.680703 24.809789,26.68637 24.803277,26.690394 C 24.795048,26.695478 24.797456,26.696099 24.811171,26.692431 C 24.822024,26.689528 24.836232,26.683861 24.842744,26.679837 L 24.842744,26.679837 z M 24.882211,26.665382 C 24.888723,26.661174 24.890499,26.657731 24.886158,26.657731 C 24.881816,26.65773 24.872936,26.661174 24.866424,26.665382 C 24.859912,26.669591 24.858136,26.673034 24.862477,26.673034 C 24.866819,26.673034 24.875699,26.669591 24.882211,26.665382 z M 24.945358,26.641702 C 24.95187,26.637494 24.953646,26.63405 24.949304,26.63405 C 24.944963,26.63405 24.936083,26.637494 24.929571,26.641702 C 24.923059,26.64591 24.921283,26.649354 24.925624,26.649354 C 24.929966,26.649354 24.938846,26.64591 24.945358,26.641702 z M 24.984825,26.625915 C 24.991337,26.621707 24.993113,26.618264 24.988771,26.618264 C 24.98443,26.618264 24.97555,26.621707 24.969038,26.625915 C 24.962526,26.630124 24.96075,26.633567 24.965091,26.633567 C 24.969433,26.633567 24.978313,26.630124 24.984825,26.625915 z M 25.024291,26.610129 C 25.030803,26.60592 25.032579,26.602477 25.028238,26.602477 C 25.023897,26.602477 25.015017,26.60592 25.008505,26.610129 C 25.001993,26.614337 25.000217,26.61778 25.004558,26.61778 C 25.008899,26.61778 25.017779,26.614337 25.024291,26.610129 z M 25.063758,26.594342 C 25.07027,26.590133 25.072046,26.58669 25.067705,26.58669 C 25.063364,26.58669 25.054484,26.590133 25.047972,26.594342 C 25.04146,26.59855 25.039684,26.601993 25.044025,26.601993 C 25.048366,26.601993 25.057246,26.59855 25.063758,26.594342 z M 25.28077,26.499712 C 25.283536,26.495237 25.280367,26.493914 25.273342,26.49661 C 25.259668,26.501857 25.257166,26.507515 25.26852,26.507515 C 25.272605,26.507515 25.278118,26.504003 25.28077,26.499712 L 25.28077,26.499712 z M 25.3716,26.460155 C 25.378112,26.455946 25.379888,26.452503 25.375546,26.452503 C 25.371205,26.452503 25.362325,26.455946 25.355813,26.460155 C 25.349301,26.464363 25.347525,26.467806 25.351866,26.467806 C 25.356207,26.467806 25.365088,26.464363 25.3716,26.460155 z M 26.22803,25.670086 C 26.048973,25.661085 24.702891,25.65364 24.530956,25.6607 C 24.425095,25.665046 24.560309,25.666361 24.941411,25.66469 C 25.253988,25.66332 25.632278,25.665349 25.782055,25.669198 C 25.931831,25.673047 26.118312,25.676071 26.196456,25.675919 L 26.338537,25.675641 L 26.22803,25.670086 z"
+       id="path3241" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.862962,25.665164 C 25.8749,25.663356 25.894436,25.663356 25.906375,25.665164 C 25.918314,25.666973 25.908546,25.668453 25.884668,25.668453 C 25.860791,25.668453 25.851023,25.666973 25.862962,25.665164 z"
+       id="path3243" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:0.00101476000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 14.86321,23.236009 L 14.86321,18.835391 L 20.614707,18.835391 L 26.366204,18.835391 L 26.366107,21.919465 C 26.366054,23.615706 26.362345,25.001017 26.357863,24.997934 C 26.353383,24.994851 26.344756,25.00445 26.338693,25.019264 C 26.325302,25.051981 26.324472,25.067262 26.337287,25.04519 C 26.343975,25.033666 26.346651,25.033062 26.346757,25.043045 C 26.347105,25.075912 26.274386,25.19939 26.260362,25.189742 C 26.256262,25.18692 26.247004,25.19299 26.239793,25.20323 C 26.227929,25.220077 26.228282,25.220451 26.243512,25.207155 C 26.25277,25.199073 26.260344,25.197279 26.260344,25.203167 C 26.260344,25.217104 26.236091,25.239462 26.229244,25.231839 C 26.226338,25.228604 26.205097,25.251005 26.18204,25.281619 C 26.093882,25.398679 25.934902,25.534464 25.609935,25.770258 C 25.594656,25.781343 25.594474,25.782394 25.608736,25.777142 C 25.676704,25.752113 25.549902,25.837474 25.344122,25.955274 C 25.059438,26.118241 24.719275,26.277148 24.333981,26.427161 C 24.151968,26.498027 24.102592,26.513747 24.134802,26.490575 C 24.158147,26.47378 24.148889,26.476619 23.942445,26.549559 C 23.834005,26.587875 23.719674,26.627271 23.688375,26.637109 C 23.647777,26.64987 23.636531,26.656971 23.649132,26.66189 C 23.662305,26.667035 23.655576,26.672282 23.622639,26.682547 C 23.598356,26.690116 23.573516,26.692887 23.567437,26.688705 C 23.561359,26.684525 23.512956,26.694605 23.459875,26.711107 C 23.394653,26.731385 23.369146,26.743398 23.381201,26.74816 C 23.395405,26.753771 23.39253,26.756814 23.367092,26.763095 C 23.349523,26.767433 23.332571,26.768115 23.329422,26.764611 C 23.326274,26.761106 23.331633,26.758238 23.341331,26.758238 C 23.351029,26.758238 23.356605,26.755612 23.353722,26.752403 C 23.350839,26.749194 23.327628,26.752412 23.302143,26.759557 C 23.267499,26.769267 23.260381,26.774331 23.273935,26.779623 C 23.298601,26.789254 23.098084,26.844931 23.066719,26.83716 C 23.04741,26.832375 23.045772,26.833574 23.057605,26.843828 C 23.06928,26.853946 23.067005,26.855109 23.045672,26.849931 C 23.013139,26.842034 22.920562,26.865687 22.945654,26.875484 C 22.955476,26.879319 22.906124,26.896714 22.827364,26.917175 C 22.753035,26.936485 22.687767,26.949219 22.682322,26.945474 C 22.676877,26.941728 22.658968,26.941953 22.642523,26.945973 C 22.624149,26.950466 22.61703,26.956316 22.624056,26.961149 C 22.639896,26.972046 22.488485,27.007213 22.466378,26.99777 C 22.454853,26.992846 22.450759,26.994167 22.454829,27.001496 C 22.46266,27.015602 22.403446,27.029276 22.379261,27.018944 C 22.366435,27.013466 22.364003,27.015225 22.369848,27.025754 C 22.376056,27.036936 22.370774,27.038462 22.344976,27.032941 C 22.320288,27.027658 22.315775,27.028762 22.32665,27.037424 C 22.337448,27.046027 22.331401,27.047269 22.302606,27.042366 C 22.273048,27.037332 22.267477,27.038581 22.27856,27.047756 C 22.290125,27.057328 22.287806,27.058778 22.266873,27.055063 C 22.25251,27.052513 22.239278,27.055378 22.237467,27.061429 C 22.235655,27.067479 22.212123,27.072801 22.185173,27.073256 C 22.156435,27.07374 22.140758,27.077767 22.147257,27.082997 C 22.153454,27.087985 22.141381,27.089298 22.119867,27.085977 C 22.091381,27.081583 22.08514,27.082959 22.095821,27.091282 C 22.107052,27.100034 22.104464,27.101497 22.084135,27.097888 C 22.069772,27.095339 22.056789,27.09653 22.055282,27.100537 C 22.050627,27.112908 21.900348,27.142066 21.869803,27.136526 C 21.846603,27.132317 21.843776,27.13371 21.855376,27.143637 C 21.866694,27.153323 21.861514,27.15457 21.831331,27.149432 C 21.802114,27.144455 21.79633,27.145703 21.807287,27.154615 C 21.818214,27.163505 21.811219,27.164909 21.778433,27.160401 C 21.745966,27.155939 21.739958,27.157109 21.754389,27.165086 C 21.768991,27.173159 21.763198,27.174448 21.730343,27.17044 C 21.702365,27.167026 21.693752,27.168323 21.705983,27.174108 C 21.72113,27.181273 21.716415,27.184325 21.682322,27.189415 C 21.658904,27.192911 21.626588,27.193594 21.610506,27.190932 C 21.585597,27.186807 21.584115,27.187736 21.600503,27.197206 C 21.616277,27.206321 21.61387,27.207316 21.587137,27.202732 C 21.568774,27.199584 21.444839,27.218364 21.303409,27.245721 C 21.026734,27.299242 20.537072,27.384556 20.282863,27.423533 C 20.161128,27.442197 20.126732,27.45058 20.148213,27.456347 C 20.168827,27.461882 20.164707,27.462725 20.133783,27.459303 C 20.109979,27.456669 20.029911,27.462773 19.955853,27.472867 C 19.848444,27.487508 19.828014,27.492785 19.854867,27.498946 C 19.879369,27.504568 19.874417,27.505441 19.836664,27.502154 C 19.808139,27.49967 19.758366,27.500946 19.726059,27.50499 C 19.670939,27.511889 19.669394,27.512814 19.70098,27.51999 C 19.721977,27.524759 19.707502,27.526176 19.66251,27.523756 C 19.607192,27.520781 19.598223,27.522067 19.624038,27.529271 C 19.650925,27.536778 19.645118,27.537837 19.595185,27.534537 C 19.558079,27.532084 19.542442,27.533686 19.556714,27.538479 C 19.589128,27.549361 19.466475,27.562662 19.39321,27.556208 C 19.353735,27.552732 19.348853,27.553604 19.373975,27.559644 C 19.397506,27.565304 19.37869,27.567826 19.311459,27.568025 C 19.25856,27.568181 19.113572,27.582223 18.989261,27.599226 L 18.763242,27.630141 L 16.813226,27.633383 L 14.86321,27.636628 L 14.86321,23.236009 z M 19.477183,27.543103 C 19.467825,27.540388 19.454841,27.540566 19.448329,27.5435 C 19.441818,27.546433 19.449475,27.548653 19.465344,27.548435 C 19.481214,27.548216 19.486541,27.545817 19.477183,27.543103 L 19.477183,27.543103 z M 22.549662,26.975762 C 22.54272,26.972669 22.534424,26.973049 22.531228,26.976607 C 22.528033,26.980165 22.533714,26.982694 22.543852,26.98223 C 22.555057,26.981716 22.557335,26.979179 22.549662,26.975762 z M 22.588135,26.965055 C 22.581192,26.961963 22.572897,26.962344 22.569701,26.9659 C 22.566504,26.969458 22.572185,26.971988 22.582324,26.971523 C 22.593528,26.97101 22.595808,26.968473 22.588135,26.965055 z M 22.713166,26.932935 C 22.706223,26.929843 22.697928,26.930222 22.694732,26.93378 C 22.691537,26.937338 22.697216,26.939869 22.707355,26.939404 C 22.718559,26.938891 22.720838,26.936353 22.713166,26.932935 z M 23.174822,26.804457 C 23.167879,26.801364 23.159584,26.801744 23.156388,26.805302 C 23.153191,26.80886 23.158872,26.811389 23.169011,26.810926 C 23.180216,26.810412 23.182495,26.807875 23.174822,26.804457 z M 23.235534,26.790357 C 23.24766,26.784558 23.249437,26.781156 23.240344,26.781156 C 23.232409,26.781156 23.217262,26.785296 23.206682,26.790357 C 23.194557,26.796157 23.192779,26.799559 23.201872,26.799559 C 23.209807,26.799559 23.224955,26.795418 23.235534,26.790357 z M 23.61063,26.672586 C 23.622755,26.666786 23.624533,26.663384 23.615439,26.663384 C 23.607504,26.663384 23.592356,26.667525 23.581776,26.672586 C 23.569653,26.678386 23.567876,26.681788 23.576969,26.681788 C 23.584903,26.681788 23.600051,26.677646 23.61063,26.672586 z M 25.587096,25.788745 C 25.587096,25.7858 25.574111,25.790866 25.558242,25.800002 C 25.542372,25.809137 25.529388,25.81902 25.529388,25.821965 C 25.529388,25.82491 25.542372,25.819843 25.558242,25.810708 C 25.574111,25.801573 25.587096,25.79169 25.587096,25.788745 L 25.587096,25.788745 z M 26.228735,24.973027 C 26.198126,24.970895 26.150516,24.970916 26.122939,24.973071 C 26.095361,24.975226 26.120404,24.976971 26.178592,24.976946 C 26.23678,24.976922 26.259344,24.975158 26.228735,24.973027 L 26.228735,24.973027 z M 25.911697,24.962248 C 25.849542,24.960384 25.747834,24.960384 25.685679,24.962248 C 25.623522,24.964113 25.674377,24.965639 25.798687,24.965639 C 25.922998,24.965639 25.973852,24.964113 25.911697,24.962248 z M 24.848926,24.951588 C 24.810576,24.949555 24.747819,24.949555 24.709468,24.951588 C 24.671117,24.95362 24.702496,24.955283 24.779197,24.955283 C 24.8559,24.955283 24.887278,24.95362 24.848926,24.951588 L 24.848926,24.951588 z M 26.330205,24.941295 C 26.318377,24.938753 26.296737,24.938688 26.282116,24.941149 C 26.267496,24.94361 26.277175,24.945688 26.303625,24.945769 C 26.330073,24.945849 26.342034,24.943835 26.330205,24.941295 L 26.330205,24.941295 z"
+       id="path3245" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 12.848775,27.619856 C 10.696878,27.386126 9.0250697,27.008859 7.9114743,26.505687 C 7.3412741,26.248045 6.9502443,25.953581 6.8626973,25.715909 C 6.8373638,25.647134 6.8383187,25.644618 6.8873101,25.651082 C 6.9101022,25.654089 7.1489752,25.658872 7.4181389,25.66171 L 7.9075276,25.666871 L 7.4931259,25.673007 C 7.0722205,25.679239 6.8893635,25.687314 6.8764376,25.70024 C 6.8671934,25.709484 6.8990931,25.769628 6.944627,25.828802 C 7.0008187,25.901828 7.1653628,26.052563 7.2721117,26.128804 C 7.6214041,26.378272 8.1390063,26.615616 8.7836912,26.821932 C 9.8543,27.164554 11.170036,27.420552 12.765707,27.596698 C 12.980199,27.620376 13.085534,27.634586 13.046109,27.634527 C 13.011378,27.634474 12.922578,27.627872 12.848775,27.619856 L 12.848775,27.619856 z"
+       id="path3247" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 7.8897675,25.664951 C 7.923413,25.663471 7.9784692,25.663471 8.0121147,25.664951 C 8.0457602,25.66643 8.0182321,25.667641 7.9509411,25.667641 C 7.8836502,25.667641 7.8561221,25.66643 7.8897675,25.664951 L 7.8897675,25.664951 z"
+       id="path3249" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#00ffff;stroke-width:0.00039063000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 8.1891765,26.622092 C 8.0158724,26.551424 7.9012315,26.500857 7.775114,26.439456 C 7.3056794,26.210909 6.9784811,25.958681 6.8793554,25.748942 C 6.8604997,25.709045 6.8459037,25.665422 6.8488454,25.657756 C 6.8505937,25.6532 6.860807,25.651938 6.8990148,25.651559 C 6.9254006,25.651297 6.9715983,25.649844 7.0016765,25.64833 C 7.0490679,25.645945 7.0411205,25.645488 6.9421061,25.6449 L 6.8278483,25.644223 L 6.8278483,24.536801 L 6.8278483,23.429379 L 8.9743327,23.429379 L 11.120817,23.429379 L 11.120817,25.034848 L 11.120817,26.640317 L 9.699613,26.640317 L 8.2784086,26.640317 L 8.191264,26.605128 C 7.7767222,26.437736 7.4215269,26.246672 7.205778,26.075024 C 7.1912761,26.063486 7.1794108,26.054987 7.1794108,26.056136 C 7.1794108,26.060154 7.2574677,26.120366 7.3063385,26.154048 C 7.5331887,26.310391 7.8447844,26.471289 8.181364,26.605882 C 8.2243327,26.623064 8.2602214,26.637841 8.2611166,26.63872 C 8.2620117,26.639598 8.2558594,26.640159 8.2474447,26.639965 C 8.2390299,26.639772 8.2128093,26.631729 8.1891765,26.622092 L 8.1891765,26.622092 z M 7.1755046,26.053031 C 7.1755046,26.05229 7.1715495,26.048335 7.1667155,26.044242 L 7.1579265,26.036801 L 7.1653679,26.04559 C 7.1723609,26.05385 7.1755046,26.056157 7.1755046,26.053031 L 7.1755046,26.053031 z M 7.0090626,25.897153 C 6.9646401,25.850887 6.921397,25.794898 6.8953494,25.749923 C 6.8884321,25.737979 6.8827192,25.729863 6.8826541,25.731886 C 6.8824658,25.737747 6.9132665,25.788187 6.9353961,25.818257 C 6.955002,25.844898 7.0216168,25.91766 7.026401,25.91766 C 7.0276947,25.91766 7.0198925,25.908432 7.0090626,25.897153 z M 6.8983177,25.697891 C 6.9078994,25.696167 6.9324382,25.693155 6.9528483,25.691198 L 6.9899577,25.68764 L 6.946989,25.689396 C 6.9233561,25.690362 6.8974284,25.69298 6.8893718,25.695215 C 6.8768915,25.698676 6.874781,25.70084 6.8751127,25.709836 L 6.8755021,25.720395 L 6.8781994,25.71071 C 6.880352,25.702981 6.8844138,25.700393 6.8983177,25.697891 L 6.8983177,25.697891 z M 7.047444,25.684307 C 7.0360926,25.683516 7.0185145,25.683524 7.0083815,25.684326 C 6.9982484,25.685127 7.0075358,25.685775 7.0290202,25.685765 C 7.0505046,25.685755 7.0587953,25.685099 7.047444,25.684307 L 7.047444,25.684307 z M 7.1528727,25.680381 C 7.1372026,25.679638 7.1125932,25.679643 7.0981852,25.680393 C 7.0837773,25.681142 7.0965983,25.68175 7.1266765,25.681744 C 7.1567546,25.681738 7.1685429,25.681125 7.1528727,25.680381 L 7.1528727,25.680381 z M 7.9450358,25.671591 C 8.1996257,25.669274 8.4896647,25.666975 8.5895671,25.666482 C 8.6894694,25.665989 8.5198405,25.665813 8.212614,25.66609 C 7.739063,25.666518 7.4526201,25.669676 7.2399577,25.676815 C 7.193965,25.67836 7.2332656,25.678068 7.9450358,25.671591 L 7.9450358,25.671591 z"
+       id="path3251" />
+    <path
+       style="fill:#cccccc;fill-opacity:1;stroke:#cccccc;stroke-width:0.00033541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 8.2977622,25.558384 C 7.6348501,25.395042 7.1541263,25.212335 6.949393,25.045916 C 6.9000173,25.00578 6.8429499,24.933011 6.8509382,24.920371 C 6.8528386,24.917364 6.8633054,24.916481 6.8997648,24.916251 C 6.925289,24.916091 6.9645739,24.915104 6.9870646,24.914061 C 7.0199272,24.912535 7.0083057,24.912079 6.9278787,24.91174 L 6.8278008,24.911317 L 6.8278008,24.170366 L 6.8278008,23.429416 L 9.1930827,23.429416 L 11.558365,23.429416 L 11.558365,24.503598 L 11.558365,25.57778 L 9.9919988,25.57778 L 8.4256326,25.57778 L 8.3100444,25.549304 C 8.2464707,25.533642 8.1568592,25.510708 8.1109075,25.498339 C 8.0324738,25.477227 8.0079986,25.471341 8.03304,25.479614 C 8.0532483,25.486291 8.2237101,25.530904 8.3146241,25.55331 C 8.3645358,25.565612 8.4061799,25.576149 8.4071664,25.576728 C 8.4081527,25.577306 8.4013733,25.577711 8.3921009,25.577627 C 8.3815622,25.577532 8.3461947,25.570318 8.2977622,25.558384 L 8.2977622,25.558384 z M 7.9227412,25.445911 C 7.8679952,25.429668 7.7943896,25.407325 7.7591729,25.396259 C 7.7239561,25.385194 7.6990165,25.378059 7.7037514,25.380405 C 7.714605,25.385782 8.0118976,25.475922 8.0178691,25.475646 C 8.0202943,25.475534 7.9774869,25.462153 7.9227411,25.445911 L 7.9227412,25.445911 z M 7.6843815,25.372666 C 7.6843815,25.371977 7.6766335,25.369013 7.6671638,25.366079 C 7.657694,25.363146 7.6499461,25.36133 7.6499461,25.362044 C 7.6499461,25.362757 7.6572099,25.365669 7.6660877,25.368516 C 7.6843513,25.37437 7.6843815,25.374377 7.6843815,25.372666 z M 7.6456417,25.359613 C 7.6456417,25.358931 7.6398307,25.356548 7.6327284,25.354318 C 7.6165399,25.349235 7.6155604,25.351443 7.6316523,25.356744 C 7.6451792,25.3612 7.6456417,25.361295 7.6456417,25.359613 L 7.6456417,25.359613 z M 7.6069019,25.34657 C 7.6069019,25.345901 7.6025436,25.344073 7.5972169,25.342505 C 7.5879167,25.339769 7.5878639,25.339817 7.5958874,25.34372 C 7.6046697,25.347992 7.6069019,25.34857 7.6069019,25.34657 L 7.6069019,25.34657 z M 7.5767708,25.336115 C 7.5767708,25.335447 7.5724127,25.333618 7.567086,25.332051 C 7.5577856,25.329314 7.5577329,25.329362 7.5657564,25.333266 C 7.5745387,25.337538 7.5767708,25.338115 7.5767708,25.336115 L 7.5767708,25.336115 z M 7.5552488,25.328275 C 7.5552488,25.327607 7.5508905,25.325778 7.5455638,25.32421 C 7.5362636,25.321473 7.5362108,25.321522 7.5442343,25.325425 C 7.5530166,25.329697 7.5552488,25.330274 7.5552488,25.328275 L 7.5552488,25.328275 z M 7.52727,25.317454 C 7.5162444,25.312294 7.5035957,25.308065 7.5035957,25.309539 C 7.5035957,25.310867 7.530532,25.32158 7.5337266,25.321522 C 7.5349104,25.3215 7.5320048,25.31967 7.52727,25.317454 L 7.52727,25.317454 z M 7.4992912,25.307366 C 7.4992912,25.306698 7.494933,25.304869 7.4896063,25.303301 C 7.480306,25.300565 7.4802532,25.300613 7.4882767,25.304516 C 7.4970589,25.308788 7.4992912,25.309366 7.4992912,25.307366 L 7.4992912,25.307366 z M 7.4694446,25.295735 C 7.4564365,25.289663 7.4310146,25.280754 7.436877,25.284321 C 7.4426523,25.287835 7.4748846,25.300755 7.4776922,25.300682 C 7.4789182,25.30065 7.4752068,25.298424 7.4694446,25.295735 L 7.4694446,25.295735 z M 7.4045938,25.270984 C 7.4045938,25.270431 7.3992672,25.268009 7.3927566,25.265602 L 7.3809196,25.261226 L 7.3910814,25.266608 C 7.4009976,25.271861 7.4045938,25.273026 7.4045938,25.270984 L 7.4045938,25.270984 z M 7.3701584,25.25631 C 7.3304169,25.23808 7.2576092,25.207102 7.2647,25.21144 C 7.2742547,25.217286 7.3753612,25.26153 7.3787673,25.261356 C 7.3799511,25.261295 7.376077,25.259024 7.3701584,25.25631 z M 7.253939,25.205664 C 7.253939,25.205122 7.2505492,25.203064 7.2464062,25.20109 C 7.2395791,25.197839 7.2394269,25.197932 7.244781,25.202077 C 7.2504042,25.206431 7.253939,25.207815 7.253939,25.205664 z M 7.0188851,25.075319 C 6.9940514,25.059393 6.9613175,25.035315 6.9398288,25.017167 C 6.9186809,24.999306 6.9084433,24.992459 6.9202909,25.004099 C 6.9423156,25.025737 7.0257138,25.086427 7.0334235,25.086427 C 7.0349536,25.086427 7.0284114,25.081428 7.0188851,25.075319 z M 6.9095849,24.989724 C 6.9070509,24.986849 6.904009,24.984497 6.9028253,24.984497 C 6.9016416,24.984497 6.9027464,24.986849 6.9052804,24.989724 C 6.9078144,24.992599 6.9108563,24.994951 6.91204,24.994951 C 6.9132237,24.994951 6.9121189,24.992599 6.9095849,24.989724 z M 6.9268026,24.944489 C 6.9327212,24.943842 6.9269363,24.943801 6.9139473,24.944398 C 6.9009583,24.944995 6.888618,24.946524 6.8865244,24.947795 C 6.8843187,24.949135 6.8897249,24.949173 6.8993797,24.947886 C 6.9085437,24.946665 6.920884,24.945136 6.9268026,24.944489 L 6.9268026,24.944489 z M 6.9706539,24.940894 C 6.9675467,24.940139 6.9638341,24.940232 6.9624038,24.941101 C 6.9609735,24.941969 6.9635158,24.942587 6.9680534,24.942473 C 6.9730677,24.942348 6.9740877,24.941728 6.9706539,24.940894 z M 7.6424133,24.930271 C 7.6086774,24.929829 7.5534732,24.929829 7.5197372,24.930271 C 7.4860013,24.930713 7.5136034,24.931074 7.5810753,24.931074 C 7.6485472,24.931074 7.6761493,24.930713 7.6424133,24.930271 L 7.6424133,24.930271 z M 8.3881552,24.92714 L 8.6033764,24.925399 L 8.4010684,24.92526 C 8.2897989,24.925183 8.0931944,24.925901 7.9641692,24.926856 L 7.729578,24.928592 L 7.9512559,24.928736 C 8.0731788,24.928816 8.2697834,24.928097 8.3881552,24.92714 L 8.3881552,24.92714 z"
+       id="path3253" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/failed_mds.svg b/src/tools/gui_resources/failed_mds.svg
new file mode 100644 (file)
index 0000000..e0f0a86
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg3327"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="failed_mds.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3329">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective3335" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.9180417"
+     inkscape:cx="-11.684466"
+     inkscape:cy="21.927714"
+     inkscape:current-layer="svg3327"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata3332">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 18.656491,25.047041 L 27.72077,19.956756 L 27.72077,19.956756 L 27.72077,19.956756"
+       id="path3461" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 18.745794,24.779131 L 18.745794,13.16971 L 18.745794,13.16971"
+       id="path3463" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 9.8154699,11.160387 L 18.879749,13.526923"
+       id="path3465" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 18.656579,13.526923 L 27.720858,8.4366372 L 27.720858,8.4366372 L 27.720858,8.4366372"
+       id="path3467" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 27.497512,8.0197056 L 27.497512,20.462992"
+       id="path3469" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 10.195009,11.160387 L 19.259288,6.0701016 L 19.259288,6.0701016 L 19.259288,6.0701016"
+       id="path3471" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 10.261986,23.200389 L 10.261986,11.220973 L 10.261986,11.220973"
+       id="path3473" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 9.8824473,22.524224 L 18.946726,24.89076"
+       id="path3475" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 18.934833,6.169838 L 27.487079,8.5601597"
+       id="path3477" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 19.287403,18.922886 L 19.287403,13.770547 L 23.090962,11.633509 C 25.182922,10.458139 26.911024,9.4897458 26.931189,9.4815255 C 26.951354,9.4733047 26.962749,11.790012 26.956507,14.629762 L 26.945156,19.792944 L 23.132939,21.934085 C 21.036223,23.111713 19.313228,24.075226 19.304065,24.075226 C 19.294899,24.075226 19.287403,21.756673 19.287403,18.922886 L 19.287403,18.922886 z"
+       id="path3479" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 14.476191,23.190934 L 10.803595,22.227498 L 10.803595,17.096228 L 10.803595,11.964955 L 10.926387,11.994404 C 11.194689,12.05875 17.762229,13.771129 17.981343,13.83387 L 18.215764,13.900993 L 18.215764,19.032762 C 18.215764,21.855234 18.200695,24.162243 18.182276,24.159449 C 18.163857,24.156654 16.496119,23.720823 14.476191,23.190933 L 14.476191,23.190934 z"
+       id="path3481" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 14.992359,11.982284 C 13.059856,11.474631 11.492584,11.046224 11.509532,11.030268 C 11.526481,11.014313 13.244667,10.044573 15.327725,8.8752922 L 19.115103,6.7493259 L 22.583613,7.7163058 C 24.491295,8.2481441 26.066515,8.6957838 26.084103,8.7110604 C 26.12934,8.7503543 18.753688,12.884321 18.61782,12.895824 C 18.55632,12.901031 16.924862,12.489938 14.992359,11.982285 L 14.992359,11.982284 z"
+       id="path3483" />
+  </g>
+  <path
+     style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+     d="M 4.293991,12.550747 L 15.281556,26.569364"
+     id="path3336" />
+  <path
+     style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+     d="M 4.0414033,26.569364 L 14.397499,13.182216"
+     id="path3338" />
+</svg>
diff --git a/src/tools/gui_resources/gui_monitor.build b/src/tools/gui_resources/gui_monitor.build
new file mode 100644 (file)
index 0000000..c22664a
--- /dev/null
@@ -0,0 +1,804 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkWindow" id="guiMonitorWindow">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Ceph Monitor</property>
+    <child>
+      <object class="GtkVBox" id="guiMonitorVBox">
+        <property name="visible">True</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkMenuBar" id="guiMonitorMenuBar">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorFileMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_File</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorFileMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorQuitImageMenuItem">
+                        <property name="label">gtk-quit</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorEditMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Edit</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorEditMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorCopyImageMenuItem">
+                        <property name="label">gtk-copy</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorCephMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Ceph</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorCephMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkMenuItem" id="guiMonitorSendCommandMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Send Command...</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="guiMonitorViewNodeMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_View Node...</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorHelpMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Help</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorHelpMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorAboutImageMenuItem">
+                        <property name="label">gtk-about</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTable" id="guiMonitorCephInfoTable">
+            <property name="visible">True</property>
+            <property name="n_rows">2</property>
+            <property name="n_columns">2</property>
+            <child>
+              <object class="GtkVBox" id="guiMonitorPGClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorPGClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Placement Groups:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorPGClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorPGClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorPGClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorPGClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterStatsButton">
+                        <property name="label" translatable="yes">Placement Group Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorMonitorClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMonitorClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Monitors:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMonitorClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorMonitorClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkTreeView" id="guiMonitorMonitorClusterTreeView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="rules_hint">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="guiMonitorMonitorClusterStatsButton">
+                    <property name="label" translatable="yes">Monitor Cluster Stats...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorOSDClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorOSDClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">OSDs:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorOSDClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorOSDClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorOSDClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorOSDClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterStatsButton">
+                        <property name="label" translatable="yes">OSD Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorMDSClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMDSClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Metadata Servers:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMDSClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorMDSClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorMDSClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorMDSClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterStatsButton">
+                        <property name="label" translatable="yes">Metadata Server Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="guiMonitorLogVBox">
+            <property name="visible">True</property>
+            <property name="border_width">5</property>
+            <child>
+              <object class="GtkLabel" id="guiMonitorLogLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Log:</property>
+                <property name="justify">fill</property>
+                <property name="wrap_mode">word-char</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="guiMonitorLogScrolledWindow">
+                <property name="height_request">70</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="guiMonitorLogTextView">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                    <property name="wrap_mode">word</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkStatusbar" id="guiMonitorStatusbar">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkAboutDialog" id="guiMonitorAboutDialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">About Ceph Monitor</property>
+    <property name="resizable">False</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="icon_name">monitor</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="program_name">Ceph Monitor</property>
+    <property name="version">0.1</property>
+    <property name="copyright" translatable="yes">(c) 2009 Michael McThrow
+All rights reserved</property>
+    <property name="comments" translatable="yes">Monitoring tool for the Ceph distributed file system</property>
+    <property name="website">http://ceph.newdream.net</property>
+    <property name="website_label" translatable="yes">Ceph website</property>
+    <property name="authors">Author: Michael McThrow
+Based on code written by Sage Weil and other contributors.</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="guiMonitorAboutVBox">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="guiMonitorAboutButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkDialog" id="viewNodeDialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">View Node...</property>
+    <property name="modal">True</property>
+    <property name="window_position">center</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="viewNodeMainVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkVBox" id="viewNodeOptionVBox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="viewNodeWhichNodeLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Which node would you like to view?</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="viewNodeTypeHBox">
+                <property name="visible">True</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkLabel" id="viewNodeTypeLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">_Type of Node</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">viewNodeTypeComboBox</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="viewNodeTypeComboBox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="has_focus">True</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="text"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="viewNodeNameHBox">
+                <property name="visible">True</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkLabel" id="viewNodeNameLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">_Node ID</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">viewNodeNameEntry</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="viewNodeNameEntry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x25CF;</property>
+                    <property name="caps_lock_warning">False</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">5</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="viewNodeHButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="viewNodeCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="viewNodeOkButton">
+                <property name="label" translatable="yes">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">viewNodeCancelButton</action-widget>
+      <action-widget response="-5">viewNodeOkButton</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkDialog" id="sendCommandDialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Send Command...</property>
+    <property name="modal">True</property>
+    <property name="default_width">400</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="sendCommandMainVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVBox" id="sendCommandAreaVBox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="sendCommandPromptLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">_Please enter a Ceph command:</property>
+                <property name="use_underline">True</property>
+                <property name="mnemonic_widget">sendCommandPromptEntry</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="sendCommandPromptEntry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="has_focus">True</property>
+                <property name="invisible_char">&#x25CF;</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">5</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="sendCommandHButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="sendCommandCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="sendCommandRunButton">
+                <property name="label" translatable="yes">_Run</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">sendCommandCancelButton</action-widget>
+      <action-widget response="-5">sendCommandRunButton</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/src/tools/gui_resources/gui_monitor.glade b/src/tools/gui_resources/gui_monitor.glade
new file mode 100644 (file)
index 0000000..dae0e8d
--- /dev/null
@@ -0,0 +1,970 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkListStore" id="viewNodeNodeTypeListStore">
+    <columns>
+      <!-- column-name viewNodeNodeType -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">OSD</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Metadata server</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Placement group</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Monitor</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkWindow" id="guiMonitorWindow">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Ceph Monitor</property>
+    <child>
+      <object class="GtkVBox" id="guiMonitorVBox">
+        <property name="visible">True</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkMenuBar" id="guiMonitorMenuBar">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorFileMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_File</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorFileMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorQuitImageMenuItem">
+                        <property name="label">gtk-quit</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorEditMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Edit</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorEditMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorCopyImageMenuItem">
+                        <property name="label">gtk-copy</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorCephMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Ceph</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorCephMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkMenuItem" id="guiMonitorSendCommandMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Send Command...</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="guiMonitorViewNodeMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_View Node...</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="guiMonitorHelpMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Help</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="guiMonitorHelpMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkImageMenuItem" id="guiMonitorAboutImageMenuItem">
+                        <property name="label">gtk-about</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTable" id="guiMonitorCephInfoTable">
+            <property name="visible">True</property>
+            <property name="n_rows">2</property>
+            <property name="n_columns">2</property>
+            <child>
+              <object class="GtkVBox" id="guiMonitorPGClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorPGClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Placement Groups:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorPGClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorPGClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorPGClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorPGClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorPGClusterStatsButton">
+                        <property name="label" translatable="yes">Placement Group Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorMonitorClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMonitorClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Monitors:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMonitorClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorMonitorClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkTreeView" id="guiMonitorMonitorClusterTreeView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="guiMonitorMonitorClusterStatsButton">
+                    <property name="label" translatable="yes">Monitor Cluster Stats...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorOSDClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorOSDClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">OSDs:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorOSDClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorOSDClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorOSDClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorOSDClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorOSDClusterStatsButton">
+                        <property name="label" translatable="yes">OSD Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkVBox" id="guiMonitorMDSClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMDSClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Metadata Servers:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="guiMonitorMDSClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="guiMonitorMDSClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkIconView" id="guiMonitorMDSClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkHBox" id="guiMonitorMDSClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="guiMonitorMDSClusterStatsButton">
+                        <property name="label" translatable="yes">Metadata Server Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="guiMonitorLogVBox">
+            <property name="visible">True</property>
+            <property name="border_width">5</property>
+            <child>
+              <object class="GtkLabel" id="guiMonitorLogLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Log:</property>
+                <property name="justify">fill</property>
+                <property name="wrap_mode">word-char</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="guiMonitorLogScrolledWindow">
+                <property name="height_request">70</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="guiMonitorLogTextView">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkStatusbar" id="guiMonitorStatusbar">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkAboutDialog" id="guiMonitorAboutDialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">About Ceph Monitor</property>
+    <property name="resizable">False</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="icon_name">monitor</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="program_name">Ceph Monitor</property>
+    <property name="version">0.1</property>
+    <property name="copyright" translatable="yes">(c) 2009 Michael McThrow
+All rights reserved</property>
+    <property name="comments" translatable="yes">Monitoring tool for the Ceph distributed file system</property>
+    <property name="website">http://ceph.newdream.net</property>
+    <property name="website_label" translatable="yes">Ceph website</property>
+    <property name="authors">Main Author: Michael McThrow
+Portions of the code for the Ceph Monitor were written by Sage Weil and other contributors of the Ceph distributed file system.</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="guiMonitorAboutVBox">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="guiMonitorAboutButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkWindow" id="clusterStatsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <object class="GtkVBox" id="clusterStatsVBox">
+        <property name="visible">True</property>
+        <child>
+          <object class="GtkLabel" id="clusterStatsInfoLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="clusterStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="clusterStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="clusterStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkHBox" id="clusterStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkButton" id="clusterStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="clusterStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="clusterStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkWindow" id="nodeStatsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <object class="GtkVBox" id="nodeStatsVBox">
+        <property name="visible">True</property>
+        <child>
+          <object class="GtkLabel" id="nodeStatsLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="nodeStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="nodeStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="nodeStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkHBox" id="nodeStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkButton" id="nodeStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nodeStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nodeStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkFileChooserDialog" id="saveFileChooserDialog">
+    <property name="border_width">5</property>
+    <property name="type">popup</property>
+    <property name="title" translatable="yes">Save File</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="action">save</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="saveVBox">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="saveActionsHButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="saveCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="saveSaveButton">
+                <property name="label" translatable="yes">gtk-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">saveCancelButton</action-widget>
+      <action-widget response="-5">saveSaveButton</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkDialog" id="viewNodeDialog">
+    <property name="border_width">5</property>
+    <property name="modal">True</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="viewNodeMainVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkVBox" id="viewNodeOptionVBox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="viewNodeWhichNodeLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Which node would you like to view?</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="viewNodeTypeHBox">
+                <property name="visible">True</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkLabel" id="viewNodeTypeLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Type of Node</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="viewNodeTypeComboBox">
+                    <property name="visible">True</property>
+                    <property name="model">viewNodeNodeTypeListStore</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="viewNodeNameHBox">
+                <property name="visible">True</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkLabel" id="viewNodeNameLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Node Name</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="viewNodeNameEntry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x25CF;</property>
+                    <property name="caps_lock_warning">False</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">5</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="viewNodeHButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="viewNodeCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="viewNodeOkButton">
+                <property name="label" translatable="yes">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="5">viewNodeCancelButton</action-widget>
+      <action-widget response="4">viewNodeOkButton</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/src/tools/gui_resources/gui_monitor_old.glade b/src/tools/gui_resources/gui_monitor_old.glade
new file mode 100644 (file)
index 0000000..6e868a0
--- /dev/null
@@ -0,0 +1,1027 @@
+<?xml version="1.0"?>
+<glade-interface>
+  <!-- interface-requires gtk+ 2.16 -->
+  <!-- interface-naming-policy toplevel-contextual -->
+  <widget class="GtkWindow" id="guiMonitorWindow">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Ceph Monitor</property>
+    <child>
+      <widget class="GtkVBox" id="guiMonitorVBox">
+        <property name="visible">True</property>
+        <property name="spacing">10</property>
+        <child>
+          <widget class="GtkMenuBar" id="guiMonitorMenuBar">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkMenuItem" id="guiMonitorFileMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_File</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="guiMonitorFileMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="guiMonitorQuitImageMenuItem">
+                        <property name="label">gtk-quit</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="guiMonitorEditMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Edit</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="guiMonitorEditMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="guiMonitorCopyImageMenuItem">
+                        <property name="label">gtk-copy</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="guiMonitorCephMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Ceph</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="guiMonitorCephMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkMenuItem" id="guiMonitorSendCommandMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Send Command...</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkMenuItem" id="guiMonitorViewNodeMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_View Node...</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="guiMonitorHelpMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Help</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="guiMonitorHelpMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="guiMonitorAboutImageMenuItem">
+                        <property name="label">gtk-about</property>
+                        <property name="visible">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkTable" id="guiMonitorCephInfoTable">
+            <property name="visible">True</property>
+            <property name="n_rows">2</property>
+            <property name="n_columns">2</property>
+            <child>
+              <widget class="GtkVBox" id="guiMonitorPGClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorPGClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Placement Groups:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorPGClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="guiMonitorPGClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <widget class="GtkIconView" id="guiMonitorPGClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="guiMonitorPGClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorPGClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorPGClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorPGClusterStatsButton">
+                        <property name="label" translatable="yes">Placement Group Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="guiMonitorMonitorClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorMonitorClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Monitors:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorMonitorClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="guiMonitorMonitorClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <widget class="GtkTreeView" id="guiMonitorMonitorClusterTreeView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="guiMonitorMonitorClusterStatsButton">
+                    <property name="label" translatable="yes">Monitor Cluster Stats...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="guiMonitorOSDClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorOSDClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">OSDs:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorOSDClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="guiMonitorOSDClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <widget class="GtkIconView" id="guiMonitorOSDClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="guiMonitorOSDClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorOSDClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorOSDClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorOSDClusterStatsButton">
+                        <property name="label" translatable="yes">OSD Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="guiMonitorMDSClusterVBox">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorMDSClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Metadata Servers:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="guiMonitorMDSClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="guiMonitorMDSClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <widget class="GtkIconView" id="guiMonitorMDSClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="guiMonitorMDSClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorMDSClusterBackButton">
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorMDSClusterViewAllButton">
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="guiMonitorMDSClusterStatsButton">
+                        <property name="label" translatable="yes">Metadata Server Cluster Stats...</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkVBox" id="guiMonitorLogVBox">
+            <property name="visible">True</property>
+            <property name="border_width">5</property>
+            <child>
+              <widget class="GtkLabel" id="guiMonitorLogLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Log:</property>
+                <property name="justify">fill</property>
+                <property name="wrap_mode">word-char</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkScrolledWindow" id="guiMonitorLogScrolledWindow">
+                <property name="height_request">70</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <widget class="GtkTextView" id="guiMonitorLogTextView">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkStatusbar" id="guiMonitorStatusbar">
+            <property name="visible">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkAboutDialog" id="guiMonitorAboutDialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">About Ceph Monitor</property>
+    <property name="resizable">False</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="icon_name">monitor</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="program_name">Ceph Monitor</property>
+    <property name="version">0.1</property>
+    <property name="copyright" translatable="yes">(c) 2009 Michael McThrow
+All rights reserved</property>
+    <property name="comments" translatable="yes">Monitoring tool for the Ceph distributed file system</property>
+    <property name="website">http://ceph.newdream.net</property>
+    <property name="website_label" translatable="yes">Ceph website</property>
+    <property name="authors">Main Author: Michael McThrow
+Portions of the code for the Ceph Monitor were written by Sage Weil and other contributors of the Ceph distributed file system.</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="guiMonitorAboutVBox">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="guiMonitorAboutButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkWindow" id="viewNodeWindow">
+    <property name="border_width">5</property>
+    <property name="type">popup</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <widget class="GtkVBox" id="viewNodeVBox">
+        <property name="visible">True</property>
+        <property name="spacing">5</property>
+        <child>
+          <widget class="GtkLabel" id="viewNodeInstructionsLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="label" translatable="yes">Which node would you like to view?</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkTable" id="viewNodeInputTable">
+            <property name="visible">True</property>
+            <property name="n_rows">2</property>
+            <property name="n_columns">2</property>
+            <property name="column_spacing">160</property>
+            <child>
+              <widget class="GtkComboBox" id="viewNodeTypeComboBox">
+                <property name="visible">True</property>
+                <property name="items" translatable="yes">Metadata Server
+Monitor
+OSD
+Placement Group</property>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="viewNodeTypeLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Type of Node</property>
+              </widget>
+              <packing>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="viewNodeNameLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Name or Number</property>
+              </widget>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkEntry" id="viewNodeNameEntry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="viewNodeBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="viewNodeButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkButton" id="viewNodeCancelButton">
+                    <property name="label" translatable="yes">gtk-cancel</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="viewNodeOkButton">
+                    <property name="label" translatable="yes">gtk-ok</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkWindow" id="sendCommandWindow">
+    <property name="border_width">5</property>
+    <property name="type">popup</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <widget class="GtkVBox" id="sendCommandVBox">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkLabel" id="sendCommandInstructionsLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+            <property name="label" translatable="yes">Ceph command to run:</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkEntry" id="sendCommandPromptEntry">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="sendCommandBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="sendCommandButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkButton" id="sendCommandCancelButton">
+                    <property name="label" translatable="yes">gtk-cancel</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="sendCommandRunButton">
+                    <property name="label" translatable="yes">Run</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkWindow" id="clusterStatsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <widget class="GtkVBox" id="clusterStatsVBox">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkLabel" id="clusterStatsInfoLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkScrolledWindow" id="clusterStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <widget class="GtkTreeView" id="clusterStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="clusterStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="clusterStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkButton" id="clusterStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="clusterStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="clusterStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkWindow" id="nodeStatsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <widget class="GtkVBox" id="nodeStatsVBox">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkLabel" id="nodeStatsLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkScrolledWindow" id="nodeStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <widget class="GtkTreeView" id="nodeStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="nodeStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="nodeStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkButton" id="nodeStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="nodeStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkButton" id="nodeStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkFileChooserDialog" id="saveFileChooserDialog">
+    <property name="border_width">5</property>
+    <property name="type">popup</property>
+    <property name="title" translatable="yes">Save File</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="action">save</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="saveVBox">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="saveActionsHButtonBox">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <widget class="GtkButton" id="saveCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="response_id">-6</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkButton" id="saveSaveButton">
+                <property name="label" translatable="yes">gtk-save</property>
+                <property name="response_id">-5</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/src/tools/gui_resources/main-window.glade b/src/tools/gui_resources/main-window.glade
new file mode 100644 (file)
index 0000000..b64b165
--- /dev/null
@@ -0,0 +1,591 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.5 on Mon Nov  2 05:39:40 2009 -->
+<glade-interface>
+  <widget class="GtkWindow" id="guiMonitorWindow">
+    <property name="title" translatable="yes">Ceph Monitor</property>
+    <child>
+      <widget class="GtkVBox" id="mainVBox">
+        <property name="visible">True</property>
+        <property name="spacing">10</property>
+        <child>
+          <widget class="GtkMenuBar" id="menuBar">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkMenuItem" id="fileMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_File</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="fileMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="quitImageMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">gtk-quit</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="editMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Edit</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="cephMenu">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="imagemenuitem7">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">gtk-copy</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="cephMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Ceph</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="cephMen">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkMenuItem" id="sendCommandMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Send Command...</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkMenuItem" id="viewNodeMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_View Node...</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="helpMenuItem">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Help</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="menu3">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="aboutMenuItem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">gtk-about</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkTable" id="cephInfoTable">
+            <property name="visible">True</property>
+            <property name="n_rows">3</property>
+            <property name="n_columns">2</property>
+            <property name="column_spacing">20</property>
+            <property name="row_spacing">20</property>
+            <child>
+              <widget class="GtkVBox" id="monitorClusterVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="monitorClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Monitors:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="monitorClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="monitorClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkIconView" id="monitorClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="monitorClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="monitorClusterBackButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="monitorClusterViewAllButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="PGClusterVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="PGClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Placement Groups:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="PGClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="PGClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkIconView" id="PGClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="PGClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="PGClusterBackButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="PGClusterViewAllButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="clientsVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="clientsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Clients:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="clientsStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="clientsScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkIconView" id="clientsIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="clientsButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="clientsBackButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="clientsViewAllButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="MDSClusterVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="MDSClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Metadata Servers:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="MDSClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="MDSClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkIconView" id="MDSClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="MDSClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="MDSClusterBackButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="MDSClusterViewAllButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="OSDClusterVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="OSDClusterLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">OSDs:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="OSDClusterStatsLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="OSDClusterScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkIconView" id="OSDClusterIconView">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="OSDClusterButtonHBox">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkButton" id="OSDClusterBackButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">Back</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="OSDClusterViewAllButton">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="label" translatable="yes">View All</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="summaryVBox">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkLabel" id="summaryLabel">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0</property>
+                    <property name="label" translatable="yes">Summary:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkVBox" id="logVBox">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkLabel" id="logLabel">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+                <property name="label" translatable="yes">Log:</property>
+                <property name="justify">GTK_JUSTIFY_FILL</property>
+                <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkScrolledWindow" id="logScrolledWindow">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                <child>
+                  <widget class="GtkTextView" id="logTextView">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkWindow" id="window1">
+    <child>
+      <placeholder/>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/src/tools/gui_resources/mds.svg b/src/tools/gui_resources/mds.svg
new file mode 100644 (file)
index 0000000..e00211f
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg3327"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="mds.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3329">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective3335" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.395604"
+     inkscape:cx="16"
+     inkscape:cy="18.74316"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata3332">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 14.109912,23.784102 L 23.174191,18.693817 L 23.174191,18.693817 L 23.174191,18.693817"
+       id="path3461" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 14.199215,23.516192 L 14.199215,11.906771 L 14.199215,11.906771"
+       id="path3463" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 5.2688912,9.8974481 L 14.33317,12.263984"
+       id="path3465" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 14.11,12.263984 L 23.174279,7.1736987 L 23.174279,7.1736987 L 23.174279,7.1736987"
+       id="path3467" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 22.950933,6.7567671 L 22.950933,19.200053"
+       id="path3469" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 5.6484299,9.8974484 L 14.712709,4.8071631 L 14.712709,4.8071631 L 14.712709,4.8071631"
+       id="path3471" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 5.7154074,21.93745 L 5.7154074,9.9580345 L 5.7154074,9.9580345"
+       id="path3473" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 5.3358686,21.261285 L 14.400147,23.627821"
+       id="path3475" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 14.388254,4.9068995 L 22.9405,7.2972212"
+       id="path3477" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 14.740824,17.659947 L 14.740824,12.507608 L 18.544383,10.37057 C 20.636343,9.1952001 22.364445,8.2268073 22.38461,8.218587 C 22.404775,8.2103662 22.41617,10.527073 22.409928,13.366823 L 22.398577,18.530005 L 18.58636,20.671146 C 16.489644,21.848774 14.766649,22.812287 14.757486,22.812287 C 14.74832,22.812287 14.740824,20.493734 14.740824,17.659947 L 14.740824,17.659947 z"
+       id="path3479" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 9.9296123,21.927995 L 6.2570165,20.964559 L 6.2570165,15.833289 L 6.2570165,10.702016 L 6.3798085,10.731465 C 6.6481098,10.795811 13.21565,12.50819 13.434764,12.570931 L 13.669185,12.638054 L 13.669185,17.769823 C 13.669185,20.592295 13.654116,22.899304 13.635697,22.89651 C 13.617278,22.893715 11.94954,22.457884 9.9296123,21.927994 L 9.9296123,21.927995 z"
+       id="path3481" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 10.44578,10.719345 C 8.5132772,10.211692 6.9460053,9.7832851 6.9629537,9.7673293 C 6.9799021,9.7513744 8.6980884,8.7816345 10.781146,7.6123537 L 14.568524,5.4863874 L 18.037034,6.4533673 C 19.944716,6.9852056 21.519936,7.4328453 21.537524,7.4481219 C 21.582761,7.4874158 14.207109,11.621382 14.071241,11.632885 C 14.009741,11.638092 12.378283,11.226999 10.44578,10.719346 L 10.44578,10.719345 z"
+       id="path3483" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/monitor.svg b/src/tools/gui_resources/monitor.svg
new file mode 100644 (file)
index 0000000..55fd2ea
--- /dev/null
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg4068"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="monitor.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4070">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective4076" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="0.10402327"
+     inkscape:cy="16"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata4073">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect4629"
+       width="28.041218"
+       height="27.416094"
+       x="1.9646713"
+       y="2.0834146" />
+    <rect
+       style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.96407133000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect4631"
+       width="22.004526"
+       height="21.379402"
+       x="4.983017"
+       y="5.5482764" />
+    <path
+       style="opacity:1;fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.08930324;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 2.4794895,15.776742 L 2.4794895,2.604514 L 15.964279,2.604514 L 29.449068,2.604514 L 29.449068,15.776742 L 29.449068,28.94897 L 15.964279,28.94897 L 2.4794895,28.94897 L 2.4794895,15.776742 z M 27.484397,16.223258 L 27.484397,5.0157015 L 15.964279,5.0157015 L 4.4441607,5.0157015 L 4.4441607,16.223258 L 4.4441607,27.430815 L 15.964279,27.430815 L 27.484397,27.430815 L 27.484397,16.223258 z"
+       id="path4633" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00f00f;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.94117647"
+       d="M 4.465162,18.515211 L 10.805692,8.4239446"
+       id="path4639" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 10.805692,8.6918543 L 16.342493,22.980373"
+       id="path4641" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 16.25319,22.89107 L 20.986261,13.24632 L 27.416095,18.068695 L 27.416095,18.068695"
+       id="path4643" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/node_stats_window.glade b/src/tools/gui_resources/node_stats_window.glade
new file mode 100644 (file)
index 0000000..9cedae9
--- /dev/null
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 2.8 -->
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="nodeStatsWindow">
+    <property name="border_width">5</property>
+    <child>
+      <object class="GtkVBox" id="nodeStatsVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="nodeStatsLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="nodeStatsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="nodeStatsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="nodeStatsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkHBox" id="nodeStatsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkButton" id="nodeStatsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nodeStatsSaveButton">
+                    <property name="label" translatable="yes">gtk-save-as</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="nodeStatsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/src/tools/gui_resources/osd.svg b/src/tools/gui_resources/osd.svg
new file mode 100644 (file)
index 0000000..225661a
--- /dev/null
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg2383"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="osd.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2385">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective2391" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="7.2823362"
+     inkscape:cy="13.712442"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="989"
+     inkscape:window-height="719"
+     inkscape:window-x="100"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata2388">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path2397"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.625,0.6875)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 6.3406527,8.4863219 L 6.3406527,25.81115"
+       id="path2399" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 26.880397,8.4866719 L 26.880397,25.8115"
+       id="path3199" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path3205"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.6249998,18.012328)" />
+    <rect
+       style="fill:#00ffff"
+       id="rect3209"
+       width="19.543974"
+       height="6.4725599"
+       x="6.8263373"
+       y="19.174059" />
+    <path
+       style="fill:#00ffff"
+       d="M 15.273526,27.770004 C 11.299686,27.637867 7.872366,26.856295 6.9915854,25.881377 C 6.9273507,25.810276 6.8747945,25.730832 6.8747945,25.704834 C 6.8747945,25.662959 7.9864418,25.657565 16.615208,25.657565 C 21.972435,25.657565 26.355621,25.665374 26.355621,25.674919 C 26.355621,25.724606 26.253768,25.874516 26.160981,25.961394 C 25.604644,26.482303 24.201694,26.990077 22.424725,27.313669 C 20.316126,27.697653 17.843263,27.855451 15.273526,27.770003 L 15.273526,27.770004 z"
+       id="path3211" />
+    <path
+       style="fill:#00ffff"
+       d="M 6.843221,14.9068 L 6.843221,10.660169 L 7.9561856,10.660264 L 9.0691502,10.660358 L 9.511179,10.768521 C 12.573897,11.517963 17.19152,11.707721 21.035493,11.242107 C 21.927979,11.134002 23.067767,10.930343 23.772644,10.753028 L 24.141785,10.660169 L 25.248704,10.660169 L 26.355621,10.660169 L 26.355621,14.9068 L 26.355621,19.153431 L 16.599421,19.153431 L 6.843221,19.153431 L 6.843221,14.9068 z"
+       id="path3213" />
+    <path
+       style="fill:#00ffff"
+       d="M 14.562933,27.722982 C 11.326995,27.537172 8.6353059,26.966688 7.4276086,26.210701 C 7.1890805,26.061389 6.8874997,25.776785 6.9170843,25.728916 C 6.9615104,25.657033 26.324048,25.654726 26.324048,25.726605 C 26.324048,25.780756 26.06097,26.03727 25.886844,26.152901 C 24.791454,26.880307 22.330117,27.458208 19.393673,27.67744 C 18.006132,27.781033 15.916896,27.80073 14.562933,27.722983 L 14.562933,27.722982 z"
+       id="path3215" />
+    <path
+       style="fill:#00ffff"
+       d="M 6.843221,22.405498 L 6.843221,19.185005 L 16.599421,19.185005 L 26.355621,19.185005 L 26.355621,22.405498 L 26.355621,25.625991 L 16.599421,25.625991 L 6.843221,25.625991 L 6.843221,22.405498 z"
+       id="path3217" />
+    <path
+       style="fill:#00ffff"
+       d="M 7.316823,25.656311 C 7.0476592,25.646939 11.223644,25.636283 16.59679,25.632631 C 21.969935,25.628979 26.355745,25.636392 26.343032,25.649104 C 26.316676,25.675461 8.0653341,25.682374 7.316823,25.656311 L 7.316823,25.656311 z"
+       id="path3219" />
+    <path
+       style="fill:#00ffff"
+       d="M 15.039957,25.986261 C 14.962824,25.979836 14.633257,25.959675 14.307585,25.941459 C 11.320919,25.774403 8.6207627,25.184044 7.4513479,24.442417 C 7.1969137,24.281059 6.9094195,23.999282 6.9540698,23.95503 C 6.9719506,23.937308 8.5919187,23.914121 11.004123,23.89706 L 15.024375,23.868626 L 10.949584,23.863252 L 6.8747945,23.857877 L 6.8747945,20.637384 L 6.8747945,17.416891 L 16.5047,17.416891 L 26.134606,17.416891 L 26.134606,20.637384 L 26.134606,23.857877 L 25.098379,23.862451 C 24.528453,23.864966 23.262775,23.876377 22.285761,23.887808 L 20.50937,23.908592 L 23.306406,23.914808 C 25.458908,23.919592 26.103442,23.929762 26.103442,23.958942 C 26.103442,24.028045 25.745772,24.350618 25.522995,24.482433 C 24.297348,25.207638 21.989676,25.712372 18.842056,25.94369 C 18.406715,25.975684 15.326952,26.010166 15.039957,25.986261 L 15.039957,25.986261 z"
+       id="path3221" />
+    <path
+       style="fill:#00ffff"
+       d="M 6.9557817,25.656508 C 6.7646254,25.647244 7.2660677,25.636588 8.0700981,25.632828 C 8.8741284,25.629068 9.52854,25.631186 9.52435,25.637535 C 9.510965,25.657808 7.3170063,25.674014 6.9557817,25.656508 L 6.9557817,25.656508 z"
+       id="path3223" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 6.8464444,10.220304 L 6.8464444,9.7804387 L 7.2332193,9.9776583 C 7.6338449,10.18194 8.1894851,10.399112 8.7289111,10.562248 L 9.0408001,10.656572 L 7.9436222,10.65837 L 6.8464444,10.660169 L 6.8464444,10.220304 z"
+       id="path3227" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.290783,10.623842 C 24.342879,10.606604 24.563104,10.535192 24.780172,10.465149 C 25.259094,10.310612 25.766836,10.101186 26.10633,9.9181537 L 26.358845,9.7820152 L 26.358845,10.221092 L 26.358845,10.660169 L 25.277454,10.657677 C 24.516214,10.655922 24.224106,10.645905 24.290783,10.623842 z"
+       id="path3229" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.722897,25.665521 C 25.012656,25.660315 25.49573,25.660306 25.796395,25.6655 C 26.09706,25.670694 25.859984,25.674953 25.26956,25.674965 C 24.679136,25.674976 24.433138,25.670726 24.722897,25.665521 L 24.722897,25.665521 z"
+       id="path3231" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 20.181712,27.627323 C 20.216442,27.62354 20.360299,27.607897 20.501393,27.592561 C 22.617756,27.36253 24.339627,26.956526 25.426774,26.431193 C 25.919083,26.193299 26.21332,25.968832 26.334008,25.739083 C 26.347353,25.71368 26.35827,25.687928 26.35827,25.681856 C 26.35827,25.672693 26.321727,25.670661 26.143176,25.669895 C 26.024874,25.669388 25.904994,25.666378 25.876775,25.663206 C 25.844523,25.659581 25.911951,25.656966 26.058322,25.656166 C 26.186392,25.655467 26.309825,25.652654 26.332617,25.649917 C 26.380266,25.644193 26.380801,25.645242 26.362207,25.707854 C 26.336163,25.795557 26.226288,25.931215 26.087248,26.047332 C 25.958274,26.155045 25.718181,26.30637 25.51368,26.408839 C 24.491701,26.920923 22.835817,27.328593 20.785554,27.572879 C 20.469382,27.610551 20.211759,27.63636 20.163141,27.635234 C 20.120413,27.634244 20.121182,27.633916 20.181712,27.627323 z"
+       id="path3233" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.914268,25.665247 C 25.924036,25.663366 25.940021,25.663366 25.949789,25.665247 C 25.959557,25.667129 25.951565,25.668668 25.932029,25.668668 C 25.912492,25.668668 25.9045,25.667129 25.914268,25.665247 L 25.914268,25.665247 z"
+       id="path3235" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.74822,25.657115 C 25.770853,25.655526 25.809925,25.655512 25.835047,25.657083 C 25.860168,25.658654 25.841649,25.659954 25.793895,25.659972 C 25.74614,25.65999 25.725586,25.658704 25.74822,25.657115 L 25.74822,25.657115 z"
+       id="path3237" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397529 L 26.366164,25.647138 L 26.226056,25.648917 L 26.085949,25.650696 L 26.226056,25.653046 L 26.366164,25.655395 L 26.366164,25.676455 C 26.366164,25.694996 26.364984,25.695956 26.356297,25.684475 C 26.348306,25.673913 26.326168,25.670592 26.23987,25.667007 C 26.039033,25.658664 24.491662,25.655046 24.223115,25.662292 C 24.018746,25.667806 24.123226,25.668597 24.661197,25.665607 C 25.407254,25.66146 26.350377,25.674721 26.350377,25.689357 C 26.350377,25.693634 26.338012,25.719629 26.322899,25.747123 C 26.28983,25.807285 26.292791,25.814386 26.326463,25.755672 C 26.339534,25.73288 26.350262,25.719671 26.350303,25.726319 C 26.350344,25.732966 26.337671,25.758719 26.322142,25.783545 C 26.294013,25.828516 26.281211,25.841129 26.290348,25.814872 C 26.293365,25.806201 26.289113,25.808404 26.278923,25.820792 C 26.269996,25.831645 26.242474,25.864619 26.217763,25.894066 C 26.121257,26.00907 25.910758,26.165899 25.681414,26.293663 C 25.632574,26.320872 25.592614,26.344847 25.592614,26.346943 C 25.592614,26.349039 25.619475,26.335926 25.652306,26.317803 C 25.685136,26.29968 25.713856,26.286711 25.716128,26.288982 C 25.726238,26.299093 25.388857,26.469926 25.201892,26.549366 C 24.978653,26.644218 24.728645,26.739172 24.714531,26.734467 C 24.710554,26.733141 24.758199,26.713113 24.820409,26.68996 C 24.969673,26.634407 25.128342,26.569467 25.124412,26.565538 C 25.122686,26.563811 25.092722,26.57462 25.057826,26.589556 C 24.874963,26.667824 24.44844,26.815793 24.146766,26.905618 C 23.884759,26.983633 23.408294,27.107145 23.182095,27.155685 C 23.146219,27.163384 23.139029,27.167136 23.150522,27.172162 C 23.161237,27.176847 23.158773,27.177657 23.141724,27.175055 C 23.107638,27.169851 22.949998,27.203302 22.96912,27.21168 C 22.979543,27.216246 22.976924,27.217052 22.960176,27.214433 C 22.92559,27.209025 22.798917,27.234533 22.818631,27.242937 C 22.828263,27.247042 22.820795,27.248003 22.798362,27.245544 C 22.770971,27.242542 22.766455,27.243486 22.778629,27.249669 C 22.791623,27.256268 22.789883,27.256998 22.768796,27.253793 C 22.754706,27.251652 22.660578,27.265532 22.559622,27.284638 C 21.835562,27.42167 21.017892,27.537138 20.181712,27.620439 C 20.029985,27.635554 19.96359,27.636168 18.474771,27.636216 L 16.925698,27.636266 L 16.925698,24.392093 z M 25.158479,26.554875 C 25.164991,26.550667 25.166767,26.547223 25.162425,26.547223 C 25.158084,26.547223 25.149204,26.550667 25.142692,26.554875 C 25.13618,26.559083 25.134404,26.562527 25.138745,26.562527 C 25.143087,26.562527 25.151967,26.559083 25.158479,26.554875 z M 25.205839,26.535142 C 25.216692,26.528937 25.22202,26.523861 25.217679,26.523861 C 25.213338,26.523861 25.200906,26.528937 25.190052,26.535142 C 25.179199,26.541346 25.173871,26.546422 25.178212,26.546422 C 25.182553,26.546422 25.194985,26.541346 25.205839,26.535142 z M 25.276879,26.503568 C 25.296415,26.493107 25.308847,26.484548 25.304506,26.484548 C 25.300165,26.484548 25.280629,26.493107 25.261092,26.503568 C 25.241556,26.514029 25.229124,26.522588 25.233466,26.522588 C 25.237807,26.522588 25.257343,26.514029 25.276879,26.503568 z M 25.3716,26.460155 C 25.386794,26.451836 25.395674,26.44503 25.391333,26.44503 C 25.386992,26.44503 25.371008,26.451836 25.355813,26.460155 C 25.340618,26.468473 25.331738,26.47528 25.336079,26.47528 C 25.340421,26.475279 25.356405,26.468473 25.3716,26.460155 z"
+       id="path3239" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397262 L 26.366164,25.646604 L 26.28131,25.649141 L 26.196456,25.651679 L 26.28131,25.653355 L 26.366164,25.655031 L 26.366043,25.676738 C 26.365975,25.688842 26.363357,25.694502 26.360123,25.689533 C 26.356651,25.684199 26.347396,25.69608 26.337066,25.719133 C 26.31838,25.760835 26.318928,25.771036 26.337969,25.735938 C 26.344653,25.723619 26.349881,25.719459 26.350061,25.726319 C 26.350491,25.742775 26.292885,25.833809 26.289143,25.822585 C 26.287502,25.817663 26.260158,25.844551 26.228377,25.882335 C 26.126925,26.00295 25.921451,26.16031 25.716934,26.274022 C 25.663866,26.303528 25.641609,26.321986 25.688067,26.297961 C 25.717482,26.28275 25.72685,26.287374 25.700971,26.304331 C 25.662356,26.329633 25.449444,26.43789 25.33299,26.491435 C 25.100904,26.598147 24.733288,26.740325 24.709214,26.732684 C 24.70213,26.730436 24.621828,26.753627 24.530765,26.784221 C 24.328449,26.852191 24.062521,26.932708 23.85338,26.989319 C 23.741524,27.019597 23.70092,27.033549 23.7113,27.038139 C 23.721452,27.042628 23.71858,27.043486 23.701771,27.040983 C 23.688536,27.039013 23.638808,27.047503 23.591263,27.05985 C 23.543719,27.072196 23.513699,27.082852 23.524552,27.083528 C 23.535405,27.084205 23.508928,27.093509 23.465714,27.104204 C 23.4225,27.114899 23.381937,27.121652 23.375574,27.119211 C 23.369211,27.116769 23.344591,27.119116 23.320863,27.124426 C 23.287147,27.131971 23.280972,27.135498 23.292602,27.140564 C 23.302502,27.144876 23.298235,27.145725 23.279858,27.143098 C 23.264663,27.140926 23.241575,27.142359 23.228551,27.146281 C 23.205877,27.153111 23.205709,27.153477 23.224604,27.1549 C 23.241369,27.156163 23.240182,27.157422 23.216711,27.163271 C 23.201516,27.167058 23.178428,27.168254 23.165404,27.165931 C 23.149673,27.163124 23.14525,27.164143 23.152227,27.168965 C 23.166088,27.178543 23.120857,27.188059 23.091619,27.181716 C 23.074958,27.178101 23.073101,27.178976 23.082523,27.185999 C 23.091671,27.192816 23.087184,27.19384 23.06279,27.190499 C 23.038339,27.18715 23.034778,27.187968 23.047003,27.194126 C 23.059108,27.200223 23.054505,27.201169 23.02727,27.198184 C 22.999878,27.195182 22.995362,27.196126 23.007536,27.202309 C 23.02045,27.208867 23.018584,27.209602 22.997277,27.206347 C 22.982952,27.204159 22.973126,27.205435 22.975443,27.209182 C 22.981221,27.218532 22.938193,27.226274 22.906896,27.221516 C 22.885792,27.218308 22.884042,27.219038 22.897029,27.225633 C 22.909203,27.231816 22.904688,27.23276 22.877296,27.229758 C 22.849904,27.226756 22.845389,27.2277 22.857563,27.233882 C 22.870477,27.240441 22.86861,27.241176 22.847303,27.237921 C 22.829256,27.235164 22.822941,27.236665 22.826738,27.242809 C 22.830632,27.249111 22.823324,27.250134 22.801477,27.246344 C 22.779426,27.242519 22.774083,27.243292 22.782576,27.249077 C 22.794908,27.257478 22.788646,27.258693 22.719429,27.261331 C 22.704234,27.26191 22.681146,27.263285 22.668122,27.264386 C 22.646916,27.266179 22.646091,27.26717 22.660228,27.273877 C 22.672493,27.279695 22.670063,27.280451 22.649338,27.277261 C 22.634666,27.275004 22.599264,27.277468 22.570668,27.282737 C 22.527521,27.290687 22.521987,27.293355 22.538144,27.29842 C 22.552245,27.30284 22.549181,27.303557 22.527029,27.301023 C 22.509746,27.299046 22.400138,27.31452 22.274998,27.336604 C 21.858929,27.410029 21.345967,27.486438 20.915795,27.539068 C 20.775719,27.556205 20.74146,27.562489 20.765821,27.566574 C 20.784472,27.569701 20.769934,27.570765 20.7303,27.569172 C 20.678496,27.567091 20.670402,27.568028 20.69478,27.573284 C 20.721172,27.578974 20.718111,27.579524 20.676132,27.576633 C 20.64851,27.574732 20.581022,27.578398 20.526158,27.584781 C 20.471294,27.591164 20.336294,27.605359 20.226156,27.616326 L 20.025906,27.636266 L 18.475802,27.636266 L 16.925698,27.636266 L 16.925698,24.392093 z M 23.194511,27.157272 C 23.188813,27.154992 23.182004,27.155272 23.179382,27.157895 C 23.176759,27.160518 23.181421,27.162384 23.189742,27.162041 C 23.198937,27.161662 23.200807,27.159792 23.194511,27.157272 z M 23.399738,27.109912 C 23.39404,27.107632 23.387232,27.107912 23.384609,27.110535 C 23.381986,27.113158 23.386648,27.115024 23.394969,27.114681 C 23.404165,27.114302 23.406035,27.112432 23.399738,27.109912 z M 23.431312,27.102019 C 23.425614,27.099738 23.418805,27.100019 23.416183,27.102642 C 23.41356,27.105265 23.418222,27.10713 23.426543,27.106787 C 23.435738,27.106409 23.437608,27.104538 23.431312,27.102019 z M 23.462885,27.094125 C 23.457187,27.091845 23.450379,27.092125 23.447756,27.094748 C 23.445133,27.097371 23.449795,27.099237 23.458116,27.098894 C 23.467312,27.098516 23.469182,27.096645 23.462885,27.094125 z M 23.494458,27.086232 C 23.48876,27.083952 23.481952,27.084232 23.47933,27.086855 C 23.476707,27.089478 23.481369,27.091343 23.48969,27.091001 C 23.498885,27.090622 23.500755,27.088752 23.494458,27.086232 z M 24.767757,26.707901 C 24.786775,26.699241 24.787552,26.698071 24.771704,26.701959 C 24.76085,26.704622 24.741314,26.711653 24.72829,26.717583 C 24.709272,26.726243 24.708495,26.727413 24.724344,26.723525 C 24.735197,26.720862 24.754733,26.713832 24.767757,26.707901 L 24.767757,26.707901 z M 24.842744,26.679837 C 24.850973,26.674753 24.848565,26.674132 24.834851,26.6778 C 24.823997,26.680703 24.809789,26.68637 24.803277,26.690394 C 24.795048,26.695478 24.797456,26.696099 24.811171,26.692431 C 24.822024,26.689528 24.836232,26.683861 24.842744,26.679837 L 24.842744,26.679837 z M 24.882211,26.665382 C 24.888723,26.661174 24.890499,26.657731 24.886158,26.657731 C 24.881816,26.65773 24.872936,26.661174 24.866424,26.665382 C 24.859912,26.669591 24.858136,26.673034 24.862477,26.673034 C 24.866819,26.673034 24.875699,26.669591 24.882211,26.665382 z M 24.945358,26.641702 C 24.95187,26.637494 24.953646,26.63405 24.949304,26.63405 C 24.944963,26.63405 24.936083,26.637494 24.929571,26.641702 C 24.923059,26.64591 24.921283,26.649354 24.925624,26.649354 C 24.929966,26.649354 24.938846,26.64591 24.945358,26.641702 z M 24.984825,26.625915 C 24.991337,26.621707 24.993113,26.618264 24.988771,26.618264 C 24.98443,26.618264 24.97555,26.621707 24.969038,26.625915 C 24.962526,26.630124 24.96075,26.633567 24.965091,26.633567 C 24.969433,26.633567 24.978313,26.630124 24.984825,26.625915 z M 25.024291,26.610129 C 25.030803,26.60592 25.032579,26.602477 25.028238,26.602477 C 25.023897,26.602477 25.015017,26.60592 25.008505,26.610129 C 25.001993,26.614337 25.000217,26.61778 25.004558,26.61778 C 25.008899,26.61778 25.017779,26.614337 25.024291,26.610129 z M 25.063758,26.594342 C 25.07027,26.590133 25.072046,26.58669 25.067705,26.58669 C 25.063364,26.58669 25.054484,26.590133 25.047972,26.594342 C 25.04146,26.59855 25.039684,26.601993 25.044025,26.601993 C 25.048366,26.601993 25.057246,26.59855 25.063758,26.594342 z M 25.28077,26.499712 C 25.283536,26.495237 25.280367,26.493914 25.273342,26.49661 C 25.259668,26.501857 25.257166,26.507515 25.26852,26.507515 C 25.272605,26.507515 25.278118,26.504003 25.28077,26.499712 L 25.28077,26.499712 z M 25.3716,26.460155 C 25.378112,26.455946 25.379888,26.452503 25.375546,26.452503 C 25.371205,26.452503 25.362325,26.455946 25.355813,26.460155 C 25.349301,26.464363 25.347525,26.467806 25.351866,26.467806 C 25.356207,26.467806 25.365088,26.464363 25.3716,26.460155 z M 26.22803,25.670086 C 26.048973,25.661085 24.702891,25.65364 24.530956,25.6607 C 24.425095,25.665046 24.560309,25.666361 24.941411,25.66469 C 25.253988,25.66332 25.632278,25.665349 25.782055,25.669198 C 25.931831,25.673047 26.118312,25.676071 26.196456,25.675919 L 26.338537,25.675641 L 26.22803,25.670086 z"
+       id="path3241" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.862962,25.665164 C 25.8749,25.663356 25.894436,25.663356 25.906375,25.665164 C 25.918314,25.666973 25.908546,25.668453 25.884668,25.668453 C 25.860791,25.668453 25.851023,25.666973 25.862962,25.665164 z"
+       id="path3243" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392259 L 16.925698,21.147919 L 21.645957,21.147919 L 26.366216,21.147919 L 26.366137,23.421642 C 26.366093,24.672189 26.363049,25.693505 26.359371,25.691232 C 26.355694,25.688959 26.348614,25.696036 26.343638,25.706957 C 26.332648,25.731078 26.331967,25.742344 26.342484,25.726072 C 26.347973,25.717576 26.350169,25.71713 26.350256,25.72449 C 26.350542,25.748721 26.290861,25.839755 26.279352,25.832642 C 26.275987,25.830561 26.268389,25.835036 26.262471,25.842586 C 26.252733,25.855007 26.253023,25.855282 26.265523,25.845479 C 26.273121,25.839521 26.279337,25.838198 26.279337,25.842539 C 26.279337,25.852814 26.259433,25.869298 26.253813,25.863678 C 26.251428,25.861293 26.233995,25.877808 26.215073,25.900378 C 26.142721,25.98668 26.012246,26.086787 25.745545,26.260625 C 25.733006,26.268798 25.732856,26.269573 25.744561,26.265701 C 25.800343,26.247248 25.696277,26.31018 25.527392,26.397027 C 25.293752,26.517174 25.01458,26.634328 24.698369,26.744925 C 24.548991,26.79717 24.508467,26.80876 24.534903,26.791676 C 24.554062,26.779294 24.546464,26.781387 24.377035,26.835162 C 24.288038,26.86341 24.194206,26.892455 24.16852,26.899708 C 24.1352,26.909116 24.125971,26.914351 24.136312,26.917978 C 24.147123,26.921771 24.141601,26.925639 24.11457,26.933207 C 24.094641,26.938787 24.074254,26.94083 24.069265,26.937747 C 24.064277,26.934665 24.024553,26.942097 23.980989,26.954263 C 23.927461,26.969213 23.906528,26.978069 23.916421,26.98158 C 23.928078,26.985717 23.925719,26.98796 23.904842,26.992591 C 23.890423,26.995789 23.876511,26.996292 23.873927,26.993708 C 23.871343,26.991124 23.875741,26.98901 23.8837,26.98901 C 23.891659,26.98901 23.896235,26.987074 23.893869,26.984708 C 23.891503,26.982342 23.872454,26.984715 23.851538,26.989982 C 23.823106,26.997141 23.817264,27.000874 23.828388,27.004776 C 23.848631,27.011877 23.684067,27.052924 23.658326,27.047195 C 23.642478,27.043667 23.641134,27.044551 23.650846,27.052111 C 23.660428,27.05957 23.658561,27.060428 23.641052,27.05661 C 23.614352,27.050788 23.538374,27.068226 23.558967,27.075449 C 23.567028,27.078277 23.526525,27.091101 23.461887,27.106186 C 23.400885,27.120422 23.347319,27.12981 23.34285,27.127049 C 23.338382,27.124287 23.323684,27.124453 23.310188,27.127417 C 23.295108,27.130729 23.289266,27.135042 23.295032,27.138605 C 23.308032,27.14664 23.183768,27.172566 23.165625,27.165604 C 23.156167,27.161974 23.152807,27.162948 23.156147,27.168351 C 23.162574,27.178751 23.113977,27.188832 23.094128,27.181215 C 23.083602,27.177176 23.081606,27.178473 23.086403,27.186235 C 23.091498,27.194479 23.087163,27.195604 23.065991,27.191534 C 23.045729,27.187639 23.042025,27.188453 23.05095,27.194839 C 23.059812,27.201181 23.054849,27.202097 23.031217,27.198482 C 23.006959,27.194771 23.002387,27.195692 23.011483,27.202456 C 23.020974,27.209513 23.019071,27.210582 23.001892,27.207843 C 22.990104,27.205963 22.979244,27.208075 22.977757,27.212536 C 22.97627,27.216997 22.956958,27.220921 22.93484,27.221256 C 22.911254,27.221613 22.898388,27.224582 22.903722,27.228438 C 22.908808,27.232115 22.8989,27.233083 22.881243,27.230635 C 22.857865,27.227395 22.852743,27.22841 22.861509,27.234546 C 22.870726,27.240998 22.868602,27.242077 22.851918,27.239416 C 22.84013,27.237537 22.829475,27.238415 22.828238,27.241369 C 22.824418,27.250489 22.701084,27.271986 22.676015,27.267901 C 22.656975,27.264798 22.654655,27.265825 22.664175,27.273144 C 22.673464,27.280285 22.669213,27.281205 22.644442,27.277416 C 22.620463,27.273747 22.615716,27.274667 22.624708,27.281238 C 22.633677,27.287792 22.627936,27.288827 22.601028,27.285504 C 22.574383,27.282214 22.569452,27.283077 22.581295,27.288958 C 22.593279,27.294909 22.588525,27.29586 22.561561,27.292905 C 22.538599,27.290388 22.53153,27.291344 22.541568,27.295609 C 22.554,27.300891 22.550129,27.303141 22.52215,27.306894 C 22.502931,27.309471 22.476408,27.309975 22.46321,27.308012 C 22.442767,27.304971 22.441551,27.305656 22.455001,27.312638 C 22.467946,27.319358 22.465971,27.320091 22.444031,27.316712 C 22.428961,27.314391 22.327247,27.328236 22.211176,27.348405 C 21.984108,27.387863 21.582242,27.450761 21.373612,27.479496 C 21.273704,27.493257 21.245475,27.499437 21.263105,27.503689 C 21.280023,27.507769 21.276642,27.508391 21.251263,27.505868 C 21.231726,27.503926 21.166014,27.508426 21.105235,27.515868 C 21.017084,27.526662 21.000317,27.530552 21.022355,27.535094 C 21.042465,27.539239 21.038401,27.539883 21.007416,27.537459 C 20.984006,27.535628 20.943157,27.536569 20.916643,27.53955 C 20.871405,27.544636 20.870137,27.545318 20.896061,27.550609 C 20.913293,27.554125 20.901413,27.55517 20.864488,27.553386 C 20.819089,27.551192 20.811728,27.55214 20.832914,27.557452 C 20.85498,27.562986 20.850214,27.563767 20.809234,27.561334 C 20.778781,27.559526 20.765948,27.560707 20.777661,27.56424 C 20.804263,27.572263 20.703602,27.582069 20.643473,27.577311 C 20.611076,27.574748 20.60707,27.575391 20.627687,27.579844 C 20.646999,27.584017 20.631557,27.585876 20.57638,27.586023 C 20.532966,27.586138 20.413974,27.59649 20.311952,27.609025 L 20.126458,27.631818 L 18.526078,27.634208 L 16.925698,27.6366 L 16.925698,24.392259 z M 20.71239,27.567649 C 20.70471,27.565648 20.694054,27.565779 20.68871,27.567942 C 20.683366,27.570104 20.68965,27.571741 20.702674,27.57158 C 20.715698,27.571419 20.72007,27.56965 20.71239,27.567649 L 20.71239,27.567649 z M 23.233977,27.149379 C 23.228279,27.147099 23.221471,27.147379 23.218848,27.150002 C 23.216226,27.152625 23.220888,27.15449 23.229208,27.154148 C 23.238404,27.153769 23.240274,27.151898 23.233977,27.149379 z M 23.265551,27.141485 C 23.259853,27.139205 23.253045,27.139486 23.250422,27.142108 C 23.247799,27.144732 23.252461,27.146597 23.260782,27.146254 C 23.269977,27.145876 23.271848,27.144005 23.265551,27.141485 z M 23.368165,27.117805 C 23.362467,27.115525 23.355659,27.115805 23.353036,27.118428 C 23.350413,27.121051 23.355075,27.122917 23.363396,27.122574 C 23.372591,27.122196 23.374461,27.120325 23.368165,27.117805 z M 23.747046,27.023085 C 23.741348,27.020805 23.73454,27.021085 23.731917,27.023708 C 23.729294,27.026331 23.733956,27.028196 23.742277,27.027854 C 23.751473,27.027475 23.753343,27.025605 23.747046,27.023085 z M 23.796873,27.01269 C 23.806824,27.008414 23.808283,27.005906 23.80082,27.005906 C 23.794308,27.005906 23.781876,27.008959 23.773193,27.01269 C 23.763242,27.016966 23.761783,27.019474 23.769246,27.019474 C 23.775758,27.019474 23.78819,27.016421 23.796873,27.01269 z M 24.104714,26.925863 C 24.114665,26.921587 24.116124,26.919079 24.108661,26.919079 C 24.102149,26.919079 24.089717,26.922132 24.081034,26.925863 C 24.071084,26.930139 24.069625,26.932647 24.077088,26.932647 C 24.0836,26.932647 24.096032,26.929594 24.104714,26.925863 z M 25.726801,26.274255 C 25.726801,26.272084 25.716145,26.275819 25.703121,26.282554 C 25.690097,26.289289 25.679441,26.296575 25.679441,26.298746 C 25.679441,26.300917 25.690097,26.297182 25.703121,26.290447 C 25.716145,26.283712 25.726801,26.276426 25.726801,26.274255 L 25.726801,26.274255 z M 26.253395,25.67287 C 26.228274,25.671298 26.189201,25.671313 26.166568,25.672902 C 26.143935,25.674491 26.164488,25.675777 26.212243,25.675759 C 26.259998,25.675741 26.278516,25.674441 26.253395,25.67287 L 26.253395,25.67287 z M 25.993202,25.664923 C 25.942191,25.663549 25.858719,25.663549 25.807708,25.664923 C 25.756697,25.666298 25.798433,25.667423 25.900455,25.667423 C 26.002477,25.667423 26.044213,25.666298 25.993202,25.664923 z M 25.120985,25.657064 C 25.08951,25.655565 25.038006,25.655565 25.006531,25.657064 C 24.975057,25.658562 25.000809,25.659788 25.063758,25.659788 C 25.126708,25.659788 25.15246,25.658562 25.120985,25.657064 L 25.120985,25.657064 z M 26.336672,25.649475 C 26.326964,25.647601 26.309204,25.647553 26.297205,25.649367 C 26.285207,25.651182 26.29315,25.652714 26.314857,25.652774 C 26.336564,25.652833 26.34638,25.651348 26.336672,25.649475 L 26.336672,25.649475 z"
+       id="path3245" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 12.848775,27.619856 C 10.696878,27.386126 9.0250697,27.008859 7.9114743,26.505687 C 7.3412741,26.248045 6.9502443,25.953581 6.8626973,25.715909 C 6.8373638,25.647134 6.8383187,25.644618 6.8873101,25.651082 C 6.9101022,25.654089 7.1489752,25.658872 7.4181389,25.66171 L 7.9075276,25.666871 L 7.4931259,25.673007 C 7.0722205,25.679239 6.8893635,25.687314 6.8764376,25.70024 C 6.8671934,25.709484 6.8990931,25.769628 6.944627,25.828802 C 7.0008187,25.901828 7.1653628,26.052563 7.2721117,26.128804 C 7.6214041,26.378272 8.1390063,26.615616 8.7836912,26.821932 C 9.8543,27.164554 11.170036,27.420552 12.765707,27.596698 C 12.980199,27.620376 13.085534,27.634586 13.046109,27.634527 C 13.011378,27.634474 12.922578,27.627872 12.848775,27.619856 L 12.848775,27.619856 z"
+       id="path3247" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 7.8897675,25.664951 C 7.923413,25.663471 7.9784692,25.663471 8.0121147,25.664951 C 8.0457602,25.66643 8.0182321,25.667641 7.9509411,25.667641 C 7.8836502,25.667641 7.8561221,25.66643 7.8897675,25.664951 L 7.8897675,25.664951 z"
+       id="path3249" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00039063;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 8.1891765,26.622092 C 8.0158724,26.551424 7.9012315,26.500857 7.775114,26.439456 C 7.3056794,26.210909 6.9784811,25.958681 6.8793554,25.748942 C 6.8604997,25.709045 6.8459037,25.665422 6.8488454,25.657756 C 6.8505937,25.6532 6.860807,25.651938 6.8990148,25.651559 C 6.9254006,25.651297 6.9715983,25.649844 7.0016765,25.64833 C 7.0490679,25.645945 7.0411205,25.645488 6.9421061,25.6449 L 6.8278483,25.644223 L 6.8278483,24.536801 L 6.8278483,23.429379 L 8.9743327,23.429379 L 11.120817,23.429379 L 11.120817,25.034848 L 11.120817,26.640317 L 9.699613,26.640317 L 8.2784086,26.640317 L 8.191264,26.605128 C 7.7767222,26.437736 7.4215269,26.246672 7.205778,26.075024 C 7.1912761,26.063486 7.1794108,26.054987 7.1794108,26.056136 C 7.1794108,26.060154 7.2574677,26.120366 7.3063385,26.154048 C 7.5331887,26.310391 7.8447844,26.471289 8.181364,26.605882 C 8.2243327,26.623064 8.2602214,26.637841 8.2611166,26.63872 C 8.2620117,26.639598 8.2558594,26.640159 8.2474447,26.639965 C 8.2390299,26.639772 8.2128093,26.631729 8.1891765,26.622092 L 8.1891765,26.622092 z M 7.1755046,26.053031 C 7.1755046,26.05229 7.1715495,26.048335 7.1667155,26.044242 L 7.1579265,26.036801 L 7.1653679,26.04559 C 7.1723609,26.05385 7.1755046,26.056157 7.1755046,26.053031 L 7.1755046,26.053031 z M 7.0090626,25.897153 C 6.9646401,25.850887 6.921397,25.794898 6.8953494,25.749923 C 6.8884321,25.737979 6.8827192,25.729863 6.8826541,25.731886 C 6.8824658,25.737747 6.9132665,25.788187 6.9353961,25.818257 C 6.955002,25.844898 7.0216168,25.91766 7.026401,25.91766 C 7.0276947,25.91766 7.0198925,25.908432 7.0090626,25.897153 z M 6.8983177,25.697891 C 6.9078994,25.696167 6.9324382,25.693155 6.9528483,25.691198 L 6.9899577,25.68764 L 6.946989,25.689396 C 6.9233561,25.690362 6.8974284,25.69298 6.8893718,25.695215 C 6.8768915,25.698676 6.874781,25.70084 6.8751127,25.709836 L 6.8755021,25.720395 L 6.8781994,25.71071 C 6.880352,25.702981 6.8844138,25.700393 6.8983177,25.697891 L 6.8983177,25.697891 z M 7.047444,25.684307 C 7.0360926,25.683516 7.0185145,25.683524 7.0083815,25.684326 C 6.9982484,25.685127 7.0075358,25.685775 7.0290202,25.685765 C 7.0505046,25.685755 7.0587953,25.685099 7.047444,25.684307 L 7.047444,25.684307 z M 7.1528727,25.680381 C 7.1372026,25.679638 7.1125932,25.679643 7.0981852,25.680393 C 7.0837773,25.681142 7.0965983,25.68175 7.1266765,25.681744 C 7.1567546,25.681738 7.1685429,25.681125 7.1528727,25.680381 L 7.1528727,25.680381 z M 7.9450358,25.671591 C 8.1996257,25.669274 8.4896647,25.666975 8.5895671,25.666482 C 8.6894694,25.665989 8.5198405,25.665813 8.212614,25.66609 C 7.739063,25.666518 7.4526201,25.669676 7.2399577,25.676815 C 7.193965,25.67836 7.2332656,25.678068 7.9450358,25.671591 L 7.9450358,25.671591 z"
+       id="path3251" />
+    <path
+       style="fill:#00ffff;fill-opacity:1;stroke:#00ffff;stroke-width:0.00039063;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 8.1618327,26.611328 C 7.5602425,26.367197 7.1239875,26.094124 6.9381928,25.845395 C 6.8933845,25.785408 6.8415961,25.676647 6.8488454,25.657756 C 6.85057,25.653262 6.8600686,25.651942 6.8931554,25.651598 C 6.9163185,25.651358 6.9519694,25.649884 6.9723796,25.648324 C 7.0022023,25.646044 6.9916558,25.645363 6.9186686,25.644855 L 6.8278483,25.644223 L 6.8278483,24.536801 L 6.8278483,23.429379 L 8.9743327,23.429379 L 11.120817,23.429379 L 11.120817,25.034848 L 11.120817,26.640317 L 9.699346,26.640317 L 8.2778746,26.640317 L 8.1729788,26.597757 C 8.1152859,26.574349 8.0339638,26.540072 7.9922628,26.521585 C 7.9210845,26.490031 7.8988734,26.481234 7.9215983,26.493599 C 7.9399373,26.503578 8.0946307,26.570257 8.1771348,26.603745 C 8.2224295,26.622131 8.2602214,26.63788 8.2611166,26.638745 C 8.2620117,26.639609 8.2558594,26.640214 8.2474447,26.640089 C 8.2378809,26.639947 8.205785,26.629164 8.1618327,26.611328 L 8.1618327,26.611328 z M 7.8215026,26.443226 C 7.7718208,26.41895 7.705024,26.385556 7.673065,26.369017 C 7.6411059,26.352478 7.6184733,26.341815 7.6227702,26.345321 C 7.6326198,26.353357 7.9024117,26.488081 7.9078308,26.487668 C 7.9100317,26.487501 7.8711841,26.467502 7.8215025,26.443226 L 7.8215026,26.443226 z M 7.6051921,26.333755 C 7.6051921,26.332725 7.5981608,26.328295 7.5895671,26.32391 C 7.5809733,26.319526 7.5739421,26.316812 7.5739421,26.317878 C 7.5739421,26.318945 7.5805339,26.323297 7.5885905,26.327551 C 7.6051647,26.336301 7.6051921,26.336311 7.6051921,26.333755 z M 7.5700358,26.314245 C 7.5700358,26.313226 7.5647624,26.309665 7.5583171,26.306332 C 7.5436261,26.298735 7.5427372,26.302035 7.5573405,26.309957 C 7.5696161,26.316617 7.5700358,26.316759 7.5700358,26.314245 L 7.5700358,26.314245 z M 7.5348796,26.294751 C 7.5348796,26.293752 7.5309245,26.291019 7.5260905,26.288676 C 7.5176506,26.284586 7.5176027,26.284658 7.524884,26.290492 C 7.5328539,26.296877 7.5348796,26.29774 7.5348796,26.294751 L 7.5348796,26.294751 z M 7.5075358,26.279126 C 7.5075358,26.278127 7.5035808,26.275394 7.4987468,26.273051 C 7.4903068,26.268961 7.4902589,26.269033 7.4975402,26.274867 C 7.5055101,26.281252 7.5075358,26.282115 7.5075358,26.279126 L 7.5075358,26.279126 z M 7.4880046,26.267407 C 7.4880046,26.266409 7.4840495,26.263675 7.4792155,26.261332 C 7.4707756,26.257242 7.4707277,26.257314 7.478009,26.263148 C 7.4859789,26.269533 7.4880046,26.270396 7.4880046,26.267407 L 7.4880046,26.267407 z M 7.462614,26.251234 C 7.4526083,26.243523 7.4411296,26.237202 7.4411296,26.239405 C 7.4411296,26.24139 7.4655742,26.257401 7.4684733,26.257314 C 7.4695476,26.257282 7.4669108,26.254546 7.462614,26.251234 L 7.462614,26.251234 z M 7.4372233,26.236157 C 7.4372233,26.235159 7.4332683,26.232425 7.4284343,26.230082 C 7.4199943,26.225992 7.4199464,26.226064 7.4272277,26.231898 C 7.4351975,26.238283 7.4372233,26.239146 7.4372233,26.236157 L 7.4372233,26.236157 z M 7.4101376,26.218773 C 7.3983328,26.209699 7.3752626,26.196383 7.3805827,26.201714 C 7.3858237,26.206966 7.4150744,26.226277 7.4176223,26.226167 C 7.4187349,26.226119 7.4153668,26.222792 7.4101376,26.218773 L 7.4101376,26.218773 z M 7.3512858,26.181781 C 7.3512858,26.180954 7.3464519,26.177334 7.3405436,26.173737 L 7.3298015,26.167197 L 7.3390233,26.175241 C 7.3480222,26.183091 7.3512858,26.184832 7.3512858,26.181781 L 7.3512858,26.181781 z M 7.3200358,26.159849 C 7.2839705,26.132602 7.2178978,26.086303 7.2243327,26.092787 C 7.2330035,26.101524 7.3247573,26.167651 7.3278483,26.167391 C 7.3289226,26.1673 7.3254069,26.163906 7.3200358,26.159849 z M 7.2145671,26.084154 C 7.2145671,26.083343 7.2114909,26.080267 7.2077311,26.077318 C 7.2015356,26.072459 7.2013974,26.072598 7.2062563,26.078793 C 7.2113593,26.0853 7.2145671,26.087369 7.2145671,26.084154 z M 7.0012566,25.88934 C 6.9787201,25.865537 6.9490142,25.82955 6.9295133,25.802426 C 6.9103217,25.775732 6.9010311,25.765498 6.9117827,25.782895 C 6.9317701,25.815235 7.0074536,25.905942 7.0144501,25.905942 C 7.0158387,25.905942 7.0099017,25.898471 7.0012566,25.88934 z M 6.9020671,25.76141 C 6.8997675,25.757113 6.897007,25.753598 6.8959328,25.753598 C 6.8948586,25.753598 6.8958612,25.757113 6.8981608,25.76141 C 6.9004604,25.765707 6.9032209,25.769223 6.9042951,25.769223 C 6.9053693,25.769223 6.9043667,25.765707 6.9020671,25.76141 z M 6.9176921,25.693802 C 6.9230632,25.692835 6.9178134,25.692774 6.9060259,25.693666 C 6.8942385,25.694559 6.8830397,25.696844 6.8811398,25.698744 C 6.8791381,25.700746 6.8840442,25.700803 6.8928059,25.698879 C 6.9011222,25.697054 6.912321,25.694769 6.9176921,25.693802 L 6.9176921,25.693802 z M 6.957487,25.688429 C 6.9546672,25.687301 6.951298,25.68744 6.95,25.688738 C 6.948702,25.690036 6.9510092,25.690959 6.955127,25.690789 C 6.9596775,25.690602 6.9606031,25.689676 6.957487,25.688429 z M 7.5671061,25.672552 C 7.5364909,25.671892 7.4863933,25.671892 7.455778,25.672552 C 7.4251628,25.673212 7.4502116,25.673752 7.5114421,25.673752 C 7.5726726,25.673752 7.5977214,25.673212 7.5671061,25.672552 L 7.5671061,25.672552 z M 8.243864,25.667872 L 8.4391765,25.665271 L 8.2555827,25.665062 C 8.1546061,25.664947 7.9761882,25.66602 7.8590983,25.667448 L 7.6462077,25.670043 L 7.8473796,25.670258 C 7.9580241,25.670377 8.1364421,25.669303 8.243864,25.667872 L 8.243864,25.667872 z"
+       id="path3253" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/out_osd.svg b/src/tools/gui_resources/out_osd.svg
new file mode 100644 (file)
index 0000000..586b7d4
--- /dev/null
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg2383"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="blacklisted_osd.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2385">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective2391" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6568543"
+     inkscape:cx="8.5290146"
+     inkscape:cy="14.474997"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="989"
+     inkscape:window-height="719"
+     inkscape:window-x="100"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata2388">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       id="path2397"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.625,0.6875)" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       d="M 6.3406527,8.4863219 L 6.3406527,25.81115"
+       id="path2399" />
+    <path
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       d="M 26.880397,8.4866719 L 26.880397,25.8115"
+       id="path3199" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+       id="path3205"
+       sodipodi:cx="17.235525"
+       sodipodi:cy="7.6202154"
+       sodipodi:rx="10.269873"
+       sodipodi:ry="2.6790972"
+       d="M 27.505398,7.6202154 A 10.269873,2.6790972 0 1 1 6.9656525,7.6202154 A 10.269873,2.6790972 0 1 1 27.505398,7.6202154 z"
+       transform="translate(-0.6249998,18.012328)" />
+    <rect
+       style="fill:#000000;fill-opacity:1"
+       id="rect3209"
+       width="19.543974"
+       height="6.4725599"
+       x="6.8263373"
+       y="19.174059" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 15.273526,27.770004 C 11.299686,27.637867 7.872366,26.856295 6.9915854,25.881377 C 6.9273507,25.810276 6.8747945,25.730832 6.8747945,25.704834 C 6.8747945,25.662959 7.9864418,25.657565 16.615208,25.657565 C 21.972435,25.657565 26.355621,25.665374 26.355621,25.674919 C 26.355621,25.724606 26.253768,25.874516 26.160981,25.961394 C 25.604644,26.482303 24.201694,26.990077 22.424725,27.313669 C 20.316126,27.697653 17.843263,27.855451 15.273526,27.770003 L 15.273526,27.770004 z"
+       id="path3211" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 6.843221,14.9068 L 6.843221,10.660169 L 7.9561856,10.660264 L 9.0691502,10.660358 L 9.511179,10.768521 C 12.573897,11.517963 17.19152,11.707721 21.035493,11.242107 C 21.927979,11.134002 23.067767,10.930343 23.772644,10.753028 L 24.141785,10.660169 L 25.248704,10.660169 L 26.355621,10.660169 L 26.355621,14.9068 L 26.355621,19.153431 L 16.599421,19.153431 L 6.843221,19.153431 L 6.843221,14.9068 z"
+       id="path3213" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 14.562933,27.722982 C 11.326995,27.537172 8.6353059,26.966688 7.4276086,26.210701 C 7.1890805,26.061389 6.8874997,25.776785 6.9170843,25.728916 C 6.9615104,25.657033 26.324048,25.654726 26.324048,25.726605 C 26.324048,25.780756 26.06097,26.03727 25.886844,26.152901 C 24.791454,26.880307 22.330117,27.458208 19.393673,27.67744 C 18.006132,27.781033 15.916896,27.80073 14.562933,27.722983 L 14.562933,27.722982 z"
+       id="path3215" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 6.843221,22.405498 L 6.843221,19.185005 L 16.599421,19.185005 L 26.355621,19.185005 L 26.355621,22.405498 L 26.355621,25.625991 L 16.599421,25.625991 L 6.843221,25.625991 L 6.843221,22.405498 z"
+       id="path3217" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 7.316823,25.656311 C 7.0476592,25.646939 11.223644,25.636283 16.59679,25.632631 C 21.969935,25.628979 26.355745,25.636392 26.343032,25.649104 C 26.316676,25.675461 8.0653341,25.682374 7.316823,25.656311 L 7.316823,25.656311 z"
+       id="path3219" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 15.039957,25.986261 C 14.962824,25.979836 14.633257,25.959675 14.307585,25.941459 C 11.320919,25.774403 8.6207627,25.184044 7.4513479,24.442417 C 7.1969137,24.281059 6.9094195,23.999282 6.9540698,23.95503 C 6.9719506,23.937308 8.5919187,23.914121 11.004123,23.89706 L 15.024375,23.868626 L 10.949584,23.863252 L 6.8747945,23.857877 L 6.8747945,20.637384 L 6.8747945,17.416891 L 16.5047,17.416891 L 26.134606,17.416891 L 26.134606,20.637384 L 26.134606,23.857877 L 25.098379,23.862451 C 24.528453,23.864966 23.262775,23.876377 22.285761,23.887808 L 20.50937,23.908592 L 23.306406,23.914808 C 25.458908,23.919592 26.103442,23.929762 26.103442,23.958942 C 26.103442,24.028045 25.745772,24.350618 25.522995,24.482433 C 24.297348,25.207638 21.989676,25.712372 18.842056,25.94369 C 18.406715,25.975684 15.326952,26.010166 15.039957,25.986261 L 15.039957,25.986261 z"
+       id="path3221" />
+    <path
+       style="fill:#000000;fill-opacity:1"
+       d="M 6.9557817,25.656508 C 6.7646254,25.647244 7.2660677,25.636588 8.0700981,25.632828 C 8.8741284,25.629068 9.52854,25.631186 9.52435,25.637535 C 9.510965,25.657808 7.3170063,25.674014 6.9557817,25.656508 L 6.9557817,25.656508 z"
+       id="path3223" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 6.8464444,10.220304 L 6.8464444,9.7804387 L 7.2332193,9.9776583 C 7.6338449,10.18194 8.1894851,10.399112 8.7289111,10.562248 L 9.0408001,10.656572 L 7.9436222,10.65837 L 6.8464444,10.660169 L 6.8464444,10.220304 z"
+       id="path3227" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.290783,10.623842 C 24.342879,10.606604 24.563104,10.535192 24.780172,10.465149 C 25.259094,10.310612 25.766836,10.101186 26.10633,9.9181537 L 26.358845,9.7820152 L 26.358845,10.221092 L 26.358845,10.660169 L 25.277454,10.657677 C 24.516214,10.655922 24.224106,10.645905 24.290783,10.623842 z"
+       id="path3229" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00315735000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 24.722897,25.665521 C 25.012656,25.660315 25.49573,25.660306 25.796395,25.6655 C 26.09706,25.670694 25.859984,25.674953 25.26956,25.674965 C 24.679136,25.674976 24.433138,25.670726 24.722897,25.665521 L 24.722897,25.665521 z"
+       id="path3231" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 20.181712,27.627323 C 20.216442,27.62354 20.360299,27.607897 20.501393,27.592561 C 22.617756,27.36253 24.339627,26.956526 25.426774,26.431193 C 25.919083,26.193299 26.21332,25.968832 26.334008,25.739083 C 26.347353,25.71368 26.35827,25.687928 26.35827,25.681856 C 26.35827,25.672693 26.321727,25.670661 26.143176,25.669895 C 26.024874,25.669388 25.904994,25.666378 25.876775,25.663206 C 25.844523,25.659581 25.911951,25.656966 26.058322,25.656166 C 26.186392,25.655467 26.309825,25.652654 26.332617,25.649917 C 26.380266,25.644193 26.380801,25.645242 26.362207,25.707854 C 26.336163,25.795557 26.226288,25.931215 26.087248,26.047332 C 25.958274,26.155045 25.718181,26.30637 25.51368,26.408839 C 24.491701,26.920923 22.835817,27.328593 20.785554,27.572879 C 20.469382,27.610551 20.211759,27.63636 20.163141,27.635234 C 20.120413,27.634244 20.121182,27.633916 20.181712,27.627323 z"
+       id="path3233" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.914268,25.665247 C 25.924036,25.663366 25.940021,25.663366 25.949789,25.665247 C 25.959557,25.667129 25.951565,25.668668 25.932029,25.668668 C 25.912492,25.668668 25.9045,25.667129 25.914268,25.665247 L 25.914268,25.665247 z"
+       id="path3235" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.74822,25.657115 C 25.770853,25.655526 25.809925,25.655512 25.835047,25.657083 C 25.860168,25.658654 25.841649,25.659954 25.793895,25.659972 C 25.74614,25.65999 25.725586,25.658704 25.74822,25.657115 L 25.74822,25.657115 z"
+       id="path3237" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397529 L 26.366164,25.647138 L 26.226056,25.648917 L 26.085949,25.650696 L 26.226056,25.653046 L 26.366164,25.655395 L 26.366164,25.676455 C 26.366164,25.694996 26.364984,25.695956 26.356297,25.684475 C 26.348306,25.673913 26.326168,25.670592 26.23987,25.667007 C 26.039033,25.658664 24.491662,25.655046 24.223115,25.662292 C 24.018746,25.667806 24.123226,25.668597 24.661197,25.665607 C 25.407254,25.66146 26.350377,25.674721 26.350377,25.689357 C 26.350377,25.693634 26.338012,25.719629 26.322899,25.747123 C 26.28983,25.807285 26.292791,25.814386 26.326463,25.755672 C 26.339534,25.73288 26.350262,25.719671 26.350303,25.726319 C 26.350344,25.732966 26.337671,25.758719 26.322142,25.783545 C 26.294013,25.828516 26.281211,25.841129 26.290348,25.814872 C 26.293365,25.806201 26.289113,25.808404 26.278923,25.820792 C 26.269996,25.831645 26.242474,25.864619 26.217763,25.894066 C 26.121257,26.00907 25.910758,26.165899 25.681414,26.293663 C 25.632574,26.320872 25.592614,26.344847 25.592614,26.346943 C 25.592614,26.349039 25.619475,26.335926 25.652306,26.317803 C 25.685136,26.29968 25.713856,26.286711 25.716128,26.288982 C 25.726238,26.299093 25.388857,26.469926 25.201892,26.549366 C 24.978653,26.644218 24.728645,26.739172 24.714531,26.734467 C 24.710554,26.733141 24.758199,26.713113 24.820409,26.68996 C 24.969673,26.634407 25.128342,26.569467 25.124412,26.565538 C 25.122686,26.563811 25.092722,26.57462 25.057826,26.589556 C 24.874963,26.667824 24.44844,26.815793 24.146766,26.905618 C 23.884759,26.983633 23.408294,27.107145 23.182095,27.155685 C 23.146219,27.163384 23.139029,27.167136 23.150522,27.172162 C 23.161237,27.176847 23.158773,27.177657 23.141724,27.175055 C 23.107638,27.169851 22.949998,27.203302 22.96912,27.21168 C 22.979543,27.216246 22.976924,27.217052 22.960176,27.214433 C 22.92559,27.209025 22.798917,27.234533 22.818631,27.242937 C 22.828263,27.247042 22.820795,27.248003 22.798362,27.245544 C 22.770971,27.242542 22.766455,27.243486 22.778629,27.249669 C 22.791623,27.256268 22.789883,27.256998 22.768796,27.253793 C 22.754706,27.251652 22.660578,27.265532 22.559622,27.284638 C 21.835562,27.42167 21.017892,27.537138 20.181712,27.620439 C 20.029985,27.635554 19.96359,27.636168 18.474771,27.636216 L 16.925698,27.636266 L 16.925698,24.392093 z M 25.158479,26.554875 C 25.164991,26.550667 25.166767,26.547223 25.162425,26.547223 C 25.158084,26.547223 25.149204,26.550667 25.142692,26.554875 C 25.13618,26.559083 25.134404,26.562527 25.138745,26.562527 C 25.143087,26.562527 25.151967,26.559083 25.158479,26.554875 z M 25.205839,26.535142 C 25.216692,26.528937 25.22202,26.523861 25.217679,26.523861 C 25.213338,26.523861 25.200906,26.528937 25.190052,26.535142 C 25.179199,26.541346 25.173871,26.546422 25.178212,26.546422 C 25.182553,26.546422 25.194985,26.541346 25.205839,26.535142 z M 25.276879,26.503568 C 25.296415,26.493107 25.308847,26.484548 25.304506,26.484548 C 25.300165,26.484548 25.280629,26.493107 25.261092,26.503568 C 25.241556,26.514029 25.229124,26.522588 25.233466,26.522588 C 25.237807,26.522588 25.257343,26.514029 25.276879,26.503568 z M 25.3716,26.460155 C 25.386794,26.451836 25.395674,26.44503 25.391333,26.44503 C 25.386992,26.44503 25.371008,26.451836 25.355813,26.460155 C 25.340618,26.468473 25.331738,26.47528 25.336079,26.47528 C 25.340421,26.475279 25.356405,26.468473 25.3716,26.460155 z"
+       id="path3239" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392093 L 16.925698,21.147919 L 21.645931,21.147919 L 26.366164,21.147919 L 26.366164,23.397262 L 26.366164,25.646604 L 26.28131,25.649141 L 26.196456,25.651679 L 26.28131,25.653355 L 26.366164,25.655031 L 26.366043,25.676738 C 26.365975,25.688842 26.363357,25.694502 26.360123,25.689533 C 26.356651,25.684199 26.347396,25.69608 26.337066,25.719133 C 26.31838,25.760835 26.318928,25.771036 26.337969,25.735938 C 26.344653,25.723619 26.349881,25.719459 26.350061,25.726319 C 26.350491,25.742775 26.292885,25.833809 26.289143,25.822585 C 26.287502,25.817663 26.260158,25.844551 26.228377,25.882335 C 26.126925,26.00295 25.921451,26.16031 25.716934,26.274022 C 25.663866,26.303528 25.641609,26.321986 25.688067,26.297961 C 25.717482,26.28275 25.72685,26.287374 25.700971,26.304331 C 25.662356,26.329633 25.449444,26.43789 25.33299,26.491435 C 25.100904,26.598147 24.733288,26.740325 24.709214,26.732684 C 24.70213,26.730436 24.621828,26.753627 24.530765,26.784221 C 24.328449,26.852191 24.062521,26.932708 23.85338,26.989319 C 23.741524,27.019597 23.70092,27.033549 23.7113,27.038139 C 23.721452,27.042628 23.71858,27.043486 23.701771,27.040983 C 23.688536,27.039013 23.638808,27.047503 23.591263,27.05985 C 23.543719,27.072196 23.513699,27.082852 23.524552,27.083528 C 23.535405,27.084205 23.508928,27.093509 23.465714,27.104204 C 23.4225,27.114899 23.381937,27.121652 23.375574,27.119211 C 23.369211,27.116769 23.344591,27.119116 23.320863,27.124426 C 23.287147,27.131971 23.280972,27.135498 23.292602,27.140564 C 23.302502,27.144876 23.298235,27.145725 23.279858,27.143098 C 23.264663,27.140926 23.241575,27.142359 23.228551,27.146281 C 23.205877,27.153111 23.205709,27.153477 23.224604,27.1549 C 23.241369,27.156163 23.240182,27.157422 23.216711,27.163271 C 23.201516,27.167058 23.178428,27.168254 23.165404,27.165931 C 23.149673,27.163124 23.14525,27.164143 23.152227,27.168965 C 23.166088,27.178543 23.120857,27.188059 23.091619,27.181716 C 23.074958,27.178101 23.073101,27.178976 23.082523,27.185999 C 23.091671,27.192816 23.087184,27.19384 23.06279,27.190499 C 23.038339,27.18715 23.034778,27.187968 23.047003,27.194126 C 23.059108,27.200223 23.054505,27.201169 23.02727,27.198184 C 22.999878,27.195182 22.995362,27.196126 23.007536,27.202309 C 23.02045,27.208867 23.018584,27.209602 22.997277,27.206347 C 22.982952,27.204159 22.973126,27.205435 22.975443,27.209182 C 22.981221,27.218532 22.938193,27.226274 22.906896,27.221516 C 22.885792,27.218308 22.884042,27.219038 22.897029,27.225633 C 22.909203,27.231816 22.904688,27.23276 22.877296,27.229758 C 22.849904,27.226756 22.845389,27.2277 22.857563,27.233882 C 22.870477,27.240441 22.86861,27.241176 22.847303,27.237921 C 22.829256,27.235164 22.822941,27.236665 22.826738,27.242809 C 22.830632,27.249111 22.823324,27.250134 22.801477,27.246344 C 22.779426,27.242519 22.774083,27.243292 22.782576,27.249077 C 22.794908,27.257478 22.788646,27.258693 22.719429,27.261331 C 22.704234,27.26191 22.681146,27.263285 22.668122,27.264386 C 22.646916,27.266179 22.646091,27.26717 22.660228,27.273877 C 22.672493,27.279695 22.670063,27.280451 22.649338,27.277261 C 22.634666,27.275004 22.599264,27.277468 22.570668,27.282737 C 22.527521,27.290687 22.521987,27.293355 22.538144,27.29842 C 22.552245,27.30284 22.549181,27.303557 22.527029,27.301023 C 22.509746,27.299046 22.400138,27.31452 22.274998,27.336604 C 21.858929,27.410029 21.345967,27.486438 20.915795,27.539068 C 20.775719,27.556205 20.74146,27.562489 20.765821,27.566574 C 20.784472,27.569701 20.769934,27.570765 20.7303,27.569172 C 20.678496,27.567091 20.670402,27.568028 20.69478,27.573284 C 20.721172,27.578974 20.718111,27.579524 20.676132,27.576633 C 20.64851,27.574732 20.581022,27.578398 20.526158,27.584781 C 20.471294,27.591164 20.336294,27.605359 20.226156,27.616326 L 20.025906,27.636266 L 18.475802,27.636266 L 16.925698,27.636266 L 16.925698,24.392093 z M 23.194511,27.157272 C 23.188813,27.154992 23.182004,27.155272 23.179382,27.157895 C 23.176759,27.160518 23.181421,27.162384 23.189742,27.162041 C 23.198937,27.161662 23.200807,27.159792 23.194511,27.157272 z M 23.399738,27.109912 C 23.39404,27.107632 23.387232,27.107912 23.384609,27.110535 C 23.381986,27.113158 23.386648,27.115024 23.394969,27.114681 C 23.404165,27.114302 23.406035,27.112432 23.399738,27.109912 z M 23.431312,27.102019 C 23.425614,27.099738 23.418805,27.100019 23.416183,27.102642 C 23.41356,27.105265 23.418222,27.10713 23.426543,27.106787 C 23.435738,27.106409 23.437608,27.104538 23.431312,27.102019 z M 23.462885,27.094125 C 23.457187,27.091845 23.450379,27.092125 23.447756,27.094748 C 23.445133,27.097371 23.449795,27.099237 23.458116,27.098894 C 23.467312,27.098516 23.469182,27.096645 23.462885,27.094125 z M 23.494458,27.086232 C 23.48876,27.083952 23.481952,27.084232 23.47933,27.086855 C 23.476707,27.089478 23.481369,27.091343 23.48969,27.091001 C 23.498885,27.090622 23.500755,27.088752 23.494458,27.086232 z M 24.767757,26.707901 C 24.786775,26.699241 24.787552,26.698071 24.771704,26.701959 C 24.76085,26.704622 24.741314,26.711653 24.72829,26.717583 C 24.709272,26.726243 24.708495,26.727413 24.724344,26.723525 C 24.735197,26.720862 24.754733,26.713832 24.767757,26.707901 L 24.767757,26.707901 z M 24.842744,26.679837 C 24.850973,26.674753 24.848565,26.674132 24.834851,26.6778 C 24.823997,26.680703 24.809789,26.68637 24.803277,26.690394 C 24.795048,26.695478 24.797456,26.696099 24.811171,26.692431 C 24.822024,26.689528 24.836232,26.683861 24.842744,26.679837 L 24.842744,26.679837 z M 24.882211,26.665382 C 24.888723,26.661174 24.890499,26.657731 24.886158,26.657731 C 24.881816,26.65773 24.872936,26.661174 24.866424,26.665382 C 24.859912,26.669591 24.858136,26.673034 24.862477,26.673034 C 24.866819,26.673034 24.875699,26.669591 24.882211,26.665382 z M 24.945358,26.641702 C 24.95187,26.637494 24.953646,26.63405 24.949304,26.63405 C 24.944963,26.63405 24.936083,26.637494 24.929571,26.641702 C 24.923059,26.64591 24.921283,26.649354 24.925624,26.649354 C 24.929966,26.649354 24.938846,26.64591 24.945358,26.641702 z M 24.984825,26.625915 C 24.991337,26.621707 24.993113,26.618264 24.988771,26.618264 C 24.98443,26.618264 24.97555,26.621707 24.969038,26.625915 C 24.962526,26.630124 24.96075,26.633567 24.965091,26.633567 C 24.969433,26.633567 24.978313,26.630124 24.984825,26.625915 z M 25.024291,26.610129 C 25.030803,26.60592 25.032579,26.602477 25.028238,26.602477 C 25.023897,26.602477 25.015017,26.60592 25.008505,26.610129 C 25.001993,26.614337 25.000217,26.61778 25.004558,26.61778 C 25.008899,26.61778 25.017779,26.614337 25.024291,26.610129 z M 25.063758,26.594342 C 25.07027,26.590133 25.072046,26.58669 25.067705,26.58669 C 25.063364,26.58669 25.054484,26.590133 25.047972,26.594342 C 25.04146,26.59855 25.039684,26.601993 25.044025,26.601993 C 25.048366,26.601993 25.057246,26.59855 25.063758,26.594342 z M 25.28077,26.499712 C 25.283536,26.495237 25.280367,26.493914 25.273342,26.49661 C 25.259668,26.501857 25.257166,26.507515 25.26852,26.507515 C 25.272605,26.507515 25.278118,26.504003 25.28077,26.499712 L 25.28077,26.499712 z M 25.3716,26.460155 C 25.378112,26.455946 25.379888,26.452503 25.375546,26.452503 C 25.371205,26.452503 25.362325,26.455946 25.355813,26.460155 C 25.349301,26.464363 25.347525,26.467806 25.351866,26.467806 C 25.356207,26.467806 25.365088,26.464363 25.3716,26.460155 z M 26.22803,25.670086 C 26.048973,25.661085 24.702891,25.65364 24.530956,25.6607 C 24.425095,25.665046 24.560309,25.666361 24.941411,25.66469 C 25.253988,25.66332 25.632278,25.665349 25.782055,25.669198 C 25.931831,25.673047 26.118312,25.676071 26.196456,25.675919 L 26.338537,25.675641 L 26.22803,25.670086 z"
+       id="path3241" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 25.862962,25.665164 C 25.8749,25.663356 25.894436,25.663356 25.906375,25.665164 C 25.918314,25.666973 25.908546,25.668453 25.884668,25.668453 C 25.860791,25.668453 25.851023,25.666973 25.862962,25.665164 z"
+       id="path3243" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.925698,24.392259 L 16.925698,21.147919 L 21.645957,21.147919 L 26.366216,21.147919 L 26.366137,23.421642 C 26.366093,24.672189 26.363049,25.693505 26.359371,25.691232 C 26.355694,25.688959 26.348614,25.696036 26.343638,25.706957 C 26.332648,25.731078 26.331967,25.742344 26.342484,25.726072 C 26.347973,25.717576 26.350169,25.71713 26.350256,25.72449 C 26.350542,25.748721 26.290861,25.839755 26.279352,25.832642 C 26.275987,25.830561 26.268389,25.835036 26.262471,25.842586 C 26.252733,25.855007 26.253023,25.855282 26.265523,25.845479 C 26.273121,25.839521 26.279337,25.838198 26.279337,25.842539 C 26.279337,25.852814 26.259433,25.869298 26.253813,25.863678 C 26.251428,25.861293 26.233995,25.877808 26.215073,25.900378 C 26.142721,25.98668 26.012246,26.086787 25.745545,26.260625 C 25.733006,26.268798 25.732856,26.269573 25.744561,26.265701 C 25.800343,26.247248 25.696277,26.31018 25.527392,26.397027 C 25.293752,26.517174 25.01458,26.634328 24.698369,26.744925 C 24.548991,26.79717 24.508467,26.80876 24.534903,26.791676 C 24.554062,26.779294 24.546464,26.781387 24.377035,26.835162 C 24.288038,26.86341 24.194206,26.892455 24.16852,26.899708 C 24.1352,26.909116 24.125971,26.914351 24.136312,26.917978 C 24.147123,26.921771 24.141601,26.925639 24.11457,26.933207 C 24.094641,26.938787 24.074254,26.94083 24.069265,26.937747 C 24.064277,26.934665 24.024553,26.942097 23.980989,26.954263 C 23.927461,26.969213 23.906528,26.978069 23.916421,26.98158 C 23.928078,26.985717 23.925719,26.98796 23.904842,26.992591 C 23.890423,26.995789 23.876511,26.996292 23.873927,26.993708 C 23.871343,26.991124 23.875741,26.98901 23.8837,26.98901 C 23.891659,26.98901 23.896235,26.987074 23.893869,26.984708 C 23.891503,26.982342 23.872454,26.984715 23.851538,26.989982 C 23.823106,26.997141 23.817264,27.000874 23.828388,27.004776 C 23.848631,27.011877 23.684067,27.052924 23.658326,27.047195 C 23.642478,27.043667 23.641134,27.044551 23.650846,27.052111 C 23.660428,27.05957 23.658561,27.060428 23.641052,27.05661 C 23.614352,27.050788 23.538374,27.068226 23.558967,27.075449 C 23.567028,27.078277 23.526525,27.091101 23.461887,27.106186 C 23.400885,27.120422 23.347319,27.12981 23.34285,27.127049 C 23.338382,27.124287 23.323684,27.124453 23.310188,27.127417 C 23.295108,27.130729 23.289266,27.135042 23.295032,27.138605 C 23.308032,27.14664 23.183768,27.172566 23.165625,27.165604 C 23.156167,27.161974 23.152807,27.162948 23.156147,27.168351 C 23.162574,27.178751 23.113977,27.188832 23.094128,27.181215 C 23.083602,27.177176 23.081606,27.178473 23.086403,27.186235 C 23.091498,27.194479 23.087163,27.195604 23.065991,27.191534 C 23.045729,27.187639 23.042025,27.188453 23.05095,27.194839 C 23.059812,27.201181 23.054849,27.202097 23.031217,27.198482 C 23.006959,27.194771 23.002387,27.195692 23.011483,27.202456 C 23.020974,27.209513 23.019071,27.210582 23.001892,27.207843 C 22.990104,27.205963 22.979244,27.208075 22.977757,27.212536 C 22.97627,27.216997 22.956958,27.220921 22.93484,27.221256 C 22.911254,27.221613 22.898388,27.224582 22.903722,27.228438 C 22.908808,27.232115 22.8989,27.233083 22.881243,27.230635 C 22.857865,27.227395 22.852743,27.22841 22.861509,27.234546 C 22.870726,27.240998 22.868602,27.242077 22.851918,27.239416 C 22.84013,27.237537 22.829475,27.238415 22.828238,27.241369 C 22.824418,27.250489 22.701084,27.271986 22.676015,27.267901 C 22.656975,27.264798 22.654655,27.265825 22.664175,27.273144 C 22.673464,27.280285 22.669213,27.281205 22.644442,27.277416 C 22.620463,27.273747 22.615716,27.274667 22.624708,27.281238 C 22.633677,27.287792 22.627936,27.288827 22.601028,27.285504 C 22.574383,27.282214 22.569452,27.283077 22.581295,27.288958 C 22.593279,27.294909 22.588525,27.29586 22.561561,27.292905 C 22.538599,27.290388 22.53153,27.291344 22.541568,27.295609 C 22.554,27.300891 22.550129,27.303141 22.52215,27.306894 C 22.502931,27.309471 22.476408,27.309975 22.46321,27.308012 C 22.442767,27.304971 22.441551,27.305656 22.455001,27.312638 C 22.467946,27.319358 22.465971,27.320091 22.444031,27.316712 C 22.428961,27.314391 22.327247,27.328236 22.211176,27.348405 C 21.984108,27.387863 21.582242,27.450761 21.373612,27.479496 C 21.273704,27.493257 21.245475,27.499437 21.263105,27.503689 C 21.280023,27.507769 21.276642,27.508391 21.251263,27.505868 C 21.231726,27.503926 21.166014,27.508426 21.105235,27.515868 C 21.017084,27.526662 21.000317,27.530552 21.022355,27.535094 C 21.042465,27.539239 21.038401,27.539883 21.007416,27.537459 C 20.984006,27.535628 20.943157,27.536569 20.916643,27.53955 C 20.871405,27.544636 20.870137,27.545318 20.896061,27.550609 C 20.913293,27.554125 20.901413,27.55517 20.864488,27.553386 C 20.819089,27.551192 20.811728,27.55214 20.832914,27.557452 C 20.85498,27.562986 20.850214,27.563767 20.809234,27.561334 C 20.778781,27.559526 20.765948,27.560707 20.777661,27.56424 C 20.804263,27.572263 20.703602,27.582069 20.643473,27.577311 C 20.611076,27.574748 20.60707,27.575391 20.627687,27.579844 C 20.646999,27.584017 20.631557,27.585876 20.57638,27.586023 C 20.532966,27.586138 20.413974,27.59649 20.311952,27.609025 L 20.126458,27.631818 L 18.526078,27.634208 L 16.925698,27.6366 L 16.925698,24.392259 z M 20.71239,27.567649 C 20.70471,27.565648 20.694054,27.565779 20.68871,27.567942 C 20.683366,27.570104 20.68965,27.571741 20.702674,27.57158 C 20.715698,27.571419 20.72007,27.56965 20.71239,27.567649 L 20.71239,27.567649 z M 23.233977,27.149379 C 23.228279,27.147099 23.221471,27.147379 23.218848,27.150002 C 23.216226,27.152625 23.220888,27.15449 23.229208,27.154148 C 23.238404,27.153769 23.240274,27.151898 23.233977,27.149379 z M 23.265551,27.141485 C 23.259853,27.139205 23.253045,27.139486 23.250422,27.142108 C 23.247799,27.144732 23.252461,27.146597 23.260782,27.146254 C 23.269977,27.145876 23.271848,27.144005 23.265551,27.141485 z M 23.368165,27.117805 C 23.362467,27.115525 23.355659,27.115805 23.353036,27.118428 C 23.350413,27.121051 23.355075,27.122917 23.363396,27.122574 C 23.372591,27.122196 23.374461,27.120325 23.368165,27.117805 z M 23.747046,27.023085 C 23.741348,27.020805 23.73454,27.021085 23.731917,27.023708 C 23.729294,27.026331 23.733956,27.028196 23.742277,27.027854 C 23.751473,27.027475 23.753343,27.025605 23.747046,27.023085 z M 23.796873,27.01269 C 23.806824,27.008414 23.808283,27.005906 23.80082,27.005906 C 23.794308,27.005906 23.781876,27.008959 23.773193,27.01269 C 23.763242,27.016966 23.761783,27.019474 23.769246,27.019474 C 23.775758,27.019474 23.78819,27.016421 23.796873,27.01269 z M 24.104714,26.925863 C 24.114665,26.921587 24.116124,26.919079 24.108661,26.919079 C 24.102149,26.919079 24.089717,26.922132 24.081034,26.925863 C 24.071084,26.930139 24.069625,26.932647 24.077088,26.932647 C 24.0836,26.932647 24.096032,26.929594 24.104714,26.925863 z M 25.726801,26.274255 C 25.726801,26.272084 25.716145,26.275819 25.703121,26.282554 C 25.690097,26.289289 25.679441,26.296575 25.679441,26.298746 C 25.679441,26.300917 25.690097,26.297182 25.703121,26.290447 C 25.716145,26.283712 25.726801,26.276426 25.726801,26.274255 L 25.726801,26.274255 z M 26.253395,25.67287 C 26.228274,25.671298 26.189201,25.671313 26.166568,25.672902 C 26.143935,25.674491 26.164488,25.675777 26.212243,25.675759 C 26.259998,25.675741 26.278516,25.674441 26.253395,25.67287 L 26.253395,25.67287 z M 25.993202,25.664923 C 25.942191,25.663549 25.858719,25.663549 25.807708,25.664923 C 25.756697,25.666298 25.798433,25.667423 25.900455,25.667423 C 26.002477,25.667423 26.044213,25.666298 25.993202,25.664923 z M 25.120985,25.657064 C 25.08951,25.655565 25.038006,25.655565 25.006531,25.657064 C 24.975057,25.658562 25.000809,25.659788 25.063758,25.659788 C 25.126708,25.659788 25.15246,25.658562 25.120985,25.657064 L 25.120985,25.657064 z M 26.336672,25.649475 C 26.326964,25.647601 26.309204,25.647553 26.297205,25.649367 C 26.285207,25.651182 26.29315,25.652714 26.314857,25.652774 C 26.336564,25.652833 26.34638,25.651348 26.336672,25.649475 L 26.336672,25.649475 z"
+       id="path3245" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 12.848775,27.619856 C 10.696878,27.386126 9.0250697,27.008859 7.9114743,26.505687 C 7.3412741,26.248045 6.9502443,25.953581 6.8626973,25.715909 C 6.8373638,25.647134 6.8383187,25.644618 6.8873101,25.651082 C 6.9101022,25.654089 7.1489752,25.658872 7.4181389,25.66171 L 7.9075276,25.666871 L 7.4931259,25.673007 C 7.0722205,25.679239 6.8893635,25.687314 6.8764376,25.70024 C 6.8671934,25.709484 6.8990931,25.769628 6.944627,25.828802 C 7.0008187,25.901828 7.1653628,26.052563 7.2721117,26.128804 C 7.6214041,26.378272 8.1390063,26.615616 8.7836912,26.821932 C 9.8543,27.164554 11.170036,27.420552 12.765707,27.596698 C 12.980199,27.620376 13.085534,27.634586 13.046109,27.634527 C 13.011378,27.634474 12.922578,27.627872 12.848775,27.619856 L 12.848775,27.619856 z"
+       id="path3247" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00078934000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 7.8897675,25.664951 C 7.923413,25.663471 7.9784692,25.663471 8.0121147,25.664951 C 8.0457602,25.66643 8.0182321,25.667641 7.9509411,25.667641 C 7.8836502,25.667641 7.8561221,25.66643 7.8897675,25.664951 L 7.8897675,25.664951 z"
+       id="path3249" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00039063000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 8.1891765,26.622092 C 8.0158724,26.551424 7.9012315,26.500857 7.775114,26.439456 C 7.3056794,26.210909 6.9784811,25.958681 6.8793554,25.748942 C 6.8604997,25.709045 6.8459037,25.665422 6.8488454,25.657756 C 6.8505937,25.6532 6.860807,25.651938 6.8990148,25.651559 C 6.9254006,25.651297 6.9715983,25.649844 7.0016765,25.64833 C 7.0490679,25.645945 7.0411205,25.645488 6.9421061,25.6449 L 6.8278483,25.644223 L 6.8278483,24.536801 L 6.8278483,23.429379 L 8.9743327,23.429379 L 11.120817,23.429379 L 11.120817,25.034848 L 11.120817,26.640317 L 9.699613,26.640317 L 8.2784086,26.640317 L 8.191264,26.605128 C 7.7767222,26.437736 7.4215269,26.246672 7.205778,26.075024 C 7.1912761,26.063486 7.1794108,26.054987 7.1794108,26.056136 C 7.1794108,26.060154 7.2574677,26.120366 7.3063385,26.154048 C 7.5331887,26.310391 7.8447844,26.471289 8.181364,26.605882 C 8.2243327,26.623064 8.2602214,26.637841 8.2611166,26.63872 C 8.2620117,26.639598 8.2558594,26.640159 8.2474447,26.639965 C 8.2390299,26.639772 8.2128093,26.631729 8.1891765,26.622092 L 8.1891765,26.622092 z M 7.1755046,26.053031 C 7.1755046,26.05229 7.1715495,26.048335 7.1667155,26.044242 L 7.1579265,26.036801 L 7.1653679,26.04559 C 7.1723609,26.05385 7.1755046,26.056157 7.1755046,26.053031 L 7.1755046,26.053031 z M 7.0090626,25.897153 C 6.9646401,25.850887 6.921397,25.794898 6.8953494,25.749923 C 6.8884321,25.737979 6.8827192,25.729863 6.8826541,25.731886 C 6.8824658,25.737747 6.9132665,25.788187 6.9353961,25.818257 C 6.955002,25.844898 7.0216168,25.91766 7.026401,25.91766 C 7.0276947,25.91766 7.0198925,25.908432 7.0090626,25.897153 z M 6.8983177,25.697891 C 6.9078994,25.696167 6.9324382,25.693155 6.9528483,25.691198 L 6.9899577,25.68764 L 6.946989,25.689396 C 6.9233561,25.690362 6.8974284,25.69298 6.8893718,25.695215 C 6.8768915,25.698676 6.874781,25.70084 6.8751127,25.709836 L 6.8755021,25.720395 L 6.8781994,25.71071 C 6.880352,25.702981 6.8844138,25.700393 6.8983177,25.697891 L 6.8983177,25.697891 z M 7.047444,25.684307 C 7.0360926,25.683516 7.0185145,25.683524 7.0083815,25.684326 C 6.9982484,25.685127 7.0075358,25.685775 7.0290202,25.685765 C 7.0505046,25.685755 7.0587953,25.685099 7.047444,25.684307 L 7.047444,25.684307 z M 7.1528727,25.680381 C 7.1372026,25.679638 7.1125932,25.679643 7.0981852,25.680393 C 7.0837773,25.681142 7.0965983,25.68175 7.1266765,25.681744 C 7.1567546,25.681738 7.1685429,25.681125 7.1528727,25.680381 L 7.1528727,25.680381 z M 7.9450358,25.671591 C 8.1996257,25.669274 8.4896647,25.666975 8.5895671,25.666482 C 8.6894694,25.665989 8.5198405,25.665813 8.212614,25.66609 C 7.739063,25.666518 7.4526201,25.669676 7.2399577,25.676815 C 7.193965,25.67836 7.2332656,25.678068 7.9450358,25.671591 L 7.9450358,25.671591 z"
+       id="path3251" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#00ffff;stroke-width:0.00039063000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 8.1618327,26.611328 C 7.5602425,26.367197 7.1239875,26.094124 6.9381928,25.845395 C 6.8933845,25.785408 6.8415961,25.676647 6.8488454,25.657756 C 6.85057,25.653262 6.8600686,25.651942 6.8931554,25.651598 C 6.9163185,25.651358 6.9519694,25.649884 6.9723796,25.648324 C 7.0022023,25.646044 6.9916558,25.645363 6.9186686,25.644855 L 6.8278483,25.644223 L 6.8278483,24.536801 L 6.8278483,23.429379 L 8.9743327,23.429379 L 11.120817,23.429379 L 11.120817,25.034848 L 11.120817,26.640317 L 9.699346,26.640317 L 8.2778746,26.640317 L 8.1729788,26.597757 C 8.1152859,26.574349 8.0339638,26.540072 7.9922628,26.521585 C 7.9210845,26.490031 7.8988734,26.481234 7.9215983,26.493599 C 7.9399373,26.503578 8.0946307,26.570257 8.1771348,26.603745 C 8.2224295,26.622131 8.2602214,26.63788 8.2611166,26.638745 C 8.2620117,26.639609 8.2558594,26.640214 8.2474447,26.640089 C 8.2378809,26.639947 8.205785,26.629164 8.1618327,26.611328 L 8.1618327,26.611328 z M 7.8215026,26.443226 C 7.7718208,26.41895 7.705024,26.385556 7.673065,26.369017 C 7.6411059,26.352478 7.6184733,26.341815 7.6227702,26.345321 C 7.6326198,26.353357 7.9024117,26.488081 7.9078308,26.487668 C 7.9100317,26.487501 7.8711841,26.467502 7.8215025,26.443226 L 7.8215026,26.443226 z M 7.6051921,26.333755 C 7.6051921,26.332725 7.5981608,26.328295 7.5895671,26.32391 C 7.5809733,26.319526 7.5739421,26.316812 7.5739421,26.317878 C 7.5739421,26.318945 7.5805339,26.323297 7.5885905,26.327551 C 7.6051647,26.336301 7.6051921,26.336311 7.6051921,26.333755 z M 7.5700358,26.314245 C 7.5700358,26.313226 7.5647624,26.309665 7.5583171,26.306332 C 7.5436261,26.298735 7.5427372,26.302035 7.5573405,26.309957 C 7.5696161,26.316617 7.5700358,26.316759 7.5700358,26.314245 L 7.5700358,26.314245 z M 7.5348796,26.294751 C 7.5348796,26.293752 7.5309245,26.291019 7.5260905,26.288676 C 7.5176506,26.284586 7.5176027,26.284658 7.524884,26.290492 C 7.5328539,26.296877 7.5348796,26.29774 7.5348796,26.294751 L 7.5348796,26.294751 z M 7.5075358,26.279126 C 7.5075358,26.278127 7.5035808,26.275394 7.4987468,26.273051 C 7.4903068,26.268961 7.4902589,26.269033 7.4975402,26.274867 C 7.5055101,26.281252 7.5075358,26.282115 7.5075358,26.279126 L 7.5075358,26.279126 z M 7.4880046,26.267407 C 7.4880046,26.266409 7.4840495,26.263675 7.4792155,26.261332 C 7.4707756,26.257242 7.4707277,26.257314 7.478009,26.263148 C 7.4859789,26.269533 7.4880046,26.270396 7.4880046,26.267407 L 7.4880046,26.267407 z M 7.462614,26.251234 C 7.4526083,26.243523 7.4411296,26.237202 7.4411296,26.239405 C 7.4411296,26.24139 7.4655742,26.257401 7.4684733,26.257314 C 7.4695476,26.257282 7.4669108,26.254546 7.462614,26.251234 L 7.462614,26.251234 z M 7.4372233,26.236157 C 7.4372233,26.235159 7.4332683,26.232425 7.4284343,26.230082 C 7.4199943,26.225992 7.4199464,26.226064 7.4272277,26.231898 C 7.4351975,26.238283 7.4372233,26.239146 7.4372233,26.236157 L 7.4372233,26.236157 z M 7.4101376,26.218773 C 7.3983328,26.209699 7.3752626,26.196383 7.3805827,26.201714 C 7.3858237,26.206966 7.4150744,26.226277 7.4176223,26.226167 C 7.4187349,26.226119 7.4153668,26.222792 7.4101376,26.218773 L 7.4101376,26.218773 z M 7.3512858,26.181781 C 7.3512858,26.180954 7.3464519,26.177334 7.3405436,26.173737 L 7.3298015,26.167197 L 7.3390233,26.175241 C 7.3480222,26.183091 7.3512858,26.184832 7.3512858,26.181781 L 7.3512858,26.181781 z M 7.3200358,26.159849 C 7.2839705,26.132602 7.2178978,26.086303 7.2243327,26.092787 C 7.2330035,26.101524 7.3247573,26.167651 7.3278483,26.167391 C 7.3289226,26.1673 7.3254069,26.163906 7.3200358,26.159849 z M 7.2145671,26.084154 C 7.2145671,26.083343 7.2114909,26.080267 7.2077311,26.077318 C 7.2015356,26.072459 7.2013974,26.072598 7.2062563,26.078793 C 7.2113593,26.0853 7.2145671,26.087369 7.2145671,26.084154 z M 7.0012566,25.88934 C 6.9787201,25.865537 6.9490142,25.82955 6.9295133,25.802426 C 6.9103217,25.775732 6.9010311,25.765498 6.9117827,25.782895 C 6.9317701,25.815235 7.0074536,25.905942 7.0144501,25.905942 C 7.0158387,25.905942 7.0099017,25.898471 7.0012566,25.88934 z M 6.9020671,25.76141 C 6.8997675,25.757113 6.897007,25.753598 6.8959328,25.753598 C 6.8948586,25.753598 6.8958612,25.757113 6.8981608,25.76141 C 6.9004604,25.765707 6.9032209,25.769223 6.9042951,25.769223 C 6.9053693,25.769223 6.9043667,25.765707 6.9020671,25.76141 z M 6.9176921,25.693802 C 6.9230632,25.692835 6.9178134,25.692774 6.9060259,25.693666 C 6.8942385,25.694559 6.8830397,25.696844 6.8811398,25.698744 C 6.8791381,25.700746 6.8840442,25.700803 6.8928059,25.698879 C 6.9011222,25.697054 6.912321,25.694769 6.9176921,25.693802 L 6.9176921,25.693802 z M 6.957487,25.688429 C 6.9546672,25.687301 6.951298,25.68744 6.95,25.688738 C 6.948702,25.690036 6.9510092,25.690959 6.955127,25.690789 C 6.9596775,25.690602 6.9606031,25.689676 6.957487,25.688429 z M 7.5671061,25.672552 C 7.5364909,25.671892 7.4863933,25.671892 7.455778,25.672552 C 7.4251628,25.673212 7.4502116,25.673752 7.5114421,25.673752 C 7.5726726,25.673752 7.5977214,25.673212 7.5671061,25.672552 L 7.5671061,25.672552 z M 8.243864,25.667872 L 8.4391765,25.665271 L 8.2555827,25.665062 C 8.1546061,25.664947 7.9761882,25.66602 7.8590983,25.667448 L 7.6462077,25.670043 L 7.8473796,25.670258 C 7.9580241,25.670377 8.1364421,25.669303 8.243864,25.667872 L 8.243864,25.667872 z"
+       id="path3253" />
+    <path
+       style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.18750000000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 13.660265,28.663966 C 10.944351,28.440412 8.7470702,27.969723 7.4102646,27.325126 C 6.7247359,26.994571 6.3329584,26.693374 6.0771565,26.300243 L 5.9102646,26.043753 L 5.8938002,17.116048 C 5.8820977,10.770111 5.8972234,8.1144876 5.9461052,7.9329557 C 6.0581952,7.5166889 6.6640384,6.9624951 7.3814665,6.6199664 C 9.308889,5.6997357 12.563486,5.1935782 16.566515,5.1914976 C 22.088153,5.188627 26.262108,6.1678789 27.166415,7.6783401 L 27.347765,7.9812532 L 27.347765,16.950003 L 27.347765,25.918753 L 27.210746,26.174803 C 26.53469,27.438252 23.789099,28.31699 19.420975,28.667953 C 17.991127,28.782836 15.079913,28.780821 13.660265,28.663966 z M 26.379015,15.431914 L 26.379015,9.7263245 L 25.839465,9.9904889 C 24.549833,10.621894 22.341937,11.100853 19.629015,11.337721 C 18.4545,11.440268 14.738666,11.439969 13.597765,11.337235 C 10.791363,11.084528 8.5706921,10.598321 7.3008896,9.9585582 L 6.8165146,9.7145164 L 6.8316971,14.472886 L 6.8468834,19.231253 L 6.8633821,14.965628 L 6.8798802,10.700003 L 7.9894046,10.700003 C 8.9853421,10.700003 9.1852384,10.718858 9.942094,10.884183 C 11.988086,11.331103 13.728131,11.482441 16.754015,11.476642 C 19.724041,11.470951 21.217009,11.33176 23.422352,10.85495 C 24.030903,10.723377 24.303256,10.700003 25.227765,10.700003 L 26.316515,10.700003 L 26.316515,14.91417 C 26.316515,18.875108 26.30994,19.130055 26.20714,19.15692 C 26.102971,19.184142 26.102971,19.185848 26.20714,19.192753 C 26.30629,19.199328 26.316515,19.290563 26.316515,20.168753 C 26.316515,20.701566 26.330577,21.137503 26.347765,21.137503 C 26.364952,21.137503 26.379015,18.569988 26.379015,15.431914 z"
+       id="path3208" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/pg.svg b/src/tools/gui_resources/pg.svg
new file mode 100644 (file)
index 0000000..3a69492
--- /dev/null
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg4645"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="pg.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4647">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective4653" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.197802"
+     inkscape:cx="0.10402327"
+     inkscape:cy="12.42787"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata4650">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="opacity:1;fill:#ffb380;fill-opacity:1;stroke:#000000;stroke-width:0.51228672;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect4655"
+       width="28.028931"
+       height="27.761021"
+       x="1.9708146"
+       y="2.2681644" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5166"
+       width="9.5227489"
+       height="6.9329543"
+       x="5.1512856"
+       y="4.019784" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5168"
+       width="9.5227489"
+       height="6.9329543"
+       x="5.0619822"
+       y="12.905456" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44609264;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5178"
+       width="9.520051"
+       height="7.0195599"
+       x="17.74439"
+       y="3.9764812" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5180"
+       width="9.5227489"
+       height="6.9329543"
+       x="17.653738"
+       y="12.905456" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5182"
+       width="9.5227489"
+       height="6.9329543"
+       x="5.0619822"
+       y="20.942747" />
+    <rect
+       style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect5184"
+       width="9.5227489"
+       height="6.9329543"
+       x="17.564436"
+       y="21.032051" />
+  </g>
+</svg>
diff --git a/src/tools/gui_resources/stats_window.glade b/src/tools/gui_resources/stats_window.glade
new file mode 100644 (file)
index 0000000..9ce10cf
--- /dev/null
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-requires gtk+ 2.8 -->
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="statsWindow">
+    <property name="border_width">5</property>
+    <property name="default_width">350</property>
+    <property name="default_height">500</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <child>
+      <object class="GtkVBox" id="statsVBox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="statsInfoLabel">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="yalign">0</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="statsScrolledWindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="statsInfoTreeView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="headers_clickable">False</property>
+                <property name="rules_hint">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="statsBottomHBox">
+            <property name="visible">True</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkHBox" id="statsButtonsHBox">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkButton" id="statsCopyButton">
+                    <property name="label" translatable="yes">gtk-copy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="statsCloseButton">
+                    <property name="label" translatable="yes">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkFileChooserDialog" id="saveFileChooserDialog">
+    <property name="border_width">5</property>
+    <property name="type">popup</property>
+    <property name="title" translatable="yes">Save File</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <property name="action">save</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox5">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area5">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="saveCancelButton">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="saveSaveButton">
+                <property name="label" translatable="yes">gtk-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">saveCancelButton</action-widget>
+      <action-widget response="-5">saveSaveButton</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/src/tools/gui_resources/stopped_mds.svg b/src/tools/gui_resources/stopped_mds.svg
new file mode 100644 (file)
index 0000000..67ed576
--- /dev/null
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   id="svg3327"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="stopped_mds.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3329">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:persp3d-origin="16 : 10.666667 : 1"
+       id="perspective3335" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.598901"
+     inkscape:cx="-15.791953"
+     inkscape:cy="18.74316"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="725"
+     inkscape:window-x="0"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata3332">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 20.003926,24.677134 L 29.068205,19.586849 L 29.068205,19.586849 L 29.068205,19.586849"
+       id="path3461" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 20.093229,24.409224 L 20.093229,12.799803 L 20.093229,12.799803"
+       id="path3463" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 11.162905,10.79048 L 20.227184,13.157016"
+       id="path3465" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 20.004014,13.157016 L 29.068293,8.0667311 L 29.068293,8.0667311 L 29.068293,8.0667311"
+       id="path3467" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 28.844947,7.6497995 L 28.844947,20.093085"
+       id="path3469" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 11.542444,10.790481 L 20.606723,5.7001955 L 20.606723,5.7001955 L 20.606723,5.7001955"
+       id="path3471" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 11.609421,22.830482 L 11.609421,10.851067 L 11.609421,10.851067"
+       id="path3473" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 11.229882,22.154317 L 20.294161,24.520853"
+       id="path3475" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 20.282268,5.7999319 L 28.834514,8.1902536"
+       id="path3477" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 20.634838,18.552979 L 20.634838,13.40064 L 24.438397,11.263602 C 26.530357,10.088232 28.258459,9.1198397 28.278624,9.1116194 C 28.298789,9.1033986 28.310184,11.420105 28.303942,14.259855 L 28.292591,19.423037 L 24.480374,21.564178 C 22.383658,22.741806 20.660663,23.705319 20.6515,23.705319 C 20.642334,23.705319 20.634838,21.386766 20.634838,18.552979 L 20.634838,18.552979 z"
+       id="path3479" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 15.823626,22.821027 L 12.15103,21.857591 L 12.15103,16.726321 L 12.15103,11.595048 L 12.273822,11.624497 C 12.542124,11.688843 19.109664,13.401222 19.328778,13.463963 L 19.563199,13.531086 L 19.563199,18.662855 C 19.563199,21.485327 19.54813,23.792336 19.529711,23.789542 C 19.511292,23.786747 17.843554,23.350916 15.823626,22.821026 L 15.823626,22.821027 z"
+       id="path3481" />
+    <path
+       style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
+       d="M 16.339794,11.612377 C 14.407291,11.104724 12.840019,10.676317 12.856968,10.660362 C 12.873916,10.644407 14.592102,9.6746669 16.67516,8.5053861 L 20.462538,6.3794198 L 23.931048,7.3463997 C 25.83873,7.878238 27.41395,8.3258777 27.431538,8.3411543 C 27.476775,8.3804482 20.101123,12.514414 19.965255,12.525917 C 19.903755,12.531124 18.272297,12.120031 16.339794,11.612378 L 16.339794,11.612377 z"
+       id="path3483" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path3438"
+       sodipodi:cx="11.609421"
+       sodipodi:cy="17.890089"
+       sodipodi:rx="4.4651618"
+       sodipodi:ry="4.1079493"
+       d="M 16.074583,17.890089 A 4.4651618,4.1079493 0 1 1 7.144259,17.890089 A 4.4651618,4.1079493 0 1 1 16.074583,17.890089 z"
+       transform="translate(-1.2502454,-0.7144259)" />
+  </g>
+</svg>