diff --git a/.gitignore b/.gitignore index d639319..92fb135 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ bin/ +build/ local/ spacetray *~ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..48654d0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.10) +project(spacetray) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +find_package(Qt5 REQUIRED COMPONENTS Widgets Network) + +add_executable(spacetray + main.cpp + spacetray.cpp + spacetray.h +) + +target_link_libraries(spacetray Qt5::Widgets Qt5::Network) diff --git a/Makefile b/Makefile deleted file mode 100644 index ef923a6..0000000 --- a/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -all: - $(CC) -Wall -g `pkg-config --cflags --libs gtk+-2.0 --libs libcurl --libs json-c --libs libnotify` -DLIBNOTIFY -o bin/spacetray spacetray.c - -nonotify: - $(CC) -Wall -g `pkg-config --cflags --libs gtk+-2.0 --libs libcurl --libs json-c` -o bin/spacetray spacetray.c - -clean: - rm -f ./bin/spacetray - -run: - ./bin/spacetray diff --git a/README.md b/README.md index b6708f0..7d2cdc8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ spacetray ========= -A panel Applet using GTK2 for showing the Status of a Hackerspace. Compatible with the SpaceAPI version >= 0.13. +A panel Applet using Qt5 for showing the Status of a Hackerspace. Compatible with the SpaceAPI version >= 0.13. Installation: @@ -9,11 +9,8 @@ Installation: Requirements: -- Standard tools like gcc, pkg-config etc. -- curl -- gtk+-2.0 -- json-c -- libnotify - Only needed when compiling with libnotify support. +- Standard tools like g++, cmake etc. +- Qt5 (Widgets and Network modules) Use the following command for getting the sources: @@ -25,67 +22,75 @@ Change into the new directory: To compile the sources just run: + mkdir build + cd build + cmake .. make -This will compile dooris with libnotify support. +This will compile spacetray with status icon and notification support. -If you don't want notifications run the following command: +Just copy "bin/spacetray" to a folder in your $PATH. I do: - make nonotify - -Just copy "spacetray" to a folder in your $PATH. I do: - - cp ./spacetray ~/bin/ + cp ./bin/spacetray ~/bin/ You can copy the file to /usr/bin to make it available to all users but I don't. If you want that just run: - sudo cp ./spacetray /usr/bin/ + sudo cp ./bin/spacetray /usr/bin/ Configuration: -------------- -Configuration needs to be done before compiling. There are some parameters you can set in the head of the spacetray.c file where variables are declared. A configuration file will at this point make no sense. +Configuration is done via command line arguments. Usage: ------ Run spacetray with: - ./spacetray & + ./bin/spacetray & Or if in your $PATH: - spacetray + spacetray -Status Icon "Pesthoernchen" colors: +Status Icon "lock" colors: -- Red = Door closed -- Yellow = Door open +- Red = Door open +- Green = Door closed Themes: ------- -You can create your own icon theme by generating a C header file containing the icons as "static const GdkPixdata" data structure. +You can create your own icon theme by generating a C++ header file containing the icons as raw RGBA8888 pixel data in a `static const quint8` array. -This can be done using the following commands: +The format should look like this: - gdk-pixbuf-csource --struct PATH_TO_OPEN_IMAGE > ./themes/THEME_NAME.h + static const quint8 icon_open_data[] = { + 0xRR, 0xGG, 0xBB, 0xAA, ... + }; - gdk-pixbuf-csource --struct PATH_TO_CLOSED_IMAGE >> ./themes/THEME_NAME.h + static const quint8 icon_closed_data[] = { + 0xRR, 0xGG, 0xBB, 0xAA, ... + }; -Afterwards you need to rename the first generated struct to: +The image size used in the default theme is 52x48 pixels with 4 channels (RGBA). - icon_open_pixbuf +To create these arrays from a PNG image, you can use `ImageMagick` to convert the image to raw RGBA data and then format it into a C++ header. -The second must be renamed to: +Example using `magick` (ImageMagick 7): - icon_closed_pixbuf + magick icon_open.png -size 52x48 -depth 8 RGBA:icon_open.raw + hexdump -v -e '12/1 "0x%02x, " "\n"' icon_open.raw -in: +Or using a simple one-liner to generate the header content: - ./themes/THEME_NAME.h + echo "static const quint8 icon_open_data[] = {" > themes/my_theme.h + magick icon_open.png -size 52x48 -depth 8 RGBA:- | hexdump -v -e '12/1 "0x%02x, " "\n"' >> themes/my_theme.h + echo "};" >> themes/my_theme.h -You can then use your custom icon theme when changing the line: +Repeat the process for `icon_closed_data` and append it to the same header file. + +You can then use your custom icon theme by changing the line: #include "themes/lock.h" @@ -95,5 +100,5 @@ to: in: - ./spacetray.c + ./spacetray.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..790e2fa --- /dev/null +++ b/main.cpp @@ -0,0 +1,17 @@ +#include +#include +#include "spacetray.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + if (argc != 2) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + return 1; + } + + SpaceTray tray(argv[1]); + + return app.exec(); +} diff --git a/spacetray.c b/spacetray.c deleted file mode 100644 index f2ba56d..0000000 --- a/spacetray.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * SpaceAPI based tray applet for BSD* / Linux / UNIX etc. using GTK2 - * - * Author: hanez - * Website: https://git.xw3.org/hanez/spacetray - * - * Licensed under the terms of the MIT License. - */ - -#include -#include -#include - -#if LIBNOTIFY -#include -#endif -#include -#include -#include -#include -#include -#include - -#include "themes/lock_new.h" - -struct string { - char *ptr; - size_t len; -}; - -static char *agent = "Spacetray/0.42"; -static char *name = "SpaceAPI widget for UNIX"; -static char *statusurl = NULL; - -// The delay for polling the dooris service. Adjust this before compiling -static int delay = 300; // ms. aka 15 minutes - -bool door_open = false; -bool old_door_open = false; -int door_last_change = 0; -char space_name[128] = "Unknown Space"; - -void on_quit_menu_item_activated(GtkMenuItem *item, gpointer data) { - gtk_main_quit(); -} - -void on_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer data) { - GtkWidget *menu, *quit_item; - - menu = gtk_menu_new(); - quit_item = gtk_menu_item_new_with_label("Quit"); - - g_signal_connect(G_OBJECT(quit_item), "activate", - G_CALLBACK(on_quit_menu_item_activated), NULL); - - gtk_menu_shell_append(GTK_MENU_SHELL(menu), quit_item); - gtk_widget_show_all(menu); - - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, - gtk_status_icon_position_menu, status_icon, - button, activate_time); -} - -void do_it(); -void invoke_notification(); - -gboolean do_it_wrapper(gpointer data) { - do_it(); - return FALSE; -} - -void *status_update_thread(void *arg) { - while (1) { - sleep(delay); - g_idle_add(do_it_wrapper, NULL); - } - return NULL; -} - -GtkStatusIcon *tray_icon; - -void init_string(struct string *s) { - s->len = 0; - s->ptr = malloc(s->len+1); - if (s->ptr == NULL) { - fprintf(stderr, "malloc() failed\n"); - exit(EXIT_FAILURE); - } - s->ptr[0] = '\0'; -} - -size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s) { - size_t new_len = s->len + size*nmemb; - s->ptr = realloc(s->ptr, new_len+1); - if (s->ptr == NULL) { - fprintf(stderr, "realloc() failed\n"); - exit(EXIT_FAILURE); - } - memcpy(s->ptr+s->len, ptr, size*nmemb); - s->ptr[new_len] = '\0'; - s->len = new_len; - - return size*nmemb; -} - -void get_bouncer_data() { - CURL *curl; - CURLcode res; - - struct json_object *response_json_object; - struct json_object *door_json_object; - struct json_object *leaf_json_object; - - bool door_status; - struct string s; - - printf("Called get_bouncer_data()\n"); - - old_door_open = door_open; - - init_string(&s); - - curl = curl_easy_init(); - if(!curl) { - fprintf(stderr, "curl_easy_init() failed.\n"); - return; - } - - curl_easy_setopt(curl, CURLOPT_URL, statusurl); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); - curl_easy_setopt(curl, CURLOPT_USERAGENT, agent); - - res = curl_easy_perform(curl); - - curl_easy_cleanup(curl); - - if(res != CURLE_OK) { - fprintf(stderr, "curl_easy_perform() failed: %s\n", - curl_easy_strerror(res)); - return; - } - - response_json_object = json_tokener_parse(s.ptr); - free(s.ptr); - - // door objects - door_json_object = json_object_object_get(response_json_object, "state"); - - leaf_json_object = json_object_object_get(door_json_object, "open"); - door_status = json_object_get_int(leaf_json_object); - //door_status = true; - leaf_json_object = json_object_object_get(door_json_object, "lastchange"); - door_last_change = json_object_get_int(leaf_json_object); - - leaf_json_object = json_object_object_get(response_json_object, "space"); - if (leaf_json_object != NULL) { - const char *s_name = json_object_get_string(leaf_json_object); - if (s_name != NULL) { - strncpy(space_name, s_name, sizeof(space_name) - 1); - space_name[sizeof(space_name) - 1] = '\0'; - } - } - - // free response object - json_object_put(response_json_object); - - printf("Door status: = %d\n", door_status); - printf("Door last change: = %d\n", door_last_change); - - if (door_status == true) { - door_open = true; - } else { - door_open = false; - } -} - -GdkPixbuf *icon_open = NULL; -GdkPixbuf *icon_closed = NULL; - -static GdkPixbuf *pixbuf_new_from_data(const guint8 *data) { - return gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, TRUE, 8, 52, 48, 208, NULL, NULL); -} - -void update_tooltip() { - char door[256]; - char date_str[64]; - time_t last_change_time = (time_t)door_last_change; - struct tm *tm_info = localtime(&last_change_time); - - strftime(date_str, sizeof(date_str), "%Y-%m-%d %H:%M:%S", tm_info); - - if (door_open == true) { - snprintf(door, sizeof(door), "%s: Door open since %s", space_name, date_str); - } else { - snprintf(door, sizeof(door), "%s: Door closed since %s", space_name, date_str); - } - - gtk_status_icon_set_tooltip(tray_icon, door); -} - -void invoke_notification() { - char door[256]; - char date_str[64]; - time_t last_change_time = (time_t)door_last_change; - struct tm *tm_info = localtime(&last_change_time); - - strftime(date_str, sizeof(date_str), "%Y-%m-%d %H:%M:%S", tm_info); - - if (door_open == true) { - snprintf(door, sizeof(door), "%s: Door open since %s", space_name, date_str); - } else { - snprintf(door, sizeof(door), "%s: Door closed since %s", space_name, date_str); - } - -#if LIBNOTIFY - NotifyNotification *n; - - n = notify_notification_new(name, door, NULL); - - if (door_open == true) { - notify_notification_set_icon_from_pixbuf(n, icon_open); - } else { - notify_notification_set_icon_from_pixbuf(n, icon_closed); - } - notify_notification_show(n, NULL); - g_object_unref(G_OBJECT(n)); -#endif -} - -void set_status() { - if (door_open == true) { - printf("Set to status: open\n"); - gtk_status_icon_set_from_pixbuf(tray_icon, icon_open); - } else { - printf("Set to status: closed\n"); - gtk_status_icon_set_from_pixbuf(tray_icon, icon_closed); - } -} - -void do_it() { - static bool first_run = true; - get_bouncer_data(); - set_status(); - update_tooltip(); - - if (!first_run && door_open != old_door_open) { - invoke_notification(); - } - first_run = false; -} - -int main(int argc, char **argv) { - pthread_t thread_id; - - if (argc != 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - return 1; - } - - statusurl = argv[1]; - - gtk_init(&argc, &argv); - - icon_open = pixbuf_new_from_data(icon_open_data); - icon_closed = pixbuf_new_from_data(icon_closed_data); - -#if LIBNOTIFY - notify_init(name); -#endif - - tray_icon = gtk_status_icon_new(); - g_signal_connect(G_OBJECT(tray_icon), "activate", - G_CALLBACK(do_it), NULL); - g_signal_connect(G_OBJECT(tray_icon), "popup-menu", - G_CALLBACK(on_popup_menu), NULL); - - gtk_status_icon_set_visible(tray_icon, true); - - do_it(); - - if (pthread_create(&thread_id, NULL, status_update_thread, NULL) != 0) { - fprintf(stderr, "Error creating thread\n"); - return 1; - } - - gtk_main(); - - return 0; -} diff --git a/spacetray.cpp b/spacetray.cpp new file mode 100644 index 0000000..bf1c4fb --- /dev/null +++ b/spacetray.cpp @@ -0,0 +1,131 @@ +#include "spacetray.h" +#include "themes/lock.h" +#include +#include +#include +#include +#include +#include +#include +#include + +SpaceTray::SpaceTray(const QString &url, QObject *parent) + : QObject(parent), + m_statusUrl(url), + m_doorOpen(false), + m_oldDoorOpen(false), + m_doorLastChange(0), + m_spaceName("Unknown Space"), + m_firstRun(true) +{ + // Initialize icons from raw data + QImage imgOpen(icon_open_data, 52, 48, 208, QImage::Format_RGBA8888); + m_iconOpen = QIcon(QPixmap::fromImage(imgOpen)); + + QImage imgClosed(icon_closed_data, 52, 48, 208, QImage::Format_RGBA8888); + m_iconClosed = QIcon(QPixmap::fromImage(imgClosed)); + + // Setup tray icon + m_trayIcon = new QSystemTrayIcon(this); + m_trayIcon->setIcon(m_iconClosed); + m_trayIcon->setVisible(true); + + // Setup tray menu + m_trayMenu = new QMenu(); + QAction *quitAction = m_trayMenu->addAction("Quit"); + connect(quitAction, &QAction::triggered, this, &SpaceTray::quit); + m_trayIcon->setContextMenu(m_trayMenu); + + connect(m_trayIcon, &QSystemTrayIcon::activated, [this](QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::Trigger) { + fetchData(); + } + }); + + // Setup network manager + m_networkManager = new QNetworkAccessManager(this); + + // Setup timer (300 seconds as per previous delay=300 in C code) + m_timer = new QTimer(this); + connect(m_timer, &QTimer::timeout, this, &SpaceTray::fetchData); + m_timer->start(300000); // 300 seconds in ms + + // Initial fetch + fetchData(); +} + +SpaceTray::~SpaceTray() +{ + delete m_trayMenu; +} + +void SpaceTray::fetchData() +{ + QNetworkRequest request(m_statusUrl); + request.setHeader(QNetworkRequest::UserAgentHeader, "Spacetray/0.42 (Qt)"); + request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); + QNetworkReply *reply = m_networkManager->get(request); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { onFinished(reply); }); +} + +void SpaceTray::onFinished(QNetworkReply *reply) +{ + if (reply->error() != QNetworkReply::NoError) { + qWarning() << "Network error:" << reply->errorString(); + reply->deleteLater(); + return; + } + + QByteArray data = reply->readAll(); + reply->deleteLater(); + + // Remove UTF-8 BOM if present + if (data.startsWith("\xEF\xBB\xBF")) { + data.remove(0, 3); + } + + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(data, &error); + if (doc.isNull()) { + qWarning() << "Failed to parse JSON:" << error.errorString(); + qWarning() << "Raw data:" << data; + return; + } + + QJsonObject obj = doc.object(); + m_spaceName = obj.value("space").toString("Unknown Space"); + + QJsonObject stateObj = obj.value("state").toObject(); + m_oldDoorOpen = m_doorOpen; + m_doorOpen = stateObj.value("open").toBool(); + m_doorLastChange = stateObj.value("lastchange").toVariant().toLongLong(); + + updateTray(); + + if (!m_firstRun && m_doorOpen != m_oldDoorOpen) { + QString dateStr = QDateTime::fromSecsSinceEpoch(m_doorLastChange).toString("yyyy-MM-dd HH:mm:ss"); + QString status = m_doorOpen ? "open" : "closed"; + showNotification(QString("%1: Door %2 since %3").arg(m_spaceName, status, dateStr)); + } + m_firstRun = false; +} + +void SpaceTray::updateTray() +{ + m_trayIcon->setIcon(m_doorOpen ? m_iconOpen : m_iconClosed); + + QString dateStr = QDateTime::fromSecsSinceEpoch(m_doorLastChange).toString("yyyy-MM-dd HH:mm:ss"); + QString status = m_doorOpen ? "open" : "closed"; + QString tooltip = QString("%1: Door %2 since %3").arg(m_spaceName, status, dateStr); + m_trayIcon->setToolTip(tooltip); +} + +void SpaceTray::showNotification(const QString &message) +{ + m_trayIcon->showMessage("SpaceAPI widget for UNIX", message, m_doorOpen ? m_iconOpen : m_iconClosed); +} + +void SpaceTray::quit() +{ + QCoreApplication::quit(); +} diff --git a/spacetray.h b/spacetray.h new file mode 100644 index 0000000..2fe415e --- /dev/null +++ b/spacetray.h @@ -0,0 +1,45 @@ +#ifndef SPACETRAY_H +#define SPACETRAY_H + +#include +#include +#include +#include +#include +#include +#include + +class SpaceTray : public QObject +{ + Q_OBJECT + +public: + explicit SpaceTray(const QString &url, QObject *parent = nullptr); + ~SpaceTray(); + +private slots: + void fetchData(); + void onFinished(QNetworkReply *reply); + void quit(); + +private: + void updateTray(); + void showNotification(const QString &message); + + QString m_statusUrl; + QSystemTrayIcon *m_trayIcon; + QMenu *m_trayMenu; + QNetworkAccessManager *m_networkManager; + QTimer *m_timer; + + bool m_doorOpen; + bool m_oldDoorOpen; + qint64 m_doorLastChange; + QString m_spaceName; + bool m_firstRun; + + QIcon m_iconOpen; + QIcon m_iconClosed; +}; + +#endif // SPACETRAY_H diff --git a/themes/lock_new.h b/themes/lock.h similarity index 99% rename from themes/lock_new.h rename to themes/lock.h index 76187ef..490d66c 100644 --- a/themes/lock_new.h +++ b/themes/lock.h @@ -1,7 +1,7 @@ -#include +#include /* width: 52, height: 48, rowstride: 208, n_channels: 4 */ -static const guint8 icon_open_data[] = { +static const quint8 icon_open_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x91, 0x80, 0x00, 0x00, 0xdf, 0x80, 0x00, 0x00, 0xf2, 0x80, 0x00, 0x00, 0xf5, 0x80, 0x00, 0x00, 0xf5, 0x80, 0x00, 0x00, 0xf5, @@ -838,7 +838,7 @@ static const guint8 icon_open_data[] = { /* width: 52, height: 48, rowstride: 208, n_channels: 4 */ -static const guint8 icon_closed_data[] = { +static const quint8 icon_closed_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x4d, 0x18, 0x2b, 0x2e, 0x50, 0x15, 0xb3, 0x2e, 0x51, 0x15, 0xda, 0x2d, 0x50, 0x16, 0xe3, 0x2d, 0x50, 0x16, 0xe3, 0x2d, 0x50, 0x16, 0xe3, 0x2d, 0x50, 0x16, 0xe3, diff --git a/themes/pesthoernchen.h b/themes/pesthoernchen.h deleted file mode 100644 index aa83221..0000000 --- a/themes/pesthoernchen.h +++ /dev/null @@ -1,304 +0,0 @@ -static const GdkPixdata icon_open_pixbuf = { - 0x47646b50, /* Pixbuf magic: 'GdkP' */ - 24 + 3515, /* header length + pixel_data length */ - 0x2010002, /* pixdata_type */ - 192, /* rowstride */ - 48, /* width */ - 48, /* height */ - /* pixel_data: */ - (guint8 *) - "\377\0\0\0\0\243\0\0\0\0\7;'\0\15}d\0\\\215q\0\210\210m\0\237\216q\0" - "\231\211n\0\206y`\0=\247\0\0\0\0\3w^\0\\\262\216\0\336\356\277\0\376" - "\206\377\314\0\377\3\310\240\0\365\217r\0\23033\0\5\226\0\0\0\0\1}c\0" - "Z\204\205j\0\202\1x_\0f\206\0\0\0\0\3]K\0)\261\216\0\341\375\312\0\377" - "\212\377\314\0\377\2\312\241\0\365u^\0W\206\0\0\0\0\1x`\0h\202\236~\0" - "\300\1\243\203\0\307\204\250\206\0\317\4\256\214\0\327\261\215\0\335" - "\265\220\0\330\207p\0\40\203\0\0\0\0\1\270\223\0\333\204\377\314\0\377" - "\1\275\227\0\347\205\0\0\0\0\2t]\0X\336\261\0\374\215\377\314\0\377\2" - "\367\306\0\377\210l\0\245\205\0\0\0\0\1\217r\0\226\212\377\314\0\377" - "\1[I\0\34\203\0\0\0\0\1\252\210\0\316\204\377\314\0\377\1\270\223\0\345" - "\204\0\0\0\0\2p[\0T\352\273\0\376\217\377\314\0\377\3\376\313\0\377\233" - "|\0\307\0\0\0\2\203\0\0\0\0\1\205j\0}\211\377\314\0\377\2\366\305\0\377" - "\0\0\0\1\203\0\0\0\0\1\232{\0\275\204\377\314\0\377\1\306\236\0\355\203" - "\0\0\0\0\2hP\0\40\332\257\0\373\222\377\314\0\377\1\222t\0\270\203\0" - "\0\0\0\1x`\0b\211\377\314\0\377\1\342\264\0\374\204\0\0\0\0\1\223u\0" - "\243\204\377\314\0\377\1\333\260\0\373\203\0\0\0\0\1\252\210\0\330\223" - "\377\314\0\377\2\374\312\0\377\201h\0\202\202\0\0\0\0\1zb\0^\211\377" - "\314\0\377\1\317\246\0\366\204\0\0\0\0\1\212o\0\201\204\377\314\0\377" - "\5\376\313\0\377\223t\0!\0\0\0\0hU\0B\372\310\0\377\224\377\314\0\377" - "\4\333\257\0\374E;\0\32\0\0\0\0\214q\0q\211\377\314\0\377\1\266\222\0" - "\341\204\0\0\0\0\1t^\0Q\205\377\314\0\377\3\232{\0\203\0\0\0\0\233|\0" - "\306\226\377\314\0\377\3\234}\0\304\0\0\0\0\226x\0\210\211\377\314\0" - "\377\1\241\201\0\274\204\0\0\0\0\2""3\"\0\17\367\306\0\377\204\377\314" - "\0\377\3\256\213\0\315\0\0\0\0\325\252\0\372\205\377\314\0\377\5\376" - "\313\0\377\322\251\0\365\262\216\0\325\264\220\0\324\376\313\0\377\204" - "\377\314\0\377\13\365\304\0\377\245\205\0\312\223v\0{\210m\0g\230z\0" - "\212\260\215\0\325\370\306\0\377\377\314\0\377\351\273\0\3765+\0\30\236" - "\177\0\265\211\377\314\0\377\1\201h\0{\205\0\0\0\0\1\313\242\0\365\204" - "\377\314\0\377\3\325\253\0\370F:\0,\374\312\0\377\203\377\314\0\377\3" - "\344\266\0\374\242\202\0\276\202i\0\77\203\0\0\0\0\1\256\214\0\327\203" - "\377\314\0\377\2\370\306\0\377\203i\0k\205\0\0\0\0\5\211m\0w\372\310" - "\0\377\377\314\0\377\207l\0\227\257\215\0\335\210\377\314\0\377\2\366" - "\305\0\377YC\0\27\205\0\0\0\0\1\245\204\0\315\205\377\314\0\377\1\222" - "t\0\270\202\377\314\0\377\3\373\311\0\377\224w\0\237`@\0\10\205\0\0\0" - "\0\5cN\0>\375\312\0\377\377\314\0\377\361\301\0\376\254\212\0\325\207" - "\0\0\0\0\4\254\212\0\321\377\314\0\377\303\234\0\353\326\253\0\367\210" - "\377\314\0\377\1\276\230\0\353\206\0\0\0\0\1\200e\0t\205\377\314\0\377" - "\1\371\307\0\377\202\377\314\0\377\1\304\235\0\354\210\0\0\0\0\4\353" - "\274\0\376\352\273\0\376\236}\0\277\231{\0\242\207\0\0\0\0\3w_\0V\377" - "\314\0\377\374\312\0\377\211\377\314\0\377\1\217s\0\240\206\0\0\0\0\2" - "..\0\13\350\271\0\375\204\377\314\0\377\4\354\275\0\376\357\277\0\376" - "\377\314\0\377\263\217\0\333\207\0\0\0\0\5\0\0\0\5\317\245\0\364\301" - "\232\0\345\213o\0\212\257\214\0\317\207\0\0\0\0\3\214q\0h\332\257\0\370" - "\262\217\0\330\210\377\314\0\377\2\347\271\0\376F:\0\26\207\0\0\0\0\1" - "\251\210\0\315\204\377\314\0\377\4\361\301\0\376\235~\0\266\377\314\0" - "\377\276\230\0\344\207\0\0\0\0\6yb\0""9\267\222\0\343\244\203\0\312q" - "Z\0O\332\256\0\371\0\0\0\1\206\0\0\0\0\3\236~\0\250\263\220\0\327\271" - "\224\0\363\210\377\314\0\377\1\234}\0\314\210\0\0\0\0\2w^\0I\375\312" - "\0\377\204\377\314\0\377\4~e\0\232\377\314\0\377\332\256\0\371U9\0\11" - "\206\0\0\0\0\6\216q\0s\243\202\0\310\202h\0\253-\36\0\21\372\310\0\377" - "\205k\0d\205\0\0\0\0\4\211n\0a\351\272\0\374\245\205\0\314\303\234\0" - "\361\207\377\314\0\377\2\371\307\0\377^K\0D\211\0\0\0\0\1\273\225\0\347" - "\204\377\314\0\377\1\200g\0\225\202\377\314\0\377\2\305\235\0\355{a\0" - "Y\205\0\0\0\0\6\240\200\0\256\222t\0\242C5\0""5\0\0\0\0\340\263\0\374" - "\262\217\0\330\203\0\0\0\0\6\210n\0k\300\232\0\352\375\312\0\377\377" - "\314\0\377\263\217\0\333\267\223\0\347\207\377\314\0\377\1\256\213\0" - "\331\212\0\0\0\0\2\201f\0U\374\312\0\377\203\377\314\0\377\2\221s\0\222" - "\372\310\0\377\203\377\314\0\377\7\321\247\0\371\226x\0\266kR\0\37\0" - "\0\0\0\0\0\0\1\306\236\0\355\205j\0o\202\0\0\0\0\5\312\241\0\357\366" - "\305\0\377\214q\0o\221u\0\216\301\232\0\353\204\377\314\0\377\2\277\231" - "\0\353\255\213\0\327\206\377\314\0\377\2\353\274\0\376[J\0-\213\0\0\0" - "\0\1\250\207\0\326\203\377\314\0\377\2\226x\0\241\360\300\0\377\205\377" - "\314\0\377\5\362\302\0\376\301\233\0\347\322\250\0\363\377\314\0\377" - "\214p\0R\202\0\0\0\0\1\265\221\0\331\210\377\314\0\377\2\307\237\0\367" - "\252\211\0\276\206\377\314\0\377\1\213o\0\267\214\0\0\0\0\2m[\0\34\334" - "\260\0\372\202\377\314\0\377\2\233}\0\260\346\270\0\377\211\377\314\0" - "\377\1\213o\0\\\202\0\0\0\0\1\303\234\0\342\210\377\314\0\377\2\323\251" - "\0\372\251\207\0\300\205\377\314\0\377\2\320\247\0\366..\0\13\215\0\0" - "\0\0\5r\\\0^\364\303\0\377\377\314\0\377\253\210\0\310\312\242\0\366" - "\211\377\314\0\377\1\220s\0\225\202\0\0\0\0\1\353\274\0\374\210\377\314" - "\0\377\2\274\226\0\356\276\227\0\342\204\377\314\0\377\2\355\276\0\377" - "s[\0I\217\0\0\0\0\4\202h\0\207\371\307\0\377\331\256\0\370\237\200\0" - "\310\211\377\314\0\377\3\266\222\0\340WI\0#\201i\0I\211\377\314\0\377" - "\2\217r\0\260\354\275\0\376\203\377\314\0\377\2\374\312\0\377zb\0\227" - "\221\0\0\0\0\3\205j\0\225\370\306\0\377\311\241\0\362\211\377\314\0\377" - "\3\363\302\0\377\227x\0\260\302\234\0\357\210\377\314\0\377\2\361\301" - "\0\376\320\246\0\362\204\377\314\0\377\1\243\201\0\301\223\0\0\0\0\2" - "\177e\0\203\361\301\0\377\212\377\314\0\377\1\371\307\0\377\216\377\314" - "\0\377\2\243\203\0\313\0\0\0\1\224\0\0\0\0\2s[\0_\332\257\0\373\226\377" - "\314\0\377\2\362\302\0\377\223v\0\236\227\0\0\0\0\23`P\0\40\263\217\0" - "\342\366\305\0\377\331\256\0\371\367\306\0\377\340\263\0\373\336\262" - "\0\373\377\314\0\377\256\213\0\325\204j\0Y\336\262\0\373\201f\0K\231" - "z\0\235\373\311\0\377\271\225\0\337\353\273\0\375\376\313\0\377\322\250" - "\0\370\376\313\0\377\203\377\314\0\377\2\302\233\0\362zb\0I\205\0\0\0" - "\0\4bQ\0""9\200f\0\200mX\0b@@\0\10\211\0\0\0\0\5]M\0!\215q\0\243\245" - "\203\0\316\224w\0\247..\0\13\203\0\0\0\0\6\241\201\0\307\0\0\0\0\245" - "\204\0\301\203g\0T]F\0\13\314\244\0\366\202\0\0\0\0\1\277\230\0\347\202" - "\0\0\0\0\12\305\235\0\355\0\0\0\0\233|\0\244\243\203\0\257\0\0\0\0\342" - "\266\0\372\377\314\0\377\317\246\0\370\207l\0\223\0\0\0\4\205\0\0\0\0" - "\2\230z\0\270\367\306\0\377\202\377\314\0\377\2\322\250\0\370r\\\0:\207" - "\0\0\0\0\2\201f\0}\343\266\0\376\203\377\314\0\377\2\264\220\0\352\0" - "\0\0\2\202\0\0\0\0\6\212o\0\263zb\0A\262\217\0\323\200e\0:33\0\5\262" - "\216\0\340\202\0\0\0\0\1\301\232\0\346\202\0\0\0\0\10\271\224\0\344\0" - "\0\0\0\231z\0\226\212n\0\213\0\0\0\0\304\235\0\351\202h\0x\0\0\0\3\206" - "\0\0\0\0\2\200f\0\200\376\313\0\377\204\377\314\0\377\1\306\236\0\362" - "\206\0\0\0\0\2cN\0$\355\276\0\376\205\377\314\0\377\1r[\0b\202\0\0\0" - "\0\21@@\0\4\221t\0\247\245\204\0\315\250\206\0\334\266\222\0\343\315" - "\244\0\366\253\210\0\325\245\203\0\306\336\261\0\374\221t\0\253\226x" - "\0\263\353\274\0\376\245\204\0\313\311\240\0\360\270\224\0\347\262\216" - "\0\335\220t\0\254\210\0\0\0\0\1\274\227\0\351\206\377\314\0\377\1gS\0" - "4\205\0\0\0\0\1\215p\0\177\206\377\314\0\377\1\201f\0}\205\0\0\0\0\27" - "\0\0\0\1\40\40\0\20\0\0\0\0\13\13\0\30mU\0""6\225x\0F\201h\0goY\0g0\40" - "\0\20:.\0B/&\0""6\25\16\0%I=\0;\0\0\0\3\0\0\0\0\\G\0\31r[\0LoX\0N\202" - "h\0V\215r\0\\\201h\0e\207l\0q\347\270\0\375\205\377\314\0\377\2\371\307" - "\0\377H8\0\40\205\0\0\0\0\1u]\0U\206\377\314\0\377\4\333\260\0\373\322" - "\250\0\370\333\257\0\372\340\263\0\374\202\337\262\0\375\12\233|\0\321" - "\0\0\0\0cU\0\22\306\236\0\364\354\275\0\376\357\277\0\377\377\314\0\377" - "\226x\0\233\212o\0\263\356\276\0\377\203\377\314\0\377\4\224v\0\253\0" - "\0\0\0p[\0;\357\277\0\376\213\377\314\0\377\1\261\215\0\344\207\0\0\0" - "\0\2\227y\0\272\334\260\0\372\211\377\314\0\377\4\355\276\0\376gS\0""4" - "\0\0\0\0\242\202\0\306\203\377\314\0\377\4\312\242\0\360\200\200\0\2" - "@0\0\20\332\257\0\373\203\377\314\0\377\4\362\302\0\377z`\0E\0\0\0\0" - "\225x\0\244\212\377\314\0\377\2\374\312\0\377ya\0T\206\0\0\0\0\2$$\0" - "\7\242\202\0\327\212\377\314\0\377\4\230y\0\255\0\0\0\0u]\0U\370\306" - "\0\377\202\377\314\0\377\2\371\307\0\377\200f\0P\202\0\0\0\0\2\202h\0" - "\207\376\313\0\377\203\377\314\0\377\4\315\244\0\363U9\0\11\0\0\0\1\304" - "\235\0\355\211\377\314\0\377\3\346\267\0\375\305\235\0\363aO\0\35\205" - "\0\0\0\0\1\230z\0\274\212\377\314\0\377\4\317\245\0\364UU\0\6\0\0\0\2" - "\304\235\0\362\203\377\314\0\377\1\251\206\0\311\203\0\0\0\0\2\0\0\0" - "\1\255\212\0\351\204\377\314\0\377\4\255\213\0\320]F\0\13y_\0;\361\301" - "\0\376\203\377\314\0\377\1\367\306\0\377\206\377\314\0\377\1\234}\0\260" - "\205\0\0\0\0\1\315\244\0\366\205\377\314\0\377\2\233|\0\304\333\257\0" - "\371\202\322\250\0\370\5\310\240\0\367\201h\0]t\\\0V\240\200\0\301\327" - "\254\0\371\202\377\314\0\377\2\345\267\0\375dN\0\27\204\0\0\0\0\2M\77" - "\0""5\320\246\0\367\204\377\314\0\377\3\324\251\0\372pZ\0[\217r\0\217" - "\202\261\215\0\335\2\242\201\0\305\307\240\0\356\206\377\314\0\377\1" - "\237\177\0\305\205\0\0\0\0\1\275\226\0\352\205\377\314\0\377\1\236~\0" - "\302\204\0\0\0\0\2\211n\0\204\367\306\0\377\205\377\314\0\377\1\250\206" - "\0\334\204\0\0\0\0\2\200e\0t\375\312\0\377\205\377\314\0\377\2\344\266" - "\0\375ZE\0%\203\0\0\0\0\1\264\220\0\341\205\377\314\0\377\2\376\313\0" - "\377q[\0j\205\0\0\0\0\2\202g\0~\376\313\0\377\204\377\314\0\377\1\234" - "}\0\302\204\0\0\0\0\1\301\232\0\356\206\377\314\0\377\1\305\235\0\363" - "\204\0\0\0\0\1\252\210\0\331\207\377\314\0\377\1\216q\0\253\203\0\0\0" - "\0\2t\\\0l\360\300\0\377\203\377\314\0\377\2\376\313\0\377\233|\0\311" - "\207\0\0\0\0\2\230y\0\276\376\313\0\377\202\377\314\0\377\2\355\276\0" - "\376hR\0;\204\0\0\0\0\1\275\230\0\355\202\377\314\0\377\5\325\252\0\371" - "\327\253\0\367\377\314\0\377\374\312\0\377\211n\0\240\204\0\0\0\0\2\205" - "k\0\224\376\313\0\377\202\377\314\0\377\2\333\260\0\373\323\251\0\365" - "\202\377\314\0\377\1\221t\0\236\204\0\0\0\0\5s\\\0P\254\211\0\331\263" - "\220\0\345\235~\0\311qY\0a\211\0\0\0\0\4\200h\0\205\301\232\0\356\275" - "\227\0\353w_\0^\205\0\0\0\0\7zc\0w\366\305\0\377\354\275\0\376\206k\0" - "z\205k\0\224\252\210\0\326xa\0l\206\0\0\0\0\10\201g\0y\247\206\0\316" - "\224w\0\245ZJ\0\37\245\205\0\333\376\313\0\377\302\234\0\357dN\0\27\234" - "\0\0\0\0\2QA\0/9+\0\22\217\0\0\0\0\2""7)\0%\0\0\0\1\377\0\0\0\0\376\0" - "\0\0\0", -}; - -static const GdkPixdata icon_closed_pixbuf = { - 0x47646b50, /* Pixbuf magic: 'GdkP' */ - 24 + 3515, /* header length + pixel_data length */ - 0x2010002, /* pixdata_type */ - 192, /* rowstride */ - 48, /* width */ - 48, /* height */ - /* pixel_data: */ - (guint8 *) - "\377\0\0\0\0\243\0\0\0\0\7;\0\0\15}\0\0\\\215\0\0\210\210\0\0\237\216" - "\0\0\231\211\0\0\206y\0\0=\247\0\0\0\0\3w\0\0\\\262\0\0\336\356\0\0\376" - "\206\377\0\0\377\3\310\0\0\365\217\0\0\2303\0\0\5\226\0\0\0\0\1}\0\0" - "Z\204\205\0\0\202\1x\0\0f\206\0\0\0\0\3]\0\0)\261\0\0\341\375\0\0\377" - "\212\377\0\0\377\2\312\0\0\365u\0\0W\206\0\0\0\0\1x\0\0h\202\236\0\0" - "\300\1\243\0\0\307\204\250\0\0\317\4\256\0\0\327\261\0\0\335\265\0\0" - "\330\207\0\0\40\203\0\0\0\0\1\270\0\0\333\204\377\0\0\377\1\275\0\0\347" - "\205\0\0\0\0\2t\0\0X\336\0\0\374\215\377\0\0\377\2\367\0\0\377\210\0" - "\0\245\205\0\0\0\0\1\217\0\0\226\212\377\0\0\377\1[\0\0\34\203\0\0\0" - "\0\1\252\0\0\316\204\377\0\0\377\1\270\0\0\345\204\0\0\0\0\2p\0\0T\352" - "\0\0\376\217\377\0\0\377\3\376\0\0\377\233\0\0\307\0\0\0\2\203\0\0\0" - "\0\1\205\0\0}\211\377\0\0\377\2\366\0\0\377\0\0\0\1\203\0\0\0\0\1\232" - "\0\0\275\204\377\0\0\377\1\306\0\0\355\203\0\0\0\0\2h\0\0\40\332\0\0" - "\373\222\377\0\0\377\1\222\0\0\270\203\0\0\0\0\1x\0\0b\211\377\0\0\377" - "\1\342\0\0\374\204\0\0\0\0\1\223\0\0\243\204\377\0\0\377\1\333\0\0\373" - "\203\0\0\0\0\1\252\0\0\330\223\377\0\0\377\2\374\0\0\377\201\0\0\202" - "\202\0\0\0\0\1z\0\0^\211\377\0\0\377\1\317\0\0\366\204\0\0\0\0\1\212" - "\0\0\201\204\377\0\0\377\5\376\0\0\377\223\0\0!\0\0\0\0h\0\0B\372\0\0" - "\377\224\377\0\0\377\4\333\0\0\374E\0\0\32\0\0\0\0\214\0\0q\211\377\0" - "\0\377\1\266\0\0\341\204\0\0\0\0\1t\0\0Q\205\377\0\0\377\3\232\0\0\203" - "\0\0\0\0\233\0\0\306\226\377\0\0\377\3\234\0\0\304\0\0\0\0\226\0\0\210" - "\211\377\0\0\377\1\241\0\0\274\204\0\0\0\0\2""3\0\0\17\367\0\0\377\204" - "\377\0\0\377\3\256\0\0\315\0\0\0\0\325\0\0\372\205\377\0\0\377\5\376" - "\0\0\377\322\0\0\365\262\0\0\325\264\0\0\324\376\0\0\377\204\377\0\0" - "\377\13\365\0\0\377\245\0\0\312\223\0\0{\210\0\0g\230\0\0\212\260\0\0" - "\325\370\0\0\377\377\0\0\377\351\0\0\3765\0\0\30\236\0\0\265\211\377" - "\0\0\377\1\201\0\0{\205\0\0\0\0\1\313\0\0\365\204\377\0\0\377\3\325\0" - "\0\370F\0\0,\374\0\0\377\203\377\0\0\377\3\344\0\0\374\242\0\0\276\202" - "\0\0\77\203\0\0\0\0\1\256\0\0\327\203\377\0\0\377\2\370\0\0\377\203\0" - "\0k\205\0\0\0\0\5\211\0\0w\372\0\0\377\377\0\0\377\207\0\0\227\257\0" - "\0\335\210\377\0\0\377\2\366\0\0\377Y\0\0\27\205\0\0\0\0\1\245\0\0\315" - "\205\377\0\0\377\1\222\0\0\270\202\377\0\0\377\3\373\0\0\377\224\0\0" - "\237`\0\0\10\205\0\0\0\0\5c\0\0>\375\0\0\377\377\0\0\377\361\0\0\376" - "\254\0\0\325\207\0\0\0\0\4\254\0\0\321\377\0\0\377\303\0\0\353\326\0" - "\0\367\210\377\0\0\377\1\276\0\0\353\206\0\0\0\0\1\200\0\0t\205\377\0" - "\0\377\1\371\0\0\377\202\377\0\0\377\1\304\0\0\354\210\0\0\0\0\4\353" - "\0\0\376\352\0\0\376\236\0\0\277\231\0\0\242\207\0\0\0\0\3w\0\0V\377" - "\0\0\377\374\0\0\377\211\377\0\0\377\1\217\0\0\240\206\0\0\0\0\2.\0\0" - "\13\350\0\0\375\204\377\0\0\377\4\354\0\0\376\357\0\0\376\377\0\0\377" - "\263\0\0\333\207\0\0\0\0\5\0\0\0\5\317\0\0\364\301\0\0\345\213\0\0\212" - "\257\0\0\317\207\0\0\0\0\3\214\0\0h\332\0\0\370\262\0\0\330\210\377\0" - "\0\377\2\347\0\0\376F\0\0\26\207\0\0\0\0\1\251\0\0\315\204\377\0\0\377" - "\4\361\0\0\376\235\0\0\266\377\0\0\377\276\0\0\344\207\0\0\0\0\6y\0\0" - "9\267\0\0\343\244\0\0\312q\0\0O\332\0\0\371\0\0\0\1\206\0\0\0\0\3\236" - "\0\0\250\263\0\0\327\271\0\0\363\210\377\0\0\377\1\234\0\0\314\210\0" - "\0\0\0\2w\0\0I\375\0\0\377\204\377\0\0\377\4~\0\0\232\377\0\0\377\332" - "\0\0\371U\0\0\11\206\0\0\0\0\6\216\0\0s\243\0\0\310\202\0\0\253-\0\0" - "\21\372\0\0\377\205\0\0d\205\0\0\0\0\4\211\0\0a\351\0\0\374\245\0\0\314" - "\303\0\0\361\207\377\0\0\377\2\371\0\0\377^\0\0D\211\0\0\0\0\1\273\0" - "\0\347\204\377\0\0\377\1\200\0\0\225\202\377\0\0\377\2\305\0\0\355{\0" - "\0Y\205\0\0\0\0\6\240\0\0\256\222\0\0\242C\0\0""5\0\0\0\0\340\0\0\374" - "\262\0\0\330\203\0\0\0\0\6\210\0\0k\300\0\0\352\375\0\0\377\377\0\0\377" - "\263\0\0\333\267\0\0\347\207\377\0\0\377\1\256\0\0\331\212\0\0\0\0\2" - "\201\0\0U\374\0\0\377\203\377\0\0\377\2\221\0\0\222\372\0\0\377\203\377" - "\0\0\377\7\321\0\0\371\226\0\0\266k\0\0\37\0\0\0\0\0\0\0\1\306\0\0\355" - "\205\0\0o\202\0\0\0\0\5\312\0\0\357\366\0\0\377\214\0\0o\221\0\0\216" - "\301\0\0\353\204\377\0\0\377\2\277\0\0\353\255\0\0\327\206\377\0\0\377" - "\2\353\0\0\376[\0\0-\213\0\0\0\0\1\250\0\0\326\203\377\0\0\377\2\226" - "\0\0\241\360\0\0\377\205\377\0\0\377\5\362\0\0\376\301\0\0\347\322\0" - "\0\363\377\0\0\377\214\0\0R\202\0\0\0\0\1\265\0\0\331\210\377\0\0\377" - "\2\307\0\0\367\252\0\0\276\206\377\0\0\377\1\213\0\0\267\214\0\0\0\0" - "\2m\0\0\34\334\0\0\372\202\377\0\0\377\2\233\0\0\260\346\0\0\377\211" - "\377\0\0\377\1\213\0\0\\\202\0\0\0\0\1\303\0\0\342\210\377\0\0\377\2" - "\323\0\0\372\251\0\0\300\205\377\0\0\377\2\320\0\0\366.\0\0\13\215\0" - "\0\0\0\5r\0\0^\364\0\0\377\377\0\0\377\253\0\0\310\312\0\0\366\211\377" - "\0\0\377\1\220\0\0\225\202\0\0\0\0\1\353\0\0\374\210\377\0\0\377\2\274" - "\0\0\356\276\0\0\342\204\377\0\0\377\2\355\0\0\377s\0\0I\217\0\0\0\0" - "\4\202\0\0\207\371\0\0\377\331\0\0\370\237\0\0\310\211\377\0\0\377\3" - "\266\0\0\340W\0\0#\201\0\0I\211\377\0\0\377\2\217\0\0\260\354\0\0\376" - "\203\377\0\0\377\2\374\0\0\377z\0\0\227\221\0\0\0\0\3\205\0\0\225\370" - "\0\0\377\311\0\0\362\211\377\0\0\377\3\363\0\0\377\227\0\0\260\302\0" - "\0\357\210\377\0\0\377\2\361\0\0\376\320\0\0\362\204\377\0\0\377\1\243" - "\0\0\301\223\0\0\0\0\2\177\0\0\203\361\0\0\377\212\377\0\0\377\1\371" - "\0\0\377\216\377\0\0\377\2\243\0\0\313\0\0\0\1\224\0\0\0\0\2s\0\0_\332" - "\0\0\373\226\377\0\0\377\2\362\0\0\377\223\0\0\236\227\0\0\0\0\23`\0" - "\0\40\263\0\0\342\366\0\0\377\331\0\0\371\367\0\0\377\340\0\0\373\336" - "\0\0\373\377\0\0\377\256\0\0\325\204\0\0Y\336\0\0\373\201\0\0K\231\0" - "\0\235\373\0\0\377\271\0\0\337\353\0\0\375\376\0\0\377\322\0\0\370\376" - "\0\0\377\203\377\0\0\377\2\302\0\0\362z\0\0I\205\0\0\0\0\4b\0\0""9\200" - "\0\0\200m\0\0b@\0\0\10\211\0\0\0\0\5]\0\0!\215\0\0\243\245\0\0\316\224" - "\0\0\247.\0\0\13\203\0\0\0\0\6\241\0\0\307\0\0\0\0\245\0\0\301\203\0" - "\0T]\0\0\13\314\0\0\366\202\0\0\0\0\1\277\0\0\347\202\0\0\0\0\12\305" - "\0\0\355\0\0\0\0\233\0\0\244\243\0\0\257\0\0\0\0\342\0\0\372\377\0\0" - "\377\317\0\0\370\207\0\0\223\0\0\0\4\205\0\0\0\0\2\230\0\0\270\367\0" - "\0\377\202\377\0\0\377\2\322\0\0\370r\0\0:\207\0\0\0\0\2\201\0\0}\343" - "\0\0\376\203\377\0\0\377\2\264\0\0\352\0\0\0\2\202\0\0\0\0\6\212\0\0" - "\263z\0\0A\262\0\0\323\200\0\0:3\0\0\5\262\0\0\340\202\0\0\0\0\1\301" - "\0\0\346\202\0\0\0\0\10\271\0\0\344\0\0\0\0\231\0\0\226\212\0\0\213\0" - "\0\0\0\304\0\0\351\202\0\0x\0\0\0\3\206\0\0\0\0\2\200\0\0\200\376\0\0" - "\377\204\377\0\0\377\1\306\0\0\362\206\0\0\0\0\2c\0\0$\355\0\0\376\205" - "\377\0\0\377\1r\0\0b\202\0\0\0\0\21@\0\0\4\221\0\0\247\245\0\0\315\250" - "\0\0\334\266\0\0\343\315\0\0\366\253\0\0\325\245\0\0\306\336\0\0\374" - "\221\0\0\253\226\0\0\263\353\0\0\376\245\0\0\313\311\0\0\360\270\0\0" - "\347\262\0\0\335\220\0\0\254\210\0\0\0\0\1\274\0\0\351\206\377\0\0\377" - "\1g\0\0""4\205\0\0\0\0\1\215\0\0\177\206\377\0\0\377\1\201\0\0}\205\0" - "\0\0\0\27\0\0\0\1\40\0\0\20\0\0\0\0\13\0\0\30m\0\0""6\225\0\0F\201\0" - "\0go\0\0g0\0\0\20:\0\0B/\0\0""6\25\0\0%I\0\0;\0\0\0\3\0\0\0\0\\\0\0\31" - "r\0\0Lo\0\0N\202\0\0V\215\0\0\\\201\0\0e\207\0\0q\347\0\0\375\205\377" - "\0\0\377\2\371\0\0\377H\0\0\40\205\0\0\0\0\1u\0\0U\206\377\0\0\377\4" - "\333\0\0\373\322\0\0\370\333\0\0\372\340\0\0\374\202\337\0\0\375\12\233" - "\0\0\321\0\0\0\0c\0\0\22\306\0\0\364\354\0\0\376\357\0\0\377\377\0\0" - "\377\226\0\0\233\212\0\0\263\356\0\0\377\203\377\0\0\377\4\224\0\0\253" - "\0\0\0\0p\0\0;\357\0\0\376\213\377\0\0\377\1\261\0\0\344\207\0\0\0\0" - "\2\227\0\0\272\334\0\0\372\211\377\0\0\377\4\355\0\0\376g\0\0""4\0\0" - "\0\0\242\0\0\306\203\377\0\0\377\4\312\0\0\360\200\0\0\2@\0\0\20\332" - "\0\0\373\203\377\0\0\377\4\362\0\0\377z\0\0E\0\0\0\0\225\0\0\244\212" - "\377\0\0\377\2\374\0\0\377y\0\0T\206\0\0\0\0\2$\0\0\7\242\0\0\327\212" - "\377\0\0\377\4\230\0\0\255\0\0\0\0u\0\0U\370\0\0\377\202\377\0\0\377" - "\2\371\0\0\377\200\0\0P\202\0\0\0\0\2\202\0\0\207\376\0\0\377\203\377" - "\0\0\377\4\315\0\0\363U\0\0\11\0\0\0\1\304\0\0\355\211\377\0\0\377\3" - "\346\0\0\375\305\0\0\363a\0\0\35\205\0\0\0\0\1\230\0\0\274\212\377\0" - "\0\377\4\317\0\0\364U\0\0\6\0\0\0\2\304\0\0\362\203\377\0\0\377\1\251" - "\0\0\311\203\0\0\0\0\2\0\0\0\1\255\0\0\351\204\377\0\0\377\4\255\0\0" - "\320]\0\0\13y\0\0;\361\0\0\376\203\377\0\0\377\1\367\0\0\377\206\377" - "\0\0\377\1\234\0\0\260\205\0\0\0\0\1\315\0\0\366\205\377\0\0\377\2\233" - "\0\0\304\333\0\0\371\202\322\0\0\370\5\310\0\0\367\201\0\0]t\0\0V\240" - "\0\0\301\327\0\0\371\202\377\0\0\377\2\345\0\0\375d\0\0\27\204\0\0\0" - "\0\2M\0\0""5\320\0\0\367\204\377\0\0\377\3\324\0\0\372p\0\0[\217\0\0" - "\217\202\261\0\0\335\2\242\0\0\305\307\0\0\356\206\377\0\0\377\1\237" - "\0\0\305\205\0\0\0\0\1\275\0\0\352\205\377\0\0\377\1\236\0\0\302\204" - "\0\0\0\0\2\211\0\0\204\367\0\0\377\205\377\0\0\377\1\250\0\0\334\204" - "\0\0\0\0\2\200\0\0t\375\0\0\377\205\377\0\0\377\2\344\0\0\375Z\0\0%\203" - "\0\0\0\0\1\264\0\0\341\205\377\0\0\377\2\376\0\0\377q\0\0j\205\0\0\0" - "\0\2\202\0\0~\376\0\0\377\204\377\0\0\377\1\234\0\0\302\204\0\0\0\0\1" - "\301\0\0\356\206\377\0\0\377\1\305\0\0\363\204\0\0\0\0\1\252\0\0\331" - "\207\377\0\0\377\1\216\0\0\253\203\0\0\0\0\2t\0\0l\360\0\0\377\203\377" - "\0\0\377\2\376\0\0\377\233\0\0\311\207\0\0\0\0\2\230\0\0\276\376\0\0" - "\377\202\377\0\0\377\2\355\0\0\376h\0\0;\204\0\0\0\0\1\275\0\0\355\202" - "\377\0\0\377\5\325\0\0\371\327\0\0\367\377\0\0\377\374\0\0\377\211\0" - "\0\240\204\0\0\0\0\2\205\0\0\224\376\0\0\377\202\377\0\0\377\2\333\0" - "\0\373\323\0\0\365\202\377\0\0\377\1\221\0\0\236\204\0\0\0\0\5s\0\0P" - "\254\0\0\331\263\0\0\345\235\0\0\311q\0\0a\211\0\0\0\0\4\200\0\0\205" - "\301\0\0\356\275\0\0\353w\0\0^\205\0\0\0\0\7z\0\0w\366\0\0\377\354\0" - "\0\376\206\0\0z\205\0\0\224\252\0\0\326x\0\0l\206\0\0\0\0\10\201\0\0" - "y\247\0\0\316\224\0\0\245Z\0\0\37\245\0\0\333\376\0\0\377\302\0\0\357" - "d\0\0\27\234\0\0\0\0\2Q\0\0/9\0\0\22\217\0\0\0\0\2""7\0\0%\0\0\0\1\377" - "\0\0\0\0\376\0\0\0\0", -}; -