qlix-0.2.6/0000755000175000017500000000000011050625232010564 5ustar alialiqlix-0.2.6/widgets/0000755000175000017500000000000011050625235012235 5ustar alialiqlix-0.2.6/widgets/QlixPreferences.h0000644000175000017500000000300011050625206015474 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef QLIXPREFERENCES #define QLIXPREFERENCES #include #include #include #include #include #include #include #include //This should be a private class but its not because MOC doesn't support nested classes class QlixPreferences: public QWidget { Q_OBJECT public: QlixPreferences(QObject* parent = NULL); private slots: void saveSettings(); private: QSettings _settings; QToolButton* _saveButton; QAction* _saveAction; QGridLayout* _layout; QLabel* _defaultDeviceLabel; QLineEdit* _defaultDeviceLine; QLabel* _defaultDirPathLabel; QLineEdit* _defaultDirPathLine; }; #endif qlix-0.2.6/widgets/AlbumModel.cpp0000644000175000017500000002354411050625206014770 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * TODO check duplicate enteries when adding files to an album */ #include "widgets/AlbumModel.h" /** * Construct a new AlbumModel */ AlbumModel::AlbumModel(vector in_albums, QObject* parent) : _albumList(in_albums) { } /** * Destructor for the AlbumModel */ AlbumModel::~AlbumModel() { for (count_t i = 0; i < _albumList.size(); i++) { delete _albumList[i]; } } /** * Return the Album or track at the given index and parent * row and col are realtive to parent * The parent's internal pointer should only be of types MtpTrack and MtpAlbum * @param row the row coordinate of the item to display * @param col the column coordinate of the item to display * @param parent the parent of the object * @return an index constructed of the item to display or an invalid index if * the request coordinates are out of bounds */ QModelIndex AlbumModel::index(int row, int col, const QModelIndex& parent) const { if(col < 0 || row < 0) return QModelIndex(); if(!parent.isValid() && row >= (int)_albumList.size()) return QModelIndex(); if (!parent.isValid() && col == 0) { MTP::Album* album = _albumList[row]; return createIndex(row, col, (void*) album); } if (!parent.isValid() && col > 0) { return QModelIndex(); } MTP::GenericObject* obj= (MTP::GenericObject*)parent.internalPointer(); assert(obj->Type() == MtpAlbum); MTP::Album* album = (MTP::Album*) obj; if (row >= (int)album->TrackCount()) return QModelIndex(); MTP::Track* track = album->ChildTrack(row); assert (track->Type() == MtpTrack); return createIndex(row, col, track); } /** * Returns the parent of the given index * @param idx the index of whose parent we must create * @return an index constructured of parent the passed paramameter idx or an * invalid index if the parent is the root level */ QModelIndex AlbumModel::parent(const QModelIndex& idx) const { if (!idx.isValid()) return QModelIndex(); MTP::GenericObject* obj=(MTP::GenericObject*) idx.internalPointer(); if(obj->Type() == MtpTrack) { MTP::Album* parent = ((MTP::Track*)obj)->ParentAlbum(); assert(parent != (MTP::Album*)obj); QModelIndex ret = createIndex(parent->GetRowIndex(),0, parent); return ret; } else if (obj->Type() == MtpAlbum) return QModelIndex(); else { qDebug() << "object is of type: " << obj->Type(); qDebug() << "Requesting row: "<< idx.row() << "column: " << idx.column() << "of object " << (void*)obj; assert(false); } return QModelIndex(); } /** * Returns the row count of the parent this should be the number of tracks * under an album or 0 if the parent happens to be a track * @param parent the parent item whos row counts we are trying to discover * @return the number of rows that occur under the given parameter: parent */ int AlbumModel::rowCount(const QModelIndex& parent) const { if (!parent.isValid() ) return _albumList.size(); MTP::GenericObject* obj= (MTP::Album*)parent.internalPointer(); if(obj->Type() == MtpTrack) return 0; else if (obj->Type() == MtpAlbum) return ((MTP::Album*)obj)->TrackCount(); else { qDebug() << "invalid reference of type: " << obj->Type(); qDebug() << "Requesting row: "<< parent.row() << "column: " << parent.column() << "of object " << (void*)obj; assert(false); } } /** Return the column count at the given parent index, 2 seemed reasonable * at the current time * @param parent the index whos column count we are trying to discover * @return the number of colums that occur beside the given parent */ int AlbumModel::columnCount(const QModelIndex& parent ) const { // MTP::GenericObject* obj = (MTP::GenericObject*)parent.internalPointer(); // if (obj && obj->Type() == MtpAlbum) // return 2; return 1; } /** * Returns the data to display at the given index and the role * @param index the index of the item to display * @param role the role this data will be used for */ QVariant AlbumModel::data(const QModelIndex& index, int role ) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpAlbum && index.column() == 0) { MTP::Album* tempAlbum = (MTP::Album*)temp; QString first = QString::fromUtf8(tempAlbum->Name()); // QString second = QString('\n') + QString(" ") + QString::fromUtf8(tempAlbum->Artist()); return QVariant(first); } else if (temp->Type() == MtpTrack && index.column() == 0) { MTP::Track* tempTrack = (MTP::Track*)temp; QString temp = QString::fromUtf8(tempTrack->Name()); return QVariant(temp); } return QVariant(); } if (role == Qt::DecorationRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpAlbum && index.column() == 0) { MTP::Album* tempAlbum = (MTP::Album*)temp; LIBMTP_filesampledata_t sample = tempAlbum->SampleData(); if (sample.size > 0 && sample.data ) /*&& (sample.filetype == LIBMTP_FILETYPE_JPEG || sample.filetype == LIBMTP_FILETYPE_JPX || sample.filetype == LIBMTP_FILETYPE_JP2)) */ { QPixmap ret; ret.loadFromData( (const uchar*)sample.data, sample.size); // qDebug() << "album decoration found:" << sample.filetype << " with size: " << sample.size; #ifdef SIMULATE_TRANSFERS qDebug() << "Actual sample found in simulate mode!"; #endif return ret.scaledToWidth(24, Qt::SmoothTransformation); } else { // qDebug() << "album decoration is not a jpeg:" << sample.filetype << " with size: " << sample.size; QPixmap ret("pixmaps/miscAlbumCover.png"); return ret.scaledToWidth(24, Qt::SmoothTransformation); } } else if (temp->Type() == MtpTrack && index.column() == 0) { return QIcon(QPixmap (":/pixmaps/track.png")); } else return QVariant(); } if (role == Qt::SizeHintRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); /* if (temp->Type() == MtpAlbum && index.column() == 0) return QSize(28, 28); */ } if (role == Qt::FontRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); //Its an album if (temp->Type() == MtpAlbum && index.column() == 0) { QFont temp; temp.setBold(true); temp.setPointSize(8); return temp; } } return QVariant(); } /** * Adds an album to this model * @param in_album the album to add to the model */ void AlbumModel::AddAlbum(MTP::Album* in_album) { //invalid parent for root items qDebug() << "Called Add Album" << endl; QModelIndex parentIdx = QModelIndex(); emit beginInsertRows(parentIdx, _albumList.size(), _albumList.size()); in_album->SetRowIndex(_albumList.size()); _albumList.push_back(in_album); emit endInsertRows(); } /** * Adds an track to this model * @param in_track the track to add, the parent album is determined through * in_track's parent field */ void AlbumModel::AddTrack(MTP::Track* in_track) { qDebug() << "Called AddTrack"; MTP::Album* parentAlbum = in_track->ParentAlbum(); assert(parentAlbum); in_track->SetRowIndex(parentAlbum->TrackCount()); QModelIndex parentIdx = createIndex(parentAlbum->GetRowIndex(), 0, parentAlbum); unsigned int sz = parentAlbum->TrackCount(); emit beginInsertRows(parentIdx, parentAlbum->TrackCount(), parentAlbum->TrackCount()); parentAlbum->AddTrack(in_track); emit endInsertRows(); assert(sz+1 == parentAlbum->TrackCount()); qDebug() << "old size: " << sz << " new size: " << parentAlbum->TrackCount(); } /** * Removes an album from the model * @param in_album the album to remove */ void AlbumModel::RemoveAlbum(MTP::Album* in_album) { //invalid parent for root items qDebug() << "Called RemoveAlbum"; assert(in_album); assert(in_album->GetRowIndex() < _albumList.size()); QModelIndex parentIdx = QModelIndex(); emit beginRemoveRows(parentIdx, in_album->GetRowIndex(), in_album->GetRowIndex()); for (unsigned int i =in_album->GetRowIndex()+1; i < _albumList.size(); i++) _albumList[i]->SetRowIndex(i -1); MTP::Album* deleteThisAlbum = _albumList[in_album->GetRowIndex()]; std::vector::iterator iter= _albumList.begin() + in_album->GetRowIndex(); _albumList.erase(iter); emit endRemoveRows(); } /** * Removes a track from the model * @param in_album the album to remove */ void AlbumModel::RemoveTrack(MTP::Track* in_track) { qDebug() << "Called RemoveTrack"; MTP::Album* parentAlbum = in_track->ParentAlbum(); assert(parentAlbum); QModelIndex parentIdx = createIndex(parentAlbum->GetRowIndex(), 0, parentAlbum); emit beginRemoveRows(parentIdx, in_track->GetRowIndex(), in_track->GetRowIndex()); parentAlbum->RemoveTrack(in_track->GetRowIndex()); emit endRemoveRows(); } qlix-0.2.6/widgets/QMtpDevice.h0000644000175000017500000001250411050625206014407 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __QMTPDEVICE__ #define __QMTPDEVICE__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mtp/MtpDevice.h" #include "widgets/MtpWatchDog.h" #include "widgets/CommandCodes.h" #include "widgets/AlbumModel.h" #include "widgets/PlaylistModel.h" #include "widgets/DirModel.h" #include "mtp/Icon.h" #include "mtp/BmpStructs.h" #include #include #include using namespace MTPCMD; class MtpWatchDog; /* * A threaded version of MtpDevice representing device attributes using QT * objects and models */ class QMtpDevice : public QThread { Q_OBJECT public: QMtpDevice(MtpDevice*, MtpWatchDog*, QObject* parent = NULL); QString Name(); QString Serial(); QIcon Icon(); void TransferTrack(QString filepath); void TransferFrom(MTP::GenericObject*, QString ); void DeleteObject(MTP::GenericObject*); void IssueCommand (GenericCommand* in_command); QSortFilterProxyModel* GetAlbumModel() const; QSortFilterProxyModel* GetPlaylistModel() const; QSortFilterProxyModel* GetDirModel() const; void Progress(uint64_t const sent, uint64_t const total); void FreeSpace(uint64_t* , uint64_t*); void SetSelectedStorage(count_t); unsigned int SelectedStorage(); unsigned int StorageDeviceCount(); MtpStorage* StorageDevice(unsigned int); signals: void Initialized(QMtpDevice*); void TrackTransferComplete(MTP::Track*); void NotATrack(SendFileCmd*); void UpdateProgress(QString, count_t); void CreatedAlbum(MTP::Album*); void AddedTrack(MTP::Track*); void AddedFile(MTP::File*); void RemovedTrack(MTP::Track*); void RemovedFile(MTP::File*); void RemovedAlbum(MTP::Album*); void RemovedFolder(MTP::Folder*); protected: void run(); private: void findAndRetrieveDeviceIcon(); void initializeDeviceStructures(); void proccessJob(GenericCommand*); MTP::Track* SetupTrackTransfer(TagLib::FileRef tagFile, const QString&, uint64_t, uint32_t, LIBMTP_filetype_t); MTP::File* SetupFileTransfer(const char*, uint64_t, count_t, LIBMTP_filetype_t); void syncTrack(TagLib::FileRef, uint32_t parent); void deleteObject(MTP::GenericObject*); void syncFile(const QString& path, uint32_t parent); void lockusb(); void unlockusb(); bool discoverCoverArt(const QString& in_path, const QString& in_albumName, QFileInfo* outFile); MtpDevice* _device; MtpWatchDog* _watchDog; QIcon _icon; QString _name; QString _serial; count_t _storageID; QQueue _jobs; QMutex _jobLock; QWaitCondition _noJobsCondition; AlbumModel* _albumModel; DirModel* _dirModel; PlaylistModel* _plModel; static int progressWrapper(uint64_t const sent, uint64_t const total, const void* const data); /** * A private class to manage sorting of the Directory model * it sorts directories before files. */ class MtpDirSorter : public QSortFilterProxyModel { public: MtpDirSorter(QObject* parent = NULL) : QSortFilterProxyModel(parent) { } bool lessThan(const QModelIndex& left, const QModelIndex& right) const { MTP::GenericObject* leftobj = (MTP::GenericObject*) left.internalPointer(); MTP::GenericObject* rightobj = (MTP::GenericObject*) right.internalPointer(); if (leftobj->Type() == MtpFolder && rightobj->Type() == MtpFolder) { MTP::Folder* leftFolder = (MTP::Folder*) leftobj; MTP::Folder* rightFolder = (MTP::Folder*) rightobj; return ( QString::fromUtf8(leftFolder->Name() ) < QString::fromUtf8(rightFolder->Name() ) ); } else if (leftobj->Type() == MtpFolder && rightobj->Type() == MtpFile) return true; else if (leftobj->Type() == MtpFile && rightobj->Type() == MtpFolder) return false; else if (leftobj->Type() == MtpFile && rightobj->Type() == MtpFile) { MTP::File* leftFile = (MTP::File*) leftobj; MTP::File* rightFile = (MTP::File*) rightobj; return ( QString::fromUtf8(leftFile->Name() ) < QString::fromUtf8(rightFile->Name() ) ); } assert(false); } }; MtpDirSorter* _sortedFiles; QSortFilterProxyModel* _sortedAlbums; QSortFilterProxyModel* _sortedPlaylists; }; #endif qlix-0.2.6/widgets/QlixMainWindow.cpp0000644000175000017500000001542711050625206015662 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "QlixMainWindow.h" QlixMainWindow::QlixMainWindow(MtpSubSystem* in_subsystem) { setMinimumSize(800,500); QWidget::setWindowIcon(QIcon(":/pixmaps/qlix.xpm")); QWidget::setWindowTitle("Qlix"); _watchDog = new MtpWatchDog(in_subsystem); _deviceChooser = new DeviceChooser(this); setupWatchDogConnections(); _watchDog->start(); _deviceChooser->resize(frameSize()); setCentralWidget(_deviceChooser); connect (_deviceChooser, SIGNAL(DeviceSelected(QMtpDevice*)), this, SLOT(DeviceSelected(QMtpDevice*))); } void QlixMainWindow::setupWatchDogConnections() { connect(_watchDog, SIGNAL(DefaultDevice(QMtpDevice*)), this, SLOT(DeviceSelected(QMtpDevice*)), Qt::QueuedConnection); connect(_watchDog, SIGNAL(NewDevice(QMtpDevice*)), _deviceChooser, SLOT(AddDevice(QMtpDevice*)), Qt::QueuedConnection); connect(_watchDog, SIGNAL(NoDevices(bool)), _deviceChooser, SLOT(NoDevices(bool)), Qt::QueuedConnection); } void QlixMainWindow::DeviceSelected(QMtpDevice* in_device) { setupStatusBar(); _deviceChooser->hide(); //TODO this is not such a great idea.. // _watchDog->quit(); _currentDevice = in_device; _deviceExplorer = new DeviceExplorer(in_device, this); _deviceExplorer->SetProgressBar(_progressBar); setupToolBar(); setupActions(); setupConnections(); setCentralWidget(_deviceExplorer); _deviceExplorer->setContentsMargins(0,-10,0,0); _albumlistAction->trigger(); } void QlixMainWindow::setupStatusBar() { statusBar()->setMaximumHeight(24); statusBar()->setContentsMargins(0,-2,0,0); _progressBar = new QProgressBar(); _progressBar->setTextVisible(false); _progressBar->setRange(0, 100); _progressBar->setMaximumSize(240, 20); _progressBar->setMinimumSize(240, 20); _progressBar->setAlignment(Qt::AlignRight); statusBar()->insertPermanentWidget(0, _progressBar, 0); _progressBar->hide(); } void QlixMainWindow::setupToolBar() { _navBar = new QToolBar(); _navBar->setOrientation(Qt::Vertical); _navBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); _navBar->setFloatable(false); /* _playlistTools = new QToolBar(_navBar); _playlistTools->setOrientation(Qt::Vertical); _playlistTools->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); _playlistTools->setFloatable(false); _playlistTools->setIconSize(QSize(12,12)); _playlistTools->setMovable(false); _fileTools = new QToolBar(_navBar); _fileTools->setOrientation(Qt::Vertical); _fileTools->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); _fileTools->setFloatable(false); _fileTools->setIconSize(QSize(12,12)); _fileTools->setMovable(false); */ addToolBar(Qt::TopToolBarArea,_navBar); /* addToolBar(Qt::BottomToolBarArea, _albumTools); addToolBar(Qt::BottomToolBarArea, _playlistTools); addToolBar(Qt::BottomToolBarArea, _fileTools); */ } void QlixMainWindow::setupActions() { _deviceExplorerActions = new QActionGroup(NULL); _deviceExplorerActions->setExclusive(true); _albumlistAction= new QAction( QIcon(":/pixmaps/albumlist.png"), QString("View Albums"), NULL); _albumlistAction->setCheckable(true); _deviceExplorerActions->addAction(_albumlistAction); _playlistAction = new QAction( QIcon(":/pixmaps/playlist.png"), QString("View Playlists"), NULL); _playlistAction->setCheckable(true); _deviceExplorerActions->addAction(_playlistAction); _filelistAction = new QAction( QIcon(":/pixmaps/filelist.png"), QString("View Files"), NULL); _filelistAction->setCheckable(true); _deviceExplorerActions->addAction(_filelistAction); _preferencesAction = new QAction( QIcon(":/pixmaps/preferences.png"), QString("Preferences"), NULL); _preferencesAction->setCheckable(true); _deviceExplorerActions->addAction(_preferencesAction); _manageDeviceAction = new QAction( QIcon(":/pixmaps/managedevice.png"), QString("Manage Device"), NULL); _manageDeviceAction->setCheckable(true); _deviceExplorerActions->addAction(_manageDeviceAction); _showQueueSeparator = new QAction(NULL); _showQueueSeparator->setSeparator(true); _showQueue = new QAction( QIcon(":/pixmaps/ShowQueue.png"), QString("Show Queue"), NULL); _showQueue->setCheckable(true); _navBar->addAction(_albumlistAction); _navBar->addAction(_playlistAction); _navBar->addAction(_filelistAction); _navBar->addAction(_manageDeviceAction); _navBar->addAction(_preferencesAction); _navBar->addAction(_showQueueSeparator); _navBar->addAction(_showQueue); _navBar->setIconSize(QSize(32,32)); // setupAlbumActions(); // setupPlaylistActions(); // setupFileActions(); } /* void QlixMainWindow::showAlbumActions() { _playlistTools->hide(); _fileTools->hide(); _albumTools->show(); _currentView = Albums; return; } void QlixMainWindow::hideAlbumActions() {} void QlixMainWindow::showPlaylistActions() { _albumTools->hide(); _fileTools->hide(); _playlistTools->show(); _currentView = Playlists; return; } void QlixMainWindow::hidePlaylistActions() {} void QlixMainWindow::showFileActions() { _playlistTools->hide(); _albumTools->hide(); _fileTools->show(); _currentView = Files; return; } void QlixMainWindow::hideFileActions() { for (int i =0; i < _fileActionList.size(); i++) _fileActionList[i]->setVisible(false); } */ void QlixMainWindow::setupConnections() { //The following connections change DeviceExplorer's views //And show the toolbar //And show the right actions connect(_albumlistAction, SIGNAL(triggered(bool)), _deviceExplorer, SLOT(ShowAlbums())); connect(_playlistAction, SIGNAL(triggered(bool)), _deviceExplorer, SLOT(ShowPlaylists())); connect(_filelistAction, SIGNAL(triggered(bool)), _deviceExplorer, SLOT(ShowFiles())); //The following show the preferences menu and the device manager //And hides the toolbar connect(_manageDeviceAction, SIGNAL(triggered(bool)), _deviceExplorer, SLOT(ShowDeviceManager())); connect(_preferencesAction, SIGNAL(triggered(bool)), _deviceExplorer, SLOT(ShowPreferences())); } qlix-0.2.6/widgets/MtpWatchDog.h0000644000175000017500000000361111050625206014566 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __MTPWATCHDOG__ #define __MTPWATCHDOG__ #include #include #include #include #include "mtp/MtpSubSystem.h" #include "types.h" #include "widgets/QMtpDevice.h" #include "QSettings" #ifdef LINUX_DBUS #include #include #endif class QMtpDevice; /** * @class This class will in the future be used to handle events such as * device disconnencts and connects while the application is in the middle of * a transaction */ class MtpWatchDog : public QThread { Q_OBJECT public: MtpWatchDog (MtpSubSystem*, QObject* parent = NULL); void Lock(); void Unlock(); signals: void DeviceCountChanged(count_t ); void NewDevice(QMtpDevice* Device); void DefaultDevice(QMtpDevice* Device); void NoDevices(bool); protected: void run(); private: QMutex _subSystemLock; MtpSubSystem* _subSystem; bool findDefaultDevice(); void createDevices(); count_t _deviceCount; #ifdef LINUX_DBUS void setupDBUS(); //QDBusConnection _systemBus; private slots: void DeviceAdded(QString); #endif }; #endif qlix-0.2.6/widgets/DeviceExplorer.h0000644000175000017500000001151711050625206015331 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "widgets/QlixPreferences.h" #include #include "widgets/QMtpDevice.h" #include "widgets/AlbumModel.h" #include "widgets/DirModel.h" #include "widgets/PlaylistModel.h" #include "mtp/MtpObject.h" #include "types.h" /** * @class The DeviceExplorer widget shows two panes one of which will expose * the local filesystem, the other will expose the device database. In specific * instances it will display the preferences widget * and the device management widget. Over all this widget ties all * functionality of Qlix into one main widget. It is the central widget * that is set in QlixMainWindow */ class DeviceExplorer : public QWidget { Q_OBJECT public: DeviceExplorer(QMtpDevice*, QWidget* parent); bool QueueState(); void SetProgressBar(QProgressBar*); public slots: void ShowFiles(); void ShowAlbums(); void ShowPlaylists(); void ShowPreferences(); void ShowDeviceManager(); void ShowQueue(bool); void UpdateProgressBar(const QString&, count_t percent); void Beep(MTP::Track* in_track); signals: private slots: void TransferToDevice(); void TransferFromDevice(); void DeleteFromDevice(); void SwitchFilesystemDir(const QModelIndex&); private: enum ViewPort { AlbumsView, PlaylistView, FileView }; void setupToolBars(); void setupMenus(); void setupDeviceView(); void setupFileSystemView(); void setupProgressBar(); void setupAlbumTools(); void setupPlaylistTools(); void setupFileTools(); void setupCommonTools(); void setupConnections(); void showAlbumTools(); void showGeneralTools(); void hideGeneralTools(); void showPlaylistTools(); void showFileTools(); void hideAlbumTools(); void hidePlaylistTools(); void hideFileTools(); void updateDeviceSpace(); void clearActions(); bool confirmDeletion(); bool confirmContainerDeletion(MTP::GenericObject*); // QModelIndexList removeAlbumDuplicates(const QModelIndexList&); QModelIndexList removeIndexDuplicates(const QModelIndexList&, const QAbstractItemModel*); QGridLayout* _layout; ViewPort _view; //Filesystem representation QListView* _fsView; QDirModel* _fsModel; //Device representations QMtpDevice* _device; QHeaderView* _horizontalHeader; //Queue representation QListView* _queueView; QTreeView* _deviceView; QSortFilterProxyModel* _albumModel; AlbumModel* _unsortedAlbumModel; QSortFilterProxyModel* _plModel; QSortFilterProxyModel* _dirModel; QSplitter* _fsDeviceSplit; QSplitter* _queueSplit; //Device manager and preferences (for now there are just labels QlixPreferences* _preferencesWidget; QLabel* _deviceManagerWidget; //Used to figure out if we are displaying the preferences or devicemanager //widget bool _otherWidgetShown; bool _queueShown; //Track toolbar and actions QToolBar* _tools; QSpacerItem* _progressBarSpacer; //Progress bar for space usage and transfers QProgressBar* _progressBar; //Playlist Actions QAction* _newPlaylist; QAction* _addToPlaylist; QAction* _showDeviceTracks; QAction* _showFSTracks; QAction* _deletePlaylist; QAction* _deleteFromPlaylist; QVector _playlistActionList; //Queue Actions QAction* _viewQueue; QAction* _hideQueue; //common to all fs views QActionGroup* _commonFSActions; QAction* _transferToDevice; //common to all objects QActionGroup* _commonDeviceActions; QAction* _transferFromDevice; QAction* _addToQueue; QAction* _sync; QAction* _deleteSeperator; QAction* _delete; //File Actions QAction* _newFolder; QVector _fileActionList; }; qlix-0.2.6/widgets/QlixMainWindow.h0000644000175000017500000000505511050625206015323 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __QLIXMAINWINDOW__ #define __QLIXMAINWINDOW__ #include #include #include #include #include #include #include #include #include #include "libmtp.h" #include "mtp/MtpSubSystem.h" #include "widgets/DeviceChooser.h" #include "widgets/DeviceExplorer.h" /* This class first displays the device chooser widget. Then it displays either * the batch-mode transfer widget */ class QlixMainWindow : public QMainWindow { Q_OBJECT public: QlixMainWindow(MtpSubSystem*); public slots: void DeviceSelected(QMtpDevice*); protected: // void closeEvent (QCloseEvent* eventh private slots: private: enum ToolbarView { Invalid, Albums, Playlists, Files, DeviceManager, Preferences }; void setupActions(); void setupToolBar(); void setupStatusBar(); void setupWatchDogConnections(); void setupConnections(); void setupAlbumActions(); void setupPlaylistActions(); void setupFileActions(); MtpWatchDog* _watchDog; DeviceChooser* _deviceChooser; QMtpDevice* _currentDevice; DeviceExplorer* _deviceExplorer; QToolBar* _navBar; QStatusBar* _statusBar; QProgressBar* _progressBar; //View Actions QAction* _albumlistAction; QAction* _filelistAction; QAction* _playlistAction; QMenu* _playlistMenu; QAction* _showDeviceTracks; QAction* _showFileSystem; QActionGroup* _deviceExplorerActions; QAction* _manageDeviceAction; QAction* _preferencesAction; QAction* _showQueueSeparator; QAction* _showQueue; /* //File Actions QAction* _transferFile; QAction* _deleteFile; QAction* _newFolder; QAction* _deleteFolder; QVector _fileActionList; */ }; #endif qlix-0.2.6/widgets/CommandCodes.h0000644000175000017500000001115711050625206014745 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __COMMANDCODES__ #define __COMMANDCODES__ #include #include #include #include "types.h" /** * @file * This file will detail the thread level protocol between the GUI and the device */ namespace MTPCMD { enum CommandCode { Initialize, SendFile, GetObj, Delete, CreateFSFolder /* Not implemented yet Connect, Disconnect, GetDeviceInfo, GetFile, GetDirMetaData, GetFileMetaData, GetSampleData, SendSampleData, CreateDirectory, TransferDeviceFolder, TransferSystemFolder */ }; struct GenericCommand { CommandCode ComCode; GenericCommand (CommandCode in_code) : ComCode(in_code) { } CommandCode GetCommand() { return ComCode; } }; struct SendFileCmd : GenericCommand { QString Path; bool IsTrack; uint32_t ParentID; SendFileCmd (QString in_path, uint32_t in_parent, bool in_isTrack = false) : GenericCommand(SendFile) { Path = in_path; ParentID = in_parent; IsTrack = in_isTrack; } }; struct GetObjCmd : GenericCommand { QString Path; uint32_t ID; GetObjCmd (uint32_t file_id, const QString& in_path): GenericCommand(GetObj) { ID = file_id; Path = in_path; ComCode = GetObj; } }; struct DeleteObjCmd : GenericCommand { MTP::GenericObject* Object; DeleteObjCmd (MTP::GenericObject* in_obj) : GenericCommand(Delete), Object(in_obj) {} }; struct CreateFSFolderCmd: GenericCommand { QString Path; QString Name; CreateFSFolderCmd(const QString& in_path, const QString& in_name): GenericCommand(CreateFSFolder) { Path = in_path; Name = in_name; } }; /* struct MtpDeviceInfo { QString _serial; QString _modelName; QString _friendlyName; QString _syncPartner; ubyte _curBatteryLevel; ubyte _maxBatteryLevel; }; struct MtpUpdate { Code ComCode; bool Success; Code GetCommand() { return ComCode; } bool isSuccess() { return Success; } }; struct GetDeviceInfo : GenericCommand { GetDeviceInfo ( void ) { ComCode = GetDeviceInfo; } }; struct MtpUpdateDeviceInfo { //todo MtpDeviceInfo Info; }; struct Connect : GenericCommand { Connect (void ) { ComCode = Connect; } }; MTPFS does not exist anymore struct MtpUpdateConnect: MtpUpdate { MtpFS* MtpFileSystem; MtpUpdateConnect(bool in_success, MtpFS* in_fs) { MtpFileSystem = in_fs; Success = in_success; } }; struct Disconnect : GenericCommand { Disconnect ( void ) { ComCode= Disconnect; } }; struct NewDirectory : GenericCommand { uint32_t ParentID; QString Name; NewDirectory(const QString& in_name, uint32_t in_parent_id) { ComCode = CreateDirectory; ParentID = in_parent_id; Name = in_name; } }; Not used: DirNode struct TransferSystemFolder : GenericCommand { QFileInfoList Files; DirNode* Parent; QString DirName; TransferSystemFolder(QDir folder, DirNode* parent) { ComCode = TransferSystemFolder; DirName = folder.dirName(); Parent = parent; Files = folder.entryInfoList(); } }; struct MtpUpdateDelete : MtpUpdate { uint32_t FolderID; int Depth; MtpUpdateDelete (bool in_success, uint32_t in_Folderid, int in_depth) { Success = in_success; FolderID = in_Folderid; Depth = in_depth; } }; struct MtpUpdateTransfer : MtpUpdate { uint32_t FolderID; MtpUpdateTransfer(bool in_success, uint32_t in_Folderid) { FolderID = in_Folderid; Success = in_success; } }; struct MtpThreadData { * Command; }; */ } #endif qlix-0.2.6/widgets/DeviceExplorer.cpp0000644000175000017500000005413511050625206015667 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * TODO context/selection sensative context menus.. */ #include "DeviceExplorer.h" /** * Constructs a new DeviceExplorer * @param in_device the device whos database to represent * @param parent the parent widget of this widget, should QlixMainWindow */ DeviceExplorer::DeviceExplorer(QMtpDevice* in_device, QWidget* parent) : _device(in_device), _progressBar(NULL) { qRegisterMetaType("count_t"); qRegisterMetaType("QModelIndex"); _layout = new QGridLayout(this); _preferencesWidget = new QlixPreferences(); _deviceManagerWidget = new QLabel("Device manager!"); _preferencesWidget->hide(); _deviceManagerWidget->hide(); //Get the models _albumModel = _device->GetAlbumModel(); //Album mode connections _unsortedAlbumModel = (AlbumModel*) _albumModel->sourceModel(); _dirModel= _device->GetDirModel(); _plModel = _device->GetPlaylistModel(); setupDeviceView(); _otherWidgetShown = false; _queueShown = false; setupFileSystemView(); _fsDeviceSplit = new QSplitter(); _queueSplit = new QSplitter(); _queueSplit->setOrientation(Qt::Vertical); _fsDeviceSplit->setOrientation(Qt::Horizontal); //add the widgets to the layout _fsDeviceSplit->addWidget(_fsView); _fsDeviceSplit->addWidget(_deviceView); _queueSplit->addWidget(_fsDeviceSplit); _queueSplit->addWidget(_queueView); _layout->addWidget(_queueSplit,1,0); _queueView->hide(); _layout->addWidget(_preferencesWidget,1,1); _layout->addWidget(_deviceManagerWidget,1,2); _fsModel->setSorting( QDir::Name | QDir::DirsFirst); _fsModel->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden |QDir::Readable); _fsModel->setLazyChildCount(true); QSettings settings; QString defaultDirLocation = settings.value("FSDirectory").toString(); QFileInfo defaultDir(defaultDirLocation); if (!defaultDir.exists() || !defaultDir.isDir() || !defaultDir.isReadable()) _fsView->setRootIndex(_fsModel->index(QDir::currentPath())); else _fsView->setRootIndex(_fsModel->index(defaultDirLocation)); setupCommonTools(); setupConnections(); setupMenus(); _deviceView->addActions(_commonDeviceActions->actions()); _fsView->addActions(_commonFSActions->actions()); } /** * Displays the AlbumModel and hides the preferences and devicemManager * widgets */ void DeviceExplorer::ShowAlbums() { if (_otherWidgetShown) { _deviceManagerWidget->hide(); _preferencesWidget->hide(); _fsView->show(); _deviceView->show(); _otherWidgetShown = false; if (_queueShown) _queueView->show(); }// _sortedModel->setSourceModel(_albumModel); if (_deviceView->model() != _albumModel) { _deviceView->setModel(_albumModel); _deviceView->setSelectionMode(QAbstractItemView::ExtendedSelection); } _deviceView->setStyleSheet("QTreeView::branch:!adjoins-item, QTreeView::branch:!has-children:open{ background: none} QTreeView::branch:has-children:closed{ image: url(:/pixmaps/TreeView/branch-closed.png)} QTreeView::branch:has-children:open{ image: url(:/pixmaps/TreeView/branch-open.png)}"); /* //To be continued * _deviceView->setStyleSheet("QTreeView::branch{ background: none} \ QTreeView::branch:adjoins-item:!has-children{ image: url(:/pixmaps/TreeView/branch-end.png)} \ QTreeView::branch:has-children:closed{ image: url(:/pixmaps/TreeView/branch-closed.png)} \ QTreeView::branch:has-children:open{ image: url(:/pixmaps/TreeView/branch-open.png)}"); */ } void DeviceExplorer::setupToolBars() { _tools = new QToolBar(); _tools->setOrientation(Qt::Horizontal); _tools->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); _tools->setFloatable(false); _tools->setIconSize(QSize(12,12)); _tools->setMovable(false); _tools->setContentsMargins(0,0,0,-3); _fsDeviceSplit->setContentsMargins(0,-1,0,1); // Incoroporates the progress bar as well _layout->addWidget(_tools, 0,0); _tools->addActions(_commonDeviceActions->actions()); } void DeviceExplorer::setupDeviceView() { _deviceView = new QTreeView(); _deviceView->setModel(_albumModel); _deviceView->setSelectionBehavior(QAbstractItemView::SelectRows); _deviceView->setSelectionMode(QAbstractItemView::ExtendedSelection); _deviceView->setSortingEnabled(true); _deviceView->sortByColumn(0, Qt::AscendingOrder); _deviceView->header()->hide(); _deviceView->setAlternatingRowColors(true); } bool DeviceExplorer::QueueState() { return _queueShown;} /** * Displays the PlaylistModel and hides the preferences and devicemManager * widgets */ void DeviceExplorer::ShowPlaylists() { if (_otherWidgetShown) { _deviceManagerWidget->hide(); _preferencesWidget->hide(); _fsView->show(); _deviceView->show(); _otherWidgetShown = false; if (_queueShown) _queueView->show(); }// _sortedModel->setSourceModel(_plModel); if (_deviceView->model() != _plModel) { _deviceView->setModel(_plModel); _deviceView->setSelectionMode(QAbstractItemView::ExtendedSelection); } } /** * Displays the DirModel and hides the preferences and devicemManager * widgets */ void DeviceExplorer::ShowFiles() { // _sortedModel->setSourceModel(_dirModel); if (_otherWidgetShown) { _deviceManagerWidget->hide(); _preferencesWidget->hide(); _fsView->show(); _deviceView->show(); _otherWidgetShown = false; if (_queueShown) _queueView->show(); } if (_deviceView->model() != _dirModel) { _deviceView->setModel(_dirModel); _deviceView->setSelectionMode(QAbstractItemView::SingleSelection); } _deviceView->setStyleSheet(""); } void DeviceExplorer::UpdateProgressBar(const QString& label, count_t percent) { if (!_progressBar) return; else if (_progressBar->isHidden()) _progressBar->show(); _progressBar->setFormat(label); _progressBar->setValue(percent); if (percent == 100) { updateDeviceSpace(); } } /** Sets the DeviceExplorers progress bar to @param in_progressbar * @param in_progerssbar the progress bar to update when an event happens * @see UpdateProgressBar; * */ void DeviceExplorer::SetProgressBar(QProgressBar* in_progressbar) { _progressBar = in_progressbar; _progressBar->setTextVisible(true); updateDeviceSpace(); } /** * Displays the preferences widget and hides the filesystem and device views * Also hides the devicemanager widget if it is being shown */ void DeviceExplorer::ShowPreferences() { if (_otherWidgetShown) { _deviceManagerWidget->hide(); _preferencesWidget->show(); } else { _deviceView->hide(); _fsView->hide(); _queueView->hide(); _preferencesWidget->show(); _otherWidgetShown = true; } } void DeviceExplorer::ShowQueue( bool showQueue ) { if (showQueue) { _queueView->show(); _queueShown = true; } else { _queueView->hide(); _queueShown = false; } } /** * Displays the DeviceManager widget and hides the filesystem and device views * Also hides the preferences widget if it is being shown */ void DeviceExplorer::ShowDeviceManager() { if (_otherWidgetShown) { _preferencesWidget->hide(); _deviceManagerWidget->show(); } else { _deviceView->hide(); _fsView->hide(); _queueView->hide(); _deviceManagerWidget->show(); _otherWidgetShown = true; } } void DeviceExplorer::setupConnections() { connect(_fsView, SIGNAL( doubleClicked ( const QModelIndex& )), this, SLOT(SwitchFilesystemDir(const QModelIndex&))); connect(_transferFromDevice, SIGNAL(triggered(bool)), this, SLOT(TransferFromDevice())); connect(_delete, SIGNAL(triggered(bool)), this, SLOT(DeleteFromDevice())); connect(_device, SIGNAL(UpdateProgress(QString, count_t)), this, SLOT(UpdateProgressBar(QString, count_t))); connect(_transferToDevice, SIGNAL(triggered(bool)), this, SLOT(TransferToDevice())); /* connect(_device, SIGNAL(AlbumCreated(MTP::Album*)), temp, SLOT(Beep()), Qt::QuuuedConnection); */ /* connect(_device, SIGNAL(CreatedAlbum(MTP::Album*)), _albumModel, SLOT(invalidate()), Qt::BlockingQueuedConnection); */ connect(_device, SIGNAL(CreatedAlbum(MTP::Album*)), _albumModel->sourceModel(), SLOT(AddAlbum(MTP::Album*)), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(AddedTrack(MTP::Track*)), _albumModel->sourceModel(), SLOT(AddTrack(MTP::Track*)), Qt::BlockingQueuedConnection); /* connect(_device, SIGNAL(AddedTrackToAlbum(MTP::Track*)), _albumModel, SLOT(invalidate()), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(RemovedTrack(MTP::Track*)), _albumModel, SLOT(invalidate()), Qt::BlockingQueuedConnection); */ connect(_device, SIGNAL(RemovedTrack(MTP::Track*)), _albumModel->sourceModel(), SLOT(RemoveTrack(MTP::Track*)), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(RemovedAlbum(MTP::Album*)), _albumModel->sourceModel(), SLOT(RemoveAlbum(MTP::Album*)), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(RemovedFolder(MTP::Folder*)), _dirModel->sourceModel(), SLOT(RemoveFolder(MTP::Folder*)), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(RemovedFile(MTP::File*)), _dirModel->sourceModel(), SLOT(RemoveFile(MTP::File*)), Qt::BlockingQueuedConnection); connect(_device, SIGNAL(AddedFile(MTP::File*)), _dirModel->sourceModel(), SLOT(AddFile(MTP::File*)), Qt::BlockingQueuedConnection); } void DeviceExplorer::Beep(MTP::Track* in_track) { qDebug() << "Beep from device Explorer"; ((AlbumModel*)_albumModel->sourceModel())->AddTrack(in_track); _albumModel->invalidate(); } void DeviceExplorer::updateDeviceSpace() { if (!_progressBar) return; else if (_progressBar->isHidden()) _progressBar->show(); uint64_t total; uint64_t free; _device->FreeSpace(&total, &free); uint64_t used = total - free; double displayTotal_kb = total/1024; double displayTotal_mb = displayTotal_kb/1024; double displayTotal_gb = displayTotal_mb/1024; QString totalDisplaySize = QString("%1 GB").arg(displayTotal_gb, 0, 'f', 2, QLatin1Char(' ' )); if (displayTotal_gb < 1) { totalDisplaySize = QString("%1 MB").arg(displayTotal_mb, 0, 'f', 2, QLatin1Char( ' ' )); } else if (displayTotal_mb < 1) { totalDisplaySize = QString("%1 KB").arg(displayTotal_kb, 0, 'f', 2, QLatin1Char( ' ' )); } else if (displayTotal_mb < 1 && displayTotal_gb < 1) { totalDisplaySize = QString("%1 B").arg(total, 0, 'f', 2, QLatin1Char( ' ' )); } double displayUsed_kb = used/1024; double displayUsed_mb = displayUsed_kb/1024; double displayUsed_gb = displayUsed_mb/1024; QString usedDisplaySize = QString("%1 GB").arg(displayUsed_gb, 0, 'f', 2, QLatin1Char( ' ' )); if (displayUsed_gb < 1) { usedDisplaySize = QString("%1 MB").arg(displayUsed_mb, 0, 'f', 2, QLatin1Char( ' ' )); } else if (displayUsed_mb < 1) { usedDisplaySize = QString("%1 KB").arg(displayUsed_kb, 0, 'f', 2, QLatin1Char( ' ' )); } else if (displayUsed_mb <1 && displayUsed_gb < 1) { usedDisplaySize = QString("%1 B").arg(used, 0, 'f', 2, QLatin1Char( ' ' )); } QString label = usedDisplaySize + " of " + totalDisplaySize ; count_t percent = (count_t)(((double) used / (double) total) * 100); qDebug() << "Free space reported: " << free; qDebug() << "Total space reported: " << total; _progressBar->setFormat(label); _progressBar->setValue(percent); } //Must be done before all others void DeviceExplorer::setupCommonTools() { _commonDeviceActions = new QActionGroup(this); _commonFSActions = new QActionGroup(this); _transferFromDevice = new QAction( QIcon(":/pixmaps/ActionBar/TransferFromDevice.png"), QString("Transfer From Device"), NULL); _commonDeviceActions->addAction(_transferFromDevice); _addToQueue= new QAction( QIcon(":/pixmaps/ActionBar/AddToQueue.png"), QString("Add to queue"), NULL); _commonDeviceActions->addAction(_addToQueue); _sync = new QAction( QIcon(":/pixmaps/ActionBar/SyncQueue.png"), QString("Sync"), NULL); _commonDeviceActions->addAction(_sync); QAction* _deleteSeperator = new QAction(NULL); _deleteSeperator->setSeparator(true); _commonDeviceActions->addAction(_deleteSeperator); _delete = new QAction( QIcon(":/pixmaps/ActionBar/DeleteFile.png"), QString("Delete"), NULL); _commonDeviceActions->addAction(_delete); _newFolder = new QAction( QIcon(":/pixmaps/ActionBar/NewFolder.png"), QString("New Folder"), NULL); _commonDeviceActions->addAction(_newFolder); //FS actions _transferToDevice = new QAction( QIcon(":/pixmaps/ActionBar/TransferFile.png"), QString("Transfer"), NULL); _commonFSActions->addAction(_transferToDevice); } void DeviceExplorer::setupFileSystemView() { //setup the filesystem view _fsModel = new QDirModel(); _fsView = new QListView(); _fsView->setModel(_fsModel); _fsView->setAlternatingRowColors(true); _fsView->setSelectionBehavior(QAbstractItemView::SelectRows); _fsView->setSelectionMode(QAbstractItemView::ExtendedSelection); _queueView = new QListView(); _queueView->setModel(_fsModel); } void DeviceExplorer::setupMenus() { _fsView->setContextMenuPolicy(Qt::ActionsContextMenu); _deviceView->setContextMenuPolicy(Qt::ActionsContextMenu); //setContextMenuPolicy(Qt::ActionsContextMenu); } void DeviceExplorer::TransferToDevice() { QList fileList; QItemSelectionModel* selectedModel = _fsView->selectionModel(); QModelIndexList idxList = selectedModel->selectedRows(); if (idxList .empty()) { qDebug() << "Nothing selected!"; return; } while(!idxList.empty()) { QString fpath = _fsModel->filePath(idxList.front()); qDebug() << "Fpath is: " << fpath; fileList.push_back(fpath); idxList.pop_front(); } /* selctedModel = _deviceView->selectionModel(); idxList = selectedModel->selectedRows(); */ while (!fileList.empty()) { _device->TransferTrack(fileList.front()); fileList.pop_front(); } } void DeviceExplorer::TransferFromDevice() { qDebug() << "called Transfer from device"; QModelIndex idx = _fsView->rootIndex(); if (!idx.isValid()) { qDebug() << "Current directory is invalid" ; return; } QFileInfo info = _fsModel->fileInfo(idx); assert(info.isDir()); if (!info.isWritable()) { qDebug() << "Current directory is not writable:" << info.canonicalFilePath(); return; } QString transferPath = info.canonicalFilePath(); QItemSelectionModel* selectedModel = _deviceView->selectionModel(); QModelIndexList idxList= selectedModel->selectedRows(); if (idxList.empty()) { qDebug() << "nothing selected!"; return; } QAbstractItemModel* theModel = _deviceView->model(); assert(theModel == _albumModel || theModel == _plModel || theModel == _dirModel); idxList = removeIndexDuplicates(idxList, (QSortFilterProxyModel*)theModel); MTP::GenericObject* obj; QModelIndex temp; foreach(temp, idxList) { obj = (MTP::GenericObject*) temp.internalPointer(); assert(temp.isValid()); _device->TransferFrom(obj, transferPath); } } /** * This function retrieves the current selection from the UI and proceedes * to first confirm the deletion of each object selected and then issues an * asynchornous delete command to MtpDevice */ void DeviceExplorer::DeleteFromDevice() { qDebug() << "Deleting form device.."; QItemSelectionModel* selectedModel = _deviceView->selectionModel(); QModelIndexList idxList = selectedModel->selectedRows(); if (idxList.empty()) { qDebug() << "nothing selected!"; return; } QAbstractItemModel* theModel = _deviceView->model(); assert(theModel == _albumModel || theModel == _plModel || theModel == _dirModel || theModel == _unsortedAlbumModel); idxList = removeIndexDuplicates(idxList, (QSortFilterProxyModel*)theModel); QModelIndex temp; foreach(temp, idxList) { MTP::GenericObject* obj = (MTP::GenericObject*) temp.internalPointer(); if (!confirmDeletion() ) continue; qDebug() << "Deleting object"; if (obj->Type() != MtpFile && obj->Type() != MtpTrack) { if (!confirmContainerDeletion(obj) ) continue; } assert(temp.isValid()); _device->DeleteObject(obj); } } void DeviceExplorer::SwitchFilesystemDir(const QModelIndex& tmpIdx) { if (!_fsView || !_fsModel) return; QFileInfo switchDir = _fsModel->fileInfo(tmpIdx); if (!switchDir.isDir() || !switchDir.exists()) return; _fsView->setRootIndex (tmpIdx); } /* QModelIndexList DeviceExplorer::removeAlbumDuplicates (const QModelIndexList& in_list) { QModelIndexList ret; QModelIndexList::const_iterator iter = in_list.constBegin(); for( ;iter != in_list.end(); iter++) { MTP::GenericObject* temp = (MTP::GenericObject*) (*iter).internalPointer(); if (temp->Type() == MtpAlbum) { ret.push_back(*iter); } } qDebug() << "Potential problem Album count: " <Type() == MtpAlbum) continue; QModelIndex parent = _albumModel->parent(*iter); QModelIndex potentialParent; bool duplicate = false; foreach (potentialParent, ret) { if (parent == potentialParent) { duplicate = true; dupcount ++; break; } } if (!duplicate) ret.push_back(*iter); } qDebug() << "Duplicates found: " << dupcount; return ret; } */ /** * This function removes duplicate selection implied by selecting a parent * widget and one or many of its children. The parent widget's selection * implies all widgets under it are selected, thus it gets precedence when * transfering and deleting files/tracks/folders. * @param in_list the list of indicies selected * @param in_model the model that in_list applies to */ QModelIndexList DeviceExplorer::removeIndexDuplicates( const QModelIndexList& in_list, const QAbstractItemModel* in_model) { qDebug() << "Called removeIndexDuplicates"; QModelIndexList ret; QModelIndexList tempList = in_list; count_t dupCount = 0; while (!tempList.empty()) { QModelIndex first = tempList.front(); tempList.pop_front(); QModelIndex parent = first; bool found = false; while (parent.isValid()) { QModelIndex rightOfFirst; QModelIndex leftOfFirst; foreach(rightOfFirst, tempList) { if (rightOfFirst == parent) { found = true; dupCount++; break; } } foreach(leftOfFirst, ret) { if (leftOfFirst == parent) { found = true; dupCount++; break; } } if (found) break; parent = in_model->parent(parent); } if (!found) { if (in_model != _unsortedAlbumModel) { QModelIndex mapped = ((QSortFilterProxyModel*)in_model)->mapToSource(first); ret.push_back(mapped); MTP::GenericObject* tempObj = (MTP::GenericObject*) mapped.internalPointer(); assert(tempObj->Type() == MtpTrack || tempObj->Type() == MtpFile || tempObj->Type() == MtpAlbum || tempObj->Type() == MtpFolder); } else ret.push_back(first); } } qDebug() << "Found :" << dupCount << " duplicates" << endl; qDebug() << "ret size:" <sourceModel())->data(temp, Qt::DisplayRole)).toString(); qDebug()<< i << ": " << tempOut; i++; } #endif return ret; } /** * This function creates a popup and requests the user to confirm the deletion * of an object */ bool DeviceExplorer::confirmDeletion() { if (QMessageBox::question(this, "Confirm Deletion", "Pleaes confirm object deletion", "&Delete", "&Cancel", QString::null, 0, 1) == 0) return true; else return false; } /** * This function creates a popup and requests the user to confirm the deletion * of a container object * @param in_obj the container object that is about to be deleted */ bool DeviceExplorer::confirmContainerDeletion(MTP::GenericObject* in_obj) { if (QMessageBox::question(this, "Confirm Container Deletion", QString("%1 is a container object, all contained \ objects will be deleted!").arg( QString::fromUtf8(in_obj->Name() ) ), "&Delete", "&Cancel", QString::null, 0, 1) == 0) return true; else return false; } qlix-0.2.6/widgets/DeviceChooser.h0000644000175000017500000001020711050625206015126 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __DEVICECHOOSER__ #define __DEVICECHOOSER__ #include #include #include #include #include #include #include #include #include #include #include #include #include "types.h" #include "mtp/MtpSubSystem.h" #include "widgets/DeviceButton.h" #include "widgets/MtpWatchDog.h" #include "widgets/QMtpDevice.h" typedef QVector QButtonVector; /** * @class This class displays the device chooser widget * which is a widget that display a series of buttons, one for each * device that has been detected by libMTP */ class DeviceChooser : public QScrollArea { Q_OBJECT public: DeviceChooser(QWidget*); signals: void DeviceSelected(QMtpDevice* ); public slots: void ExclusivelySelected(DeviceButton*, QMtpDevice*); void Reinitialize(); void AddDevice(QMtpDevice*); void NoDevices(bool); private slots: void deviceCountChanged(); private: //private forward declration class NoDevice; void addButton(DeviceButton*); void setupConnections(count_t idx); // Connects the WatchDog to this widget to inform it of updates void setupWatchDogConnections(); void initialize(); void createNoDeviceWidget(); void createDetectDevicesWidget(); void addButtonToLayout(DeviceButton*); void showNoDeviceWidget(); void hideNoDeviceWidget(); QVector _devices; /* Used when devices are detected */ QButtonVector _deviceButtons; QGridLayout* _chooserLayout; QGroupBox* _chooserGroupBox; NoDevice* _noDeviceWidget; NoDevice* _detectDevicesWidget; /** * @class A private class to display the NoDevice Icon or alternatively * it shoulds the Detecting Devices Icon * */ class NoDevice : public QWidget { public: NoDevice(bool nodevice, QWidget* parent = NULL) : QWidget(parent) { _layout = new QGridLayout(); _top = new QSpacerItem(10, 10, QSizePolicy::Maximum, QSizePolicy::Expanding); _bottom = new QSpacerItem(10, 10, QSizePolicy::Maximum, QSizePolicy::Expanding); QString txt; if (nodevice) txt = QString("

No devices detected!

"); else txt = QString("

Detecting devices..

"); _text = new QLabel(txt); _text->setTextFormat(Qt::RichText); _image = new QLabel(); if (nodevice) _image->setPixmap(QPixmap(":/pixmaps/noDevice.png")); else _image->setPixmap(QPixmap(":/pixmaps/DetectDevices.png")); _layout->addItem(_top, 0, 0, 1, -1); _layout->addWidget(_text, 1, 0, 1, -1, Qt::AlignCenter); _layout->addWidget(_image, 2, 0, 1, -1, Qt::AlignCenter); _layout->addItem(_bottom, 3, 0, 1, -1); setLayout(_layout); } /** This function changes the image to a recycle sign and tells the user * to connect a device as DBUS seems to be functioning */ void SetDBusSearch() { QString txt ("

No devices found. Please connect a device..

"); _text->setText(txt); _image->setPixmap(QPixmap(":/pixmaps/DetectDevices.png")); } private: QGridLayout* _layout; QSpacerItem* _top; QSpacerItem* _bottom; QLabel* _text; QLabel* _image; }; }; #endif qlix-0.2.6/widgets/.QMtpDevice.cpp.swp0000644000175000017500000012000011050625206015617 0ustar alialib0VIM 7.1q)£H®ÊE¤alishahal-laptop~ali/svn/trunk/widgets/QMtpDevice.cpputf-8 3210#"! UtpÿvtwŒëpwxçi_ dÈC,ad5!výÈÅ…‚=÷³¡žYÒ ” ‘ D ÷ ¶ ³ „ m L ú ² ‘ m l $ û Ó ¨ y : 7 þ ý Ï r q ; 9  üÞ¾¼»¤¢•uVG Ñ¥Ÿk^X-ÿù¾~xtZYJF1í캣†‚€GEâÒι³˜‹…rlGèç©mPHùáÒÊÉŽaK>8'!  { case GetObj: } break; delete sendCmd; syncTrack(tagFile, sendCmd->ParentID); qDebug() << "Syncing track with path: " << fullpath; } break; delete sendCmd; syncFile(fullpath, 0); qDebug() << "Syncing to root folder.."; { if (tagFile.isNull()) TagLib::AudioProperties::Accurate); TagLib::FileRef tagFile(fullpath.toUtf8().data(), true, QString fullpath = sendCmd->Path; SendFileCmd* sendCmd = (SendFileCmd*)currentJob; qDebug() << "Syncing file.. "; { case SendFile: } break; delete currentJob; { case Initialize: { switch (type) qDebug() << "Processing Job with type: " << type; CommandCode type = currentJob->GetCommand();{void QMtpDevice::proccessJob(GenericCommand* currentJob)} } proccessJob(currentJob); _jobLock.unlock(); GenericCommand* currentJob = _jobs.dequeue(); _noJobsCondition.wait(&_jobLock); while (_jobs.empty() ) _jobLock.lock(); { while (true) emit Initialized(this); } } qDebug() << "Default storage not found, selecting first"; SetSelectedStorage(_device->StorageDevice(0)->ID()); { if (i+1 >= _device->StorageDeviceCount()) //if we haven't found a storage device } break; qDebug() << "Found default storage!" << endl; { if (storage->ID() == SelectedStorage()) MtpStorage* storage = _device->StorageDevice(i); { for (count_t i =0; i < _device->StorageDeviceCount(); i++) unlockusb(); findAndRetrieveDeviceIcon(); initializeDeviceStructures(); lockusb();{void QMtpDevice::run()} qDebug() << "Issued command"; _noJobsCondition.wakeOne(); _jobs.push_back(in_cmd); QMutexLocker locker(&_jobLock);{void QMtpDevice::IssueCommand(GenericCommand* in_cmd)QIcon QMtpDevice::Icon() { return _icon; }QString QMtpDevice::Serial() { return _serial; }QString QMtpDevice::Name() { return _name; }} _device->SetProgressFunction(progressWrapper, this);{ _icon(QPixmap(":/pixmaps/miscDev.png")) _watchDog(in_watchDog), _device(in_device), QThread(parent), QObject* parent):QMtpDevice::QMtpDevice(MtpDevice* in_device, MtpWatchDog* in_watchDog, #include "widgets/QMtpDevice.h" */ * adding tracks/files/objects * TODO should the model just use queuedConnections for removing and * TODO move model information out of this thread and back into the main thread * TODO update model correctly * TODO memory leaks * TODO retrieving files with NULL filenames * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * with this program; if not, write to the Free Software Foundation, Inc., * You should have received a copy of the GNU General Public License along * * GNU General Public License version 2.0 for more details. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * but WITHOUT ANY WARRANTY; without even the implied warranty of * This program is distributed in the hope that it will be useful, * * this file. * and appearing in the file COPYING included in the packaging of * License version 2.0 as published by the Free Software Foundation * This file may be used under the terms of the GNU General Public * * This file is part of the Qlix project on http://berlios.de * * Copyright (C) 2008 Ali Shah /*adÈèCÙ–YúôÛ±ž˜~zjhg-+ç £ ~ z G 4 0   ú í ç æ Ó Í € D  Ç • p c ] \ H B í ¼ ¯ © – C  Ñ ‹ Š W 2 %     õïêèç} } } break; { case MtpPlaylist: } break; emit RemovedFile(association); emit RemovedAlbum( (MTP::Album*)deletedObj); MTP::File* association= (MTP::File*) deletedObj->Association(); _device->RemoveAlbum( (MTP::Album*)deletedObj); assert(deletedObj->Association()->Type() == MtpFile); MTP::GenericFileObject* deletedObj = (MTP::GenericFileObject*) in_obj; { case MtpAlbum: } break; emit RemovedFolder((MTP::Folder*) in_obj); qDebug() << "About to emit folder removal: thread id is: " << currentThread(); { case MtpFolder: } break; emit RemovedFile(association); emit RemovedTrack((MTP::Track*)deletedObj); MTP::File* association= (MTP::File*) deletedObj->Association(); _device->RemoveTrack( (MTP::Track*)deletedObj); assert(deletedObj->Association()->Type() == MtpFile); MTP::GenericFileObject* deletedObj = (MTP::GenericFileObject*) in_obj; { case MtpTrack: } break; { case MtpFile: { switch (in_obj->Type()) } assert(false); qDebug() << "Object of unknown type!" << endl; { in_obj->Type() != MtpPlaylist) in_obj->Type() != MtpFolder && in_obj->Type() != MtpAlbum && if (in_obj->Type() != MtpFile && in_obj->Type() != MtpTrack &&{void QMtpDevice::deleteObject(MTP::GenericObject* in_obj)} return false; } children.pop_front(); } return true; //find out the default image size (*outFile) = temp; { name == "albumart.jpeg") name == "album art.jpeg" || name == "albumart.jpg" || name == "folder.jpeg" || name == "album art.jpg" || name == albumNameAlt.toLower() || name == "folder.jpg" || name == albumName.toLower() ||adätÍqC.þñëÒ̃4 å ¿ Y J   â Ç º › • „ ~ B â º ¡ p K > 8 4 2 1 ò ð Ä › … b ` _ D B -    ø ö á Ê È Ç Ä x t F D 4 (  ਖb[( ×»’‘b0 Û­RQ$øÈÇ™k@?ÍŒJ ¿»ŽŒa.ÿþ´—mi6ÿä name = name.toLower(); QString name = QString::fromUtf8(curFile->Name()); MTP::File* curFile = rootFolder->ChildFile(i); { for (count_t i = 0; i < fileCount; i++) MTP::File* iconFile= NULL; QString iconPath = QString("/tmp/QlixDeviceIcon-%1").arg( (int) this); count_t fileCount = rootFolder->FileCount(); MTP::Folder* rootFolder = _device->RootFolder(); qDebug() << "Searching for Device Icon";{void QMtpDevice::findAndRetrieveDeviceIcon() */ * Iterates over all the devices files and tries to find devIcon.fil/*} _dirModel->moveToThread(QApplication::instance()->thread()); _sortedFiles->moveToThread(QApplication::instance()->thread()); _albumModel->moveToThread(QApplication::instance()->thread()); _sortedAlbums->moveToThread(QApplication::instance()->thread()); this->moveToThread(_sortedAlbums->thread()); _sortedFiles->setSourceModel(_dirModel); _sortedPlaylists->setSourceModel(_plModel); _sortedAlbums->setSourceModel(_albumModel); _sortedPlaylists->setDynamicSortFilter(true); _sortedFiles->setDynamicSortFilter(true); _sortedAlbums->setDynamicSortFilter(true); _sortedFiles, SLOT(invalidate())); connect(_dirModel, SIGNAL(layoutChanged()), _sortedAlbums, SLOT(invalidate())); connect(_albumModel, SIGNAL(layoutChanged()), _sortedFiles = new MtpDirSorter(); _sortedPlaylists = new QSortFilterProxyModel(); _sortedAlbums = new QSortFilterProxyModel(); _plModel = new PlaylistModel(_device); new ModelTest(_dirModel); _dirModel = new DirModel(_device->RootFolder()); new ModelTest(_albumModel); _albumModel = new AlbumModel(_device->Albums());#endif// qDebug() << "Discovered name to be: " << _name;#ifdef QLIX_DEBUG _serial = QString::fromUtf8(_device->SerialNumber()); _name = QString::fromUtf8(_device->Name()); _device->Initialize(); return; if (!_device){void QMtpDevice::initializeDeviceStructures() */ * Initializes the base device which retrieves the device friendly name etc/*} _watchDog->Unlock(); assert(_watchDog);{void QMtpDevice::unlockusb()} _watchDog->Lock(); assert(_watchDog);{void QMtpDevice::lockusb()} emit UpdateProgress(blank, per); QString blank = ""; count_t per = (count_t) (percent*100); float percent = (float)sent/(float)total;{void QMtpDevice::Progress(uint64_t const sent, uint64_t total)} } } break;// _sortedAlbums->invalidate(); //_albumModel->Delete(deleteThis->Object); delete deleteThis; deleteObject(deleteThis->Object); qDebug() << "Whether the filter supports changes: " <<_sortedAlbums->dynamicSortFilter(); DeleteObjCmd* deleteThis = (DeleteObjCmd*)currentJob; { case Delete: } //TODO update the model break; delete createFolder; qDebug() << "Failed creating folder"; else qDebug() << "Success creating folder"; if (ret) bool ret = (check.exists() && check.isDir()); QFileInfo check (temp, createFolder->Name); temp.mkdir(createFolder->Name); QDir temp(createFolder->Path); << " name: " << createFolder->Name; qDebug() << "Got a create fs folder command path:" << createFolder->Path CreateFSFolderCmd* createFolder = (CreateFSFolderCmd*) currentJob; { case CreateFSFolder: } break; //TODO update the model and delete memory delete getObj; qDebug() << "Fetch failure!" << endl; if (!ret) bool ret = _device->Fetch(getObj->ID, getObj->Path.toUtf8().data()); GetObjCmd* getObj = (GetObjCmd*) currentJob;ad MŒáÛ›tnjZVC ìÑË¥wU80ü â Â Ž 6  û Ö Ð Ç Œ … ] [ Z W 6 2 ù ÷ ß Ý Ú º ¶  } f d c ` ; 7 û ù Þ Ü Ø   f b 2 0   ö õ ¿ ª q o n j  üÒΔ’N åá®›—–_^EA.ð×ÊıªzZ"í¿¤œw^QK5/üܧŸuG?÷ñðÜÖ †hg,$øÏ´¬ŠML for (count_t i =0; i < rootFolder->FolderCount(); i++) //recurse on all subfolders } IssueCommand(cmd); cmd = new DeleteObjCmd(subFile); subFile = rootFolder->ChildFile(i); { for (count_t i =0; i < rootFolder->FileCount(); i++) MTP::Folder* subFolder; MTP::File* subFile; MTP::Folder* rootFolder = (MTP::Folder*)in_obj; { case MtpFolder: } break; IssueCommand(cmd); cmd = new DeleteObjCmd(pl); } cmd = new DeleteObjCmd(currentTrack); currentTrack = pl->ChildTrack(i); { for (count_t i = 0; i < pl->TrackCount(); i++) MTP::Track* currentTrack; MTP::Playlist* pl = (MTP::Playlist*) in_obj; { case MtpPlaylist: } break; IssueCommand(cmd); cmd = new DeleteObjCmd(album); } IssueCommand(cmd); cmd = new DeleteObjCmd(currentTrack); currentTrack = album->ChildTrack(i); { for (count_t i = 0; i < album->TrackCount(); i++) MTP::Track* currentTrack; MTP::Album* album = (MTP::Album*) in_obj; { case MtpAlbum: } break; IssueCommand(cmd); cmd = new DeleteObjCmd(in_obj); { case MtpFile: case MtpTrack: { switch(in_obj->Type()) DeleteObjCmd* cmd; // = new DeleteObjCmd(obj->ID()); } assert(false); qDebug() << "Object of unknown type!" << endl; { in_obj->Type() != MtpPlaylist) in_obj->Type() != MtpFolder && in_obj->Type() != MtpAlbum && if (in_obj->Type() != MtpFile && in_obj->Type() != MtpTrack &&{void QMtpDevice::DeleteObject(MTP::GenericObject* in_obj) */ * @param in_obj the object to be deleted * has confirmed the deletion. * This function issues the delete command to the device thread after the user/**} qDebug() << "Attempting to transfer file: " << inpath; IssueCommand(cmd); SendFileCmd* cmd= new SendFileCmd(inpath, 0, true); return; if (file.isDir()) QFileInfo file(inpath);{void QMtpDevice::TransferTrack(QString inpath) */ * @param in_path the path to the track on the filesystem * Issues a command to initiate the transfer of a track/**} return _sortedPlaylists;{QSortFilterProxyModel* QMtpDevice::GetPlaylistModel() const */ * Returns the sorted PlaylistModel /*} return _sortedFiles;{QSortFilterProxyModel* QMtpDevice::GetDirModel() const */ * Returns the sorted DirModel /*} return _sortedAlbums;{QSortFilterProxyModel* QMtpDevice::GetAlbumModel() const */ * Returns the sorted AlbumModel/*} qDebug() << "No device icon found"; else } _icon = QIcon(QPixmap(":/pixmaps/miscDev.png")); else } _icon = QIcon(QPixmap(image)); } image = (QPixmap::fromImage(tempImage)); QImage tempImage( (uchar*)buf, dim.Width, dim.Height, QImage::Format_ARGB32); Dimensions dim = devIcon.GetDimensions(); devIcon.Extract(buf); char buf[temp]; size_t temp = devIcon.GetBestImageSize(); { if (devIcon.IsValid()) DeviceIcon devIcon(buffer); QByteArray buffer = img_file.readAll(); img_file.open(QFile::ReadOnly); { if (img_file.exists()) QFile img_file(iconPath); _device->Fetch(iconFile->ID(), iconPath.toLatin1()); QPixmap image; { if (iconFile) } } break; iconFile = curFile; qDebug() << "Found icon file with id: " << curFile->ID(); { if (name == "devicon.fil")ad!õpøÈ§ŸW>1+'%$ éİ­dbP95" ò Ï Ç ’ S K @ 8  Ì Ä – j : Ä ” { n h U N !  á ¥ m R  Ý Õ ¨ _  Ú¿·|aRQ?ÿѸmUûîèÒÌœ|G?Ì…G,$ý÷Ħ„ƒA¾œ›RßœVýõô } IssueCommand(cmd); cmd = new GetObjCmd (currentFile->ID(), subFilePath); QString::fromUtf8(currentFile->Name()); QString subFilePath = subFolderPath + QDir::separator() + currentFile = rootFolder->ChildFile(i); { for (count_t i =0; i < rootFolder->FileCount(); i++) QString subFolderPath = filePath + QDir::separator() + folderName; IssueCommand(newFolderCmd); (filePath, folderName); CreateFSFolderCmd* newFolderCmd = new CreateFSFolderCmd QString folderName = QString::fromUtf8(rootFolder->Name()); MTP::Folder* currentFolder; MTP::File* currentFile; MTP::Folder* rootFolder = (MTP::Folder*)obj; { case MtpFolder: } break; } IssueCommand(cmd); cmd = new GetObjCmd (currentTrack->ID(), actualPath); QString actualPath = filePath + QDir::separator() + trackName; QString trackName = QString::fromUtf8(currentTrack->FileName()); currentTrack = pl->ChildTrack(i); { for (count_t i = 0; i < pl->TrackCount(); i++) MTP::Track* currentTrack; MTP::Playlist* pl = (MTP::Playlist*) obj; { case MtpPlaylist: } break; img.save(coverPath); coverPath = filePath + QDir::separator() + coverName; //right directory //no need to check albumDirCreated again, the path already holds the QString coverPath; QString coverName = albumName + ".jpg"; img.loadFromData( (const uchar*) cover.data, cover.size); QImage img; break; if (cover.size == 0) LIBMTP_filesampledata_t cover = album->SampleData(); } IssueCommand(cmd); cmd = new GetObjCmd (currentTrack->ID(), actualPath); QString actualPath = filePath + QDir::separator() + trackName; QString trackName = QString::fromUtf8(currentTrack->FileName()); currentTrack = album->ChildTrack(i); { for (count_t i = 0; i < album->TrackCount(); i++) filePath = filePath + QDir::separator() + albumName; if (albumDirCreated) bool albumDirCreated = albumDir.mkdir(albumName); QString albumName = QString::fromUtf8(album->Name()); QDir albumDir(filePath); MTP::Track* currentTrack; MTP::Album* album = (MTP::Album*) obj; { case MtpAlbum: } break; IssueCommand(cmd); cmd = new GetObjCmd(obj->ID(), filePath); qDebug() << "Or here: " << QDir::toNativeSeparators(filePath); qDebug() << "Transfer here: " << filePath; filePath += QDir::separator() + filename; qDebug() << "and here: " << filename; qDebug() << "check here: " << filePath; } filename= QString::fromUtf8(currentFile->Name()); MTP::File* currentFile= (MTP::File*) obj; { else } filename= QString::fromUtf8(currentTrack->FileName()); MTP::Track* currentTrack= (MTP::Track*) obj; { if (obj->Type() == MtpTrack) QString filename; { case MtpFile: case MtpTrack: { switch (obj->Type()) GetObjCmd* cmd;{void QMtpDevice::TransferFrom(MTP::GenericObject* obj, QString filePath)*/ * @param filePath * @param obj the object to transfer * Transfers an object from device the passed location/**} } } break; IssueCommand(cmd); cmd = new DeleteObjCmd(rootFolder); //delete the rootfolder } DeleteObject(subFolder); subFolder = rootFolder->ChildFolder(i); {adxÞ¡™e1)íàÚÖÔÓpn0#À y T H F E A  á ¡ W U     à ­ n j 0 .  ß Ý Ü Ø ž š o m ; & $ #  × Ó ¥ £ { y x t % ÿÎÊdba]І=¼ºqB辈wv^%íÙØ“cWSR1í¹µv9þøÞÑËÇB // finally we apply the cover art to the newly created album // We start by creating a new album, finding appropriete cover art and // if there is no trackAlbum then we have to create one } } break; trackAlbum = album; { if (QString::fromUtf8(album->Name()) == findThisAlbum) MTP::Album* album = (MTP::Album*) idx.internalPointer(); QModelIndex idx = _albumModel->index(i, 0, QModelIndex()); { for (int i = 0; i < _albumModel->rowCount(); i++) QString findThisAlbum = QString::fromUtf8(newTrack->AlbumName()); MTP::Album* trackAlbum = NULL; } return; qDebug() << "Transfer track failed.. "; { if (! _device->TransferTrack(filePath.toUtf8().data(), newTrack) ) assert(newTrack); parent, type); newTrack = SetupTrackTransfer(tagFile, filename, size, MTP::Track* newTrack; delete suffix; LIBMTP_filetype_t type = MTP::StringToType(suffix); uint64_t size = (uint64_t) file.size(); QString filename = file.fileName(); char* suffix = strdup(suffixStr.toUtf8().data()); QString suffixStr = file.suffix().toUpper(); QFileInfo file(filePath); QString filePath = tagFile.file()->name();{void QMtpDevice::syncTrack(TagLib::FileRef tagFile, uint32_t parent) */ * folder where this track will reside in * @param parent the parent id of this track, this should be the id of a * @param in_path the path to the track on the host computer's filesystem * metadata and calling the TransferTrack function on the device. * This function will sync a track to the device by looking up the track's/**} return _device->StorageDevice(in_idx);{MtpStorage* QMtpDevice::StorageDevice(unsigned int in_idx) */ * @return the requested storage device by index * bounds, this function returns NULL * @param in_idx the index of requested storage device if the index is out of /**} return _device->StorageDeviceCount();{unsigned int QMtpDevice::StorageDeviceCount() */ * @return the number of storage devices that exist on this MTP device/** } return _storageID; qDebug() << "Selected storage: " << _storageID;{unsigned int QMtpDevice::SelectedStorage() */ * @return the storage id that was selected for this view/**} qDebug() << "Selected storage: " << _storageID; _storageID = in_storageID;{void QMtpDevice::SetSelectedStorage(count_t in_storageID) */ * @param in_storageID the storage ID that will be the default * made to the device * Sets the default storage ID for all transfer and create requests that are/**} _device->FreeSpace(SelectedStorage(), out_total, out_free);{void QMtpDevice::FreeSpace(uint64_t* out_total , uint64_t* out_free) */ * @param out_free the total amount of free space on the device * @param out_total the total amount of space on the device * Probes the device for free space/**} return 0; thisDevice->Progress(sent, total); QMtpDevice* thisDevice = const_cast (tempDevice); QMtpDevice const * const tempDevice = static_cast (data); return 1; if (!data)// cout << "Progress: " << (float)sent/(float)total << endl;{int QMtpDevice::progressWrapper(uint64_t const sent, uint64_t const total, const void* const data)} } } break; assert(false); { default: } break; } TransferFrom(currentFolder, subFolderPath); currentFolder = rootFolder->ChildFolder(i); { for (count_t i =0; i < rootFolder->FolderCount(); i++) //recurse on all subfoldersad)áiíé›VP  êÕªc:Ò ³ ­ v Q *  ø í Õ ¨ e +  ó Ê © z V 9  é ² ’ _ Y < 6 à Æ À ¿ œ X 5 1 , ç°¬|plDñÔÉÇÆÂ’Ié墠…VU)辈‡21ð¶pEA ´™ŒˆDô§’b^áà uint64_t in_sz, MTP::File* QMtpDevice::SetupFileTransfer(const char* in_filename, */ * @param in_type the LIBMTP_filetype_t of file * root level * @param in_parentid the parent folder of this object, if its 0, its on the * @param in_si the size of the file * @param in_filename the name of the file * This function creates a MTP::File object filled with sane values/**} return; emit AddedFile(newFile); qDebug() << "About to emit AddedFileToAlbum thread id is: " << currentThread(); } return; qDebug() << "Failed to transfer file"; { newFile) ) if (! _device->TransferFile((const char*) in_path.toUtf8().data(), type); MTP::File* newFile = SetupFileTransfer(filename, size, parent, qDebug() << "Syncing file of type: " << QString( MTP::TypeToString(type).c_str()); LIBMTP_filetype_t type = MTP::StringToType(suffix); uint64_t size = (uint64_t) file.size(); char* filename = file.completeBaseName().toLocal8Bit().data(); char* suffix = suffixStr.toUtf8().data(); QString suffixStr = file.suffix().toUpper(); QFileInfo file(in_path);{void QMtpDevice::syncFile(const QString& in_path, uint32_t parent) */ * folder * @param parent the parent id of this file, this should be the id of a * @param in_path the path to the file on the host computer's filesystem * This function will sync a file to the device/**} return ; emit AddedTrack(newTrack); qDebug() << "About to emit AddedTrackToAlbum thread id is: " << currentThread(); newTrack->SetParentAlbum(trackAlbum); } return; qDebug() << "Failed to add track to album"; { if (!_device->AddTrackToAlbum(newTrack, trackAlbum)) //now add the track to the found album and update it on the device } emit CreatedAlbum(trackAlbum); //if thats successful we can update the view with the new album trackAlbum->SetInitialized(); } << "this"; qDebug() << "LIBMTP reported invalid sample data for this device please report" { else if (sample == NULL) } _device->UpdateAlbumArt(trackAlbum, sample); sample->data = newBuffer; memcpy(newBuffer, barray.data(), barray.size()); char* newBuffer = new char[barray.size()]; sample->height = height; sample->width = width; sample->size = barray.size(); sample->filetype = LIBMTP_FILETYPE_JPEG; img.save(&buffer, "JPEG"); buffer.open(QIODevice::WriteOnly); QBuffer buffer(&barray); QByteArray barray; Qt::SmoothTransformation); img = img.scaled( QSize(width, height), Qt::KeepAspectRatio, QImage img(cover.canonicalFilePath()); width = height; else height = width; if (height > width) count_t height = sample->height; count_t width = sample->width; qDebug() << "LIBMTP reported valid sample data"; { if (ret && sample != NULL) LIBMTP_filesampledata_t* sample = _device->DefaultJPEGSample(); qDebug() << "Found cover art!"; &cover); QString::fromUtf8(trackAlbum->Name()), bool ret = discoverCoverArt(filePath, QFileInfo cover; //Try and find some cover art } return; qDebug() << "Failed to create new album"; { if(!_device->NewAlbum(newTrack, SelectedStorage(), &trackAlbum)) //first try adding a new album to the device because one does not exist.. { if (!trackAlbum)ad#ÇdÁ}{N& ä片†…Aú ½ { 5 3  ð º © \ %  ê µ ´ Ÿ Ž X Ô Ë ™ d c M ;  ´ | s ?   ñ»ª]%ê¶µ{<Ì~}V9 ìϲ\ص“xSQPOÖ ž‚oY;4ѤutVR+þÇÆ if (name == "cover.jpg" || name == "cover.jpeg" || QString name= temp.fileName().toLower(); QFileInfo temp = children.front(); { while (!children.isEmpty()) QString albumNameAlt= in_albumName +".jpeg"; QString albumName = in_albumName + ".jpg"; QFileInfoList children = search_dir.entryInfoList(QDir::Files); search_dir = QDir(in_path); else search_dir = finfo.dir(); if (finfo.isFile()) QDir search_dir; QFileInfo finfo(in_path);{ QFileInfo* outFile) const QString& in_albumName,bool QMtpDevice::discoverCoverArt(const QString& in_path,} return new MTP::Track(newtrack); newtrack->next = NULL; newtrack->filetype = in_type; newtrack->filesize = in_size; newtrack->bitrate = tagFile.audioProperties()->bitrate(); newtrack->duration = tagFile.audioProperties()->length()*1000; newtrack->tracknumber = tagFile.tag()->track(); newtrack->filename= filename; newtrack->album = album; newtrack->genre = genre; newtrack->artist = artist; newtrack->storage_id = SelectedStorage(); newtrack->title = title; newtrack->parent_id = in_parentID; cout << "File type sanity check: " << MTP::TypeToString(in_type) << endl; LIBMTP_track_t* newtrack = LIBMTP_new_track_t(); cout << "Filename sanity check: " << filename << endl; char* filename = strdup(in_filename.toLocal8Bit().data()); //TODO why doesn't this work? //Copy the filename cout<< "Genre sanity check: " << genre << endl; genre = strdup(genreTag.toCString(true)); else genre = strdup(unknownString.toCString(true)); if (genreTag.isEmpty() || genreTag.upper() == TagLib::String("UNKNOWN")) char* genre; TagLib::String genreTag = tagFile.tag()->genre(); //Copy the genre cout << "Artist sanity check: " << artist << endl; artist = strdup(artistTag.toCString(true)); else artist = strdup(unknownString.toCString(true)); if (artistTag.isEmpty() || artistTag.upper() == TagLib::String("UNKNOWN")) TagLib::String artistTag = tagFile.tag()->artist(); char* artist; //Copy the artist cout << "Title sanity check: " << title << endl; title = strdup(titleTag.toCString(true)); else title = strdup(unknownString.toCString(true)); if (titleTag.isEmpty() || titleTag.upper() == TagLib::String("UNKNOWN")) TagLib::String titleTag = tagFile.tag()->title(); char* title; //Copy the title cout << "Album sanity check: " << album << endl; album = strdup(albumTag.toCString(true)); else album = strdup(unknownString.toCString(true)); if (albumTag.isEmpty() || albumTag.upper() == TagLib::String("UNKNOWN")) char* album; TagLib::String albumTag = tagFile.tag()->album(); //Copy the album TagLib::String unknownString = "Unknown";{ LIBMTP_filetype_t in_type) uint32_t in_parentID, uint64_t in_size, const QString& in_filename,MTP::Track* QMtpDevice::SetupTrackTransfer(TagLib::FileRef tagFile,} return new MTP::File(file); file->filetype = in_type; file->parent_id = in_parentid; file->storage_id = SelectedStorage(); file->filesize = in_sz; file->filename = strdup(in_filename); LIBMTP_file_t* file = LIBMTP_new_file_t();{ LIBMTP_filetype_t in_type) count_t in_parentid, qlix-0.2.6/widgets/QlixPreferences.cpp0000644000175000017500000000363511050625206016045 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "QlixPreferences.h" QlixPreferences::QlixPreferences(QObject* parent) { _layout = new QGridLayout(this); _defaultDeviceLabel = new QLabel("Default Device:"); _defaultDeviceLine = new QLineEdit(_settings.value("DefaultDevice").toString()); _defaultDirPathLabel = new QLabel("Default Filesystem Directory:"); _defaultDirPathLine = new QLineEdit(_settings.value("FSDirectory").toString()); _saveButton = new QToolButton(); _saveAction = new QAction(QString("Save settings"), NULL); _saveButton->setDefaultAction(_saveAction); connect(_saveAction, SIGNAL(triggered(bool)), this, SLOT(saveSettings())); _layout->addWidget(_defaultDeviceLabel, 0, 0); _layout->addWidget(_defaultDeviceLine, 0, 1); _layout->addWidget(_defaultDirPathLabel, 1, 0); _layout->addWidget(_defaultDirPathLine, 1, 1); _layout->addWidget(_saveButton, 2,1); } void QlixPreferences::saveSettings() { _settings.setValue("DefaultDevice", _defaultDeviceLine->text()); _settings.setValue("FSDirectory", _defaultDirPathLine->text()); _settings.sync(); qDebug() << "Settings saved!" < * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "widgets/DeviceChooser.h" /* * Creates a new DeviceChooser widget by first creatng a noDevice widget * and then creating container widgets for detected devices * Care should be taken with the no device widget as it is destroyed after * devices are added and should be recreated when devices are removed.. */ DeviceChooser::DeviceChooser(QWidget* parent) { createNoDeviceWidget(); createDetectDevicesWidget(); initialize(); } /* * Initializes a button for each device detected, or displays the No devices * detected screen */ void DeviceChooser::initialize() { _chooserGroupBox = new QGroupBox("Choose a device"); _chooserLayout = new QGridLayout(_chooserGroupBox); _chooserLayout->setVerticalSpacing(40); _chooserLayout->setColumnMinimumWidth(0, 160); QScrollArea::setWidgetResizable(true); QScrollArea::setWidget(_detectDevicesWidget); return; } /** * This slot iterates over all buttons and unchecks those that are not equal * to selected * @param selected the exclusively selected DeviceButton */ void DeviceChooser::ExclusivelySelected(DeviceButton* selected, QMtpDevice* selectedDev) { for (int i = 0; i < _deviceButtons.size(); i++) { if (_deviceButtons[i] != selected) _deviceButtons[i]->RemoveCheck(); } } /* * A function stub that might be needed for later use */ void DeviceChooser::Reinitialize() { return; } /* * Adds a DeviceButton based on the passed device to this container widget * @param in_device the device to add a button for */ void DeviceChooser::AddDevice(QMtpDevice* in_device) { _devices.push_back(in_device); DeviceButton* newDevice = new DeviceButton(in_device); _deviceButtons.push_back(newDevice); count_t row; count_t col; row = ((_deviceButtons.size() -1) / 3); col = (_deviceButtons.size() -1) % 3; _chooserLayout->addLayout(newDevice, row, col, 1, 1); if (_deviceButtons.size() > 1) _chooserLayout->setColumnMinimumWidth(1, 160); if (_deviceButtons.size() > 2) _chooserLayout->setColumnMinimumWidth(2, 160); #ifdef QLIX_DEBUG qDebug() << "Added a new device!"; #endif if (_devices.size() == 1) QScrollArea::setWidget(_chooserGroupBox); QScrollArea::setWidgetResizable(true); //setup connections for the last button as it was pushed to the vector setupConnections(_deviceButtons.size()-1); } void DeviceChooser::NoDevices(bool in_dbusWorking) { qDebug() << "Is dbus working: " << in_dbusWorking; if (in_dbusWorking) _noDeviceWidget->SetDBusSearch(); QScrollArea::setWidget(_noDeviceWidget); } /** * Creates the noDevice widget */ void DeviceChooser::createNoDeviceWidget() { _noDeviceWidget = new NoDevice(true); } /** Creates the Detecting Devices widget */ void DeviceChooser::createDetectDevicesWidget() { _detectDevicesWidget = new NoDevice(false); } /* * Uncommented because of development */ void DeviceChooser::deviceCountChanged() { } /* * Connects a button check box to the ExclusivelySelected() slot * @param idx the index of the button to connect */ void DeviceChooser::setupConnections(count_t idx) { assert (idx <(int) _deviceButtons.size()); QObject::connect(_deviceButtons[idx], SIGNAL(Checked(DeviceButton*, QMtpDevice*) ), this, SLOT(ExclusivelySelected(DeviceButton*, QMtpDevice*))); QObject::connect(_deviceButtons[idx], SIGNAL(Selected(QMtpDevice*)), this, SIGNAL(DeviceSelected(QMtpDevice*))); } qlix-0.2.6/widgets/AlbumModel.h0000644000175000017500000000430611050625206014430 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __ALBUMMODEL__ #define __ALBUMMODEL__ #include #include #include #include #include #include "types.h" #include #include #include #include #include #include #include #include #include #include #include #include "modeltest/modeltest.h" #include #include /** * @class This class wraps over the MTP::Album structures and provides a * hierarchy that displays tracks underneath albums */ class AlbumModel : public QAbstractItemModel { Q_OBJECT public: AlbumModel(vector, QObject* parent = NULL); ~AlbumModel(); QModelIndex index(int, int, const QModelIndex& parent= QModelIndex()) const; QModelIndex parent (const QModelIndex& index) const; int rowCount(const QModelIndex& parent= QModelIndex() ) const ; int columnCount(const QModelIndex& parent= QModelIndex() ) const; QVariant data(const QModelIndex& , int role = Qt::DisplayRole ) const; public slots: void AddAlbum(MTP::Album*); void AddTrack(MTP::Track* in_track); void RemoveAlbum(MTP::Album*); void RemoveTrack(MTP::Track*); private: std::vector _albumList; bool discoverCoverArt(const QString&, const QString&, QFileInfo*); MtpDevice* _device; QMutex* _modelLock; }; #endif qlix-0.2.6/widgets/DirModel.cpp0000644000175000017500000002207411050625206014443 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * TODO SampleData for MTP::Files */ #include "widgets/DirModel.h" DirModel::DirModel(MTP::Folder* in_rootFolder, QObject* parent) : _rootFolder(in_rootFolder) { } QModelIndex DirModel::index(int row, int col, const QModelIndex& parent) const { if(col < 0 || row < 0) return QModelIndex(); if(col >= columnCount(parent) || row >= rowCount(parent)) return QModelIndex(); if(!parent.isValid() ) { assert(row == 0 && col == 0); return createIndex(row, col, _rootFolder); } MTP::GenericObject* temp = (MTP::GenericObject*)parent.internalPointer(); if (temp->Type() != MtpFolder) assert(false); MTP::Folder* folder = (MTP::Folder*)temp; int total = (int) folder->FolderCount() + folder->FileCount(); if (row >= (int) total) { qDebug() << "Requested row is out of bounds- not enough children!"; return QModelIndex(); } if (row < (int) folder->FolderCount() ) { MTP::Folder* ret = folder->ChildFolder(row); assert(ret); return createIndex(row, col, ret); } int idx = row - folder->FolderCount(); assert(idx < (int)folder->FileCount() && idx >= 0); MTP::File* ret = folder->ChildFile(idx); assert(ret); return createIndex(row, col, ret); } QModelIndex DirModel::parent(const QModelIndex& idx) const { if (!idx.isValid()) return QModelIndex(); MTP::GenericObject* obj=(MTP::GenericObject*) idx.internalPointer(); assert(obj); if(obj->Type() == MtpFolder) { MTP::Folder* parent = ((MTP::Folder*)obj)->ParentFolder(); if (!parent) return QModelIndex(); // MTP::Folder* fobj = (MTP::Folder*) obj; // qDebug() << "folder " << QString::fromUtf8(fobj->Name()) << " 's parent is: " << QString::fromUtf8(parent->Name()); return createIndex(parent->GetRowIndex(), 0, parent); } else if (obj->Type() == MtpFile) { MTP::Folder* parent = ((MTP::File*)obj)->ParentFolder(); if (!parent) return QModelIndex(); MTP::File* fobj = (MTP::File*) obj; qDebug() << "file" << QString::fromUtf8(fobj->Name()) << " 's parent is: " << QString::fromUtf8(parent->Name()); return createIndex(parent->GetRowIndex(), 0, parent); } else { qDebug() << "object is of type: " << obj->Type(); qDebug() << "Requesting row: "<< idx.row() << "column: " << idx.column() << "of object " << (void*)obj; assert(false); } return QModelIndex(); } int DirModel::rowCount(const QModelIndex& parent) const { //return the fake root's row count- which should be 1 if (!parent.isValid() ) return 1; MTP::GenericObject* obj= (MTP::Album*)parent.internalPointer(); if(obj->Type() == MtpFolder) { MTP::Folder* folder = (MTP::Folder*) obj; return (folder->FileCount() + folder->FolderCount()); } else if (obj->Type() == MtpFile) return 0; else { qDebug() << "invalid reference of type: " << obj->Type(); qDebug() << "Requesting row: "<< parent.row() << "column: " << parent.column() << "of object " << (void*)obj; assert(false); } } int DirModel::columnCount(const QModelIndex& parent ) const { return 1; } QVariant DirModel::data(const QModelIndex& index, int role ) const { if (!index.isValid()) return QVariant(); if (index.internalPointer() == NULL) return QVariant(); if (role == Qt::DisplayRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpFolder && index.column() == 0) { MTP::Folder* tempFolder = (MTP::Folder*)temp; return QString::fromUtf8(tempFolder->Name()); } else if (temp->Type() == MtpFile && index.column() == 0) { MTP::File* tempFile = (MTP::File*)temp; QString temp = QString::fromUtf8(tempFile->Name()); return temp; } return QVariant(); } if (role == Qt::DecorationRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpFolder && index.column() == 0) { QPixmap ret(":/pixmaps/folder.png"); return ret.scaledToWidth(24, Qt::SmoothTransformation); } else if (temp->Type() == MtpFile && index.column() == 0) { QPixmap ret; /* TODO SampleData for MTP::Files MTP::File* tempFile = (MTP::File*)temp; LIBMTP_filesampledata_t sample = tempFile->SampleData(); if (sample.filetype == LIBMTP_FILETYPE_UNKNOWN && (sample.size > 0 && sample.data) ) { ret.loadFromData( (const uchar*)sample.data, sample.size); return ret.scaledToWidth(24, Qt::SmoothTransformation); } */ ret.load(":/pixmaps/file.png"); return ret.scaledToWidth(24, Qt::SmoothTransformation); } return QVariant(); } if (role == Qt::FontRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); //Its an album if (temp->Type() == MtpFolder && index.column() == 0) { QFont temp; temp.setBold(true); temp.setPointSize(8); return temp; } } return QVariant(); } /** * Adds a file to this model * @param in_file the file to add to the model, the parent folder is determined through * in_file's parent field */ void DirModel::AddFile(MTP::File* in_file) { qDebug() << "Called AddFile"; MTP::Folder* parentFolder = in_file->ParentFolder(); assert(parentFolder); QModelIndex parentIdx = createIndex(parentFolder->GetRowIndex(), 0, parentFolder); count_t sz = parentFolder->FileCount(); emit beginInsertRows(parentIdx, parentFolder->FileCount(), parentFolder->FileCount()); parentFolder->AddChildFile(in_file); emit endInsertRows(); assert(sz+1 == parentFolder->FileCount()); qDebug() << "old size: " << sz << " new size: " << parentFolder->FileCount(); } /** * Adds a folder to this model * @param in_folder the folder to add to the model, the parent folder is * determined through in_folder's parent field. If it is NULL it is added to * the root folder */ void DirModel::AddFolder(MTP::Folder* in_folder) { //invalid parent for root items qDebug() << "Called AddFolder" << endl; MTP::Folder* parentFolder = in_folder->ParentFolder(); if (!parentFolder) parentFolder = _rootFolder; QModelIndex parentIdx = createIndex(parentFolder->GetRowIndex(), 0, parentFolder); count_t subFolderCount = parentFolder->FolderCount(); emit beginInsertRows(parentIdx, subFolderCount, subFolderCount); in_folder->SetRowIndex(subFolderCount); parentFolder->AddChildFolder(in_folder); emit endInsertRows(); } void DirModel::RemoveFolder(MTP::Folder* in_folder) { qDebug() << "Called RemoveFolder"; assert(in_folder); MTP::Folder* parentFolder = in_folder->ParentFolder(); if(!parentFolder) parentFolder = _rootFolder; assert(in_folder->GetRowIndex() < parentFolder->FolderCount()); QModelIndex parentIdx = createIndex(parentFolder->GetRowIndex(), 0, parentFolder); count_t subFolderCount = parentFolder->FolderCount(); emit beginRemoveRows(parentIdx, in_folder->GetRowIndex(), in_folder->GetRowIndex()); for (count_t i =in_folder->GetRowIndex()+1; i < subFolderCount; i++) { parentFolder->ChildFolder(i)->SetRowIndex(i -1); } MTP::Folder* deleteThisFolder = parentFolder->ChildFolder(in_folder->GetRowIndex()); parentFolder->RemoveChildFolder(deleteThisFolder); delete deleteThisFolder; emit endRemoveRows(); } void DirModel::RemoveFile(MTP::File* in_file) { qDebug() << "RemoveFile stub!" << endl; assert(in_file); MTP::Folder* parentFolder = in_file->ParentFolder(); QModelIndex parentIdx = createIndex(parentFolder->GetRowIndex(), 0, parentFolder); emit beginRemoveRows(parentIdx, in_file->GetRowIndex(), in_file->GetRowIndex()); for (count_t i =0; i < parentFolder->FileCount(); i++) { assert(parentFolder->ChildFile(i)->GetRowIndex() == i); } for (count_t i =in_file->GetRowIndex()+1; i < parentFolder->FileCount(); i++) { parentFolder->ChildFile(i)->SetRowIndex(i-1); } parentFolder->RemoveChildFile(in_file); for (count_t i =0; i < parentFolder->FileCount(); i++) { assert(parentFolder->ChildFile(i)->GetRowIndex() == i); } delete in_file; emit endRemoveRows(); } qlix-0.2.6/widgets/PlaylistModel.cpp0000644000175000017500000001046011050625206015522 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "widgets/PlaylistModel.h" PlaylistModel::PlaylistModel(MtpDevice* in_dev, QObject* parent) : _device(in_dev) { } QModelIndex PlaylistModel::index(int row, int col, const QModelIndex& parent) const { if(!parent.isValid() && (row >= (int)_device->PlaylistCount())) return QModelIndex(); else if (!parent.isValid() ) { MTP::Playlist* pl = _device->Playlist(row); return createIndex(row, col, (void*) pl); } MTP::GenericObject* obj= (MTP::GenericObject*)parent.internalPointer(); assert(obj->Type() == MtpPlaylist); MTP::Playlist* pl= (MTP::Playlist*) obj; if (row >= (int)pl->TrackCount()) return QModelIndex(); MTP::Track* track = pl->ChildTrack(row); assert (track->Type() == MtpTrack); return createIndex(row, col, track); } QModelIndex PlaylistModel::parent(const QModelIndex& idx) const { if (!idx.isValid()) return QModelIndex(); MTP::GenericObject* obj=(MTP::GenericObject*) idx.internalPointer(); if(obj->Type() == MtpTrack) { MTP::Playlist* parent = ((MTP::Track*)obj)->ParentPlaylist(); QModelIndex ret = index((int)parent->GetRowIndex() - 1, 0, QModelIndex()); return ret; } else if (obj->Type() == MtpPlaylist) return QModelIndex(); else { qDebug() << "object is of type: " << obj->Type(); qDebug() << "Requesting row: "<< idx.row() << "column: " << idx.column() << "of object " << (void*)obj; assert(false); } return QModelIndex(); } int PlaylistModel::rowCount(const QModelIndex& parent) const { if (!parent.isValid() ) return _device->PlaylistCount(); MTP::GenericObject* obj= (MTP::GenericObject*)parent.internalPointer(); if(obj->Type() == MtpTrack) return 0; else if (obj->Type() == MtpPlaylist) return ((MTP::Playlist*)obj)->TrackCount(); else { qDebug() << "invalid reference of type: " << obj->Type(); qDebug() << "Requesting row: "<< parent.row() << "column: " << parent.column() << "of object " << (void*)obj; assert(false); } } int PlaylistModel::columnCount(const QModelIndex& parent ) const { return 2; } QVariant PlaylistModel::data(const QModelIndex& index, int role ) const { if (role == Qt::DisplayRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpPlaylist && index.column() == 0) { MTP::Playlist* tempPlaylist = (MTP::Playlist*)temp; QString first = QString::fromUtf8(tempPlaylist->Name()); return (first); } else if (temp->Type() == MtpTrack && index.column() == 0) { MTP::Track* tempTrack = (MTP::Track*)temp; QString temp = QString::fromUtf8(tempTrack->Name()); return temp; } } if (role == Qt::DecorationRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); if (temp->Type() == MtpPlaylist && index.column() == 0) { QPixmap ret(":/pixmaps/playlisticon.png"); return ret.scaledToWidth(24, Qt::SmoothTransformation); } else if (temp->Type() == MtpTrack && index.column() == 0) { return QIcon(QPixmap (":/pixmaps/track.png")); } else return QVariant(); } if (role == Qt::FontRole) { MTP::GenericObject* temp = (MTP::GenericObject*) index.internalPointer(); //Its an album if (temp->Type() == MtpPlaylist && index.column() == 0) { QFont temp; temp.setBold(true); temp.setPointSize(8); return temp; } } return QVariant(); } qlix-0.2.6/widgets/MtpWatchDog.cpp0000644000175000017500000001340611050625206015124 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "widgets/MtpWatchDog.h" // Currently libmtp does not support polling // In the future this will probably be supported by HAL/DBUS signals that // will inform us when a MTP device has been connected. At that point we would // ask LIBMTP to created a LIBMTP_device_t struct from a (potentially) USB port // number /** * Creates a new WatchDog over the given subsystem * @param in_subSystem the subsystem to watch over */ MtpWatchDog::MtpWatchDog(MtpSubSystem* in_subSystem, QObject* parent) : _subSystem(in_subSystem), _deviceCount(0) { } /** * Begin running the MtpWatchDog by polling LIBMTP for new devices */ void MtpWatchDog::run() { Lock(); _subSystem->Initialize(); if (_subSystem->DeviceCount() == 0) { #ifdef LINUX_DBUS setupDBUS(); Unlock(); exec(); #else emit NoDevices(false); Unlock(); return; #endif } else { qDebug() << "Device count > 0"; if (!findDefaultDevice()) createDevices(); Unlock(); return; } } /** * One must lock up the WatchDog before working with the MTP subsystem */ void MtpWatchDog::Lock() { _subSystemLock.lock(); } /** * One must unlock the WatchDog once done working with the MTP subsystem */ void MtpWatchDog::Unlock() { _subSystemLock.unlock(); } bool MtpWatchDog::findDefaultDevice() { QSettings settings; QString defaultDev = settings.value("DefaultDevice").toString(); for (count_t i = 0; i< _subSystem->DeviceCount() && !defaultDev.isEmpty(); i++) { if (QString::fromUtf8(_subSystem->Device(i)->SerialNumber()) == defaultDev) { QSettings settings; count_t defaultStorage = settings.value("DefaultStorage").toInt(); QMtpDevice* threadedDev = new QMtpDevice(_subSystem->Device(i), this); threadedDev->SetSelectedStorage(defaultStorage); // threadedDev->moveToThread(QApplication::instance()->thread()); connect(threadedDev, SIGNAL(Initialized (QMtpDevice*)), this, SIGNAL(DefaultDevice(QMtpDevice*)), Qt::QueuedConnection); assert(!threadedDev->isRunning()); threadedDev->start(); qDebug() << "Found the default device: " << defaultDev; return true; } } return false; } void MtpWatchDog::createDevices() { for (count_t i = 0; i< _subSystem->DeviceCount(); i++) { QMtpDevice* threadedDev = new QMtpDevice(_subSystem->Device(i), this); threadedDev->moveToThread(QApplication::instance()->thread()); connect(threadedDev, SIGNAL(Initialized (QMtpDevice*)), this, SIGNAL(NewDevice (QMtpDevice*)), Qt::QueuedConnection); assert(!threadedDev->isRunning()); threadedDev->start(); } } #ifdef LINUX_DBUS void MtpWatchDog::setupDBUS() { QDBusConnection _systemBus = QDBusConnection::systemBus(); bool ret = _systemBus.connect("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager", "DeviceAdded", this, SLOT(DeviceAdded(QString))); QDBusInterface hal("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager", _systemBus); bool dbusConnectionHealth = (ret && _systemBus.isConnected() && hal.isValid()); emit NoDevices(dbusConnectionHealth); } void MtpWatchDog::DeviceAdded(QString in_objRef) { qDebug() << "connected: " << in_objRef; QDBusConnection _systemBus = QDBusConnection::systemBus(); QDBusInterface usbDevice("org.freedesktop.Hal", in_objRef, "org.freedesktop.Hal.Device", _systemBus); QDBusReply vendorReply = usbDevice.call("GetPropertyInteger", "usb.vendor_id"); QDBusReply productReply = usbDevice.call("GetPropertyInteger", "usb.product_id"); QDBusReply protocolReply; protocolReply = usbDevice.call("GetPropertyStringList", "portable_audio_player.access_method.protocols"); QDBusReply protocolReply2; protocolReply2 = usbDevice.call("GetPropertyString", "info.udi"); if (vendorReply.isValid() && productReply.isValid()) { QString vendorID = QString("%1").arg(vendorReply.value(), 0, 16); QString productID = QString("%1").arg(productReply.value(), 0, 16); qDebug() << "Vendor: " << vendorID; qDebug() << "Product: " << productID; } if(protocolReply.isValid()) { qDebug() << "Protocol: " << protocolReply.value(); qDebug() << "Protocol udi: " << protocolReply2.value(); } Lock(); if (_subSystem->DeviceCount() == 0) { _subSystem->Initialize(); if (findDefaultDevice() ) { Unlock(); return; } else createDevices(); } Unlock(); //TODO potentially disconnect the DBUS connection } #endif qlix-0.2.6/widgets/DirModel.h0000644000175000017500000000334211050625206014105 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __DIRMODEL__ #define __DIRMODEL__ #include #include #include #include #include #include "types.h" #include "QtDebug" #include "QIcon" #include "QFont" #include class DirModel : public QAbstractItemModel { Q_OBJECT public: DirModel(MTP::Folder*, QObject* parent = NULL); QModelIndex index(int, int, const QModelIndex& parent= QModelIndex()) const; QModelIndex parent (const QModelIndex& index) const; int rowCount(const QModelIndex& parent= QModelIndex() ) const ; int columnCount(const QModelIndex& parent= QModelIndex() ) const; QVariant data(const QModelIndex& , int role = Qt::DisplayRole ) const; public slots: void AddFile(MTP::File*); void AddFolder(MTP::Folder*); void RemoveFile(MTP::File*); void RemoveFolder(MTP::Folder*); private: MtpDevice* _device; MTP::Folder* _rootFolder; }; #endif qlix-0.2.6/widgets/DeviceButton.cpp0000644000175000017500000000742411050625206015341 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "widgets/DeviceButton.h" /** * Creates a DeviceButton object * @param in_device The device that this button represents * @param parent The parent widget * @return Returns a DeviceButton object */ DeviceButton::DeviceButton (QMtpDevice* in_device, QWidget* parent) : _comboBox(NULL) { _device = in_device; QString name = _device->Name(); _checkBox = new QCheckBox("Connect on startup"); _button = new QToolButton(); const count_t deviceCount = in_device->StorageDeviceCount(); if (deviceCount > 1) { _comboBox = new QComboBox(); for (count_t i = 0; i < in_device->StorageDeviceCount(); i++ ) { MtpStorage* storage_device = in_device->StorageDevice(i); assert(storage_device); QString description = QString::fromUtf8(storage_device->Description() ); if (description.length() == 0) description = QString::fromUtf8(storage_device->VolumeID() ); QVariant storageID = storage_device->ID(); _comboBox->addItem(description, storageID); } } _button->setText(name); _button->setIcon(_device->Icon()); _button->setMinimumSize(QSize(160,160)); _button->setMaximumSize(QSize(160,160)); _button->setIconSize(QSize(128,128)); _button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); QSpacerItem* temp = new QSpacerItem(10, 10, QSizePolicy::Maximum, QSizePolicy::Expanding); addItem(temp); addWidget(_button); if (deviceCount > 1) addWidget(_comboBox); addWidget(_checkBox); temp = new QSpacerItem(10, 10, QSizePolicy::Maximum, QSizePolicy::Expanding); addItem(temp); setupConnections(); } /** * Removes checked state of the check box if it is checked */ void DeviceButton::RemoveCheck() { if (_checkBox->checkState() == Qt::Checked) _checkBox->setCheckState(Qt::Unchecked); } /** * Setup up the widgets internal connections * See also stateChanged() */ void DeviceButton::setupConnections() { connect(_checkBox, SIGNAL(stateChanged(int)), this, SLOT(stateChanged (int))); connect(_button, SIGNAL(clicked(bool)), this, SLOT(buttonClicked())); } /** * Private slot that gets called when the button is clicked * it emits the Selected button */ void DeviceButton::buttonClicked() { QSettings settings; count_t id; if (!_comboBox) id = _device->StorageDevice(0)->ID(); else id = _comboBox->itemData(_comboBox->currentIndex()).toInt(); _device->SetSelectedStorage(id); // settings.setStorage("DefaultStorage", id); settings.setValue("DefaultDevice", _device->Serial()); settings.setValue("DefaultStorage", id); settings.sync(); qDebug() << "Storing and syncing: " << _device->Serial(); emit Selected(_device); } /** * Private slot that is called when the checkbox is checked * See also setupConnections() */ void DeviceButton::stateChanged(int in) { if (in == Qt::Checked) emit Checked(this, _device); } qlix-0.2.6/widgets/PlaylistModel.h0000644000175000017500000000311411050625206015165 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __PLAYLISTMODEL__ #define __PLAYLISTMODEL__ #include #include #include #include #include #include "types.h" #include "QtDebug" #include "QIcon" #include #include class PlaylistModel : public QAbstractItemModel { Q_OBJECT public: PlaylistModel(MtpDevice*, QObject* parent = NULL); QModelIndex index(int, int, const QModelIndex& parent= QModelIndex()) const; QModelIndex parent (const QModelIndex& index) const; int rowCount(const QModelIndex& parent= QModelIndex() ) const ; int columnCount(const QModelIndex& parent= QModelIndex() ) const; QVariant data(const QModelIndex& , int role = Qt::DisplayRole ) const; private: MtpDevice* _device; }; #endif qlix-0.2.6/widgets/QMtpDevice.cpp0000644000175000017500000006444611050625206014756 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * TODO retrieving files with NULL filenames * TODO memory leaks * TODO update model correctly * TODO move model information out of this thread and back into the main thread * TODO should the model just use queuedConnections for removing and * adding tracks/files/objects */ #include "widgets/QMtpDevice.h" QMtpDevice::QMtpDevice(MtpDevice* in_device, MtpWatchDog* in_watchDog, QObject* parent): QThread(parent), _device(in_device), _watchDog(in_watchDog), _icon(QPixmap(":/pixmaps/miscDev.png")) { _device->SetProgressFunction(progressWrapper, this); } QString QMtpDevice::Name() { return _name; } QString QMtpDevice::Serial() { return _serial; } QIcon QMtpDevice::Icon() { return _icon; } void QMtpDevice::IssueCommand(GenericCommand* in_cmd) { QMutexLocker locker(&_jobLock); _jobs.push_back(in_cmd); _noJobsCondition.wakeOne(); qDebug() << "Issued command"; } void QMtpDevice::run() { lockusb(); initializeDeviceStructures(); findAndRetrieveDeviceIcon(); unlockusb(); for (count_t i =0; i < _device->StorageDeviceCount(); i++) { MtpStorage* storage = _device->StorageDevice(i); if (storage->ID() == SelectedStorage()) { qDebug() << "Found default storage!" << endl; break; } //if we haven't found a storage device if (i+1 >= _device->StorageDeviceCount()) { SetSelectedStorage(_device->StorageDevice(0)->ID()); qDebug() << "Default storage not found, selecting first"; } } emit Initialized(this); while (true) { _jobLock.lock(); while (_jobs.empty() ) _noJobsCondition.wait(&_jobLock); GenericCommand* currentJob = _jobs.dequeue(); _jobLock.unlock(); proccessJob(currentJob); } } void QMtpDevice::proccessJob(GenericCommand* currentJob) { CommandCode type = currentJob->GetCommand(); qDebug() << "Processing Job with type: " << type; switch (type) { case Initialize: { delete currentJob; break; } case SendFile: { qDebug() << "Syncing file.. "; SendFileCmd* sendCmd = (SendFileCmd*)currentJob; QString fullpath = sendCmd->Path; TagLib::FileRef tagFile(fullpath.toUtf8().data(), true, TagLib::AudioProperties::Accurate); if (tagFile.isNull()) { qDebug() << "Syncing to root folder.."; syncFile(fullpath, 0); delete sendCmd; break; } qDebug() << "Syncing track with path: " << fullpath; syncTrack(tagFile, sendCmd->ParentID); delete sendCmd; break; } case GetObj: { GetObjCmd* getObj = (GetObjCmd*) currentJob; bool ret = _device->Fetch(getObj->ID, getObj->Path.toUtf8().data()); if (!ret) qDebug() << "Fetch failure!" << endl; delete getObj; //TODO update the model and delete memory break; } case CreateFSFolder: { CreateFSFolderCmd* createFolder = (CreateFSFolderCmd*) currentJob; qDebug() << "Got a create fs folder command path:" << createFolder->Path << " name: " << createFolder->Name; QDir temp(createFolder->Path); temp.mkdir(createFolder->Name); QFileInfo check (temp, createFolder->Name); bool ret = (check.exists() && check.isDir()); if (ret) qDebug() << "Success creating folder"; else qDebug() << "Failed creating folder"; delete createFolder; break; //TODO update the model } case Delete: { DeleteObjCmd* deleteThis = (DeleteObjCmd*)currentJob; qDebug() << "Whether the filter supports changes: " <<_sortedAlbums->dynamicSortFilter(); deleteObject(deleteThis->Object); delete deleteThis; //_albumModel->Delete(deleteThis->Object); // _sortedAlbums->invalidate(); break; } } } void QMtpDevice::Progress(uint64_t const sent, uint64_t total) { float percent = (float)sent/(float)total; count_t per = (count_t) (percent*100); QString blank = ""; emit UpdateProgress(blank, per); } void QMtpDevice::lockusb() { assert(_watchDog); _watchDog->Lock(); } void QMtpDevice::unlockusb() { assert(_watchDog); _watchDog->Unlock(); } /* * Initializes the base device which retrieves the device friendly name etc */ void QMtpDevice::initializeDeviceStructures() { if (!_device) return; _device->Initialize(); _name = QString::fromUtf8(_device->Name()); _serial = QString::fromUtf8(_device->SerialNumber()); #ifdef QLIX_DEBUG // qDebug() << "Discovered name to be: " << _name; #endif _albumModel = new AlbumModel(_device->Albums()); new ModelTest(_albumModel); _dirModel = new DirModel(_device->RootFolder()); new ModelTest(_dirModel); _plModel = new PlaylistModel(_device); _sortedAlbums = new QSortFilterProxyModel(); _sortedPlaylists = new QSortFilterProxyModel(); _sortedFiles = new MtpDirSorter(); connect(_albumModel, SIGNAL(layoutChanged()), _sortedAlbums, SLOT(invalidate())); connect(_dirModel, SIGNAL(layoutChanged()), _sortedFiles, SLOT(invalidate())); _sortedAlbums->setDynamicSortFilter(true); _sortedFiles->setDynamicSortFilter(true); _sortedPlaylists->setDynamicSortFilter(true); _sortedAlbums->setSourceModel(_albumModel); _sortedPlaylists->setSourceModel(_plModel); _sortedFiles->setSourceModel(_dirModel); this->moveToThread(_sortedAlbums->thread()); _sortedAlbums->moveToThread(QApplication::instance()->thread()); _albumModel->moveToThread(QApplication::instance()->thread()); _sortedFiles->moveToThread(QApplication::instance()->thread()); _dirModel->moveToThread(QApplication::instance()->thread()); } /* * Iterates over all the devices files and tries to find devIcon.fil */ void QMtpDevice::findAndRetrieveDeviceIcon() { qDebug() << "Searching for Device Icon"; MTP::Folder* rootFolder = _device->RootFolder(); count_t fileCount = rootFolder->FileCount(); QString iconPath = QString("/tmp/QlixDeviceIcon-%1").arg( (int) this); MTP::File* iconFile= NULL; for (count_t i = 0; i < fileCount; i++) { MTP::File* curFile = rootFolder->ChildFile(i); QString name = QString::fromUtf8(curFile->Name()); name = name.toLower(); if (name == "devicon.fil") { qDebug() << "Found icon file with id: " << curFile->ID(); iconFile = curFile; break; } } if (iconFile) { QPixmap image; _device->Fetch(iconFile->ID(), iconPath.toLatin1()); QFile img_file(iconPath); if (img_file.exists()) { img_file.open(QFile::ReadOnly); QByteArray buffer = img_file.readAll(); DeviceIcon devIcon(buffer); if (devIcon.IsValid()) { size_t temp = devIcon.GetBestImageSize(); char buf[temp]; devIcon.Extract(buf); Dimensions dim = devIcon.GetDimensions(); QImage tempImage( (uchar*)buf, dim.Width, dim.Height, QImage::Format_ARGB32); image = (QPixmap::fromImage(tempImage)); } _icon = QIcon(QPixmap(image)); } else _icon = QIcon(QPixmap(":/pixmaps/miscDev.png")); } else qDebug() << "No device icon found"; } /* * Returns the sorted AlbumModel */ QSortFilterProxyModel* QMtpDevice::GetAlbumModel() const { return _sortedAlbums; } /* * Returns the sorted DirModel */ QSortFilterProxyModel* QMtpDevice::GetDirModel() const { return _sortedFiles; } /* * Returns the sorted PlaylistModel */ QSortFilterProxyModel* QMtpDevice::GetPlaylistModel() const { return _sortedPlaylists; } /** * Issues a command to initiate the transfer of a track * @param in_path the path to the track on the filesystem */ void QMtpDevice::TransferTrack(QString inpath) { QFileInfo file(inpath); if (file.isDir()) return; SendFileCmd* cmd= new SendFileCmd(inpath, 0, true); IssueCommand(cmd); qDebug() << "Attempting to transfer file: " << inpath; } /** * This function issues the delete command to the device thread after the user * has confirmed the deletion. * @param in_obj the object to be deleted */ void QMtpDevice::DeleteObject(MTP::GenericObject* in_obj) { if (in_obj->Type() != MtpFile && in_obj->Type() != MtpTrack && in_obj->Type() != MtpFolder && in_obj->Type() != MtpAlbum && in_obj->Type() != MtpPlaylist) { qDebug() << "Object of unknown type!" << endl; assert(false); } DeleteObjCmd* cmd; // = new DeleteObjCmd(obj->ID()); switch(in_obj->Type()) { case MtpTrack: case MtpFile: { cmd = new DeleteObjCmd(in_obj); IssueCommand(cmd); break; } case MtpAlbum: { MTP::Album* album = (MTP::Album*) in_obj; MTP::Track* currentTrack; for (count_t i = 0; i < album->TrackCount(); i++) { currentTrack = album->ChildTrack(i); cmd = new DeleteObjCmd(currentTrack); IssueCommand(cmd); } cmd = new DeleteObjCmd(album); IssueCommand(cmd); break; } case MtpPlaylist: { MTP::Playlist* pl = (MTP::Playlist*) in_obj; MTP::Track* currentTrack; for (count_t i = 0; i < pl->TrackCount(); i++) { currentTrack = pl->ChildTrack(i); cmd = new DeleteObjCmd(currentTrack); } cmd = new DeleteObjCmd(pl); IssueCommand(cmd); break; } case MtpFolder: { MTP::Folder* rootFolder = (MTP::Folder*)in_obj; MTP::File* subFile; MTP::Folder* subFolder; for (count_t i =0; i < rootFolder->FileCount(); i++) { subFile = rootFolder->ChildFile(i); cmd = new DeleteObjCmd(subFile); IssueCommand(cmd); } //recurse on all subfolders for (count_t i =0; i < rootFolder->FolderCount(); i++) { subFolder = rootFolder->ChildFolder(i); DeleteObject(subFolder); } //delete the rootfolder cmd = new DeleteObjCmd(rootFolder); IssueCommand(cmd); break; } } } /** * Transfers an object from device the passed location * @param obj the object to transfer * @param filePath */ void QMtpDevice::TransferFrom(MTP::GenericObject* obj, QString filePath) { GetObjCmd* cmd; switch (obj->Type()) { case MtpTrack: case MtpFile: { QString filename; if (obj->Type() == MtpTrack) { MTP::Track* currentTrack= (MTP::Track*) obj; filename= QString::fromUtf8(currentTrack->FileName()); } else { MTP::File* currentFile= (MTP::File*) obj; filename= QString::fromUtf8(currentFile->Name()); } qDebug() << "check here: " << filePath; qDebug() << "and here: " << filename; filePath += QDir::separator() + filename; qDebug() << "Transfer here: " << filePath; qDebug() << "Or here: " << QDir::toNativeSeparators(filePath); cmd = new GetObjCmd(obj->ID(), filePath); IssueCommand(cmd); break; } case MtpAlbum: { MTP::Album* album = (MTP::Album*) obj; MTP::Track* currentTrack; QDir albumDir(filePath); QString albumName = QString::fromUtf8(album->Name()); bool albumDirCreated = albumDir.mkdir(albumName); if (albumDirCreated) filePath = filePath + QDir::separator() + albumName; for (count_t i = 0; i < album->TrackCount(); i++) { currentTrack = album->ChildTrack(i); QString trackName = QString::fromUtf8(currentTrack->FileName()); QString actualPath = filePath + QDir::separator() + trackName; cmd = new GetObjCmd (currentTrack->ID(), actualPath); IssueCommand(cmd); } LIBMTP_filesampledata_t cover = album->SampleData(); if (cover.size == 0) break; QImage img; img.loadFromData( (const uchar*) cover.data, cover.size); QString coverName = albumName + ".jpg"; QString coverPath; //no need to check albumDirCreated again, the path already holds the //right directory coverPath = filePath + QDir::separator() + coverName; img.save(coverPath); break; } case MtpPlaylist: { MTP::Playlist* pl = (MTP::Playlist*) obj; MTP::Track* currentTrack; for (count_t i = 0; i < pl->TrackCount(); i++) { currentTrack = pl->ChildTrack(i); QString trackName = QString::fromUtf8(currentTrack->FileName()); QString actualPath = filePath + QDir::separator() + trackName; cmd = new GetObjCmd (currentTrack->ID(), actualPath); IssueCommand(cmd); } break; } case MtpFolder: { MTP::Folder* rootFolder = (MTP::Folder*)obj; MTP::File* currentFile; MTP::Folder* currentFolder; QString folderName = QString::fromUtf8(rootFolder->Name()); CreateFSFolderCmd* newFolderCmd = new CreateFSFolderCmd (filePath, folderName); IssueCommand(newFolderCmd); QString subFolderPath = filePath + QDir::separator() + folderName; for (count_t i =0; i < rootFolder->FileCount(); i++) { currentFile = rootFolder->ChildFile(i); QString subFilePath = subFolderPath + QDir::separator() + QString::fromUtf8(currentFile->Name()); cmd = new GetObjCmd (currentFile->ID(), subFilePath); IssueCommand(cmd); } //recurse on all subfolders for (count_t i =0; i < rootFolder->FolderCount(); i++) { currentFolder = rootFolder->ChildFolder(i); TransferFrom(currentFolder, subFolderPath); } break; } default: { assert(false); break; } } } int QMtpDevice::progressWrapper(uint64_t const sent, uint64_t const total, const void* const data) { // cout << "Progress: " << (float)sent/(float)total << endl; if (!data) return 1; QMtpDevice const * const tempDevice = static_cast (data); QMtpDevice* thisDevice = const_cast (tempDevice); thisDevice->Progress(sent, total); return 0; } /** * Probes the device for free space * @param out_total the total amount of space on the device * @param out_free the total amount of free space on the device */ void QMtpDevice::FreeSpace(uint64_t* out_total , uint64_t* out_free) { _device->FreeSpace(SelectedStorage(), out_total, out_free); } /** * Sets the default storage ID for all transfer and create requests that are * made to the device * @param in_storageID the storage ID that will be the default */ void QMtpDevice::SetSelectedStorage(count_t in_storageID) { _storageID = in_storageID; qDebug() << "Selected storage: " << _storageID; } /** * @return the storage id that was selected for this view */ unsigned int QMtpDevice::SelectedStorage() { qDebug() << "Selected storage: " << _storageID; return _storageID; } /** * @return the number of storage devices that exist on this MTP device */ unsigned int QMtpDevice::StorageDeviceCount() { return _device->StorageDeviceCount(); } /** * @param in_idx the index of requested storage device if the index is out of * bounds, this function returns NULL * @return the requested storage device by index */ MtpStorage* QMtpDevice::StorageDevice(unsigned int in_idx) { return _device->StorageDevice(in_idx); } /** * This function will sync a track to the device by looking up the track's * metadata and calling the TransferTrack function on the device. * @param in_path the path to the track on the host computer's filesystem * @param parent the parent id of this track, this should be the id of a * folder where this track will reside in */ void QMtpDevice::syncTrack(TagLib::FileRef tagFile, uint32_t parent) { QString filePath = tagFile.file()->name(); QFileInfo file(filePath); QString suffixStr = file.suffix().toUpper(); char* suffix = strdup(suffixStr.toUtf8().data()); QString filename = file.fileName(); uint64_t size = (uint64_t) file.size(); LIBMTP_filetype_t type = MTP::StringToType(suffix); delete suffix; MTP::Track* newTrack; newTrack = SetupTrackTransfer(tagFile, filename, size, parent, type); assert(newTrack); if (! _device->TransferTrack(filePath.toUtf8().data(), newTrack) ) { qDebug() << "Transfer track failed.. "; return; } MTP::Album* trackAlbum = NULL; QString findThisAlbum = QString::fromUtf8(newTrack->AlbumName()); for (int i = 0; i < _albumModel->rowCount(); i++) { QModelIndex idx = _albumModel->index(i, 0, QModelIndex()); MTP::Album* album = (MTP::Album*) idx.internalPointer(); if (QString::fromUtf8(album->Name()) == findThisAlbum) { trackAlbum = album; break; } } // if there is no trackAlbum then we have to create one // We start by creating a new album, finding appropriete cover art and // finally we apply the cover art to the newly created album if (!trackAlbum) { //first try adding a new album to the device because one does not exist.. if(!_device->NewAlbum(newTrack, SelectedStorage(), &trackAlbum)) { qDebug() << "Failed to create new album"; return; } //Try and find some cover art QFileInfo cover; bool ret = discoverCoverArt(filePath, QString::fromUtf8(trackAlbum->Name()), &cover); qDebug() << "Found cover art!"; LIBMTP_filesampledata_t* sample = _device->DefaultJPEGSample(); if (ret && sample != NULL) { qDebug() << "LIBMTP reported valid sample data"; count_t width = sample->width; count_t height = sample->height; if (height > width) height = width; else width = height; QImage img(cover.canonicalFilePath()); img = img.scaled( QSize(width, height), Qt::KeepAspectRatio, Qt::SmoothTransformation); QByteArray barray; QBuffer buffer(&barray); buffer.open(QIODevice::WriteOnly); img.save(&buffer, "JPEG"); sample->filetype = LIBMTP_FILETYPE_JPEG; sample->size = barray.size(); sample->width = width; sample->height = height; char* newBuffer = new char[barray.size()]; memcpy(newBuffer, barray.data(), barray.size()); sample->data = newBuffer; _device->UpdateAlbumArt(trackAlbum, sample); } else if (sample == NULL) { qDebug() << "LIBMTP reported invalid sample data for this device please report" << "this"; } trackAlbum->SetInitialized(); //if thats successful we can update the view with the new album emit CreatedAlbum(trackAlbum); } //now add the track to the found album and update it on the device if (!_device->AddTrackToAlbum(newTrack, trackAlbum)) { qDebug() << "Failed to add track to album"; return; } newTrack->SetParentAlbum(trackAlbum); qDebug() << "About to emit AddedTrackToAlbum thread id is: " << currentThread(); emit AddedTrack(newTrack); return ; } /** * This function will sync a file to the device * @param in_path the path to the file on the host computer's filesystem * @param parent the parent id of this file, this should be the id of a * folder */ void QMtpDevice::syncFile(const QString& in_path, uint32_t parent) { QFileInfo file(in_path); QString suffixStr = file.suffix().toUpper(); char* suffix = suffixStr.toUtf8().data(); char* filename = file.completeBaseName().toLocal8Bit().data(); uint64_t size = (uint64_t) file.size(); LIBMTP_filetype_t type = MTP::StringToType(suffix); qDebug() << "Syncing file of type: " << QString( MTP::TypeToString(type).c_str()); MTP::File* newFile = SetupFileTransfer(filename, size, parent, type); if (! _device->TransferFile((const char*) in_path.toUtf8().data(), newFile) ) { qDebug() << "Failed to transfer file"; return; } qDebug() << "About to emit AddedFileToAlbum thread id is: " << currentThread(); emit AddedFile(newFile); return; } /** * This function creates a MTP::File object filled with sane values * @param in_filename the name of the file * @param in_si the size of the file * @param in_parentid the parent folder of this object, if its 0, its on the * root level * @param in_type the LIBMTP_filetype_t of file */ MTP::File* QMtpDevice::SetupFileTransfer(const char* in_filename, uint64_t in_sz, count_t in_parentid, LIBMTP_filetype_t in_type) { LIBMTP_file_t* file = LIBMTP_new_file_t(); file->filename = strdup(in_filename); file->filesize = in_sz; file->storage_id = SelectedStorage(); file->parent_id = in_parentid; file->filetype = in_type; return new MTP::File(file); } MTP::Track* QMtpDevice::SetupTrackTransfer(TagLib::FileRef tagFile, const QString& in_filename, uint64_t in_size, uint32_t in_parentID, LIBMTP_filetype_t in_type) { TagLib::String unknownString = "Unknown"; //Copy the album TagLib::String albumTag = tagFile.tag()->album(); char* album; if (albumTag.isEmpty() || albumTag.upper() == TagLib::String("UNKNOWN")) album = strdup(unknownString.toCString(true)); else album = strdup(albumTag.toCString(true)); cout << "Album sanity check: " << album << endl; //Copy the title char* title; TagLib::String titleTag = tagFile.tag()->title(); if (titleTag.isEmpty() || titleTag.upper() == TagLib::String("UNKNOWN")) title = strdup(unknownString.toCString(true)); else title = strdup(titleTag.toCString(true)); cout << "Title sanity check: " << title << endl; //Copy the artist char* artist; TagLib::String artistTag = tagFile.tag()->artist(); if (artistTag.isEmpty() || artistTag.upper() == TagLib::String("UNKNOWN")) artist = strdup(unknownString.toCString(true)); else artist = strdup(artistTag.toCString(true)); cout << "Artist sanity check: " << artist << endl; //Copy the genre TagLib::String genreTag = tagFile.tag()->genre(); char* genre; if (genreTag.isEmpty() || genreTag.upper() == TagLib::String("UNKNOWN")) genre = strdup(unknownString.toCString(true)); else genre = strdup(genreTag.toCString(true)); cout<< "Genre sanity check: " << genre << endl; //Copy the filename //TODO why doesn't this work? char* filename = strdup(in_filename.toLocal8Bit().data()); cout << "Filename sanity check: " << filename << endl; LIBMTP_track_t* newtrack = LIBMTP_new_track_t(); cout << "File type sanity check: " << MTP::TypeToString(in_type) << endl; newtrack->parent_id = in_parentID; newtrack->title = title; newtrack->storage_id = SelectedStorage(); newtrack->artist = artist; newtrack->genre = genre; newtrack->album = album; newtrack->filename= filename; newtrack->tracknumber = tagFile.tag()->track(); newtrack->duration = tagFile.audioProperties()->length()*1000; newtrack->bitrate = tagFile.audioProperties()->bitrate(); newtrack->filesize = in_size; newtrack->filetype = in_type; newtrack->next = NULL; return new MTP::Track(newtrack); } bool QMtpDevice::discoverCoverArt(const QString& in_path, const QString& in_albumName, QFileInfo* outFile) { QFileInfo finfo(in_path); QDir search_dir; if (finfo.isFile()) search_dir = finfo.dir(); else search_dir = QDir(in_path); QFileInfoList children = search_dir.entryInfoList(QDir::Files); QString albumName = in_albumName + ".jpg"; QString albumNameAlt= in_albumName +".jpeg"; while (!children.isEmpty()) { QFileInfo temp = children.front(); QString name= temp.fileName().toLower(); if (name == "cover.jpg" || name == "cover.jpeg" || name == albumName.toLower() || name == albumNameAlt.toLower() || name == "folder.jpg" || name == "folder.jpeg" || name == "album art.jpg" || name == "album art.jpeg" || name == "albumart.jpg" || name == "albumart.jpeg") { (*outFile) = temp; //find out the default image size return true; } children.pop_front(); } return false; } void QMtpDevice::deleteObject(MTP::GenericObject* in_obj) { if (in_obj->Type() != MtpFile && in_obj->Type() != MtpTrack && in_obj->Type() != MtpFolder && in_obj->Type() != MtpAlbum && in_obj->Type() != MtpPlaylist) { qDebug() << "Object of unknown type!" << endl; assert(false); } switch (in_obj->Type()) { case MtpFile: { break; } case MtpTrack: { MTP::GenericFileObject* deletedObj = (MTP::GenericFileObject*) in_obj; assert(deletedObj->Association()->Type() == MtpFile); _device->RemoveTrack( (MTP::Track*)deletedObj); MTP::File* association= (MTP::File*) deletedObj->Association(); emit RemovedTrack((MTP::Track*)deletedObj); emit RemovedFile(association); break; } case MtpFolder: { qDebug() << "About to emit folder removal: thread id is: " << currentThread(); emit RemovedFolder((MTP::Folder*) in_obj); break; } case MtpAlbum: { MTP::GenericFileObject* deletedObj = (MTP::GenericFileObject*) in_obj; assert(deletedObj->Association()->Type() == MtpFile); _device->RemoveAlbum( (MTP::Album*)deletedObj); MTP::File* association= (MTP::File*) deletedObj->Association(); emit RemovedAlbum( (MTP::Album*)deletedObj); emit RemovedFile(association); break; } case MtpPlaylist: { break; } } } qlix-0.2.6/widgets/DeviceButton.h0000644000175000017500000000325011050625206014777 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __DEVICEBUTTON__ #define __DEVICEBUTTON__ #include #include #include #include #include #include #include #include "widgets/QMtpDevice.h" #include "mtp/MtpStorage.h" /** * @class a button class that displays the device icon and auto connect box, * and depending on how many storage devices exist on the device, a combo box */ class DeviceButton : public QVBoxLayout { Q_OBJECT public: DeviceButton(QMtpDevice*, QWidget* temp = NULL); void RemoveCheck(); signals: void Checked(DeviceButton*, QMtpDevice* _device); void Selected(QMtpDevice*); private slots: void stateChanged(int); void buttonClicked(); private: void setupConnections(); QMtpDevice* _device; QCheckBox* _checkBox; QComboBox* _comboBox; QToolButton* _button; }; #endif qlix-0.2.6/types.h0000644000175000017500000000230011050625206012075 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __TYPES__ #define __TYPES__ #include using namespace std; typedef vector MTPErrorVector; typedef unsigned int count_t; typedef unsigned int index_t; typedef unsigned char ubyte; enum MtpObjectType { MtpTrack, MtpFile, MtpFolder, MtpAlbum, MtpPlaylist }; enum QlixProgressType { FreeSpaceUsage, TransferAmount }; #endif qlix-0.2.6/Qlix.pro0000644000175000017500000000545011050625206012230 0ustar aliali####################################################################### # Copyright (C) 2008 Ali Shah # # This file is part of the Qlix project on http://berlios.de # # This file may be used under the terms of the GNU General Public # License version 2.0 as published by the Free Software Foundation # and appearing in the file COPYING included in the packaging of # this file. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License version 2.0 for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ####################################################################### ###########################:########################################### # Automatically generated by qmake (2.01a) Sat Jan 19 15:54:06 2008 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . mtp widgets INCLUDEPATH += . mtp widgets CONFIG += debug # Input HEADERS += linuxsignals.h \ types.h \ mtp/Icon.h \ mtp/BmpStructs.h \ mtp/MtpDevice.h \ mtp/MtpObject.h \ mtp/MtpSubSystem.h \ widgets/QlixPreferences.h \ widgets/DeviceButton.h \ widgets/MtpWatchDog.h \ widgets/QMtpDevice.h \ widgets/AlbumModel.h \ widgets/DirModel.h \ widgets/PlaylistModel.h \ widgets/DeviceChooser.h \ widgets/DeviceExplorer.h \ widgets/QlixMainWindow.h SOURCES += main.cpp \ mtp/MtpStorage.cpp \ mtp/MtpDevice.cpp \ mtp/MtpObject.cpp \ mtp/MtpSubSystem.cpp \ widgets/QlixPreferences.cpp \ widgets/DeviceButton.cpp \ widgets/QMtpDevice.cpp \ widgets/MtpWatchDog.cpp \ widgets/AlbumModel.cpp \ widgets/DirModel.cpp \ widgets/PlaylistModel.cpp \ widgets/DeviceChooser.cpp \ widgets/DeviceExplorer.cpp \ widgets/QlixMainWindow.cpp RESOURCES += Qlix.qrc unix { DEFINES += LINUX_SIGNALS DEFINES += LINUX_DBUS DEFINES += QLIX_DEBUG TAGLIB_INC = $$system(taglib-config --cflags) TAGLIB_LIBS = $$system(taglib-config --libs) LIBS += $$TAGLIB_LIBS LIBS += "-lmtp" CONFIG += qdbus TARGET = "qlix" INCLUDEPATH +="/usr/include/" INCLUDEPATH +="/usr/local/include/" DEPENDPATH += "/usr/local/lib/" QMAKE_CXXFLAGS += $$TAGLIB_INC #target.path = /usr/bin #INSTALLS += target } include(modeltest/modeltest.pri) qlix-0.2.6/main.cpp0000644000175000017500000000360611050625206012222 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include "mtp/MtpSubSystem.h" #include "widgets/QlixMainWindow.h" #ifdef LINUX_SIGNALS #include "linuxsignals.h" #endif MtpSubSystem _subSystem; int main(int argc, char* argv[]) { installSignalHandlers(); QCoreApplication::setOrganizationName("QlixIsOSS"); QCoreApplication::setOrganizationDomain("Qlix.berlios.de"); QCoreApplication::setApplicationName("Qlix"); QSettings settings; QString ret = settings.value("DefaultDevice").toString(); QApplication app(argc, argv); app.setStyle("Plastique"); //app.setStyleSheet("QTreeView::branch:!adjoins-item{ border-color: none;}"); works //app.setStyleSheet("QTreeView::branch:!adjoins-item{ background: none}"); // app.setStyleSheet("QTreeView::branch:!adjoins-item:!has-children{ foreground: red}"); // app.setStyleSheet("QTreeView::branch:adjoins-item:has-children{ background: cyan}"); QlixMainWindow qmw(&_subSystem); qmw.show(); Q_INIT_RESOURCE(Qlix); app.exec(); return 0; } qlix-0.2.6/COPYING0000644000175000017500000004310311050625206011621 0ustar aliali GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qlix-0.2.6/ChangeLog0000644000175000017500000000142411050625206012340 0ustar aliali2008-08-13 Ali Shah * Fixed: License incompatibility with QT Concurrent's modeltest 2008-08-04 Ali Shah * Fixed: Video transfers of svi files for samsung devices * Cleanup and commented more Functions * widgets/QMtpDevice.cpp: renamed AddedTrackToAlbum to AddedTrack Created signal AddedFile and linked it to the directory viewer Track deletions now trigger file deletions Album deletions now trigger file deletions * All files: Added license information * qlix.1: Added simple man page * DeviceChooser.cpp: Fixed default device selection bug * AlbumModel.cpp: Fixed crash after removal of tracks * linuxsignals.h: Signal handling no longer prevents core duimp * widgets/DeviceExplorer.cpp: Deletions now require confirmation qlix-0.2.6/pixmaps/0000755000175000017500000000000011050625260012246 5ustar alialiqlix-0.2.6/pixmaps/TreeView/0000755000175000017500000000000011050625306014001 5ustar alialiqlix-0.2.6/pixmaps/TreeView/branch-closed.png0000644000175000017500000000044711050625206017217 0ustar aliali‰PNG  IHDR š]sRGB®ÎébKGDÿÿÿ ½§“ pHYs##rAwÞtIMEØ!Ò’Úi§IDAT×-È=3CA†áûÙ}푉å¡ÑPûo~£V—Ì0)Œa #ÉnöѸÊ+/N.¯Ê8¥<žVSSŸu÷t.(Ù̇ÐÝ~~ü^“7asœ YŒ©håÌK`'¤LúQd/!p àBð #ð<Ö🯆¥­Uk<‡ÄÖèÑöM7·ûê·öëMžl_7é¾ÖþáŸÏ]ßmýs‰P@~†×}IEND®B`‚qlix-0.2.6/pixmaps/TreeView/branch-open.png0000644000175000017500000000043511050625206016704 0ustar aliali‰PNG  IHDR Ç´ÅsRGB®ÎébKGDÿÿÿ ½§“ pHYs##rAwÞtIMEØ!!yCç0IDAT×Á±JAEÑ{g‚q£ÓˆÁð ý=A« V©R¤ˆ îf²ó<ÇõöéYxLX@ íÊHòU¯n@ï@´gey©e½m%™• r 4à|uW³¼oµ8Y¥*'à½Çs˱ڇn]¶R1°>Cy»´æŸÓTÓÂj΂ɒLvmvùÍ_Ÿ¾óªºJ5G‚!(IEND®B`‚qlix-0.2.6/pixmaps/albumList.png0000644000175000017500000003362311050625206014717 0ustar aliali‰PNG  IHDR€€Ã>aË IDATxœí½w´$YuæûÛ'LfÞ¼¶¼wÝÕ]í½QÓMk!œ`Ä ¢¥7ëIzšYoFoF H ¡Afd2£™·f–4È’0 McÚW{SUÝU]¾êVݺ.]Dœýþˆˆ¼qãFäÍ[u«i„öZ™‘æÄùöþö>ûœ8!ªÊrËܵìçáåÌBœ¤Ýdi^Ñæé7«yþuWÜpÓðoÿY®¼êj/>¡ùÅ,þ¥xÉ’Q„éÙYøîWøâgþ?ö>µç¸ÇeŸóÙñEÁäXLëÇ^2z{)Àª‰Ÿ¿ âèë[<øc¶®ÞþÃïøynyå0ã§Oñµ/‚/ÿÝŸ21nw×¸î¯ +ïÌ‹`ƉÙÀžíu_n dïtt½¥uE›Çþ¥S9xçm¯§wçÛ~†M·€DQ8gíip÷2sYD@ˆc‡={Ÿâ³óÿ×Èĸyp€ÿÔ0ò]ƒIªyII$xù0€!Îâ­T¢ žg(¼çúÛ_7òÖwý[6mM¬>µ1ðIY²ÔÙÊ÷Zú2,ÇÅâòÜsó©¿ú-ž~ä±#nþ_.¾ ˜ç“±s¾â‚óŨ]¯—µØýÞJýÐ[_ÿŽŸ7w¼áÝ Öâ¶¼Z¤Äׯ|I$î‡BŒÁ8>ã§'øügþ˜{¾ð×M /ÿ„Ï®¿œ= ÇYB\ð½f€ü–ÆM¾û­Xgèíÿê—¹þ†×໚øú8—´QÕEÁÿ§¢Ùº1×£Ù ùÆÝŸâóŸü(­éõ_¬rÍÇo7˜Ã@sZ?vÖÁa‘,+ÌY~´Á2õŠßü¶\¸îòw¼÷ÃìºørD¬)? öús9A_®s-7{*‚ã8„ÖðЃ÷ðé¿øÏœ>î}§ÆMÿÍP½œÃ@“E˜à{Å©åo°L¼²Á7Þ·óŠ];ßñž_aÛÖ­hƒ_Fù……û§”ˆ—§žÞͧþìW9z`æá¯ø}ÃÀ}à.+, Ä–¯`×[μ²É×~i×u×mû»™ëÖbm€€ŸI{4ûÊÀìuL¿çXNé§.{º¸ng–`ÄeϾçøÛ}CÏŸÞ=À­ÿ¯¡ÞUJ˜à¥f€üM–ÉW4ùÚ/íºöšíoûñ²aÝjlÔIšx–|*·(ßÏÖŸÊ9—8ˆqÙ»o/Ÿúóqø…Ó»k¼2Qshœkëàœ ñù`7[¦nir÷ûv^uÙηþø/³qýl8üóܽ\À^Š,¥ÎÅ8`<öîÛçÿüC;Ð| Ê­¿Çr˜¹>„®¼T Ä>³¥us“¯ÿ‡-­»ü-?ña¶nÚ€H>–FÕý´ú*à÷H98½Ç>N„&î@Åå™gŸâÿ凘8ZýF•›>*¸91­ëœmYÏš†ä.ì:%¼¡Åw~aå&½å-?ñ.ܱ4@­E´xHÜRYn _®­€òs â8X{ô>ÿ‰_£9±ùo}®ücÁy:hB7müRŒ vAG{a‡'~|`lò–W¿ùWÙºe+6lg¢ýò@õ|ÒýËÉ-ô.*Q„q\v]r “wþÿøéþhØ>ê²ã¯$¢>y6-ƒBè¥AIÄ_Wì–ß$•çÞróëþ]|h@&IµôÂa) + /éx€s`…ÅŽ¢×õ¸êšÛ™?äÜ÷ó^c‡Vͦ3$w5=Ÿ @5iîÝðÀO^}ó[½+¯yž±„4õû™ƒÎ€—RIη,U1Êö¬¥Vñ¸þ–·qêÄ #{v÷_WyÍaa .YÚ0³%1ÀÜå]¥t.ïðÀOmºhתkoùQêU‡N§½ èƒÅ9ß‘ÿK­Kú¬ØB-ÖZƆëÜøÊ÷pêøÞyæècï©pÃqA ã,aäñRÀTìÖ€çÞ10Ú¹úš[’Uc#]ð>³ ðýØ<<[W°èqªh$GÙ°a#×Üú|ósøÚ°µþq—-§§1$wÍöôÅCrW:”kåô-Ö}æÍ—Üø¶l½µQ&Ô+^¿ žô÷üN)Ý¿_éuÌùˆÜ—ózùýóëi2Š,Æu¹èâë9zð5ÎSß½çÇV=-Ô'‰ã¾ºûe'~2'ØÙa÷»6\pYýâËo§ê)Aâ÷EËY§¬‚ÎÖúûIçÿ;§ÜüY²IÙ5{•¿ÿVCDd-õšÇe×ü0Ç^||ã™#O¾³Âõ/2 r†>\Á¢ X tCÈþ7V‡f¯¹øê·16R'ètP[¿tŸ¨^\zåû϶;x¹’Ge¢Iïe<*]“Qkñs VéæñS1x®ƒ1gÏÙ{*ÚW‰0ª¬Y½†‹¯~ ŒÿÉQgËw\Öi É]‹¦ŠûatÌ2{y(O¾mû®W³ió…`‚°7÷J¬);e²Ü1BHÍ©ó€ŒÇsÆ…Å€ºŽÁu\×Á÷\*ŠïRñ=j5ZÕ§^«à8†#Ç&Ø»ÿ8Ó3-ª/¹ö2å2Y‹ãøl»ð>¹ø™ÇÞé°òqÁ›Ó!~ ©Tz2@býUÅ® ÙsçЪ¡ Ûv½ŠªI¢þÄú3£_³²\-€~ö #‹ÚôYÀ9kœ{¶O0"¸n¢cð<—j bÅ£VA¬U}jµäSõ¨ùñ~ɾՊ‡—(‚ë\Ç¡ˆýNŒOòů=ÊwÜ‹ëšÿçeI-ˆä>¢H¬±ãÒ×qêн2œ9ô퇀É!¹+ìÅ‹1€O¦0y…š}¯ß°óí¬Y½†( °Q6L¨¿\ΖÊ‚Á<ÕGÖ"ë×R¯U¨T<j•.ˆ5ŸªO-ÙV­¤–ëáûnƪMæIâ2‰YÂ&ÝÚé³*A8ŸS{X³j˜÷þØ+™šnðè“ð½Âê.¿Z.«8.¬ß°µÛ¯ãÅÇ}“Ëúû„ÚqæJ-”RH}¿b×ìyÓàêU+6n»ßQ‚N'ŽøíÜ€ÕŲ²À§WçOQ‹!+Ö*µšÏ{ìv.¿d3ŽcpLoSfèR~dZÎa(þÂë(t‚ßsY·z„:!N.(ºïÅÇ¢ )„UŸM܉wï&Þî±óY3Cr×L ôb€$òŸ¹çà«Wo{3cccav@C°séÞ³íÛ_¬…ЫYØj¼å×qí•Û £km<Êøe&AE!QdæYd}[}~{ḰzõVn¾šÃS¾ÖÕÍ_jG˜{þp”qRù¯ yáuµ±‘k6^‰ï*a'þpõ³iêõ²ð"Èw£ ÊÖM«Ø¾\ÅZ‹*g‘2,&½ö³ Uµ›®åäþ‡·‡3GnöØñD2´¼YtL™Ð!Kó"5nYc££±ïƒ¹à¯Û~}|™,– J×£ÈÆN^æ¢j‰l„µN²®Ýe^©{¼¨{‹q‰§ÄY»“ñ™½¯rÙôBåøÜÕ.Ê–)€:j9r³Ww6¬Xw¾v4ÈýxýÐyÙ>eûA<}‹U^^StHY¢0šÇY%ÈoËÿîµ-w%"« T}V¬»’‰CO_fÛ×9¬{˜&žož,P€t˜—nŠxᕃ+/`dtu<íJ€M ‘~S·y€Ë(¾ì\E¿Ó§ŠÈÖ½ÎÚE½^' :ØÔúmØ3ø[ÌÚûaƒü9óÿu]@Ñnµç=XZX¦øG7µÛ2Ù6?–Q¬*j• Œ ˆè!ÍV‡V«C³Õ¡Ñl3Ûh1;›,-ff[AÈúµ+xÓë¯gxp >£ÎW€î•r ö£eûg˯(Žêƒc¸õµ´g]§lù;ÁI‚Áîyp@-Ó»Äkm© m¥â AÐF£l'èYà«Ë€êÇê—$f×Ã(ìfáÒ;ò=×qPkãnÓÄ i·šÍvÌ™F‹F£ÍÌl‹F³Åìl‹ÙF j³Ù¡ÕŽÁnwB ¾^„D6N=Û$¡”DÒ9¤\såVìŠËf-aEÎ|¨J _PvœˆÅªP«úT†¶Ð>uÿ¥6· îž¼È+€Œ*ǯ4•º_«¯B4"ç‚?) [cÌ’_ÌêË„a8gø ¾ïrððI¾ùÝ'9v|‚ÙF›f³E³ÐjÅ`v‚0Q†0´ €I%§])[¡|™£|pÏyRF¦H@Ü>Ï'©úñùeûå•b!D`Á5>Õúz¦=]¥áé]0ômâR/T€ÄÿW”pµšã—šêZªµ¢( Äq0Šˆ`­ÍPêBº/?žü¶¢õyY3›äTñ=—½ûŽðË¿ù真ÄuîµLJýÆt)_Gp–4%E\ÑÖöŽÖ5 J4ý/ã9÷çeà–±Aáv㪵a¤2Œ¶N\¦ºeT£CrWw¢,КÒܨfz›T.Ãs…N§ƒ†1ý£aO€‹” èÿTúQŒüzv{˜i¸®áÙ}‡8~â4ƒõZá±iÞnyv²XsMlfš`µ–0 CSxŽÅ¬¼ì¿2…QU‹£O—[YCh]blgƒPÝOœÌ)€`€ª2¹M]u««2Ñ6ûW¬ý6-‚²ýâL ¢:GÍñöþÇ',UвwÙÿº.À2ç¬EÑ ûñö~ èXUÇ@*¸ÆÅø«ÀÙ»ÛÜ ÕÝÄ£…,ÌcqP™Ønš¸~Õˆ0IýŠÎùÿ^àç·e+k1FÈþW¶ö¿tŠØ®ÏM|mZ)ùó.GÎ`±¶xÊi“P‰»íY´òËŶÍÿmÁ(bÇGê„SÛ`E8!Q€!ç§ÁA&·©Æu]Â0À¢I €.·Wp·­ƒ^n! øo^Ò·„a° Ú^.Ëïg{Ú ÐL —+$ŠÜEÝ0O{µЍ?f£0Š8.Ž[#’ ŽLlU¶ Æ%I Ç Wá ÌÌfuÖà9J„hεd¡u/…æMÒWßËò—ÌÍ'˜©ü‚^·¢cÏEz%cº ÛÙù™ÀŬ¾6Xl Bˆç¹¨SGej3j‡Á¸CîOËtø§š(@<£—Ò^£ÒZ!ÎŽcâT«06yÄ›¹ÁeÖžRmžú³­…ôÿô¿¢ÊÌï—Ý7]Æ™À¹€.­øå ú|yúý?™ù«h‰”ýî‡æK·YÛï(QˆçÔÔAN¬U‚Áu«OÐ 4ש±ƒŽ7ˆÁÚ¬ÆÀ1˜ô‚‹YVÞ÷ª*ƘҊ-Rˆt[¹åi’Ì›³„Å«èZyé—ö³Ûæ¬?ãÒx ü¢sö²îù×êűëQ±¸ŽAÜA¬:+•šORc.€ ÆUš«TŒq¼DHžòóÎÎÄ_TqÙæA/¤næ[tQt>{Žù˜þ–ye,¹Ìòú‘~€ƒr¥YªÕ÷ã&zº¬ÅÇ£ƒDíµ ² €ˆAÕÙQãVÓ«A¾ä ¶ ´ÆÌoóQzQ¥–]¦x™0 ãŠXã\â€^~?¿>äÊWrÞ^ÌPvþüïbe5cÀq«Xi‚¸ÌWEëÐ\¡RÁq|Ôæï ˜Za΂³ñA#d÷éu“Ùc‹þ‘®±eô½ËE °±A¿ŠÐu’8Š_p\SôòûEëÝÜ@ü' Ç'ÂZuºíVÿµ.¢CÐY…ñ1Ž ÄKüØKœÕ³Ð.FýEÀõc•y—gUÍzWâ[Ò ¼ ÷{¾y1Iúéárzre×ê'&ÈüAúâ2ãx¨¸(AA$¦h7i”*t1>"s͵Ôò>)µÈtÿ¼ÅåÝDÐüñEô]dÅÝã³nWçöYÎf_/)U3øÏ}z[uÑy—bùÅåÐ8G¢Š1*>"Á(¢u$îÊrÓ.À¬/ÆgjòAÓ¡^ó©zGbÎ(ºH6¢·ÖÎóýe€g›„ù}‹¢ô¼{ÉnKuRoUÜ ‹Øæl¤/ÿŸnë²fü)óû}Yñ"û–í+bêÆq´‚à'¹Ÿ.@úîeqÆ€µ„AÀT{–™™i|ß§Z­R«ÅÊà8óS®i‹ÀË€]¬9¸˜¤Ö·ÜÒ¯õ§¿ó»çîEÿ½e±}€Ÿ0Q\ øÝ‡Hè#8i¥¦1€ÖCœ9%À€b ‚A0;;‹çyT*•îÇó<ÇY”ÂÓí½üÞm”úô\¯àó!‹±@w{&<-Ú1¿˜"dg{‹ÜHWl`~o ‚ cÐãÙ)ã­Q7ÈΦ{£(¢ÑhÐl6qÏóð}¿« ®ë.)”½Ù¢€¯ŒöËŽíRnJ{©ú²ëÚÕÌ´l Ý@¿ŠP¶žJÑHã´~¢("ˆ":Q@£•ÆO'~“zÉ0€Ì•\< @$œ=Wùþ€ ð«®ëâº.¾ïãyžçůI)xx³ ô"Éÿ¯™ °¨p6®¤¨eÛÊâ€,Ì+cÁ9zÅ(½|}z,Ì 9 ‚€N§“|B,>êÔ‰MÚ逸¹}7K¹J(’ §ŠÍ>iÚd¶‹â$N¶§OU“0!ív» |ª©B8Žƒã8…J‘½éÒ¾òëÙÁBàÏÕ5ôRùñýÄ¥žH v†]·œ`:¢›n7~Üä“Läá·ˆ§’K„HÒ‹‚Dàv ŒwÇÑÅ©",ìýËúö¢ß饅l·ÛˆÄçN• UެR¤.$ß\LÏ·—èRmvÿ¥º…Åe©Š” Nûi‘¤û¤@¦`g?éöt¿l¹ÒºUM3³¢âœÁÈH8;ùß5mXDZjýÑ ® I°Æ`T])’½ìï¼RdÓÅéxù æ>U‚¬B䣛 ìVhyšy gÁ‹Yîü{Oûæâ”< ¥¾; rºL?ñ¨ç¹}Êè?›‹™H'xu1Óð&3<¸³gþ»ÖG.3 •SF1bLÒtHÜAø½X _1EÖ\¤À<Å(»^<Ä;ìÆ(aÑl61¦7Ke— ÁëOAÊ·¬¸+6=g…ÌÎ΢6ìW€<õçMA.‹=²÷³#h·égâ ž1õÄDÌ(³Hõ”؉x¼$Šó¢!ÉÜõIý½¢lŸ^ åÝ d†„Å{…qËliÙÊÎ_´ž¿Þœõ¦´»ÐW§ F¶ë Â ¤Ùh`¤ÀlyÊšy)ªyÿ‰ âÄù“ÄpD¨ÔˆtHÀ b†&EÄ~'‹Œqk4{1@/Ên$_ý–] ¢ÉC ãìr1 ‹¶w:qÀeŒ¡Zõ©U+¤ýO­v‡ÙF“(²¸®ƒçÆÕš¶ò÷“®—g¢¢ò–)P÷}Ë?§7ë…T­š ɼ­<íV R© ÕHì÷3n } ²j]ì¿üMõ²ÄÅÎ!ݪNö/h¥”^¶Ÿ&ñ޵J³ÙÆó\.¹x+×_»‹Ë/ÝÁ¦ kˆ£kUff›¼xè8>¶‡o|ëQöì;˜ŒKLÚ%²Pæùê‚ë­g÷+k:ÇÛŒÆF,ÄÛ•¤z ¡Í<ˆWÚHý(³Æ6ÕŽ©ß&L`ãlàR`)Û³ÛÂ0"Œ¢Ä—jTcÇuð=Ç1±†«dš]Òe€^À/&F„V;@ÞðÚ›øo5W_±“¡¡4yÞÐZÛU;c„+.½€7¿ñV~nb’/ýã} Õ C›¤Ëçß{ü" Ë”#ݯlXÝ<åÆAƒ„ ÀŸÄTÇéÎ(žº:˜ê8xb§1+Á¶ã&!"B´(ÅšÍí—ÞT³ÕÆ1†5kV°cÛF¶l^˪#ø¾GEŒŸšäÀÁcì{áããg’C³­€…à÷²˜"™m´¸pÇF~áß¼‹Ûo½Ahµ;ÌÌ4JI§Þ¨U}þå;î ÕêÐ *~<¶‚\ô 4ÏVqSň•3n½!1ÆNƒ Gü©ØH^4>f¢3›­8ˆqbðSW óŸìÇ÷/fõf›á¡:¯¿ã&Þøº›¹êò Y½j ßwç%‰¬µ´;ÇŸæÛ÷?Á_~ò’Çà Nd2÷ô3ÜvËULNÍö_›=$­#’Œ_X(e„aÈæ «yÕ+®¦ÙH¹sǾ[°ZãÌw½¤”ÚK¬>Ë ñ&a€äœ$rVíA¼c ó^4Ù°Gÿ@icÜꬒöÑäbn Ä-´£h1ëÏwä¤Á\³Ùæ]ïx-w¾þæe?•"**Oþ†–‹vnaÅŠaÂežjVD˜m& ¹r”•7¿½h¿²cIð$­6ã!t ˜BõOŠ1§ Gÿ`¡$Å DäŒu7Œ5«žÅ©?È "ó&OÈ)€(" ¤rȺ›¡y ¾ˆI€wR7àÄmKÓ?eAÌ;¶mÀóÜä5+ËT×€ªpøÈøÂJ)©´ìÇõ\žá3³Ín?ú9bŸ×qùØ_}‰‰i\×í übõXfhóÿ3sÆj<ÐZ'°îÖDœˆi7}t^p1O‡>ªˆtĘÓÖÛz¿v&CÂ3 $mJ™siŠs1Íìú=\×éF Ë¥Žc˜˜œá¡ÝÏâûþ¢—ÿT<ç÷å»OÄè^õÖ<„‘3ˆ¾7¨ø}"ÈNý™ÀÝñ-gêÉ·8CÄ£ÔAðâˆ;÷¶Ð^ô00Påo>s7ìØÈ»~ôŽî@Š¥ˆç:Tª>>ò,¿óÑOðâ¡Ôj•åèåÊdh°Îé‰i~û£ŸäÓŸý&·ÜxW\¶ƒõëV20PÁs]¢ÈÒnw8=1Å /ãáÝÏñÐ#Ïrôøi<Ïe°^›—´Y˜¨¡ï”n¶‡¯hŸäh$i¦«ñÁ¶±„•ë¿ñ_Dd–’"•( ´DädT½èîhfÏkÝæ‘6!a„àÆã ¬‚(&w½ØÀ$”õÛý8ÇOLð“?þ†‡ê´Úî¼EbŒÁ÷\×áè±S|ú³÷ðéÏÞC»00P-½îR Z[/<ÁÞ}Gð<‡¡ÁUªUŸN'`v¶ÉôL“ÙÙ&ªŠï{ Ö«óF-ÖåÛkR¶ŒEŠ“¬$£~]4QãT 'Ÿ"ÒÊëo½GDÆi7÷ýN፬µ þ£Sµ×¸³ßþ@Íxµ¿ñÍ`[˜dÚX±¢xÁ%ú9k•V»Ã%måGßz;7ßp)kVui|n`#ØÈ25Ó`ÿþ£ÜóíG¹û›»9vü4µjeÞ”°‹ùþ~`á@Ïò•çAæö/Þ•ÿ/îìÿEAeévUâ’¬ø±õKEhþ 窿ˆj—ÿ¡Ï3ͽKP€Úÿ1iWPEu«†§ß60ó÷¿RYÿªš;¸ÂÙt Û‰—Ìif¿éN‚N<úwõê1.ؾ‘­[Ö±jåÕŠGFLNÎpäè)ö¿xŒ£ÇNÑjw¨VüyÁU¯6r/EèWú‰þ³#{óç)º_%èy}@ñPã¢â3Hpæ1šû·†äýâT¿r´¹ç·KßXʵ¿h@W¨Õ+ÝÆ}¿8 GÞPÙü£q~9ê`4ì2ÉL¢½"×üÈ ìzYÂ0J^I:Ž™{ekújøôI•âWÅæ¥Pª—¾þAAZ Ç´²þk­àŠkÜã÷¼ÕxÆ© V•9w€ÄJ—º[øå?ïû‹Ö¡8ƒ–½Fþw¶¢û ̲>?dAÍ~æ=¶›U‚ìö¢òÅÉ—xº7œQû4íñGh Þö ¼áûN‚­'cQë‡h=õ›E›£êe˜ÑúUŸlM¾Ô9~ÏÎÍo„Ð"$Ì/ ’ä#ÏÞX¿à—)Bd¡Ì ôËy%Ș§ÿ¬(zoÇùe¶±!™9àÅãÇÙºc÷Ðò·3¬]ðYcäH£õį÷Z-f€Ë?P¼·Hœ·òDkø¶?sÎ|îýnýñzuåUÎdÄ‘D)æ’Lo:]ö?Íϋȼßýºƒ~â€2éÕ˃Ux¯¦u*y«OË+?ßÇõ#.âÔh½—V':Ò»ùÏŒã왤$å[&Å ðÄo”í¯Õ+~©%pÄVV½9tË÷è·~Ú­­Á«¯CÂF<”Ú $OjÄMÃ…sž øeqA™”]³ð š€½ÚþÙcŠ,¿ìZE •nÏ»®å“DýnÖij4&žk5FøáÖJ©ŸlÞ‡3À¿T~DÜQ4mЋ?Õˆ&¶:¿t‡{áa¼D͸"4ù`’W‚låô~~rˆ²ßyEHÏŸý”µµSÉGþÙmyÿ_äûóçÊßo*鸈B%€„öËï‚?@Ð8Aãè½ÌýÐ'muÃŒph´ýÈ’_¥Þ3X&Õ«>(@ìF7×&¾ü¾!/¸bè‚w`D‘ô cÅ“h4O ò–˜?ÿ{±x _7°÷ÿÙÄOž²óòÍü‘®g'‡ÈÎ’½.Ä/¼D%Œ«â$=5Â`–©ç?Ô{ÁWÚ#?ô»"ò˜Ä¯„ âÄ´ûHßX*@õªöq$ ¨ÚÍÎÞZ?ý… ŽnÜþæLA”<—ž(FñÜœ;ø½ ŸX LÊZù@Ù,yeÈ^4%Ì‚÷ ’ßS%²!“û>ô~¸±âµÿÅï~DŽ¢tÚüÚÒ-™³d€TªWÈ€¨°Eƒ3o>õ÷ÿihlÓšÁ-o@ll€å”`.e\4ÿO™"¤ýý²A/ðóÍÙßE¾¿h¹Tðó¿!? ¼â€©`É}ÇTKŸn¬ºó·Ä©}‘ÃdÞ˜Jûá_ëÃâàê-~¤«ñ³f‡ñǾ9½ò£æôÿ­ã|}¬¾ù5` D ’ÙGU@£Ò ® ü,Øye(‹Šâì2/‹)@Öçgד2CSÕn¿¾ëŠ#}p0N…HaêùÏ1Ý ÷4VÝù;¸µïG€Vûá³³üTΉR©\ÿ+.°B•¦3þ#ç¿ø³Ã+vŒÖ7ß7mC%=‡‹ÅÉ ±êå Š¢ˆ ÎÕ ”)@?¾1(Ьˆ"Å*DšLè€'}L•H-“Ïž©ÙÙfV¿é#xÃßåJ3î‘[(çÌ•ë¥ï$§Š…½¶²úï§Vþ°ÕS_øµí•C[ïĸ¢6"©õD“~LüL_€e™¿27Ћ ú Kü”Eü½ʘü³~Š&s0*É\>D šLÈS%Š:Lîý;&[ö¹Ù5?ò[xÃ÷ zh¶úð’#þ"YH¥rïz £*f»tN¿jðäþÍp}dóÈoÁq}ˆš`#ŒXQ+€#`L<±c N2ÏpÞú{‡yåXŒ ʤ(ú/ þÊ¢ý¼•|Ý¥‚µB¤‚U!J~‹[#hM2¹ï³LFO̬zíï‰[ÿ–X¾ª¥àÖ©,… à, 9›€ˆ‹è"ë ¦_18þå?ì—Œ\øV¼ÚJ èÇ0§©B˜D è?õû‹µŠâŠÅÁÅ@EA_¶‰× ðyÛ¬ÅFƒ¯’(D*DjPS¥uæ“û¿Ä¤»é¾™·ý±qüûDå0J³}ÿ¯,‹åw![NH¥rÓ‡Dj Ô¶n8uïÏnÞöFê+w!ÚÆâp$~®/fƒxéˆ`L<È䦎=Û,ì*’^þ©M½¼ïßJÆò%°`q±¸Ly‰ƒ÷êÔе_hŽ^÷çFÌnÃ(M¬Î½•òeÌIg€5R]oU/«Nî~÷ðäoY7ºõ•ñË µÓ¥'a'™×0Þž(Á\A/&Xª±@èùdÏœ"ÄA^¤š¢Äê­ *:í§öýgNZqûÇ;ƒ;?c„=(ÇEiµ¿óÁeµüTÎÄ™¬x¾Ù ÂJ«²Ãmüá¡ñ»r´>´~åÎa`dbÛ¢l%Ð$(G$QŠ¥å òÍ¿s‘Å 'ÝÛäõñƒn“edA1X©0=¾—Ï}ɨ²gfõ«ÿ4ª¬¾Û € T;bQÔ&/ûþaÔHœ14⣊l&˜½¡~ê[ïé¸eå¶ÛX±ùæøÉYí$q@Öú‰›‰Y%0 seMÄå?+© èèÅÀ+‘SºV5<˦B«5ËÉ}w3~xw49xùW›c×\ÜÊà åO£vîýåå·ÐŒœoHF†øiê k¬êNozÏ›‡O}ëcƒ#«×\üFFV_ˆ v­¾ëºJ0§Ƙ¹‚1HNΗÄLu'‹Œ'µì‚žù[¾vi_Gdaâðã}î+œé˜Ó«nûÛ ¾ét"ǰ4QRk ßÏ *ˆD|DG-f“Ó7œzðÃgo[µþ2wíEw08¼6yÎ šcG’À0eºÏé9&ÝnÎ;ø©Ä,(€¦¯†A“:sJÓ¾¢xX&Ç÷sä™/3>þâìôÈ5_nŽ]õœÊã"zT”I”vçëï?¯VŸ•—’RDê«­Êv·qøöúø}o±§/]·õzÖ^xõáÕ±"hÔe˜ Àqæ UcLüØ™[°Ä®ñE$q'‰[éZzü¥ëQbý õc\¬&OâÈ3_ãøá'£©Ú¶û«nüßQeå· ö ÈiT[¢¡Ät¡ðO‘º5D<„aUY§6¼ÄŸÙÇàé_?"më¶\˺·24¶>îbÖ0ÉHÌ]«Ÿ‹ ’ÞtºÀ)B¿ ß2KI—ñ`—è ø]1ad9sr?‡žýG_|ÜN¹kw7Vßðù°¾é^1å$ª3(!ª*Iwnçëï/.Óyï¤ þvªÀ˜"Ô»üéý¯8½ûö¼hí†]²á¢[Y±îB|¿/°QÒ*H˜ QŠ.¸šQ‚t™lPvß2ÿ·d·g”€ä'™`/~7¯C³1ÍÉCOrdÏ·8~ì…`Ò_·»±âš/…õ÷Šqz ˜ÁjU›Z{ª?( ]—8H”Z’J^em´Õk¹¾vêñWµ_¹rdE}ýöëX·ýZ†WlÀ÷üx2Òb0ì"àuÞ¢ü>º_s2À§÷*ÉT슡Ýn2qâGž#/<Âé™™33ƒ;j®¸âëamõý"æ€Q¯sA1˜øAc€9¥1]EðU̘ªnrZg®ð'÷ÜT›ÜsݳÛV­Úè®ßv%k6_ÎèêÍT« `£…¨ÚùeZ ‹Šdq8ˆãbŒƒªÒnÍræäŽíŒ£çäé“íigt_sl×}áß±þà³"ìVfDç[|™ü 2@ªÉ~FTº1ÂȈEVˆ 6:ñËü©ç¯«Nï¿rˆÙMcƒ#µÕëv°rýNF×l£>²¿RÇqâ×"«Údú·¹y‰ÆsT/݉0“©ÖÅ (QÐiN3sæ8'žgüÈN<È™FcfÚ}±5´í±ÎðÖG¢êЧq܃Fí)T§€ª!–HÐù þ3”*ÚÝ?%!øˆ (2h‘h¸ÁiO^èÍÝåϺ¨Ú<±cP:«ê•ÊÀðÐCck]GmhÕú(~u¯2€ãÄsÅÍÅ”æã¶½Úˆ0è´tZÓ´f'hL3sæ8S“Ç™š>Ãt;˜jHíD{`í ¡Í{Ãúúg"èÄìiƒN£4Pí $ZÇÀ}(À?3À<èžOâGŽÄQ#>PU‘ºŠBuL¢p­ f6:­‰Mns|½ÛšØèw&×xacÔ×`ÀwÍ€ï:žïzÆ1qɤ×XKdCÂ("ˆBÛ £v;ÒFàT3p¦S9TWŽj+_Œ*£/FÞÀ1Œ{Z„)QAílÜMK'nÊ¥̼øg(V€îo5]e0q÷3PU15D|SC‚¨NÖLÔÆF+m™¨S<Ôæ&É4‘/´ÆoXÇŸPÇW·2¸-b°¢¶…j›xn€&½tŠ’4åtð/gX®A±d;¿’:rK<©È¬Ä¯51"ÖQ#.b ®oT*žŠT­ˆ×}ú‚B*€Ä`ÚŽ(-Aã±ì±U‡ϳŸ¼/.›pX^éÜÓ㹌e–ïWX°mû‰]Fº-a‹$Ú률±å)J<Æœ%ªä£÷œÇOB}1ÀyQ€–ïùÿ|_]/A.IEND®B`‚qlix-0.2.6/pixmaps/albumlist.png0000644000175000017500000000425111050625206014752 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØŠ n”)IDATXÃ¥W[ˆU×þþ­½Ö>—qÆñ2ãmÔP'&m4™`j†Ò–J )–>RBúä!éC¡ä½WHh‚…¤)SB11ŠckŒµÆÔËÄ8ŽÎå̹Ÿ½n}Øûœ9ã¥ö²kÿûìËú¿ÿö­þ³ƒ01Á;šM]m6ûš µõ¦å×A‹•ÁSbf«Ée}Å+•r¹tux8Á@¸÷Ä÷:ÆÆÔÚbqPÊÜ×ïÛþäºõ#;V­ZÝßß?À9­(h´ZanfÖM_¿>wyòÊÉóŸyì~ÖlÞćšÿ€_Ñ“ïûÞCããÏ<øÀƒë–õ#fþ· C¡TZ0§?:}éÔ‰c¿¬»Öï¯>< Àÿ7¢¡ñÇvl»ÿ¥]=þpoOQÑ’woù{+ „0·°=|øèÅóç^˜:þþiö6+oÿ|G´æÑ-ߨ¹k÷Ë;ÆÇÇ„Qâ,ëX c-Œ³H¬E’Ý[:LúŽu$¤”#6®'}­ü…ÊçW/Ýê‰[È¡¿ùЗwÿjÓÖ­kk9±Æ8˜n%ÆÂ{å‰1hu=³ÎQÿŠ^ç÷Ôœ=[½öùÅîäìÀc?´eçï¬Û4º¦cµiOj“zÁ,*»mdŠ[Æ"I²ï¬¥booÑz´eùÝúÍkÓ‹ÛkydynÅÚŸ­Z·~¸Òhe ’)½n‡ž@÷¨² d´fÓèÆ›SS?MxûwΜ™_01!’ “ûF7mÞUk6¹£–n ™‘5 9b.‡ž\…X£˜‹QÌÅ(Ä1à#Ç1_«uxõæ-_Y˜šz /ãÀ'ÐÐùóùµ£?´,TµV[’áD©ÕDŒ~ýü°f ¿=!B¸³>ºxïþàÓªH¿‘*¬Yý¬ºxñõkÀŒÀOôõ.ßR­Õ2C DÎd{@>Ö°ÞÞVÍ€‰¼¬µh4›ðÞ#méÞþm “wxSbÆHæóO:¢¨V«§Š™»$–hƒC;ƒ¹rÕFåz•z•z¥j åZ{w=gêfê¡àá}æ­„ŒXå÷blì-¹vp°ÚÙªVÓØ bNµå"€ eüäåß™o§±,åj ‰IÐl.> x—zÂ{æX?ºnJd£f†D1·ÚÖ«3ˆEbˆÛYï=¬I@,îÆ€°ÖÀÓj!dJ3åÎ!x 7zjÒù°V2¢àºÒµ‹+RKÛð!AÈwÒ±S{>µð~©õ.âˆY[òƒÒ³,©VÀ­dœgeÔ .³†h)„6xïÚ ‚ï²:•)0„@Áú È\³oP]B( Ö)°R`w&n»õÎÌ|€o+ï¸ÞŸ´à’‚Ià8X ¸9b@2M:"çà[-cà› @´óBÀyרƒ¤LC…¦ (xkZpI[­À[‹àÚ#u¿÷@~FæDÏUǾE` ¢,ñÒä#`)ñÀØ6 ôã“Ë“°ÎÃ[ ò¾£|ÓÈ0žýη±}ó(k1[*áµ·Â;·$ŽÄi¨8½[~ù´4Qc†)¾ÂBlGÀ$ÒòÆK/¾€‘¡A„@D˜.-dÓÊXÞÛ‹_üøEÄZrZ¡·ˆÀB øE² } k/Ͷ®—¸dL‚?B2ò©«Óò3žæi ®ì$XÞyi„Ķ-£Ð™òn^¼63›†MÈÅÒé¼,#àCë&ãìYkœý#ZÜy™ÁB Xç;Ãù€wŽ– ,$X üõüœ»< ïœh$?ÿÃë8óɧ¥Ôe Mïè œ=k z·o_® }bß…à‰8µphåJü`ß6¯Á|¹‚wŽ}€ƒG-æI×¢µ~õbáŸW&Ñh4²rkO[" øVý7kžšûôx9›aBôiò[jYß«$DD@-sJGR‚# I–`A âÅÐxŸ²¤5ðÖ Ø4Û—€H¯+I­ºoþäWû}Ƨ¾ÉœTe¾x?ˆ¹í2"R:¥5”RP:‚Š"D*BIH)!¥3§ ‹Œ¤Òs»—`–ÖÔ+¯Î5Ë¿ÁôkÉÒ–ìæM­9-€ÇE¾¸Šˆ(-C©c(¥ u6”JD¢(B$$„€”»¹³6d‹œ·õÊq'Üs'fïØ”¶®M–ãá‘“L´[äòÄL"ÒPJCk…XkÄZC«„Ö:Š ¥èx€²ž „”¾}p fokÕÓ‰Ižž{ÿÝ»6¥êŸ]¾®‡…/ªbÏ*¥5GQ­ÚrZ#Ž5´Ê<ÉÌúÅå),®6Y˜;ÖlÔ¿?ôй{µå)ˆ«—¦{†¿ð¶iU{âb~k¡PT±Ö¤µB¬4r±†¢Ó'03d‡š;\’z½\½9ý[ôÜ÷þ|éN»#q·†¶rå|¥Ú³ñ/’š'aÜ€Öz¨¯·Wæâ˜8뽺L)E b_)ÍWçnL½]*Ýxþúüô+å£ïÎßm£zïÍéþý|ß©S…Z3Ú¦óÑÞ•+VîŽó…Q¥d¿‘kkœ›«×ªfgfŽ$‰ysYÿqöÀXØïÿ¿ÝqׯeÏž=<7²S{[*&àåh%=ˆŠreMa>*­ªöT%‡òwÛŒÞzü d=˜.½¤øâIEND®B`‚qlix-0.2.6/pixmaps/file.png0000644000175000017500000000364611050625206013704 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/disconnected.png0000644000175000017500000001146511050625206015425 0ustar aliali‰PNG  IHDR@@ªiqÞüIDATxœíš{”ÕÇ¿¿{oUWw×t÷L3Ã2#â€A&&ê@$ÉâžhtÍ®dW>²1QcvÕõìA=É&ñ•5Öä°AcH%›#¢ÐëFE„‘‡ÃÌ0f¦{úYU÷·LWÓãÀ@uΞð;çžêê®îºßÏýÞß}T3ã¯9ÄhW`´ã€Ñ®ÀhÇ)£]ÑŽSF»£§ŒvF;Ní Œvœ0Úíø« NöÂzò»Ï4xZ_E„Ùétö'1ÛX½üöËòe?ê í̿:Ž·DIu•f]븴Öð< ­½v'—[0Ô^ûÕí=þw¾´>°;ö6X‚O·úÌppó·¿xVú#WógĈ.¹öc_g÷¾o_<þ?~´=}`­ÁÌk0k€Ì:­µóxpܤS.˜"}[@Ñ$¥$ %a(•VŠ~¯¤X}Z¸ì—7_Zë|ŒGŒÔÌýJ“f~²áœÉø÷¯5áº;–££ëXk\€¡©`«AuM¶m[J„ †ÄÑs Ç„‡”ùã{®šÖÿñI=vŒà´YW<ʬo`Ö˜væD\ÿ÷ŸÇ·þ:{zÁ¬ÁÒ€5öLTL:Á° ¥$”,6›JÂw‚i}m(™PRü(`É|»éÜÖQó@ymão™õ­®´L,¸p6l}^y ÆÖÎFÐŽ‚ˆ‚ „€’RJȱР1è‚RWä•¿TJ¹téR÷C°iÓ&""ÌŸ?¿øæ }õ _ —IÃï× "‰¦‹gãÓŸ¨ÁìgÃ(ü±ù]Üõãg‘Hç bɼZL›±ÅºzûñØS¿Cë¡VŒ ³E‡ÃaƒÁ"€`0˲@DèîîÞßÖÖö€Ÿ\sÍ5™?À¦M›h×®]ÔÚÚJ‰D‚˜ÕÕÕº²²’©v!¾ÿз»Nþ[ H‰ÁA~°•Ïš8ÿð¹ObÖ'¦á¬3NÃ;-qóC¿ÆäJ —~ºv(4¢x©6n} ¿Y·¦—Ç•ˆDʇ)Þ?7 ¦iB)…ŽŽŽŽöööûº»»]²dÉIƒ`ÇŽÔÞÞNÂóŽ&Z"B8æß¿O réŸk¦øÑ±Ð!ËÂåóf`JÍ$\þ¹F¸ùÞ|ó d³¹ã¶¸iš8|¤OmØŒ¶¶V„½¦B>ŸG8ÆÄ‰aÛöñ¾#ü$éC0MRJ>|¸«³³ó¾–––åW\qEö¤¼ð ´nÝ:Ú»w/ÙЀX,†]»v!•J xeç»Øöö.dz:a:Øv¸Øß™}}}ˆÇã˜2eJB(‚eYÇODÅjöõõõ¦R©ïõ÷÷Ú´iÇÝ´)ƒóçÏg!‡Ãa…B Ù0Œáßh}í@( çKÇŠ“ vÁžhÑ‚ëä±mÛ6ìܹeeeÃûz ÏlÙŽ·÷ìE¶ã ,/‹H¤ eeGKuu5fΜ‰òòrìܹ‡F0,ºÉ²¬b.PJ ±X¬|üøñß7nÜ¡GyäË'³gÏF"‘ êèèPmmmÆ‘#GT¿ÌårÅ;xßÈ”õ½}ƒ¡ÄMÐn®tFµC[+›ÍâÈ‘#Eñ$Þ~¿Í{àðô´¼ ˆD"CÄû%‰ ¶¶sæÌaؼy3:Tì¦iBˆãOe^zé%444Œ¹÷Þ{[´hÑ1/òfSSÇãq.¬Þ<Ï£|>/‰„êêê*éíí%Õñú-C. x‡ü‰’ò˜}…DG_ GŽÁ;/oF_Û”Ùö0ñ¶m)áp±X õõõøìg?‹D"µk×¢¥¥eX«—ÆÊ•+±dÉÜtÓM¸ôÒK©¯¯¯îX× [ F£QìÞ½¹\ù|ž<Ïrf&ÏóÈq‘N§e®ç@{8^ù$CÖ3{“ÆÆËqn]íñ†ibogaɘ2a,´›G:†mÛÃD‡ÃaØ0þà—h4Š3Ï<UUUhnnÆË/¿Œ²²2TTTëç8n½õV¬]»wÝu:;;±jÕ*TWWo¹æšk†í7 0yòd\yå•ÜÛÛ Ë²8 ‚™3@Zë!×33eº¥¥¤'U0j§3™O-š÷é!è˺H¤²Xû«'ÑÙцyóæaêÔ©p]RÊ"„p8ŒH$‚H$2d¼÷_û}ݶmL™2‘H›7oƶmÛÇá8šššL&qÛm·aË–-øá­5lÛ~þ†nØvB~466²çy,¥äÊÊJTWW#‰ˆ1cÆH˲(ŸÏƒˆŠ@œT¿ÎõÜàYñ=±…ÓϪ1ý„ÕL#“Í¡¯÷6®_‡ææfLœ83fÌ@,„B¡¢ üŒï‹Ãúº¨««ƒR O<ñî¼óN466bñâÅX½z5V¯^=(RJ¯¢¢â_®¿þú| FÜ™>}:.¾øb>|ø°îììäh4ʦiryy¹¨©©QcÇŽ¥xºûH¥Óرý5lÛòAPJ¡¬¬ ‹-B}}= Ã(:áDÂ@k{ï½Ï>û,n¹åƒAÜÿýxë­·@DPJ¹¡P¨éàÁƒOï7þ$~¬\¹’žþy™Ïçe*•RÌlxžgh­e>ŸŽãÏóD.çÈþÆw~nÁg®Ûw¨étÉd‡;Ú°mËíº†R J)Lž<—\r ÆŒƒH$‚X,)åqëL&±téRäóy,]ºýýý¸ÿþûñÞ{ïˆ`F*‹ýíž={^IËIX¹r%=÷Üsâ½÷Þýýý"“Ɉ|>/]וRJ%¥ °ˆ(ÀÔZžç˜9ð7—-ž;³áS_9cÒéáL*—_úcÛã«þûÑ3&NœRWW÷…p8õA\pÁ8ÿüó‹ÅPVV6Ì ---¸úê«1oÞ<Ì;---xàÐÛÛ 0 £«ªªêó·Þzks$ASSÓqEÀ²eËÄ–-[¨­­M ˆl6+]×®ë*­µ,´¸ÉÌ­µ%„°„YD"¢ YÌliFpÜ„‰ÓB–iîÞõÎ{ÌL̬ ÜwÞyŸª­­­7MS*¥P^^ŽyóæaÒ¤Iƒ¨¨¨€eY€7â›ßü&®½öZL™2¯¾ú*~øa¸îàŠX)u ‰\Ñßßÿ®eYn$ñB¡Oš4I766ê & 2 ÀÍ7ß,¶mÛ&zzzD*•ÙlVæóyåyžÒZ+­µbf“™M­u€ À`æ3[Bˆ K$"ŒéyžÉÌŠ™EaX•…"ˆªªªòÆÆÆ¹UUU“|7ÔÔÔà‚ .€mÛˆF£X¿~=–/_Ž[n¹ÑhO?ý4Ö¬Y_ƒRê]KZ‰(/¥t„ŽRÊ3MÓµ,KÇãq¯ªªJÏœ9“gÍšÅCC+V¬(Ú¯ïîî~€KD.§ô5ùSW*8´Öäyår9QœY–…M›6‰\.GŽã/öíé߈@DÌÌ "MD¿õ="rˆÈ%"§P™|IÉJÖ/Ìœ&¢4€43gd˜9CD¹D"ÑÕÜÜüb$Ù_YY95“É„8Pl°P(ô„ã8?°,+oÛ¶#¥Ì !ò…ßË !rBGá‘B°‚¥”LDRò$¸lÙ2±qãFÑÞÞ.³Ùlq¨ÓZ ­µÔZûÝÀOd¯¤ÈÂç~kûG:Æ%G0 !DaƒC*¥„”’ãñx`ÆŒ×nذár"‚eY÷ø ­µö—gf€£µv´ÖžÖZû≈…ZJÉJ)m–-[&š››iß¾}"™LÊl6+\×…| ˜YŽT€A>Œ›ÏK¾£Jœåà’söAH)I)EJ)’Rz‰¸Jñ>mbf×ó<§ Ú-œ»®ëj"â‚CÙ/¥d_¼iš†€5kÖІ hÿþýÔÓÓ#Òé4&?ÅY^!Oøn(í2¾P”v¡±¥Ÿ}0|ð ˆÂð( #Wkíp ¡™YDÃ^j{)%†ÁÁ`P‡B!7nܱøQºO˜L&‘L&ɇá8yžG®ëR ?úKg_dq)W*ü¸$Ïø•* "-¥†aiš‚™Ùq—™Yk핊öû·/Ü0  9‹ñøñãù /ä¥K—Ž àƒ0ZZZ°cÇ:xð %“I$ r‡\×E.—#ÏóhðTyžçAÁEÑ'{O!Ä K0•´0J›RŠ+¥`G"®®®æúúzþà,ø3C>®®.´¶¶¢½½ÚÛÛ‘H$(N#›ÍR>Ÿ‡ëºä8ƒö n)~ßuÝ“º·ÿX݇AD0M“À0 _0—••!s}}=û+#­þ"'Š5kÖ$ $ @{{;uwwÇâG*•¢löè~<V©P(„h4ŠÓN;wŽ*++‡<ÉúSã#ðÿ%þêÿ*{ ÀhW`´ã€Ñ®ÀhÇ)£]ÑŽÿdReŽì}ùIEND®B`‚qlix-0.2.6/pixmaps/ActionBar/0000755000175000017500000000000011050625263014113 5ustar alialiqlix-0.2.6/pixmaps/ActionBar/Sync.png0000644000175000017500000000364611050625206015543 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/SyncQueue.png0000644000175000017500000000364611050625206016550 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeleteFile.png0000644000175000017500000000364611050625206016631 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/TransferFromDevice.png0000644000175000017500000002324011050625206020347 0ustar aliali‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœ&IDATxÚíi$Å• ?÷ˆ¼ë®®î®¦‹«æÐ.4£F˜íhA, su qÄÚþ][3c’L™ÆÆö÷Œ„ŽY $!nÐh574¨«ï³ººë>òŽÃ÷GDdzDfVeVfV5²~eÞáéîïù»ÝÎÂY8 gá,œ…³pÎÂY8 gá,œ…³pÎÂY8 ú 6º݆»öe0\ }(ú R–"e8ÿ×9µÑ}è&üIÀ]{3øð7ÀåÀ¥ÀN ÝÔ TèöãÀ_/þÛ¥:Dñ¶'€»öfâÀ5ÀMÀ ÀhÍCµˆm Âÿqxxxêß.Ë•7z Ú·%ܵ73\‡âFàZ½kzQ;óØû¿ËÀ ÿÎå¹…›VámC_ϘÀ-Àg€«XÇë V¹à–娅÷Ž0S3±´ –Ù2}XÀÓ(î~ø+röFY3ð¶ €/g>|Å%«>¬ ;é’TXy…]»¤pËà6ƒÒ#FB`&ÁL z· 2[d³MÞüÝw®ÈÝ¿Ñc×DwÏ\øòžÌ_ß>Øð!ÊÅã.K'\ 3ª9D¯d Ò¾1Iïv‰Ô°‰Èå.à+ß}Gî™ ÆáŒ$€/ïÉ\â[ÀõPŸ;%X<ê’p).(”»¾m’ƒ‚žm’þs%2®Ý¬mð£ÀÝß}gî­õmeýØèèpç3ÛÄ“õuùíÒq—¹½.¥eÕšöY»WDå<ÑàU9oõ݉>Áð%’žm Å„ üÅ×¾û®Ü‰ j½égÜùVæÿà!?Yï~aF1õºCiiu̘Iˆ÷ b©*²…ÑZ{”S% «åeOŸX ý‚Íï4HU‡6Òâ"ðµ{Þ•ûçu⺰ápç[™ð]àæz÷ËKŠ©7ò3/„§ÁÇ{!Þ#*3»ÓàÚ!”³PίÌÒ#‚‘wÄ2 ‡øGÀ÷¼;WêNk›ƒ %€;ßÌŒŒŽ¥]‚™ÝÙIUg …‰A¼ârY7=@H¯”sŠÒ2”³õu! gT²é #¹éõið±{®ÌM®OËë´q£~øŽ73ïÃs œ£Šr`fËÒ1·á ¦†é!ÏV 0Ni}<´fJì¯^+r³ŠÂB}® è“ 6û0Üø½+s/¯Kã£mÛˆ½cwæ3À÷€”^oåàä.«P‘É~AfS}_˜§¨¸xàÏ»6®r9°¸‹XJ¨½ïX›Qè)ñŒ`ëû ÌZ-§Üþ½÷äîíà0w´ï;vgðuàï+•þXå§§_uêÚðññf¢ñ» ó`Wo»¥kíw•Ãï'Ô°K›Vžž#›ßí+‰µ·¿|õ{ï]¿`S—Ô¥Z¸ãLÅ€›¢½[<ì™vJ"ÉXzF$±Ôêï¢úϾœ¿¼ø¦Ž¶ÿ©ñ{91¿„÷[b…©KÂÀ˜ œƒì´ÂÖÔ<Ç‚S¯8 ]"é«‘\qÛË™›¿ÿ¾\®£hëB_z##üpcˆêL¿é°|Ò¯Ôµg“'ç×Ô)i’ޝ->Ô¤oG-j¦e‰Œ ‘dg¹¹jÇ•‚Ù½.VV1ti}z𷽜ùØ÷ß×}Nдs»-P|F¾kÁä ÙIU™QB€4`àAfHLêf ¬£Ð.¨–ͱd¸sóG\¬%Ÿ¾åé»;Ý“ŽÀm/g¶¡øª^ç`fÜñ¹¢í ·¾öÞ™¿õöjG,½µ ƒ£†çÞö_ªÌîsqË!«¥øêŸOoëd?:Ëÿ€"´Z90óGå†íü¡­2Ô᎕u‚V¹ÒjÅ4ah«ò¸žwÔE· ÒÀ?t²/#€Û^Ê\¦àvb—»XŰ3k`³A,Þš“ç ÃW žôD¢Þ¡rQ‘;Q# nÿâséË:õ»#¥ø #h¨[†ÜLXéë–¤2¢cJÔF˜•Yß…>¤{%=ý2DÔ¹i× PÊË—?½á Ϧÿ¢ýè Fÿ¬ûùí¼"¿Öúû†Ž)|ÔÀõ]˜ú‘Ò7ù§HTt$§°m¸eWúãJ©?SJ”åãnˆM¦2’D²;¬?ªŒ­ú»^RiIBsä'ýô¨*üÙ~Ÿþx»ýi‹nÙ•6ÒëÊ‹Šb6ìíëüÓaýAŸºÌè2BcXXVØ9aüÓÍ¿O·Òo3Š/¢¸DoQn‚cîéõµþ.ØÛÁh… $‚tF†Æ2Ѝ¸ÅÛiS[ à³ÇO)(Í*Ê¥êìz亰ÍõÄýzµ¯oÐO"õ_P*(ìeMÙòˆà³íôeÍðÅçÓ(®Öëò3á÷ôK £;Ó°¯é-ç+¬¡Äb’LoX!,ÌV'œÏ®þüÓéu'סˆUì~ ¬R5»Ç0 ¯¯³îÞÕ\Ág¸¨¦Ì°‡Ð*©pÞ€‡ƒëÖÚ†vDÀ•3ÖB¸å©´ŸÕdG[*ô€õ‚Në-+i@2UH8ÙH{”†‹aMð…gÓq¥¸VgEål8·/•îö+8ØI°^úŒ^Òé°meºî¥àÚÏý6oªXP\ƒ¢Wú”µÅB@2Ùÿ†+û¢Aô±jÄ)RiúrIyk«b Å5kéÎZEÀMú…%îM¦j3`»WRJ„ðI»Ž<Í)%RˆŽE"IB"È\ÜBä!ÆI³Ð2Üüû´PŠtdEÙªÛˆðf¡RH¾©)ºïpÂÿ]ü" a" ÚÑ¡¿ˆEN‡“gœ<7|öÉtË¿/Òзbs}ö¯ýt*Ý­Ù(Bˆ®hÿB „BÐýåÁ•ß”á@”rAˆ ‹O©Ê½NA:-YXt*×¥¢ÂT¡1ÅÃÍ ­¼·uP|D¿t øŽÇ¦ì<ò½Y!©%ï(ëmØÓð8ÀøÈVBTÏQ ª„Щ6™† ”-ï}®« , ¬ú}„u €ËкåÏþTgذ¨EhÆW‰@T2ïÏ^+@¤‚S¢Šh%ü£NÊõÎ;©´¤¼TånÉK3‡ >ZNi™”·ýjõÚ ßOÆe‡lrv"éˆ×îUE€DˆõXTëý¦ÒC¬RÆ qà‰ïÜçLà‰Xx`•CtóŒK[y´¨~þwib§PnX4öµa‰À’Ê_äÜÃW aø ˜X§Œ ŸH¿-Ò@Ê =žEbHÃÆÀ†×éëEmà +‚u6ÐØù™_µ¦¶ÊÆÀOúôÁu ‰Ã”+Ú4VY±0ÝXY¾<õ”(-ÕC„“>*¶¸ðÎ-Ë­èÝ!…¼Ã©ãžæqï¬rü[™ž*T_³çoá l’+.3ƒ¸J0öJa„Á´£cÍö§%PŠ‘vãºUP ¯¬ñ¸ ‘ä–\$’˜‘ª¼-êÍä<Ôû˜=ZÜ ¬u$e À¦ÂöýÑñÇ(Štoà4²Ý·œ —L¿$¶ÊºHS†¹œÇ”NàíŽÞ@±I¿”Jà*·‚Ã\% ãßì–”‹ Ç‚‹ú®&c µ”õ‰ä²þ¿éØû–¬Óì]ü ±„ ohe΀a Çö£‰æ(›VKZ=•3U«R4Õ !`p³dzÂáÐò³\Ñ-R˜\6zq³ý%pÙѶß…›ßÍpOûk2òå%öŸ~[•9’}Î['±Y®Ê90 p´ì0Q+M{š{“ÿ¾–Z¯è mðá+€zãšÕ@âqÁÀÁâÜÇó¯p^æ*Jv¿¼øcmqw`ç–÷µý…âÑ׿ÀÑì.,·ÀÐf“xBxC`U_€ÿR*j€WÝÒÖ(-iMJѶÂNpÃl>õK Aß I*m0S:ÀBù‡¦w³÷ô†ì–¶.ðÊѧ˜\<Ìti? Ö™>“Lo ÍeÎFxÌ•ò %ЪÚz¹r ›)†–¿´BH„0 oI`Çr/b©Ïx˜¥âìFãªãpjé(¯{’‚³ÀÉüÄã’M#ÉŠ9”Õ&Ži„wOA‰hž` °Î|¿†ç’m­¶r`KÇLƒ‘-IÊ;€í”xrϽžrù'e»ÈSã÷â(›£¹] 6oMaoC„ü+NŸBˆþ’¼–ü­‰XÖ—}‹È„w]µªƒ§âÔÑŽ™LŒþY{Š©â>¦—OðòÑ_o4Þ:O￟lq“ù×):Ë §H%MŸúQD¡EuFÑvU¤®š¢}Ʀih•„’‘D$éÇ©iaÒõ½a"ˆßWŽ‚á‘ñ„Á©â[œ^=þ4“‹‡7wmÞÉ8<ý&‹ÖsåÃd21††“¾1ìU ëç¸*ìy²Fd[i_ë ÿX¤uNCü{5*@ølOTØŸ!%££„PË¿€ëZ<5~åföh?Ca>?Ås¡¬òL^Å4%ÛF3(j8¢¬p†Ú¬ªÀPAIíNÚÝ#…Z®ì\S‰xU[ç4AªD=ö_= RÉ›G2”Ý'‹»É•yfÿÏ7kǵyrϱ]‹ù—q•Íèhf,†žÖ/¤—PâqBC«÷Biøl¶:åmmâ I87Ð+]3ºÉá¢0ªéç‰ZÑ;F¨“þQ!½ƒCz2 ÊGY²&ß¶¦á=Æ\îÓ¥}ì9†‡2ôö$ýl¢0ñ!N B“Bj\Â"À4DØ ¨|µ­À>]¸.薟(}úìp‚,pÛ¶~LÓàdñµªiXxû˜†Gg÷ðÖÉ?wæ˜)í'•гeK¯oêUó jd¿i¢VpU˜ãRxÁ¸°`_+mmÕpLA^ßDaçS¡Pá³2Qé„ê¨@6P‚â1“íÛp•ÍÉÂkXN‰'Çߦa®´Äïöý G•™(¼Š!cÛ}hü•©@Ø7É+ ô?!Ɖ„Þe­È+Õ| ¨e¸ïÚ‚ qª‘À×»Q¿²¡ "×½½)6 õ·g™+bzù/ᦡBñÔÞû(Yy&‹»qT‘sFIÆã5¬=0÷j•ÁˆžGTÆvØwÿM…UÒ¡õºb<¼‡]˜-•ì`oQÉ”Õ5‚T®Š(>'ÐÍB)$£[H¥âÌ”öQpyí 7 _;ö;&±`#gO1ØßÃÐ`¯Ÿ½lhœ.¸ŽeE)¬>ç+ˆBPŽšY5Ç[móZ2(öè¿ñ“·]?k¦êñ ”¼P©è^zµ‹wmHƒó¶ ¤àTáu\噆%»°†fwN/奣¿¡ä.3]ÚK"cìœá–pD)Â×GÒÞªõAÊ(råðžKNxqJy¸é*(Å/•ö£¶RÈ , h»¾fZ2âé’Ú DÓ¾ P*™`ûÖ!,7ÏtiüŒ4 Ëv‘'ÇïÅQ§Š»BqÁ¹[0 ³Ž¢L Q£ M_Ò¯…ï,»Õmw CP¶ÝȆ¢ü²ë¼€bRÿåx$ X°\ßïïk°e¯z-êxÃ×RHF†èïëaÉ:IÖ9Íáé7Ù{ê¥Æ{žÙÿs²ÅfJû(«Û¶ “I§¨AM¿!}G„ê£r¿*ÿ!o9¡1Ž×z'Q­¥„¯‰~z}AëuQó$g9!= èFuŽË꽺Žp!¹`ûfb1“©ÒlUäÙƒ°XhÉäí ŒŸz‘CÓ»É9S,Ùôõ¤Ý<ä~uÉšDa]w¸¨ BçÞ˜†œnNýÿðÏ?Ñš¸&PЇtó£l‡CPÛA)W›ýÕ†YœÎEˆE†meA,ã±Q”²™*½…å”xjü^ÜhZÒ:ÂB~šç>‚­ŠL—Ɖ™&;έ"0¢å‹èDÕ©¡OÝJBb»»jK…’ŠnñÐZú°Ö4Ú§ ˆk)Ë ÈÙ–Ÿ4©9ƒ…wަT¬‚B$ë^÷÷fØ22DÁ]`Ñ:Êôò/ÙÓÐqmžÿ1–Sfº´…ÃŽsÏ!K„Ö VûaTܰâkD¸žç d [.‡Ù¿!k@ЧÖ~vC¡„â¡ÊHp(o»(œˆgËï¬æþ L *70"\À¨ÖIƒó¶m%“J1o¡ä.ñÚ‰g8¹phÝ `×á'˜ÍN²h¥è.²udƒ}}_~ÀªE7}e…3 ®§’ìá»8d-;v¯ý´Þ/øTaMŸ ]s"}T ­°‰’³l·R„‚uu¡kÂ×Q‡PT70„Á%ç‹”‚éò8®²ùíÞŸ¬«ixtnœ7'ž£è.²h£'âüm£UQ¶BÀ«úeûUëGב,·DÞ©*€R@¡èê¦J­ý·EÀc€­o3ª йb…ÑŽ‡¼ƒ"Âêu Â×þÿM'S\pÎ6lUd®|À3 ÷­i˜//ñôÞŸâb3SÞ‹”’œ¯¹¹ëè3ë'¬×èÇ@Ôõ&!`º í½3$®[uÅ£°Q<¶îpÿM…yÏèuÊ[ –EÙ)ElZQa‰!{7b#ëš³ˆ ¤‚­## ÷÷“s§È9Óžy“ñS/vù ÅSã?¡hå™-ïǥ̎±1Ò‰”¿¯Õ]jýý¢v8‚ªï)ØÊVXû/…7 žyðæ×”â>] ŠŠ¸¨2:¥§ Ë苵»˜îûÀA½AÑÏÁ-Z9;¯-ŽÔ;oh×Fä=¹šG%Øyþ…(æ¬ý]5 §–ŽñÒ‘_c©< öQ’‰$—œwAH«÷4ø¨³'¸ü5zŽŸ¥i9»È¢UÇYr.*üwP)õývúÕÖjº=÷ÙîeŸŽ>Ô9Ž"2pQ• Ö²[d$9T5*æPýH ðÍŸèsÑUÂOp]Å|v!Ž%p”ÃöÁ‹:†ü²]ä±Ý÷P´sÌXã(aó΋.!•HTázXTÔ?V×qVù·—Uåùú½ç¼qÛ·xKUë¤d—jû=ôÙâíô­ýå´ŠŸ(Å‹!Q o¿lÛÌ—æª!P4vb—aÝ Z_a©]âÂíçғΰlOPVY^ï°iøû°\œgÑ9†­ \°m;ý½}µŽ¬ˆ¨eõQPèý›-Í‘sª²_ÈÛÃT¹í‹(~ÒnßÚ&€Ÿ² €¯hUVÄ § Ÿ(Ì¢p51ÙåCÓøW´ B3߯& ®Øq1†”Ì[5Ó0ß6ò÷ž~™ƒSoPtçÉ;S õ pþèXo_×Ot F×eÂõz ÷?š› ]LIÊåðG#|å¡Ï[výF¡# ªÇb¹ìS±«€‹ƒ:ÛRÞçÐü~ØJáª"Éaí»|UegÅQ„.KýÍBâ lo'ÌñXŒ™ÅY\UÆPi– ³ìyךûµP˜æWoý?,·À¼½Ÿ˜iòžKßi˜ZL^Ë݆Ø¿ª¹bÁcÿ ÅåC,Ú… ë7dg]/õ« ?üùâ7;»Îí¨ ¸E%>iÛ`FÖN³Ì”f*ì°ª%W‹©/Ç ¶oÞÆÈà0wŽ‚;Çá™·ÖlºÊáÉ=÷b;%#(\®¸p'ÉXRÓEŒÈ¹žðÙH!¬^ëGdª8Ë©âb¨†%qìÐDwQtìû#€>]Ø­àß5Kó.±`ƒ_ög'(8EЈ+…k­ ïž¿®°rÔž¹ü‚$ã –c8ª¼fÓpס'˜Íž$çžÆr³œ»e;›FÂ!ÝP˜7ìá«}BQ=!þ*Qgí²GÃ>!X˜±£fß¿?|sq÷G(¾Š¢²’C)È͇F\»Çqq*ƒ #Š^˜;èQCQ˜"¡V!IļsÇå(‹Î-¡´yÓðØÜ^vO<‹¥räœSôfzÙyÞE5¦iEC«ñûkþMí ÿ++k±{qÇ>µŒßÅ)W—ûŠ¢Š|˜³]èè¦*ã?³—.ýdÌ>Ô¹HW`$ÑÜÄ. å9ÎImÓä½·†@× t›Y„ê뛄Á»Ò‰ ®ë2·<‹ÛR8ÊfûàÅ«ö!_^æñÝߣìYt"%|àÒ÷ˆ'ÁGXeÉ–.ᄟÀåËv*²½jâ)ÍÔ d¿‹â•ùW(¸åÖ_šõ¾¯?ò…â#ÄYÇwUR¨¯+ÔƒúG¤ 9Q‹‚e§À—Þªô¸²Ü9rNÈ%¬?S›l¡×_|îEôõô‘w§°TŽ×Oüž“ Wmýo÷þ„¢•#ëœÀÅæòó/¥7Ý[G »©£îë(Û²þàþ[Ko’u ¡±!+(dÝ(ëÅ×;¯ŽÀCŸ)*7!ÅÒ¼ƒi‡MÃSåydÇý5VÏ´p†QØL!Ž` “÷\ô. i°ìÇU6O­b¾vü&æPTs”Ô£Ã[Û2Vkâ…Ì=Í,´”ˆ)K䙽ÙqN—gÃ&_Y²8W ÞPpó#_lßì‹BWöÕÚ{¿m]ú ó às@&¨/d]zú \mCÇ;KÞ^f49Z“3'"â j2VëòƒD‹D,A2–àôü)\l¤›hhN-ç·ã÷aQ$ë'•HqÕ¥ïÇ0ü]t‚Ùø,Bb@àm)B柨°üà­Ã닯0Q˜ÔqO•L¯ öO×zkñaº]ßZqïÏí×v~Üì>Ô¹—}}®¬®wsp8^|ñ÷ׄq„ap“åüçÜ“œ.Ÿ !^ pç3'ê:§ž>óØíÅ5%y¶ ëBû°Ë;?fþo«¹é÷Š9…´‰^RËÊâXá3åS '¶’ißý«Œ4Žà¥ZkŸtѬ!$†0éß̱©£”Už¸è£¤°XæÂÑ‹¸xÛÅ‘™¯!?Þ}MÁ«Ü€9kšççŸd<»K•Cš~ A~gë.uÿ·=ö¥õA~ƒ®u®ÿaòà_„^O†Î7°Dý}ÎMžÏ{û¯&côj„ +‚ºe`µ×ä;}Œ—¼„I ›"ý™>þú]×`H厫º Žëšk×?.; ¼¼ð Ç‹õW0Ç•dú€ã}õ+ %à®Ç¿TüázãbCàú&ÿxØ¢O iÀȘ‰›®ÿ ‰àâÌ¥\Ùÿ×$D²BB‹´EDzrf`Çïÿ3'0¤Á5WþWzÓÞ.àÁG ªˆW(œ*Â+ÈwpýcÑÉóêÒÓìÏý‘z­–DN±£a]€Ó(>öøÅç7F×ÿ 9†·¤é=z½bqÁȘ‰•¬Ï !ÙcGæÝlOî .SZ:™žV¦çˆ !Xv™_¿òK.»‚ GwPÙv¥!>:ûÝ 1”ÜÇ 8TØÍÉÒQœ:šœÀSô¦ŽØX¥ºúÜ«ÀßQ<¾Q8ØPøè÷“iàÀ§êÝOfÃc&åXãía$‚‘øv¤ßÅŽô»I½u<†~˜Y#‚la™Þ”··rùþ§^p+ç í/ÙóÎïæ@þu¦Ë§©Ï£<ˆ[’™#6Å\g¼ªŸ*¸õ‰;‹í§-µNý~Rw£ø¬÷Lï ¤o›e¬¾OР9Àù©ËÙžº‚^c€Œ9@B¦C¾|t%`³“ ëÖ¡àäÈÚódyNÆ9\x‹E{aÕߎ;žSgy¾a;‹À?ßzâÎÎûö[…3‚øè÷’Ûñç‚@UðÑ ÿ™Á-&™Í¢)BÐÁI‘ idȽôƒôšC€`ÙžeÙ™'ï,QpòÝ‚ŸÚÔ<ÄIö´bîTíÂ=ÿU.ðCàkO|¹xb£Ç:€3ЏîžäÀ·€ë=‹ †¶$–Ù*ºÚ ˜–¤¸ ˜›t°Ê+¶àQàî'¾\|k›¹*œ‘ÀußMþðmàƒ+=' Ÿ3 œ„'±»Yäfó§mÜz~œðOïRð•_ÜU|¦¹_X8£ €ë¾›üðM—À*_ß0°É wHb$ o¥Ý$a˜LÂ(ì’byÆeaºŠñUÞ´ø»_ÜU¼£Çn5x[ÀµßIšxºÁg€«Xåfx5 A"!ˆ%f\`&Àˆ{Á§¬°Ë`å²¢TRØN“\¤ú˜<â>?øÅÿ,Úͽ`ca£ @¬åÞ‡¿Hô‰k…àFÿzßÉQ+^®Íý‡e¿PЇJKê‰ßÝ]ZhãÍb¬ˆU®õº•ž­ùýw3~Þ5Ƈ̈́¸A\l]±%í³â”rxÔ.©‡ÿÊùÝ¡_ÚåoU Î[¹×©V7„n€Xå|¥c£óÕÞE,-äUÿ;þÞÔøˆŒq™\$$‰9Ô…úC\r]uH¹p-öfÔ¯^ø¿å—íBåézˆŒÖ©÷UƒóF×+·tÐIX éÁµŒÔ¥¹¯M­N(Dꉥ…±ã:c[ÿùòB3)†¤IZšô`¨´”^¾¢ë’Sy×&ëÚä킚_<¢zž°òûqF°bÕ unºFDÛÄÐ)Xi&G‘+µ£¬s]ï^#"¡ÁõJÇfúÝÌ _ Á®õ¢êœ¯D(+µsMˆk÷ÿ¯†xÙ  ŽúýzÄÑ,wht½´Šxð?—@iî*Åñ‹~]ï¹FÄP¯}-A«ŸŽÕa%E®ò ÂÈ^©Ô#ˆÕˆšãÍ@32½Uäëwê©ëýr#¿£·GDŽ-A;Àj ]=^(š%‚µrhã5#çõë• ð" íœ:ïÓK=‹¨£J`' ê m$$é}¯á7‚ºÅêÍþFl¿±-h‡êQhPçRÕøÝÈý¡ú €ÍꬿUä¯EŒt»\ J õd¾Ãéëm¬¤ŠUΛ1 µ¡Þý• ˆž7â8ƒbedG¿R›ÖŒ¸NÀjŸzþ€Vìÿ•ޒèh†‚óvÌ÷½`¥÷6C­ÔÕ{O³õÍö{5Ï[+žÀè±Ñy£ç굡cºÀ™ k¼×ìû[íójܪÿ¾Y"jåý·e4p ϶ÓÏf¿©5Þë l4ü)·yC»­Âÿ;)R0,”’"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeleteFromPlaylist.png0000644000175000017500000000364611050625206020377 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/HideQueue.png0000644000175000017500000002352211050625206016500 0ustar aliali‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœ&ÄIDATxÚí{,×]ß?çtOÏÌÎÎݽï§$ëa l!¹ 88PðGˆ)ÊÂ`À$T ` É)ˆvlƒmÅT€$„—±¨„¡([Ž1†?pÂÃ’eð•…¤ òÕ}îÝ{ïîÎ{¦ûüòÇéw÷ÌÎìÎî^¹î¯ª·{º{»Ï9¿ïù½Î›t“nÒMºI7é&ݤ›t“nÒMºI7é&ݤ›t“nÒW?©½.ÀN“<ÒTÀ-À]À2°/·lä¶5àïÔ›[²×uØIúª@ÈìWÿx9ð5À=ÀÂÙáYàào?×?üÕŠ=䑦|;ðÝÀëã3?c6v^>|á3úGZýnƒíЋòHsøNààu@sªÿÛj¿ÿ-à€GOéi­íuÛÌJ/È#Mx3ð&à[ÊØ{Ë&ö¼A0´›ÙKÚ§b7í…2mË$ï üð{À#Î[Zþ^·Ù4ô¢€<Òü^à½ÀÝ™óczæ`†`RŒ6¾ÝØL (Ðn¸EÀðÀÛÞbøÞÍ‹|x›ó–ÖìuÛmF74䑿·ˆð~à'Þg`°ƒë!ãw¨ïiסº¼%PéÖ+GÅç€Ùúìž4àtCÀ|¤ùµÀÃÀw½Ç· ï_ƒQÛ‚`7kª´•Õe»)gâíŸDxÈùÑÖS»Ñ~3Õc¯ &ó‘æ)àÝX]¯3Ã6XƒÎ%uf¯i,Ú]Pá±`’ QS©ŠÜ³+ hoŒ9*`€G€wº?Ú:·×m*úAæ#͇ðn Vv}ÔÖ¹éïÖ ²h÷1ÃÍÿ/Mi@ø}+eüþæÿWY„ÅàÖË @x§ûc­ìn —ÓžÀüv³ ü&ðCe׃>´ÏÃ`}r-* ¶ñ+°gïDY} „QF]&J‰ê4Ž[Cr ýàGÝk v¦´ÓÑžÀüvó8ð1òF^(–;¡wÒ†VÚ2Ük€»`ÏBÛ å‰¿›¢ÔQPÛc) ”}ñç€7¸?Þº¸c¼ í̇›¯ÂPN¦ÛD t/CïJy£*^ûggúN‘пJ©1`­„…ÃZ\à<ð@åÇ[OìEÙ÷Á‡›o> d4¥ÂÚsŒŠÞ>¨Ø?§È¾ñ¡ÕJ…2rk°x[b|¦¨¼¥òÖÖï͹f›Ò® øpS¿¼=>6Ĩ gmoÊ“»`ïxS½fÏ)X÷Ôï¯iO1á=À;*oݽÁ¦]@ð[ÍÖðùîüµþUh_¤Ð*ÔÚž3/#}…S”ÞÙêû= „ 7\¤,³†b‰ôù8ðC•ŸhÍêèn‰vÁo5ÖØ{ ­}Á6Ržjû­®Ÿ'‰üžBD¡0¡ñ¸óMпnã…:í‚"=*ðï'v^ì–õà¢MØøÍS*Ù´c*Ûb¾7 ¿«UÃ,߃8 ü®=_vÿ<·Ú²e´ÒÙº®[×v\#µ=€ðžÝ`ÌŽÃ?øÍæ?þgİÆÞÆY»O“vaáèÊlïØŒâž¯k˜¥;Qއ#ôÆs¨ ƒ[ßI ¡»R´s'KÛîýdëww²L;Zkÿ7›ß€"µ¸X.ŠÈ­AýÐü]»˜ùN³ïÔÂÔÉW žB:Ww ø%°.nÞ.p€ÒêÔ½¨…ƒÈÒÖ0ìÙÿßQÀØÀ–»m“Á: ‹à«Â6;Íþ¯7BøþØ F=è®fïsªówó È|Æ0?¢q 0Á΀@ÄŽ*¡!XÛ¥@пFC³ÞÄ÷þKó¡y—g®²Îÿõæ àï$•†mFÐz!××ÔïŒÁô­Á7 ó³ÿ[TN ´³IÍ€;ºi 8ŽàÔì³%€Þj¶”“D²Ô^Zý×­ ój³¹²@„w‰°ûÞ:“\+QйúÚAO!ªŽ4gc>ä$Á¾;ÀiôÀø›Ä ¦o‚>ˆòÀ[˜Xʱm‚&n(1˜ÌûÞ5OžÍMŒ~­ù2àI Ælï* sF_m¿ÿó¤¸çë:²t,ÌÆü ™sþ‹H;ôü)%Á¤ò¥˜oö݉µ }¯‘½ÏïdoŸÝR¯¨ý›ÖÓóh»yJ€‡‰˜/ > [dt›×ÜYæ›}Ûd>€vÐ'ïE-´Ïs±ØÞRùrÌÇñâFÈ›nÝ&´¤ÛlÔG‰pžWûÍ£ÿÞ|-ÂëÓb± ”$uq*aåÆ5Ô¶À£¾Âè:AÈ|uêëåæC«³mÊA¸ öݸ üž³=ÇÛ« Á¾;mLxÿ­§n“^UøŸÊb˜Â¦’ Ð°Uh®×÷¹ùÚ@&¿-†)S9—oRcÍÊ}êü² Ï\(’ )I0©%A¦ç/Yæë[îG-ì·J?iU³¿ýž•¨¹6˜KNá¶0üÕæ÷ˆðMifö¯gïqªóïÛÆU «agy¾Ì[ÇA‡†¡iÞn Ã)@PÎüûÀõPUË]qk0&Þàx9צ’LB |Sï—šß³í*n矇¿Út÷¥ÏùƒÐ‡M÷þø]…–'|ÌJ ÐŽ ÌåwaÔCú­m?·¼…B4e@0nBžù*d¾rCãÇ­Z?Ø­!f¼aYidGƒ£‚´|_ï?7·…úíJ€ÜMõlÁݺ•x~Oè¯YÏ ·ªè]S 7lBeÐ㫱súÊ\/§¢PÚ 7ž‡þuäüi¤{}Š"o¥•R X¼t¿/yã 1ô@­ý<óCR^¥kHúþ%uÔN1ª$Õìî[¦íÉLá3ìæFùT˜Í#Ö2µ£˜_à Ôp3Ü@ ÖÃQk1j•LÚP:Éé/8ž"Z@Ο†“¯´zvÞ‚Àœû"ÐÏẸU…Ò%=¿‰ý·§Ú@œ*Jˆ T¹$pl¯Èøv=§N›_¹%Ú²s;üoÍe`…h–®Øpon-É}u`äï#¸ãTm2ê%µ3#T ;³sÝcÔŠÃcJÛ^¡PŽÂqÅ+F‚³ï%PÛÚ)b|äÜi¤½j㦋ã…êmææÚYäÒ3èëOázðãhÔÍ&Éê T³qp¤þo·65}ë@øNIMÑN© !¥T6—O;@¯ îz-îí¯AzkÐYE6® ípk­À°›yo˜à˜ÿÅ©Oa%„ ¿fËÜZ‰£b;J^uàVÔ[³ç„`ˆT í+ ¡: [Ï#Á€Ê-÷ ¼(ÍAÙŽˆ$ÝÓ‘ª6l4À¨M#2Ú… |2~!Wàõ6²ñ3³Í%˜b×á;ž>‘_’EQjÊÕ·ž€´.£Ý1ëëçGÚE5¢ êÄ<þ»˜‹O£:`€w×½èæ¡¤Â©]•2ϧàAµh­]DüMýqåb¾è ùˆªpË›™2ˆg ß‘ŽXÅŠ0ì«Æê3í{Òº2ó«wœD¾ø(æÒÓ¨Îyµñîúzô¾Ã)U45Ë#>—û=‰ÂdqjSå *Z§ž,¹abKß1k•·b¼,Óf£lUõ“6‡®Ck‹†àN‘Á?Ž9ûyTû< [ óc_V1voüƒK‚rª(Ž ôÛS åd_/¦!}ÙæOÉÒì¾&óÓÕÿš±•QaªÁ:fãò¦îÏ®‘ÁéG1gŸ™ßÆ»ë>ôÒá¨Î©J( j ®è·¤OçýH…x àÔÀ„ŒÝLèì=’íýYÞLC3©€þ/5víݸ~5@j›4”¯Ý0÷yÔCíY^¿3‰ý¯|Þ.B4ìP¹ë>ôÒJÅý&"_”B”FP™c{oîÝ^œjÈÃiD@¾ì…1²{ÚïoÎÞŸ ·,d’8ò⛢X’©²í=¶"æŸ}ZçÐA‡ÊKïÃY>ZÂôTÆf|M~+T¸Òh(™ã°©ª‹ˆc=ICÃé¦Í)dJ.iô–Yš`6#P¸§TŸå Uþ¿ñ0§ÚA³~iNœÜ‰œþæì㨕¿E®S¹ó~œ¥£D% ØdS¥çÓÿx ñ2fù¡åmd ß3õÌîÊüŠôº~›Þ2ÆÎ‰j¯NõÒ¹“Á“ÿó•ÇàücÐ:‡SsQÕjÍ*Çðt$×û3jÁ^SJ…C½9uí«°MjÓÛ–eNF¶­Mù$`v °˜ÉË›Õ & kªÁ:Òº<û¶KóŸÿêòèîyÜj€r9ÿ$Ò['Ët]ˆ ùûJľ*;¯ªR·¹› ¥¨ ™rñ(™¢k³J€ìL>“ë0SšZGØeW0Å|gå¯qº¨ÙOe±†Ó¹ƒ–Ac¼$ÈŸËù{“c¥BÛ w¯ª. ÜºUc²ƒ&©øRrÏL³-g3…ÅB6ïØß´VÖva°+Ká„ÌÿdÌ|Õ9Oõà>T­†]±=Ñ­¡* Æëû’óeÞÁ˜c•?‚2ÉÎSúõE`ì¨(>¼ÜÀL.ñ¼è- n…ü¾94‚Â(‡ ;@TÓ¼ÍfòÜú*¨T)0{šÈ_ìêÑùèTu©Ø)Â"›GF2m\ÖÞ2f ©Hgò:m ´«Pë Hkuðö²R ç¾ïEDlÇå'\¼€³¼dŠjKè[î×KÕ+‘äYñ5‘ø·DA‘h (ú÷ôcòç¼p&ˆSÁˆV°ÙÒç*_¤,OfâÈl2¹×åܤäJƒ«1¨QÙØE  4îýoÄ't`ÁïvpTpo}UÉB„9++÷“ÉwOGÞ"`×/Ó&‰¦•?)&ån˜)?~V ÐN¿Tƹ#c›'t´Ò_Ûý1…Z}Óî"Ý6j_nÄ/*wÌŒTïŽnËôleEdþÏôþT˜8%”W·‰%•:Ò뤺·aß°DÌ^ "Ù‡+BJThõl´Li´n`ö A`‡âé\bôwEåî× ÷¢ÐËâÿQDçrÇ eãÿñ¿†ª¢ 4x 6€Î^Ý‚Ü;Óm^Ô3`V#0/aoÏØÃã´OÚu  \'\$§›dï&)sÿÑ'ïEÇ]ctæ¯0«ýÿ²¸@Î5ãÿÇ_Ô8yÃP)¨6mrȘ€R®ØÅ8@v›IÌZ͈ù2/©¤¡Ó› ÷vPÈzf³$Ñ¢ªY”yãÜÂÒk“©ë^4&`W1µÏL¯A¹z-×3…Wg•g gÊ U:L˜®”×EE íï¦+˜§§r h]-öþ2÷nL”/œ¸~¥@mÑ ÊE‰Š;I²EÿW²åÚ\¤„GhV p¡›zYb¤@ºw$±ñ¨BÚÕVGŽÚ{Ÿ¤4Î}Y Ÿù ÌÆÕ,Csþ|–É:{ošÑeA ôÞ³3AU¥†‘¬ºLž]ÒÌþw³;€Æƒ-8SÐù6"}2b~("Uà:¶þÃÖæóvGÁ©2|æÏ1­k%º9ªy¢”Í —Ÿ‹ž‘j<ª²ÊAܺJ†GD!h»UèlR”¾g–Þ1[RèVrŸ™ŸVQ˜8,|(úm#hDl…ÐJk›¸—* Sö'_‰,„ xúÏ‘H¤UX>G0ÔõªÌ˜`X.èxž€bÛL¥ó  08)E><3k•·2=¼¸8Qº®Nú\¤ÏòVu(\׿ :v1Á”ƹÿûЧBè ƒ¿M`Ü`Ùèß8û °j6M\åžÛHa†tÉZ 3/µüq~N|&X{.c\§Ô¦]„žÀLj Êä¹°CßaLƒ qtè?ö1‚çC®Cº×¿ŸºãOÏÊk¢›`  S£¥ôÓj¶dÙ˜?žµª[I } »€ñq¢÷ŠâH;v¤¸÷£KA ½ ºß!ˆÇ^2óÿæc˜¾gŸ~}âkw †/‰á™¿¤rìvT½Ö\Û™BÕpRÇu”ÖI<'Gʵeø.ÂyZ¹6ÑBcÛM éöây‘çÀ°øPKZ7?ðÖ¸0AöIÊÁ®f—ö$< U€vñ€iòcæ?Z} ê žø(»‚‹_À?û%ÜC‡QµE”v`à!tÑN¬˜•[·³’¼ºí«Ö­±ç¸YÆGÇÞ¢m&·Ò³m%…žóÓíâù >±ü®Ù¿0²ÕÉ¡B ¹p¤v Cb%ë„ù逊·a³qy²>J1_¯>…ê\‚Îe jWA WN¬­ât¡âXðšTÜÞ±`@¹ˆ¶ß¤í&™¿áLb¼¨X€à- ¼Z8O Ã‰ŠÐ@]DBŠÛÀ~‚ofÚêäÐÏ`c΋qˆÜ¤&…(ÐŽÁ¼º¨Jk”ã ÃÖäì tÏ¿ò%to…ʱãÝ>\}»‚h(yõKø×ñNœDWkHà#þã÷í±±’±Ìu*0”&‚T4ÒîÖ ©M[w­³SÇ _G·c4ŸÙ54®5h½·ùiàqüìÓ´ ¾Ø…!òÁ””*Ð^3lÙÙÂÃäfßæ™ïôVðŽG7š¸e†Jã_{Q» ^õý–«_bxáÕã'ѵšÿn¼ZŒÍuA!ñ$¢ý®MH1Ʋ\é.J{ˆ1IŠ—R`|G2ú?’7>½ü¶ö Úí,•ñ(ðÆh Ëødfú¨ È`•Í’ƒ$vxº£qÕŒ^û2º{yî °Ìÿ zýP TŽžÂ]:XÂt•*[ÎÎψ%AJ:ÐGW‚Ìã†íã-}9äÁ–i[3´ß÷™¡yèÛª—I{&YÐ1& j)œâÄ{®þhC©@Ö/Ä̯;ŽÓHë|§œù:u^kœæ~$µs(§ŠY}Õ\,O‰¡W:•,ê8YÆÊ ǹ^0üLqäïÁ¿¸ýKÏC°ôÎÖŸŸJŸ‹­Õ°ºNp13bg »žÍê^±Ì¯/Ú„Š8©Â§XJ¶ì‚ÂwüNœÇBæÍ‚„ùgCæßŽ»ÿH²øC¼³x2×É^t’,ý?'8Ž?Êö©øã’I'ûÔ_lýé!#ýn0¤ÚÊ1¸Á³á¹({†Tãätñw©v LHDµu?½“wã<‰n½P ‚˜ùíóèÞ*Õ“wã:1Fõ¤ËQ’ùT`~6bÕšàÏ uTè^)MùzßÁ÷¶ÎÍ“gsþÊ üpÑzÂØèÕp=û­`×Âð £ÚËs “b^~ì ¥Êu~¶ÁÕ¡b°¡À»åk@9øWÏAj‰ÖåùнU¼SwÛžNÑJ óÈÆþÃ$•#v¨7õÑao×x£3h';×K;8¡¿0ov©í?¢Hk?ßlüðÊôùêr86E£Ñ!‚Ú=©`N1P”éÙÚI1?L’Óc"ƒe9ûÑ^„á¹3øWÏaOaêl¢}Ý_ %ʼnD‡Iøõf6Ùë&HÚ=„÷¸Ã3¸*»PÖ`Ý~<:G§tð}­¹¯¦±#¸þÎæmصLømáHñ롾Ù_}Eò¡ ¦ŒÇ8ÂD’äÚ„˜±«.0<÷,þê ˜æIðûèÞUÛóJ)`19)$ó;È!¹6¢2|‡,§ý.t.šrá>ÜúÊNðiÇ‚à›±™*ñÄ{¥íW±ó9nF «÷#ºVÞûC¨ ã³ (¨…‚ Ií£ª‹0|áüÕbõà—M¯ß~èáÖŸïv×ßÑür_µÒ.„)÷qV_q–3ŒW9Õˆ~'„ÊŽ,ð´ ±í«â3|áit}÷Ð-‘õþl¯—TïžÜó%u¬ƒkxƒÇQée¿#æŸ/Iõ‚·z¸µ­Áž=@‚? ©„XeÕ[ÈSŒÜWToÅ~?.ÝëóÒ Œ¬7±Ì “8¢ª§«1„ù¹ž_Ôÿ bF§{½I¤€3zoôÅT Xu¬Ø{~rùC‡þcëgvš7óŒ!áSé©Lb s) tdÜiÁ3§q{§F•ÄÔUÚò'oä"r¹ÑB š8ñæŒÓ&'r×ÈÚ ¡2ø¼Ñߘ߿Šýâ²ïŸÜ Þ슸öï›Mà£ýØÞ>X8\,1uF ¯ÆTŽ'ŒLÛ:éñ1óKTAÖ½Œ\Ìt¤¼¨+–êüHÜG½&›Æ#ÝKÖâ/¡?~àÐlíзp³´k¸öö¦ÞO¨ÒäÖ qœügPÔ!üÆ7`*c†«Œ˜òò=>:VS¨ÉXþEwO2ú¿héëÑÜÎçpLq­ã[}ï÷( )|xðÐû[S~£|û´«ˆèÚÛ›o~ ¨Fm/XãpñdÑMŒÈ×§ð›ß ÎbyÜ Ãx'Ãü¢MPRõŒÞÏYÿ9Orº PÁ:îÆ_à/”—¿í³EcO`¼õðû[ì6/öWßÖ| ð1 óÑ¥¡vªûËy„(Fî]˯§žÊx e±¨Ä´û¬ïŸuå²îžÄ®]wýÿáŽÎPÖ­ÅX}ß]I%þ$tá ‡?Ðú˽àÞàêÛš·`sÚï³-•\Ó.ÔCu©üE4sÓ|Aí”S+H„bl ï ¨ôI\?)êü\ G]tÿËèöS8£s(U"µÅêùÎåÜwúkàÃh•‹Œ] =ÀÕŸk.¾¯ìºãYw±2qT…¯a¿Ó|%¸‹%‘”k[êyí³›]G·ŸB·žÄ1W7.0lY/'?_ç÷>üÖ,‘–n¹€®þ\Sa“Þ‰PK_‹šØ]€FIÜ ŒÙ‡©ßƒ,¿©ìG*K(§žµ v@º÷(¿ŒÖPþjãYœÎÓh66}÷¨kïc«ÐÞ <|øƒÛOéÚ.݈hõ¡æ)lã¼™11 ¯ õƒÓ!M"¡Šè:â4¡²ŒxlÌ`x5Z¿…’.šâPÜfä÷ w%Œk”ÿ«ÞyøƒóÒÝÝPˆhõ¡æ×"< |׸{´kãÞ"¸1ã’ˆâ 7ìPwI7MŸ:üÁÖMUÚ:݈hõg›ß‚|cæB~õTmm„e±„yñaÔ™ÞÊÜ”Møðà‘µ>»w­8™nhD´ú`ó{÷w§Ï[–Ø«[;Ð §âk7V˜Æñɘ¾]cÔJ&fÞ],ÈàmG>Ôúƒ½n»ÍèE€+6]¬mð&à[ÊÌk³kpœÑh¤…ÌB}º%¤M¦ðg"|T)>räC­ÉJ᡽€ÚʵÓ?¹¸|dA½NkPðO¡ä;93‚cF§©%§ðèJGþèÞ_o¯Íúª­—x>´[P›üNŸ›toáÿ~ö›«ÞÝWù¶†§^ïh¾KÁ±q…Ø"“³Ï.†OvFò‰_~lø§¿òøp8æi2æx–kÛ,íæ´SP›OÚ;ÞìY,U•þÄ›î?¹O}GÕU/s5w9pјÃ,dÇ'FxÎ7üýÀ—§Ï®ËŸ¼á÷»O¬J¿?¹.cŽÇý.;Þ6Í“˜žÊûΜËO˜fcÂ1¹ó,U•ó3¯ñNÜw̹cÑS<—O³XqÔ‚«i à:##Ýa@{èÓm åú.Ïý§¿ž_ä—œÈÐhŸ_H7nšÄm˜æ€I=9ÏÜÔ ŽÒUÊ® c~OÚOSïizø$cxzŸÞ¤äxP&•sKŒÛîÿoÆx=fsÆìÓ×ËÀ1­t÷{3š•ñøi¦™M¶ ÜÒ¿ËòÍDÛ™2ÉÇüpÂ^æxÜVˆÍ@ÓIƒih>+óÓ J6:N×ËäÞ“.Êíg¢yÌ ÚÌ +áe ˜[•0»Ä›FϧO@4ÑK¥Ž)y^z+óˆæjÎe(LtœNŒ˜”n˜üsp¿Ø) PÖûljýi\ÄmÑvP†Ðè\4I.Ý8éFÓ¹Fq°ëÝm&úgeþV À|CoW äÁP¦óöÈØm/`’a¨69žÆ5W†²ë“häÇIƒq’A˜Ìì<ã'•iËŒ›mð)‹ÌâÿObøL£h DÇÛq_ôq€Iϳœ+{δ秭÷f‘·Y"ùý¸ãq÷••an¶À2 ¶xmÚçÏZçÍxÖøý´ šåùs¡åhàîÝN=§iüY$[¼¶#´×øj.óž ïÎJÿ¥ Œ„:"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeleteFromQueue.png0000644000175000017500000000364611050625206017662 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/AddToQueue.png0000644000175000017500000000364611050625206016627 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeleteFolder.png0000644000175000017500000000364611050625206017165 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/AddToPlaylist.png0000644000175000017500000000364611050625206017344 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/ShowDeviceTracks.png0000644000175000017500000000364611050625206020037 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/NewFolder.png0000644000175000017500000000364611050625206016514 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/ShowFSTracks.png0000644000175000017500000000364611050625206017150 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeleteTrack.png0000644000175000017500000002324011050625206017006 0ustar aliali‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœ&IDATxÚíi$Å• ?÷ˆ¼ë®®î®¦‹«æÐ.4£F˜íhA, su qÄÚþ][3c’L™ÆÆö÷Œ„ŽY $!nÐh574¨«ï³ººë>òŽÃ÷GDdzDfVeVfV5²~eÞáéîïù»ÝÎÂY8 gá,œ…³pÎÂY8 gá,œ…³pÎÂY8 ú 6º݆»öe0\ }(ú R–"e8ÿ×9µÑ}è&üIÀ]{3øð7ÀåÀ¥ÀN ÝÔ TèöãÀ_/þÛ¥:Dñ¶'€»öfâÀ5ÀMÀ ÀhÍCµˆm Âÿqxxxêß.Ë•7z Ú·%ܵ73\‡âFàZ½kzQ;óØû¿ËÀ ÿÎå¹…›VámC_ϘÀ-Àg€«XÇë V¹à–娅÷Ž0S3±´ –Ù2}XÀÓ(î~ø+röFY3ð¶ €/g>|Å%«>¬ ;é’TXy…]»¤pËà6ƒÒ#FB`&ÁL z· 2[d³MÞüÝw®ÈÝ¿Ñc×DwÏ\øòžÌ_ß>Øð!ÊÅã.K'\ 3ª9D¯d Ò¾1Iïv‰Ô°‰Èå.à+ß}Gî™ ÆáŒ$€/ïÉ\â[ÀõPŸ;%X<ê’p).(”»¾m’ƒ‚žm’þs%2®Ý¬mð£ÀÝß}gî­õmeýØèèpç3ÛÄ“õuùíÒq—¹½.¥eÕšöY»WDå<ÑàU9oõ݉>Áð%’žm Å„ üÅ×¾û®Ü‰ j½égÜùVæÿà!?Yï~aF1õºCiiu̘Iˆ÷ b©*²…ÑZ{”S% «åeOŸX ý‚Íï4HU‡6Òâ"ðµ{Þ•ûçu⺰ápç[™ð]àæz÷ËKŠ©7ò3/„§ÁÇ{!Þ#*3»ÓàÚ!”³PίÌÒ#‚‘wÄ2 ‡øGÀ÷¼;WêNk›ƒ %€;ßÌŒŒŽ¥]‚™ÝÙIUg …‰A¼ârY7=@H¯”sŠÒ2”³õu! gT²é #¹éõið±{®ÌM®OËë´q£~øŽ73ïÃs œ£Šr`fËÒ1·á ¦†é!ÏV 0Ni}<´fJì¯^+r³ŠÂB}® è“ 6û0Üø½+s/¯Kã£mÛˆ½cwæ3À÷€”^oåàä.«P‘É~AfS}_˜§¨¸xàÏ»6®r9°¸‹XJ¨½ïX›Qè)ñŒ`ëû ÌZ-§Üþ½÷äîíà0w´ï;vgðuàï+•þXå§§_uêÚðññf¢ñ» ó`Wo»¥kíw•Ãï'Ô°K›Vžž#›ßí+‰µ·¿|õ{ï]¿`S—Ô¥Z¸ãLÅ€›¢½[<ì™vJ"ÉXzF$±Ôêï¢úϾœ¿¼ø¦Ž¶ÿ©ñ{91¿„÷[b…©KÂÀ˜ œƒì´ÂÖÔ<Ç‚S¯8 ]"é«‘\qÛË™›¿ÿ¾\®£hëB_z##üpcˆêL¿é°|Ò¯Ôµg“'ç×Ô)i’ޝ->Ô¤oG-j¦e‰Œ ‘dg¹¹jÇ•‚Ù½.VV1ti}z𷽜ùØ÷ß×}Nдs»-P|F¾kÁä ÙIU™QB€4`àAfHLêf ¬£Ð.¨–ͱd¸sóG\¬%Ÿ¾åé»;Ý“ŽÀm/g¶¡øª^ç`fÜñ¹¢í ·¾öÞ™¿õöjG,½µ ƒ£†çÞö_ªÌîsqË!«¥øêŸOoëd?:Ëÿ€"´Z90óGå†íü¡­2Ô᎕u‚V¹ÒjÅ4ah«ò¸žwÔE· ÒÀ?t²/#€Û^Ê\¦àvb—»XŰ3k`³A,Þš“ç ÃW žôD¢Þ¡rQ‘;Q# nÿâséË:õ»#¥ø #h¨[†ÜLXéë–¤2¢cJÔF˜•Yß…>¤{%=ý2DÔ¹i× PÊË—?½á Ϧÿ¢ýè Fÿ¬ûùí¼"¿Öúû†Ž)|ÔÀõ]˜ú‘Ò7ù§HTt$§°m¸eWúãJ©?SJ”åãnˆM¦2’D²;¬?ªŒ­ú»^RiIBsä'ýô¨*üÙ~Ÿþx»ýi‹nÙ•6ÒëÊ‹Šb6ìíëüÓaýAŸºÌè2BcXXVØ9aüÓÍ¿O·Òo3Š/¢¸DoQn‚cîéõµþ.ØÛÁh… $‚tF†Æ2Ѝ¸ÅÛiS[ à³ÇO)(Í*Ê¥êìz亰ÍõÄýzµ¯oÐO"õ_P*(ìeMÙòˆà³íôeÍðÅçÓ(®Öëò3á÷ôK £;Ó°¯é-ç+¬¡Äb’LoX!,ÌV'œÏ®þüÓéu'סˆUì~ ¬R5»Ç0 ¯¯³îÞÕ\Ág¸¨¦Ì°‡Ð*©pÞ€‡ƒëÖÚ†vDÀ•3ÖB¸å©´ŸÕdG[*ô€õ‚Në-+i@2UH8ÙH{”†‹aMð…gÓq¥¸VgEål8·/•îö+8ØI°^úŒ^Òé°meºî¥àÚÏý6oªXP\ƒ¢Wú”µÅB@2Ùÿ†+û¢Aô±jÄ)RiúrIyk«b Å5kéÎZEÀMú…%îM¦j3`»WRJ„ðI»Ž<Í)%RˆŽE"IB"È\ÜBä!ÆI³Ð2Üüû´PŠtdEÙªÛˆðf¡RH¾©)ºïpÂÿ]ü" a" ÚÑ¡¿ˆEN‡“gœ<7|öÉtË¿/Òзbs}ö¯ýt*Ý­Ù(Bˆ®hÿB „BÐýåÁ•ß”á@”rAˆ ‹O©Ê½NA:-YXt*×¥¢ÂT¡1ÅÃÍ ­¼·uP|D¿t øŽÇ¦ì<ò½Y!©%ï(ëmØÓð8ÀøÈVBTÏQ ª„Щ6™† ”-ï}®« , ¬ú}„u €ËкåÏþTgذ¨EhÆW‰@T2ïÏ^+@¤‚S¢Šh%ü£NÊõÎ;©´¤¼TånÉK3‡ >ZNi™”·ýjõÚ ßOÆe‡lrv"éˆ×îUE€DˆõXTëý¦ÒC¬RÆ qà‰ïÜçLà‰Xx`•CtóŒK[y´¨~þwib§PnX4öµa‰À’Ê_äÜÃW aø ˜X§Œ ŸH¿-Ò@Ê =žEbHÃÆÀ†×éëEmà +‚u6ÐØù™_µ¦¶ÊÆÀOúôÁu ‰Ã”+Ú4VY±0ÝXY¾<õ”(-ÕC„“>*¶¸ðÎ-Ë­èÝ!…¼Ã©ãžæqï¬rü[™ž*T_³çoá l’+.3ƒ¸J0öJa„Á´£cÍö§%PŠ‘vãºUP ¯¬ñ¸ ‘ä–\$’˜‘ª¼-êÍä<Ôû˜=ZÜ ¬u$e À¦ÂöýÑñÇ(Štoà4²Ý·œ —L¿$¶ÊºHS†¹œÇ”NàíŽÞ@±I¿”Jà*·‚Ã\% ãßì–”‹ Ç‚‹ú®&c µ”õ‰ä²þ¿éØû–¬Óì]ü ±„ ohe΀a Çö£‰æ(›VKZ=•3U«R4Õ !`p³dzÂáÐò³\Ñ-R˜\6zq³ý%pÙѶß…›ßÍpOûk2òå%öŸ~[•9’}Î['±Y®Ê90 p´ì0Q+M{š{“ÿ¾–Z¯è mðá+€zãšÕ@âqÁÀÁâÜÇó¯p^æ*Jv¿¼øcmqw`ç–÷µý…âÑ׿ÀÑì.,·ÀÐf“xBxC`U_€ÿR*j€WÝÒÖ(-iMJѶÂNpÃl>õK Aß I*m0S:ÀBù‡¦w³÷ô†ì–¶.ðÊѧ˜\<Ìti? Ö™>“Lo ÍeÎFxÌ•ò %ЪÚz¹r ›)†–¿´BH„0 oI`Çr/b©Ïx˜¥âìFãªãpjé(¯{’‚³ÀÉüÄã’M#ÉŠ9”Õ&Ži„wOA‰hž` °Î|¿†ç’m­¶r`KÇLƒ‘-IÊ;€í”xrϽžrù'e»ÈSã÷â(›£¹] 6oMaoC„ü+NŸBˆþ’¼–ü­‰XÖ—}‹È„w]µªƒ§âÔÑŽ™LŒþY{Š©â>¦—OðòÑ_o4Þ:O￟lq“ù×):Ë §H%MŸúQD¡EuFÑvU¤®š¢}Ʀih•„’‘D$éÇ©iaÒõ½a"ˆßWŽ‚á‘ñ„Á©â[œ^=þ4“‹‡7wmÞÉ8<ý&‹ÖsåÃd21††“¾1ìU ëç¸*ìy²Fd[i_ë ÿX¤uNCü{5*@ølOTØŸ!%££„PË¿€ëZ<5~åföh?Ca>?Ås¡¬òL^Å4%ÛF3(j8¢¬p†Ú¬ªÀPAIíNÚÝ#…Z®ì\S‰xU[ç4AªD=ö_= RÉ›G2”Ý'‹»É•yfÿÏ7kǵyrϱ]‹ù—q•Íèhf,†žÖ/¤—PâqBC«÷Biøl¶:åmmâ I87Ð+]3ºÉá¢0ªéç‰ZÑ;F¨“þQ!½ƒCz2 ÊGY²&ß¶¦á=Æ\îÓ¥}ì9†‡2ôö$ýl¢0ñ!N B“Bj\Â"À4DØ ¨|µ­À>]¸.薟(}úìp‚,pÛ¶~LÓàdñµªiXxû˜†Gg÷ðÖÉ?wæ˜)í'•гeK¯oêUó jd¿i¢VpU˜ãRxÁ¸°`_+mmÕpLA^ßDaçS¡Pá³2Qé„ê¨@6P‚â1“íÛp•ÍÉÂkXN‰'Çߦa®´Äïöý G•™(¼Š!cÛ}hü•©@Ø7É+ ô?!Ɖ„Þe­È+Õ| ¨e¸ïÚ‚ qª‘À×»Q¿²¡ "×½½)6 õ·g™+bzù/ᦡBñÔÞû(Yy&‹»qT‘sFIÆã5¬=0÷j•ÁˆžGTÆvØwÿM…UÒ¡õºb<¼‡]˜-•ì`oQÉ”Õ5‚T®Š(>'ÐÍB)$£[H¥âÌ”öQpyí 7 _;ö;&±`#gO1ØßÃÐ`¯Ÿ½lhœ.¸ŽeE)¬>ç+ˆBPŽšY5Ç[móZ2(öè¿ñ“·]?k¦êñ ”¼P©è^zµ‹wmHƒó¶ ¤àTáu\噆%»°†fwN/奣¿¡ä.3]ÚK"cìœá–pD)Â×GÒÞªõAÊ(råðžKNxqJy¸é*(Å/•ö£¶RÈ , h»¾fZ2âé’Ú DÓ¾ P*™`ûÖ!,7ÏtiüŒ4 Ëv‘'ÇïÅQ§Š»BqÁ¹[0 ³Ž¢L Q£ M_Ò¯…ï,»Õmw CP¶ÝȆ¢ü²ë¼€bRÿåx$ X°\ßïïk°e¯z-êxÃ×RHF†èïëaÉ:IÖ9Íáé7Ù{ê¥Æ{žÙÿs²ÅfJû(«Û¶ “I§¨AM¿!}G„ê£r¿*ÿ!o9¡1Ž×z'Q­¥„¯‰~z}AëuQó$g9!= èFuŽË꽺Žp!¹`ûfb1“©ÒlUäÙƒ°XhÉäí ŒŸz‘CÓ»É9S,Ùôõ¤Ý<ä~uÉšDa]w¸¨ BçÞ˜†œnNýÿðÏ?Ñš¸&PЇtó£l‡CPÛA)W›ýÕ†YœÎEˆE†meA,ã±Q”²™*½…å”xjü^ÜhZÒ:ÂB~šç>‚­ŠL—Ɖ™&;έ"0¢å‹èDÕ©¡OÝJBb»»jK…’ŠnñÐZú°Ö4Ú§ ˆk)Ë ÈÙ–Ÿ4©9ƒ…wަT¬‚B$ë^÷÷fØ22DÁ]`Ñ:Êôò/ÙÓÐqmžÿ1–Sfº´…ÃŽsÏ!K„Ö VûaTܰâkD¸žç d [.‡Ù¿!k@ЧÖ~vC¡„â¡ÊHp(o»(œˆgËï¬æþ L *70"\À¨ÖIƒó¶m%“J1o¡ä.ñÚ‰g8¹phÝ `×á'˜ÍN²h¥è.²udƒ}}_~ÀªE7}e…3 ®§’ìá»8d-;v¯ý´Þ/øTaMŸ ]s"}T ­°‰’³l·R„‚uu¡kÂ×Q‡PT70„Á%ç‹”‚éò8®²ùíÞŸ¬«ixtnœ7'ž£è.²h£'âüm£UQ¶BÀ«úeûUëGב,·DÞ©*€R@¡èê¦J­ý·EÀc€­o3ª йb…ÑŽ‡¼ƒ"Âêu Â×þÿM'S\pÎ6lUd®|À3 ÷­i˜//ñôÞŸâb3SÞ‹”’œ¯¹¹ëè3ë'¬×èÇ@Ôõ&!`º í½3$®[uÅ£°Q<¶îpÿM…yÏèuÊ[ –EÙ)ElZQa‰!{7b#ëš³ˆ ¤‚­## ÷÷“s§È9Óžy“ñS/vù ÅSã?¡hå™-ïǥ̎±1Ò‰”¿¯Õ]jýý¢v8‚ªï)ØÊVXû/…7 žyðæ×”â>] ŠŠ¸¨2:¥§ Ë苵»˜îûÀA½AÑÏÁ-Z9;¯-ŽÔ;oh×Fä=¹šG%Øyþ…(æ¬ý]5 §–ŽñÒ‘_c©< öQ’‰$—œwAH«÷4ø¨³'¸ü5zŽŸ¥i9»È¢UÇYr.*üwP)õývúÕÖjº=÷ÙîeŸŽ>Ô9Ž"2pQ• Ö²[d$9T5*æPýH ðÍŸèsÑUÂOp]Å|v!Ž%p”ÃöÁ‹:†ü²]ä±Ý÷P´sÌXã(aó΋.!•HTázXTÔ?V×qVù·—Uåùú½ç¼qÛ·xKUë¤d—jû=ôÙâíô­ýå´ŠŸ(Å‹!Q o¿lÛÌ—æª!P4vb—aÝ Z_a©]âÂíçғΰlOPVY^ï°iøû°\œgÑ9†­ \°m;ý½}µŽ¬ˆ¨eõQPèý›-Í‘sª²_ÈÛÃT¹í‹(~ÒnßÚ&€Ÿ² €¯hUVÄ § Ÿ(Ì¢p51ÙåCÓøW´ B3߯& ®Øq1†”Ì[5Ó0ß6ò÷ž~™ƒSoPtçÉ;S õ pþèXo_×Ot F×eÂõz ÷?š› ]LIÊåðG#|å¡Ï[výF¡# ªÇb¹ìS±«€‹ƒ:ÛRÞçÐü~ØJáª"Éaí»|UegÅQ„.KýÍBâ lo'ÌñXŒ™ÅY\UÆPi– ³ìyךûµP˜æWoý?,·À¼½Ÿ˜iòžKßi˜ZL^Ë݆Ø¿ª¹bÁcÿ ÅåC,Ú… ë7dg]/õ« ?üùâ7;»Îí¨ ¸E%>iÛ`FÖN³Ì”f*ì°ª%W‹©/Ç ¶oÞÆÈà0wŽ‚;Çá™·ÖlºÊáÉ=÷b;%#(\®¸p'ÉXRÓEŒÈ¹žðÙH!¬^ëGdª8Ë©âb¨†%qìÐDwQtìû#€>]Ø­àß5Kó.±`ƒ_ög'(8EЈ+…k­ ïž¿®°rÔž¹ü‚$ã –c8ª¼fÓpס'˜Íž$çžÆr³œ»e;›FÂ!ÝP˜7ìá«}BQ=!þ*Qgí²GÃ>!X˜±£fß¿?|sq÷G(¾Š¢²’C)È͇F\»Çqq*ƒ #Š^˜;èQCQ˜"¡V!IļsÇå(‹Î-¡´yÓðØÜ^vO<‹¥räœSôfzÙyÞE5¦iEC«ñûkþMí ÿ++k±{qÇ>µŒßÅ)W—ûŠ¢Š|˜³]èè¦*ã?³—.ýdÌ>Ô¹HW`$ÑÜÄ. å9ÎImÓä½·†@× t›Y„ê뛄Á»Ò‰ ®ë2·<‹ÛR8ÊfûàÅ«ö!_^æñÝߣìYt"%|àÒ÷ˆ'ÁGXeÉ–.ᄟÀåËv*²½jâ)ÍÔ d¿‹â•ùW(¸åÖ_šõ¾¯?ò…â#ÄYÇwUR¨¯+ÔƒúG¤ 9Q‹‚e§À—Þªô¸²Ü9rNÈ%¬?S›l¡×_|îEôõô‘w§°TŽ×Oüž“ Wmýo÷þ„¢•#ëœÀÅæòó/¥7Ý[G »©£îë(Û²þàþ[Ko’u ¡±!+(dÝ(ëÅ×;¯ŽÀCŸ)*7!ÅÒ¼ƒi‡MÃSåydÇý5VÏ´p†QØL!Ž` “÷\ô. i°ìÇU6O­b¾vü&æPTs”Ô£Ã[Û2Vkâ…Ì=Í,´”ˆ)K䙽ÙqN—gÃ&_Y²8W ÞPpó#_lßì‹BWöÕÚ{¿m]ú ó às@&¨/d]zú \mCÇ;KÞ^f49Z“3'"â j2VëòƒD‹D,A2–àôü)\l¤›hhN-ç·ã÷aQ$ë'•HqÕ¥ïÇ0ü]t‚Ùø,Bb@àm)B柨°üà­Ã닯0Q˜ÔqO•L¯ öO×zkñaº]ßZqïÏí×v~Üì>Ô¹—}}®¬®wsp8^|ñ÷ׄq„ap“åüçÜ“œ.Ÿ !^ pç3'ê:§ž>óØíÅ5%y¶ ëBû°Ë;?fþo«¹é÷Š9…´‰^RËÊâXá3åS '¶’ißý«Œ4Žà¥ZkŸtѬ!$†0éß̱©£”Už¸è£¤°XæÂÑ‹¸xÛÅ‘™¯!?Þ}MÁ«Ü€9kšççŸd<»K•Cš~ A~gë.uÿ·=ö¥õA~ƒ®u®ÿaòà_„^O†Î7°Dý}ÎMžÏ{û¯&côj„ +‚ºe`µ×ä;}Œ—¼„I ›"ý™>þú]×`H厫º Žëšk×?.; ¼¼ð Ç‹õW0Ç•dú€ã}õ+ %à®Ç¿TüázãbCàú&ÿxØ¢O iÀȘ‰›®ÿ ‰àâÌ¥\Ùÿ×$D²BB‹´EDzrf`Çïÿ3'0¤Á5WþWzÓÞ.àÁG ªˆW(œ*Â+ÈwpýcÑÉóêÒÓìÏý‘z­–DN±£a]€Ó(>öøÅç7F×ÿ 9†·¤é=z½bqÁȘ‰•¬Ï !ÙcGæÝlOî .SZ:™žV¦çˆ !Xv™_¿òK.»‚ GwPÙv¥!>:ûÝ 1”ÜÇ 8TØÍÉÒQœ:šœÀSô¦ŽØX¥ºúÜ«ÀßQ<¾Q8ØPøè÷“iàÀ§êÝOfÃc&åXãía$‚‘øv¤ßÅŽô»I½u<†~˜Y#‚la™Þ”··rùþ§^p+ç í/ÙóÎïæ@þu¦Ë§©Ï£<ˆ[’™#6Å\g¼ªŸ*¸õ‰;‹í§-µNý~Rw£ø¬÷Lï ¤o›e¬¾OР9Àù©ËÙžº‚^c€Œ9@B¦C¾|t%`³“ ëÖ¡àäÈÚódyNÆ9\x‹E{aÕߎ;žSgy¾a;‹À?ßzâÎÎûö[…3‚øè÷’Ûñç‚@UðÑ ÿ™Á-&™Í¢)BÐÁI‘ idȽôƒôšC€`ÙžeÙ™'ï,QpòÝ‚ŸÚÔ<ÄIö´bîTíÂ=ÿU.ðCàkO|¹xb£Ç:€3ЏîžäÀ·€ë=‹ †¶$–Ù*ºÚ ˜–¤¸ ˜›t°Ê+¶àQàî'¾\|k›¹*œ‘ÀußMþðmàƒ+=' Ÿ3 œ„'±»Yäfó§mÜz~œðOïRð•_ÜU|¦¹_X8£ €ë¾›üðM—À*_ß0°É wHb$ o¥Ý$a˜LÂ(ì’byÆeaºŠñUÞ´ø»_ÜU¼£Çn5x[ÀµßIšxºÁg€«Xåfx5 A"!ˆ%f\`&Àˆ{Á§¬°Ë`å²¢TRØN“\¤ú˜<â>?øÅÿ,Úͽ`ca£ @¬åÞ‡¿Hô‰k…àFÿzßÉQ+^®Íý‡e¿PЇJKê‰ßÝ]ZhãÍb¬ˆU®õº•ž­ùýw3~Þ5Ƈ̈́¸A\l]±%í³â”rxÔ.©‡ÿÊùÝ¡_ÚåoU Î[¹×©V7„n€Xå|¥c£óÕÞE,-äUÿ;þÞÔøˆŒq™\$$‰9Ô…úC\r]uH¹p-öfÔ¯^ø¿å—íBåézˆŒÖ©÷UƒóF×+·tÐIX éÁµŒÔ¥¹¯M­N(Dꉥ…±ã:c[ÿùòB3)†¤IZšô`¨´”^¾¢ë’Sy×&ëÚä킚_<¢zž°òûqF°bÕ unºFDÛÄÐ)Xi&G‘+µ£¬s]ï^#"¡ÁõJÇfúÝÌ _ Á®õ¢êœ¯D(+µsMˆk÷ÿ¯†xÙ  ŽúýzÄÑ,wht½´Šxð?—@iî*Åñ‹~]ï¹FÄP¯}-A«ŸŽÕa%E®ò ÂÈ^©Ô#ˆÕˆšãÍ@32½Uäëwê©ëýr#¿£·GDŽ-A;Àj ]=^(š%‚µrhã5#çõë• ð" íœ:ïÓK=‹¨£J`' ê m$$é}¯á7‚ºÅêÍþFl¿±-h‡êQhPçRÕøÝÈý¡ú €ÍꬿUä¯EŒt»\ J õd¾Ãéëm¬¤ŠUΛ1 µ¡Þý• ˆž7â8ƒbedG¿R›ÖŒ¸NÀjŸzþ€Vìÿ•ޒèh†‚óvÌ÷½`¥÷6C­ÔÕ{O³õÍö{5Ï[+žÀè±Ñy£ç굡cºÀ™ k¼×ìû[íójܪÿ¾Y"jåý·e4p ϶ÓÏf¿©5Þë l4ü)·yC»­Âÿ;)R0,”’"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/ShowQueue.png0000644000175000017500000002352211050625206016547 0ustar aliali‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœ&ÄIDATxÚí{,×]ß?çtOÏÌÎÎݽï§$ëa l!¹ 88PðGˆ)ÊÂ`À$T ` É)ˆvlƒmÅT€$„—±¨„¡([Ž1†?pÂÃ’eð•…¤ òÕ}îÝ{ïîÎ{¦ûüòÇéw÷ÌÎìÎî^¹î¯ª·{º{»Ï9¿ïù½Î›t“nÒMºI7é&ݤ›t“nÒMºI7é&ݤ›t“nÒW?©½.ÀN“<ÒTÀ-À]À2°/·lä¶5àïÔ›[²×uØIúª@ÈìWÿx9ð5À=ÀÂÙáYàào?×?üÕŠ=䑦|;ðÝÀëã3?c6v^>|á3úGZýnƒíЋòHsøNààu@sªÿÛj¿ÿ-à€GOéi­íuÛÌJ/È#Mx3ð&à[ÊØ{Ë&ö¼A0´›ÙKÚ§b7í…2mË$ï üð{À#Î[Zþ^·Ù4ô¢€<Òü^à½ÀÝ™óczæ`†`RŒ6¾ÝØL (Ðn¸EÀðÀÛÞbøÞÍ‹|x›ó–ÖìuÛmF74䑿·ˆð~à'Þg`°ƒë!ãw¨ïiסº¼%PéÖ+GÅç€Ùúìž4àtCÀ|¤ùµÀÃÀw½Ç· ï_ƒQÛ‚`7kª´•Õe»)gâíŸDxÈùÑÖS»Ñ~3Õc¯ &ó‘æ)àÝX]¯3Ã6XƒÎ%uf¯i,Ú]Pá±`’ QS©ŠÜ³+ hoŒ9*`€G€wº?Ú:·×m*úAæ#͇ðn Vv}ÔÖ¹éïÖ ²h÷1ÃÍÿ/Mi@ø}+eüþæÿWY„ÅàÖË @x§ûc­ìn —ÓžÀüv³ ü&ðCe׃>´ÏÃ`}r-* ¶ñ+°gïDY} „QF]&J‰ê4Ž[Cr ýàGÝk v¦´ÓÑžÀüvó8ð1òF^(–;¡wÒ†VÚ2Ük€»`ÏBÛ å‰¿›¢ÔQPÛc) ”}ñç€7¸?Þº¸c¼ í̇›¯ÂPN¦ÛD t/CïJy£*^ûggúN‘пJ©1`­„…ÃZ\à<ð@åÇ[OìEÙ÷Á‡›o> d4¥ÂÚsŒŠÞ>¨Ø?§È¾ñ¡ÕJ…2rk°x[b|¦¨¼¥òÖÖï͹f›Ò® øpS¿¼=>6Ĩ gmoÊ“»`ïxS½fÏ)X÷Ôï¯iO1á=À;*oݽÁ¦]@ð[ÍÖðùîüµþUh_¤Ð*ÔÚž3/#}…S”ÞÙêû= „ 7\¤,³†b‰ôù8ðC•ŸhÍêèn‰vÁo5ÖØ{ ­}Á6Ržjû­®Ÿ'‰üžBD¡0¡ñ¸óMпnã…:í‚"=*ðï'v^ì–õà¢MØøÍS*Ù´c*Ûb¾7 ¿«UÃ,߃8 ü®=_vÿ<·Ú²e´ÒÙº®[×v\#µ=€ðžÝ`ÌŽÃ?øÍæ?þgİÆÞÆY»O“vaáèÊlïØŒâž¯k˜¥;Qއ#ôÆs¨ ƒ[ßI ¡»R´s'KÛîýdëww²L;Zkÿ7›ß€"µ¸X.ŠÈ­AýÐü]»˜ùN³ïÔÂÔÉW žB:Ww ø%°.nÞ.p€ÒêÔ½¨…ƒÈÒÖ0ìÙÿßQÀØÀ–»m“Á: ‹à«Â6;Íþ¯7BøþØ F=è®fïsªówó È|Æ0?¢q 0Á΀@ÄŽ*¡!XÛ¥@пFC³ÞÄ÷þKó¡y—g®²Îÿõæ àï$•†mFÐz!××ÔïŒÁô­Á7 ó³ÿ[TN ´³IÍ€;ºi 8ŽàÔì³%€Þj¶”“D²Ô^Zý×­ ój³¹²@„w‰°ûÞ:“\+QйúÚAO!ªŽ4gc>ä$Á¾;ÀiôÀø›Ä ¦o‚>ˆòÀ[˜Xʱm‚&n(1˜ÌûÞ5OžÍMŒ~­ù2àI Ælï* sF_m¿ÿó¤¸çë:²t,ÌÆü ™sþ‹H;ôü)%Á¤ò¥˜oö݉µ }¯‘½ÏïdoŸÝR¯¨ý›ÖÓóh»yJ€‡‰˜/ > [dt›×ÜYæ›}Ûd>€vÐ'ïE-´Ïs±ØÞRùrÌÇñâFÈ›nÝ&´¤ÛlÔG‰pžWûÍ£ÿÞ|-ÂëÓb± ”$uq*aåÆ5Ô¶À£¾Âè:AÈ|uêëåæC«³mÊA¸ öݸ üž³=ÇÛ« Á¾;mLxÿ­§n“^UøŸÊb˜Â¦’ Ð°Uh®×÷¹ùÚ@&¿-†)S9—oRcÍÊ}êü² Ï\(’ )I0©%A¦ç/Yæë[îG-ì·J?iU³¿ýž•¨¹6˜KNá¶0üÕæ÷ˆðMifö¯gïqªóïÛÆU «agy¾Ì[ÇA‡†¡iÞn Ã)@PÎüûÀõPUË]qk0&Þàx9צ’LB |Sï—šß³í*n矇¿Út÷¥ÏùƒÐ‡M÷þø]…–'|ÌJ ÐŽ ÌåwaÔCú­m?·¼…B4e@0nBžù*d¾rCãÇ­Z?Ø­!f¼aYidGƒ£‚´|_ï?7·…úíJ€ÜMõlÁݺ•x~Oè¯YÏ ·ªè]S 7lBeÐ㫱súÊ\/§¢PÚ 7ž‡þuäüi¤{}Š"o¥•R X¼t¿/yã 1ô@­ý<óCR^¥kHúþ%uÔN1ª$Õìî[¦íÉLá3ìæFùT˜Í#Ö2µ£˜_à Ôp3Ü@ ÖÃQk1j•LÚP:Éé/8ž"Z@Ο†“¯´zvÞ‚Àœû"ÐÏẸU…Ò%=¿‰ý·§Ú@œ*Jˆ T¹$pl¯Èøv=§N›_¹%Ú²s;üoÍe`…h–®Øpon-É}u`äï#¸ãTm2ê%µ3#T ;³sÝcÔŠÃcJÛ^¡PŽÂqÅ+F‚³ï%PÛÚ)b|äÜi¤½j㦋ã…êmææÚYäÒ3èëOázðãhÔÍ&Éê T³qp¤þo·65}ë@øNIMÑN© !¥T6—O;@¯ îz-îí¯AzkÐYE6® ípk­À°›yo˜à˜ÿÅ©Oa%„ ¿fËÜZ‰£b;J^uàVÔ[³ç„`ˆT í+ ¡: [Ï#Á€Ê-÷ ¼(ÍAÙŽˆ$ÝÓ‘ª6l4À¨M#2Ú… |2~!Wàõ6²ñ3³Í%˜b×á;ž>‘_’EQjÊÕ·ž€´.£Ý1ëëçGÚE5¢ êÄ<þ»˜‹O£:`€w×½èæ¡¤Â©]•2ϧàAµh­]DüMýqåb¾è ùˆªpË›™2ˆg ß‘ŽXÅŠ0ì«Æê3í{Òº2ó«wœD¾ø(æÒÓ¨Îyµñîúzô¾Ã)U45Ë#>—û=‰ÂdqjSå *Z§ž,¹abKß1k•·b¼,Óf£lUõ“6‡®Ck‹†àN‘Á?Ž9ûyTû< [ óc_V1voüƒK‚rª(Ž ôÛS åd_/¦!}ÙæOÉÒì¾&óÓÕÿš±•QaªÁ:fãò¦îÏ®‘ÁéG1gŸ™ßÆ»ë>ôÒá¨Î©J( j ®è·¤OçýH…x àÔÀ„ŒÝLèì=’íýYÞLC3©€þ/5víݸ~5@j›4”¯Ý0÷yÔCíY^¿3‰ý¯|Þ.B4ìP¹ë>ôÒJÅý&"_”B”FP™c{oîÝ^œjÈÃiD@¾ì…1²{ÚïoÎÞŸ ·,d’8ò⛢X’©²í=¶"æŸ}ZçÐA‡ÊKïÃY>ZÂôTÆf|M~+T¸Òh(™ã°©ª‹ˆc=ICÃé¦Í)dJ.iô–Yš`6#P¸§TŸå Uþ¿ñ0§ÚA³~iNœÜ‰œþæì㨕¿E®S¹ó~œ¥£D% ØdS¥çÓÿx ñ2fù¡åmd ß3õÌîÊüŠôº~›Þ2ÆÎ‰j¯NõÒ¹“Á“ÿó•ÇàücÐ:‡SsQÕjÍ*Çðt$×û3jÁ^SJ…C½9uí«°MjÓÛ–eNF¶­Mù$`v °˜ÉË›Õ & kªÁ:Òº<û¶KóŸÿêòèîyÜj€r9ÿ$Ò['Ët]ˆ ùûJľ*;¯ªR·¹› ¥¨ ™rñ(™¢k³J€ìL>“ë0SšZGØeW0Å|gå¯qº¨ÙOe±†Ó¹ƒ–Ac¼$ÈŸËù{“c¥BÛ w¯ª. ÜºUc²ƒ&©øRrÏL³-g3…ÅB6ïØß´VÖva°+Ká„ÌÿdÌ|Õ9Oõà>T­†]±=Ñ­¡* Æëû’óeÞÁ˜c•?‚2ÉÎSúõE`ì¨(>¼ÜÀL.ñ¼è- n…ü¾94‚Â(‡ ;@TÓ¼ÍfòÜú*¨T)0{šÈ_ìêÑùèTu©Ø)Â"›GF2m\ÖÞ2f ©Hgò:m ´«Pë Hkuðö²R ç¾ïEDlÇå'\¼€³¼dŠjKè[î×KÕ+‘äYñ5‘ø·DA‘h (ú÷ôcòç¼p&ˆSÁˆV°ÙÒç*_¤,OfâÈl2¹×åܤäJƒ«1¨QÙØE  4îýoÄ't`ÁïvpTpo}UÉB„9++÷“ÉwOGÞ"`×/Ó&‰¦•?)&ån˜)?~V ÐN¿Tƹ#c›'t´Ò_Ûý1…Z}Óî"Ý6j_nÄ/*wÌŒTïŽnËôleEdþÏôþT˜8%”W·‰%•:Ò뤺·aß°DÌ^ "Ù‡+BJThõl´Li´n`ö A`‡âé\bôwEåî× ÷¢ÐËâÿQDçrÇ eãÿñ¿†ª¢ 4x 6€Î^Ý‚Ü;Óm^Ô3`V#0/aoÏØÃã´OÚu  \'\$§›dï&)sÿÑ'ïEÇ]ctæ¯0«ýÿ²¸@Î5ãÿÇ_Ô8yÃP)¨6mrȘ€R®ØÅ8@v›IÌZ͈ù2/©¤¡Ó› ÷vPÈzf³$Ñ¢ªY”yãÜÂÒk“©ë^4&`W1µÏL¯A¹z-×3…Wg•g gÊ U:L˜®”×EE íï¦+˜§§r h]-öþ2÷nL”/œ¸~¥@mÑ ÊE‰Š;I²EÿW²åÚ\¤„GhV p¡›zYb¤@ºw$±ñ¨BÚÕVGŽÚ{Ÿ¤4Î}Y Ÿù ÌÆÕ,Csþ|–É:{ošÑeA ôÞ³3AU¥†‘¬ºLž]ÒÌþw³;€Æƒ-8SÐù6"}2b~("Uà:¶þÃÖæóvGÁ©2|æÏ1­k%º9ªy¢”Í —Ÿ‹ž‘j<ª²ÊAܺJ†GD!h»UèlR”¾g–Þ1[RèVrŸ™ŸVQ˜8,|(úm#hDl…ÐJk›¸—* Sö'_‰,„ xúÏ‘H¤UX>G0ÔõªÌ˜`X.èxž€bÛL¥ó  08)E><3k•·2=¼¸8Qº®Nú\¤ÏòVu(\׿ :v1Á”ƹÿûЧBè ƒ¿M`Ü`Ùèß8û °j6M\åžÛHa†tÉZ 3/µüq~N|&X{.c\§Ô¦]„žÀLj Êä¹°CßaLƒ qtè?ö1‚çC®Cº×¿ŸºãOÏÊk¢›`  S£¥ôÓj¶dÙ˜?žµª[I } »€ñq¢÷ŠâH;v¤¸÷£KA ½ ºß!ˆÇ^2óÿæc˜¾gŸ~}âkw †/‰á™¿¤rìvT½Ö\Û™BÕpRÇu”ÖI<'Gʵeø.ÂyZ¹6ÑBcÛM éöây‘çÀ°øPKZ7?ðÖ¸0AöIÊÁ®f—ö$< U€vñ€iòcæ?Z} ê žø(»‚‹_À?û%ÜC‡QµE”v`à!tÑN¬˜•[·³’¼ºí«Ö­±ç¸YÆGÇÞ¢m&·Ò³m%…žóÓíâù >±ü®Ù¿0²ÕÉ¡B ¹p¤v Cb%ë„ù逊·a³qy²>J1_¯>…ê\‚Îe jWA WN¬­ât¡âXðšTÜÞ±`@¹ˆ¶ß¤í&™¿áLb¼¨X€à- ¼Z8O Ã‰ŠÐ@]DBŠÛÀ~‚ofÚêäÐÏ`c΋qˆÜ¤&…(ÐŽÁ¼º¨Jk”ã ÃÖäì tÏ¿ò%to…ʱãÝ>\}»‚h(yõKø×ñNœDWkHà#þã÷í±±’±Ìu*0”&‚T4ÒîÖ ©M[w­³SÇ _G·c4ŸÙ54®5h½·ùiàqüìÓ´ ¾Ø…!òÁ””*Ð^3lÙÙÂÃäfßæ™ïôVðŽG7š¸e†Jã_{Q» ^õý–«_bxáÕã'ѵšÿn¼ZŒÍuA!ñ$¢ý®MH1Ʋ\é.J{ˆ1IŠ—R`|G2ú?’7>½ü¶ö Úí,•ñ(ðÆh Ëødfú¨ È`•Í’ƒ$vxº£qÕŒ^û2º{yî °Ìÿ zýP TŽžÂ]:XÂt•*[ÎÎψ%AJ:ÐGW‚Ìã†íã-}9äÁ–i[3´ß÷™¡yèÛª—I{&YÐ1& j)œâÄ{®þhC©@Ö/Ä̯;ŽÓHë|§œù:u^kœæ~$µs(§ŠY}Õ\,O‰¡W:•,ê8YÆÊ ǹ^0üLqäïÁ¿¸ýKÏC°ôÎÖŸŸJŸ‹­Õ°ºNp13bg »žÍê^±Ì¯/Ú„Š8©Â§XJ¶ì‚ÂwüNœÇBæÍ‚„ùgCæßŽ»ÿH²øC¼³x2×É^t’,ý?'8Ž?Êö©øã’I'ûÔ_lýé!#ýn0¤ÚÊ1¸Á³á¹({†Tãätñw©v LHDµu?½“wã<‰n½P ‚˜ùíóèÞ*Õ“wã:1Fõ¤ËQ’ùT`~6bÕšàÏ uTè^)MùzßÁ÷¶ÎÍ“gsþÊ üpÑzÂØèÕp=û­`×Âð £ÚËs “b^~ì ¥Êu~¶ÁÕ¡b°¡À»åk@9øWÏAj‰ÖåùнU¼SwÛžNÑJ óÈÆþÃ$•#v¨7õÑao×x£3h';×K;8¡¿0ov©í?¢Hk?ßlüðÊôùêr86E£Ñ!‚Ú=©`N1P”éÙÚI1?L’Óc"ƒe9ûÑ^„á¹3øWÏaOaêl¢}Ý_ %ʼnD‡Iøõf6Ùë&HÚ=„÷¸Ã3¸*»PÖ`Ý~<:G§tð}­¹¯¦±#¸þÎæmصLømáHñ롾Ù_}Eò¡ ¦ŒÇ8ÂD’äÚ„˜±«.0<÷,þê ˜æIðûèÞUÛóJ)`19)$ó;È!¹6¢2|‡,§ý.t.šrá>ÜúÊNðiÇ‚à›±™*ñÄ{¥íW±ó9nF «÷#ºVÞûC¨ ã³ (¨…‚ Ií£ª‹0|áüÕbõà—M¯ß~èáÖŸïv×ßÑür_µÒ.„)÷qV_q–3ŒW9Õˆ~'„ÊŽ,ð´ ±í«â3|áit}÷Ð-‘õþl¯—TïžÜó%u¬ƒkxƒÇQée¿#æŸ/Iõ‚·z¸µ­Áž=@‚? ©„XeÕ[ÈSŒÜWToÅ~?.ÝëóÒ Œ¬7±Ì “8¢ª§«1„ù¹ž_Ôÿ bF§{½I¤€3zoôÅT Xu¬Ø{~rùC‡þcëgvš7óŒ!áSé©Lb s) tdÜiÁ3§q{§F•ÄÔUÚò'oä"r¹ÑB š8ñæŒÓ&'r×ÈÚ ¡2ø¼Ñߘ߿Šýâ²ïŸÜ Þ슸öï›Mà£ýØÞ>X8\,1uF ¯ÆTŽ'ŒLÛ:éñ1óKTAÖ½Œ\Ìt¤¼¨+–êüHÜG½&›Æ#ÝKÖâ/¡?~àÐlíзp³´k¸öö¦ÞO¨ÒäÖ qœügPÔ!üÆ7`*c†«Œ˜òò=>:VS¨ÉXþEwO2ú¿héëÑÜÎçpLq­ã[}ï÷( )|xðÐû[S~£|û´«ˆèÚÛ›o~ ¨Fm/XãpñdÑMŒÈ×§ð›ß ÎbyÜ Ãx'Ãü¢MPRõŒÞÏYÿ9Orº PÁ:îÆ_à/”—¿í³EcO`¼õðû[ì6/öWßÖ| ð1 óÑ¥¡vªûËy„(Fî]˯§žÊx e±¨Ä´û¬ïŸuå²îžÄ®]wýÿáŽÎPÖ­ÅX}ß]I%þ$tá ‡?Ðú˽àÞàêÛš·`sÚï³-•\Ó.ÔCu©üE4sÓ|Aí”S+H„bl ï ¨ôI\?)êü\ G]tÿËèöS8£s(U"µÅêùÎåÜwúkàÃh•‹Œ] =ÀÕŸk.¾¯ìºãYw±2qT…¯a¿Ó|%¸‹%‘”k[êyí³›]G·ŸB·žÄ1W7.0lY/'?_ç÷>üÖ,‘–n¹€®þ\Sa“Þ‰PK_‹šØ]€FIÜ ŒÙ‡©ßƒ,¿©ìG*K(§žµ v@º÷(¿ŒÖPþjãYœÎÓh66}÷¨kïc«ÐÞ <|øƒÛOéÚ.݈hõ¡æ)lã¼™11 ¯ õƒÓ!M"¡Šè:â4¡²ŒxlÌ`x5Z¿…’.šâPÜfä÷ w%Œk”ÿ«ÞyøƒóÒÝÝPˆhõ¡æ×"< |׸{´kãÞ"¸1ã’ˆâ 7ìPwI7MŸ:üÁÖMUÚ:݈hõg›ß‚|cæB~õTmm„e±„yñaÔ™ÞÊÜ”Møðà‘µ>»w­8™nhD´ú`ó{÷w§Ï[–Ø«[;Ð §âk7V˜Æñɘ¾]cÔJ&fÞ],ÈàmG>Ôúƒ½n»ÍèE€+6]¬mð&à[ÊÌk³kpœÑh¤…ÌB}º%¤M¦ðg"|T)>räC­ÉJ᡽€ÚʵÓ?¹¸|dA½NkPðO¡ä;93‚cF§©%§ðèJGþèÞ_o¯Íúª­—x>´[P›üNŸ›toáÿ~ö›«ÞÝWù¶†§^ïh¾KÁ±q…Ø"“³Ï.†OvFò‰_~lø§¿òøp8æi2æx–kÛ,íæ´SP›OÚ;ÞìY,U•þÄ›î?¹O}GÕU/s5w9pјÃ,dÇ'FxÎ7üýÀ—§Ï®ËŸ¼á÷»O¬J¿?¹.cŽÇý.;Þ6Í“˜žÊûΜËO˜fcÂ1¹ó,U•ó3¯ñNÜw̹cÑS<—O³XqÔ‚«i à:##Ýa@{èÓm åú.Ïý§¿ž_ä—œÈÐhŸ_H7nšÄm˜æ€I=9ÏÜÔ ŽÒUÊ® c~OÚOSïizø$cxzŸÞ¤äxP&•sKŒÛîÿoÆx=fsÆìÓ×ËÀ1­t÷{3š•ñøi¦™M¶ ÜÒ¿ËòÍDÛ™2ÉÇüpÂ^æxÜVˆÍ@ÓIƒih>+óÓ J6:N×ËäÞ“.Êíg¢yÌ ÚÌ +áe ˜[•0»Ä›FϧO@4ÑK¥Ž)y^z+óˆæjÎe(LtœNŒ˜”n˜üsp¿Ø) PÖûljýi\ÄmÑvP†Ðè\4I.Ý8éFÓ¹Fq°ëÝm&úgeþV À|CoW äÁP¦óöÈØm/`’a¨69žÆ5W†²ë“häÇIƒq’A˜Ìì<ã'•iËŒ›mð)‹ÌâÿObøL£h DÇÛq_ôq€Iϳœ+{δ秭÷f‘·Y"ùý¸ãq÷••an¶À2 ¶xmÚçÏZçÍxÖøý´ šåùs¡åhàîÝN=§iüY$[¼¶#´×øj.óž ïÎJÿ¥ Œ„:"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/TransferFile.png0000644000175000017500000000364611050625206017213 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/DeletePlaylist.png0000644000175000017500000000364611050625206017553 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/TransferTrack.png0000644000175000017500000002324011050625206017370 0ustar aliali‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœ&IDATxÚíi$Å• ?÷ˆ¼ë®®î®¦‹«æÐ.4£F˜íhA, su qÄÚþ][3c’L™ÆÆö÷Œ„ŽY $!nÐh574¨«ï³ººë>òŽÃ÷GDdzDfVeVfV5²~eÞáéîïù»ÝÎÂY8 gá,œ…³pÎÂY8 gá,œ…³pÎÂY8 ú 6º݆»öe0\ }(ú R–"e8ÿ×9µÑ}è&üIÀ]{3øð7ÀåÀ¥ÀN ÝÔ TèöãÀ_/þÛ¥:Dñ¶'€»öfâÀ5ÀMÀ ÀhÍCµˆm Âÿqxxxêß.Ë•7z Ú·%ܵ73\‡âFàZ½kzQ;óØû¿ËÀ ÿÎå¹…›VámC_ϘÀ-Àg€«XÇë V¹à–娅÷Ž0S3±´ –Ù2}XÀÓ(î~ø+röFY3ð¶ €/g>|Å%«>¬ ;é’TXy…]»¤pËà6ƒÒ#FB`&ÁL z· 2[d³MÞüÝw®ÈÝ¿Ñc×DwÏ\øòžÌ_ß>Øð!ÊÅã.K'\ 3ª9D¯d Ò¾1Iïv‰Ô°‰Èå.à+ß}Gî™ ÆáŒ$€/ïÉ\â[ÀõPŸ;%X<ê’p).(”»¾m’ƒ‚žm’þs%2®Ý¬mð£ÀÝß}gî­õmeýØèèpç3ÛÄ“õuùíÒq—¹½.¥eÕšöY»WDå<ÑàU9oõ݉>Áð%’žm Å„ üÅ×¾û®Ü‰ j½égÜùVæÿà!?Yï~aF1õºCiiu̘Iˆ÷ b©*²…ÑZ{”S% «åeOŸX ý‚Íï4HU‡6Òâ"ðµ{Þ•ûçu⺰ápç[™ð]àæz÷ËKŠ©7ò3/„§ÁÇ{!Þ#*3»ÓàÚ!”³PίÌÒ#‚‘wÄ2 ‡øGÀ÷¼;WêNk›ƒ %€;ßÌŒŒŽ¥]‚™ÝÙIUg …‰A¼ârY7=@H¯”sŠÒ2”³õu! gT²é #¹éõið±{®ÌM®OËë´q£~øŽ73ïÃs œ£Šr`fËÒ1·á ¦†é!ÏV 0Ni}<´fJì¯^+r³ŠÂB}® è“ 6û0Üø½+s/¯Kã£mÛˆ½cwæ3À÷€”^oåàä.«P‘É~AfS}_˜§¨¸xàÏ»6®r9°¸‹XJ¨½ïX›Qè)ñŒ`ëû ÌZ-§Üþ½÷äîíà0w´ï;vgðuàï+•þXå§§_uêÚðññf¢ñ» ó`Wo»¥kíw•Ãï'Ô°K›Vžž#›ßí+‰µ·¿|õ{ï]¿`S—Ô¥Z¸ãLÅ€›¢½[<ì™vJ"ÉXzF$±Ôêï¢úϾœ¿¼ø¦Ž¶ÿ©ñ{91¿„÷[b…©KÂÀ˜ œƒì´ÂÖÔ<Ç‚S¯8 ]"é«‘\qÛË™›¿ÿ¾\®£hëB_z##üpcˆêL¿é°|Ò¯Ôµg“'ç×Ô)i’ޝ->Ô¤oG-j¦e‰Œ ‘dg¹¹jÇ•‚Ù½.VV1ti}z𷽜ùØ÷ß×}Nдs»-P|F¾kÁä ÙIU™QB€4`àAfHLêf ¬£Ð.¨–ͱd¸sóG\¬%Ÿ¾åé»;Ý“ŽÀm/g¶¡øª^ç`fÜñ¹¢í ·¾öÞ™¿õöjG,½µ ƒ£†çÞö_ªÌîsqË!«¥øêŸOoëd?:Ëÿ€"´Z90óGå†íü¡­2Ô᎕u‚V¹ÒjÅ4ah«ò¸žwÔE· ÒÀ?t²/#€Û^Ê\¦àvb—»XŰ3k`³A,Þš“ç ÃW žôD¢Þ¡rQ‘;Q# nÿâséË:õ»#¥ø #h¨[†ÜLXéë–¤2¢cJÔF˜•Yß…>¤{%=ý2DÔ¹i× PÊË—?½á Ϧÿ¢ýè Fÿ¬ûùí¼"¿Öúû†Ž)|ÔÀõ]˜ú‘Ò7ù§HTt$§°m¸eWúãJ©?SJ”åãnˆM¦2’D²;¬?ªŒ­ú»^RiIBsä'ýô¨*üÙ~Ÿþx»ýi‹nÙ•6ÒëÊ‹Šb6ìíëüÓaýAŸºÌè2BcXXVØ9aüÓÍ¿O·Òo3Š/¢¸DoQn‚cîéõµþ.ØÛÁh… $‚tF†Æ2Ѝ¸ÅÛiS[ à³ÇO)(Í*Ê¥êìz亰ÍõÄýzµ¯oÐO"õ_P*(ìeMÙòˆà³íôeÍðÅçÓ(®Öëò3á÷ôK £;Ó°¯é-ç+¬¡Äb’LoX!,ÌV'œÏ®þüÓéu'סˆUì~ ¬R5»Ç0 ¯¯³îÞÕ\Ág¸¨¦Ì°‡Ð*©pÞ€‡ƒëÖÚ†vDÀ•3ÖB¸å©´ŸÕdG[*ô€õ‚Në-+i@2UH8ÙH{”†‹aMð…gÓq¥¸VgEål8·/•îö+8ØI°^úŒ^Òé°meºî¥àÚÏý6oªXP\ƒ¢Wú”µÅB@2Ùÿ†+û¢Aô±jÄ)RiúrIyk«b Å5kéÎZEÀMú…%îM¦j3`»WRJ„ðI»Ž<Í)%RˆŽE"IB"È\ÜBä!ÆI³Ð2Üüû´PŠtdEÙªÛˆðf¡RH¾©)ºïpÂÿ]ü" a" ÚÑ¡¿ˆEN‡“gœ<7|öÉtË¿/Òзbs}ö¯ýt*Ý­Ù(Bˆ®hÿB „BÐýåÁ•ß”á@”rAˆ ‹O©Ê½NA:-YXt*×¥¢ÂT¡1ÅÃÍ ­¼·uP|D¿t øŽÇ¦ì<ò½Y!©%ï(ëmØÓð8ÀøÈVBTÏQ ª„Щ6™† ”-ï}®« , ¬ú}„u €ËкåÏþTgذ¨EhÆW‰@T2ïÏ^+@¤‚S¢Šh%ü£NÊõÎ;©´¤¼TånÉK3‡ >ZNi™”·ýjõÚ ßOÆe‡lrv"éˆ×îUE€DˆõXTëý¦ÒC¬RÆ qà‰ïÜçLà‰Xx`•CtóŒK[y´¨~þwib§PnX4öµa‰À’Ê_äÜÃW aø ˜X§Œ ŸH¿-Ò@Ê =žEbHÃÆÀ†×éëEmà +‚u6ÐØù™_µ¦¶ÊÆÀOúôÁu ‰Ã”+Ú4VY±0ÝXY¾<õ”(-ÕC„“>*¶¸ðÎ-Ë­èÝ!…¼Ã©ãžæqï¬rü[™ž*T_³çoá l’+.3ƒ¸J0öJa„Á´£cÍö§%PŠ‘vãºUP ¯¬ñ¸ ‘ä–\$’˜‘ª¼-êÍä<Ôû˜=ZÜ ¬u$e À¦ÂöýÑñÇ(Štoà4²Ý·œ —L¿$¶ÊºHS†¹œÇ”NàíŽÞ@±I¿”Jà*·‚Ã\% ãßì–”‹ Ç‚‹ú®&c µ”õ‰ä²þ¿éØû–¬Óì]ü ±„ ohe΀a Çö£‰æ(›VKZ=•3U«R4Õ !`p³dzÂáÐò³\Ñ-R˜\6zq³ý%pÙѶß…›ßÍpOûk2òå%öŸ~[•9’}Î['±Y®Ê90 p´ì0Q+M{š{“ÿ¾–Z¯è mðá+€zãšÕ@âqÁÀÁâÜÇó¯p^æ*Jv¿¼øcmqw`ç–÷µý…âÑ׿ÀÑì.,·ÀÐf“xBxC`U_€ÿR*j€WÝÒÖ(-iMJѶÂNpÃl>õK Aß I*m0S:ÀBù‡¦w³÷ô†ì–¶.ðÊѧ˜\<Ìti? Ö™>“Lo ÍeÎFxÌ•ò %ЪÚz¹r ›)†–¿´BH„0 oI`Çr/b©Ïx˜¥âìFãªãpjé(¯{’‚³ÀÉüÄã’M#ÉŠ9”Õ&Ži„wOA‰hž` °Î|¿†ç’m­¶r`KÇLƒ‘-IÊ;€í”xrϽžrù'e»ÈSã÷â(›£¹] 6oMaoC„ü+NŸBˆþ’¼–ü­‰XÖ—}‹È„w]µªƒ§âÔÑŽ™LŒþY{Š©â>¦—OðòÑ_o4Þ:O￟lq“ù×):Ë §H%MŸúQD¡EuFÑvU¤®š¢}Ʀih•„’‘D$éÇ©iaÒõ½a"ˆßWŽ‚á‘ñ„Á©â[œ^=þ4“‹‡7wmÞÉ8<ý&‹ÖsåÃd21††“¾1ìU ëç¸*ìy²Fd[i_ë ÿX¤uNCü{5*@ølOTØŸ!%££„PË¿€ëZ<5~åföh?Ca>?Ås¡¬òL^Å4%ÛF3(j8¢¬p†Ú¬ªÀPAIíNÚÝ#…Z®ì\S‰xU[ç4AªD=ö_= RÉ›G2”Ý'‹»É•yfÿÏ7kǵyrϱ]‹ù—q•Íèhf,†žÖ/¤—PâqBC«÷Biøl¶:åmmâ I87Ð+]3ºÉá¢0ªéç‰ZÑ;F¨“þQ!½ƒCz2 ÊGY²&ß¶¦á=Æ\îÓ¥}ì9†‡2ôö$ýl¢0ñ!N B“Bj\Â"À4DØ ¨|µ­À>]¸.薟(}úìp‚,pÛ¶~LÓàdñµªiXxû˜†Gg÷ðÖÉ?wæ˜)í'•гeK¯oêUó jd¿i¢VpU˜ãRxÁ¸°`_+mmÕpLA^ßDaçS¡Pá³2Qé„ê¨@6P‚â1“íÛp•ÍÉÂkXN‰'Çߦa®´Äïöý G•™(¼Š!cÛ}hü•©@Ø7É+ ô?!Ɖ„Þe­È+Õ| ¨e¸ïÚ‚ qª‘À×»Q¿²¡ "×½½)6 õ·g™+bzù/ᦡBñÔÞû(Yy&‹»qT‘sFIÆã5¬=0÷j•ÁˆžGTÆvØwÿM…UÒ¡õºb<¼‡]˜-•ì`oQÉ”Õ5‚T®Š(>'ÐÍB)$£[H¥âÌ”öQpyí 7 _;ö;&±`#gO1ØßÃÐ`¯Ÿ½lhœ.¸ŽeE)¬>ç+ˆBPŽšY5Ç[móZ2(öè¿ñ“·]?k¦êñ ”¼P©è^zµ‹wmHƒó¶ ¤àTáu\噆%»°†fwN/奣¿¡ä.3]ÚK"cìœá–pD)Â×GÒÞªõAÊ(råðžKNxqJy¸é*(Å/•ö£¶RÈ , h»¾fZ2âé’Ú DÓ¾ P*™`ûÖ!,7ÏtiüŒ4 Ëv‘'ÇïÅQ§Š»BqÁ¹[0 ³Ž¢L Q£ M_Ò¯…ï,»Õmw CP¶ÝȆ¢ü²ë¼€bRÿåx$ X°\ßïïk°e¯z-êxÃ×RHF†èïëaÉ:IÖ9Íáé7Ù{ê¥Æ{žÙÿs²ÅfJû(«Û¶ “I§¨AM¿!}G„ê£r¿*ÿ!o9¡1Ž×z'Q­¥„¯‰~z}AëuQó$g9!= èFuŽË꽺Žp!¹`ûfb1“©ÒlUäÙƒ°XhÉäí ŒŸz‘CÓ»É9S,Ùôõ¤Ý<ä~uÉšDa]w¸¨ BçÞ˜†œnNýÿðÏ?Ñš¸&PЇtó£l‡CPÛA)W›ýÕ†YœÎEˆE†meA,ã±Q”²™*½…å”xjü^ÜhZÒ:ÂB~šç>‚­ŠL—Ɖ™&;έ"0¢å‹èDÕ©¡OÝJBb»»jK…’ŠnñÐZú°Ö4Ú§ ˆk)Ë ÈÙ–Ÿ4©9ƒ…wަT¬‚B$ë^÷÷fØ22DÁ]`Ñ:Êôò/ÙÓÐqmžÿ1–Sfº´…ÃŽsÏ!K„Ö VûaTܰâkD¸žç d [.‡Ù¿!k@ЧÖ~vC¡„â¡ÊHp(o»(œˆgËï¬æþ L *70"\À¨ÖIƒó¶m%“J1o¡ä.ñÚ‰g8¹phÝ `×á'˜ÍN²h¥è.²udƒ}}_~ÀªE7}e…3 ®§’ìá»8d-;v¯ý´Þ/øTaMŸ ]s"}T ­°‰’³l·R„‚uu¡kÂ×Q‡PT70„Á%ç‹”‚éò8®²ùíÞŸ¬«ixtnœ7'ž£è.²h£'âüm£UQ¶BÀ«úeûUëGב,·DÞ©*€R@¡èê¦J­ý·EÀc€­o3ª йb…ÑŽ‡¼ƒ"Âêu Â×þÿM'S\pÎ6lUd®|À3 ÷­i˜//ñôÞŸâb3SÞ‹”’œ¯¹¹ëè3ë'¬×èÇ@Ôõ&!`º í½3$®[uÅ£°Q<¶îpÿM…yÏèuÊ[ –EÙ)ElZQa‰!{7b#ëš³ˆ ¤‚­## ÷÷“s§È9Óžy“ñS/vù ÅSã?¡hå™-ïǥ̎±1Ò‰”¿¯Õ]jýý¢v8‚ªï)ØÊVXû/…7 žyðæ×”â>] ŠŠ¸¨2:¥§ Ë苵»˜îûÀA½AÑÏÁ-Z9;¯-ŽÔ;oh×Fä=¹šG%Øyþ…(æ¬ý]5 §–ŽñÒ‘_c©< öQ’‰$—œwAH«÷4ø¨³'¸ü5zŽŸ¥i9»È¢UÇYr.*üwP)õývúÕÖjº=÷ÙîeŸŽ>Ô9Ž"2pQ• Ö²[d$9T5*æPýH ðÍŸèsÑUÂOp]Å|v!Ž%p”ÃöÁ‹:†ü²]ä±Ý÷P´sÌXã(aó΋.!•HTázXTÔ?V×qVù·—Uåùú½ç¼qÛ·xKUë¤d—jû=ôÙâíô­ýå´ŠŸ(Å‹!Q o¿lÛÌ—æª!P4vb—aÝ Z_a©]âÂíçғΰlOPVY^ï°iøû°\œgÑ9†­ \°m;ý½}µŽ¬ˆ¨eõQPèý›-Í‘sª²_ÈÛÃT¹í‹(~ÒnßÚ&€Ÿ² €¯hUVÄ § Ÿ(Ì¢p51ÙåCÓøW´ B3߯& ®Øq1†”Ì[5Ó0ß6ò÷ž~™ƒSoPtçÉ;S õ pþèXo_×Ot F×eÂõz ÷?š› ]LIÊåðG#|å¡Ï[výF¡# ªÇb¹ìS±«€‹ƒ:ÛRÞçÐü~ØJáª"Éaí»|UegÅQ„.KýÍBâ lo'ÌñXŒ™ÅY\UÆPi– ³ìyךûµP˜æWoý?,·À¼½Ÿ˜iòžKßi˜ZL^Ë݆Ø¿ª¹bÁcÿ ÅåC,Ú… ë7dg]/õ« ?üùâ7;»Îí¨ ¸E%>iÛ`FÖN³Ì”f*ì°ª%W‹©/Ç ¶oÞÆÈà0wŽ‚;Çá™·ÖlºÊáÉ=÷b;%#(\®¸p'ÉXRÓEŒÈ¹žðÙH!¬^ëGdª8Ë©âb¨†%qìÐDwQtìû#€>]Ø­àß5Kó.±`ƒ_ög'(8EЈ+…k­ ïž¿®°rÔž¹ü‚$ã –c8ª¼fÓpס'˜Íž$çžÆr³œ»e;›FÂ!ÝP˜7ìá«}BQ=!þ*Qgí²GÃ>!X˜±£fß¿?|sq÷G(¾Š¢²’C)È͇F\»Çqq*ƒ #Š^˜;èQCQ˜"¡V!IļsÇå(‹Î-¡´yÓðØÜ^vO<‹¥räœSôfzÙyÞE5¦iEC«ñûkþMí ÿ++k±{qÇ>µŒßÅ)W—ûŠ¢Š|˜³]èè¦*ã?³—.ýdÌ>Ô¹HW`$ÑÜÄ. å9ÎImÓä½·†@× t›Y„ê뛄Á»Ò‰ ®ë2·<‹ÛR8ÊfûàÅ«ö!_^æñÝߣìYt"%|àÒ÷ˆ'ÁGXeÉ–.ᄟÀåËv*²½jâ)ÍÔ d¿‹â•ùW(¸åÖ_šõ¾¯?ò…â#ÄYÇwUR¨¯+ÔƒúG¤ 9Q‹‚e§À—Þªô¸²Ü9rNÈ%¬?S›l¡×_|îEôõô‘w§°TŽ×Oüž“ Wmýo÷þ„¢•#ëœÀÅæòó/¥7Ý[G »©£îë(Û²þàþ[Ko’u ¡±!+(dÝ(ëÅ×;¯ŽÀCŸ)*7!ÅÒ¼ƒi‡MÃSåydÇý5VÏ´p†QØL!Ž` “÷\ô. i°ìÇU6O­b¾vü&æPTs”Ô£Ã[Û2Vkâ…Ì=Í,´”ˆ)K䙽ÙqN—gÃ&_Y²8W ÞPpó#_lßì‹BWöÕÚ{¿m]ú ó às@&¨/d]zú \mCÇ;KÞ^f49Z“3'"â j2VëòƒD‹D,A2–àôü)\l¤›hhN-ç·ã÷aQ$ë'•HqÕ¥ïÇ0ü]t‚Ùø,Bb@àm)B柨°üà­Ã닯0Q˜ÔqO•L¯ öO×zkñaº]ßZqïÏí×v~Üì>Ô¹—}}®¬®wsp8^|ñ÷ׄq„ap“åüçÜ“œ.Ÿ !^ pç3'ê:§ž>óØíÅ5%y¶ ëBû°Ë;?fþo«¹é÷Š9…´‰^RËÊâXá3åS '¶’ißý«Œ4Žà¥ZkŸtѬ!$†0éß̱©£”Už¸è£¤°XæÂÑ‹¸xÛÅ‘™¯!?Þ}MÁ«Ü€9kšççŸd<»K•Cš~ A~gë.uÿ·=ö¥õA~ƒ®u®ÿaòà_„^O†Î7°Dý}ÎMžÏ{û¯&côj„ +‚ºe`µ×ä;}Œ—¼„I ›"ý™>þú]×`H厫º Žëšk×?.; ¼¼ð Ç‹õW0Ç•dú€ã}õ+ %à®Ç¿TüázãbCàú&ÿxØ¢O iÀȘ‰›®ÿ ‰àâÌ¥\Ùÿ×$D²BB‹´EDzrf`Çïÿ3'0¤Á5WþWzÓÞ.àÁG ªˆW(œ*Â+ÈwpýcÑÉóêÒÓìÏý‘z­–DN±£a]€Ó(>öøÅç7F×ÿ 9†·¤é=z½bqÁȘ‰•¬Ï !ÙcGæÝlOî .SZ:™žV¦çˆ !Xv™_¿òK.»‚ GwPÙv¥!>:ûÝ 1”ÜÇ 8TØÍÉÒQœ:šœÀSô¦ŽØX¥ºúÜ«ÀßQ<¾Q8ØPøè÷“iàÀ§êÝOfÃc&åXãía$‚‘øv¤ßÅŽô»I½u<†~˜Y#‚la™Þ”··rùþ§^p+ç í/ÙóÎïæ@þu¦Ë§©Ï£<ˆ[’™#6Å\g¼ªŸ*¸õ‰;‹í§-µNý~Rw£ø¬÷Lï ¤o›e¬¾OР9Àù©ËÙžº‚^c€Œ9@B¦C¾|t%`³“ ëÖ¡àäÈÚódyNÆ9\x‹E{aÕߎ;žSgy¾a;‹À?ßzâÎÎûö[…3‚øè÷’Ûñç‚@UðÑ ÿ™Á-&™Í¢)BÐÁI‘ idȽôƒôšC€`ÙžeÙ™'ï,QpòÝ‚ŸÚÔ<ÄIö´bîTíÂ=ÿU.ðCàkO|¹xb£Ç:€3ЏîžäÀ·€ë=‹ †¶$–Ù*ºÚ ˜–¤¸ ˜›t°Ê+¶àQàî'¾\|k›¹*œ‘ÀußMþðmàƒ+=' Ÿ3 œ„'±»Yäfó§mÜz~œðOïRð•_ÜU|¦¹_X8£ €ë¾›üðM—À*_ß0°É wHb$ o¥Ý$a˜LÂ(ì’byÆeaºŠñUÞ´ø»_ÜU¼£Çn5x[ÀµßIšxºÁg€«Xåfx5 A"!ˆ%f\`&Àˆ{Á§¬°Ë`å²¢TRØN“\¤ú˜<â>?øÅÿ,Úͽ`ca£ @¬åÞ‡¿Hô‰k…àFÿzßÉQ+^®Íý‡e¿PЇJKê‰ßÝ]ZhãÍb¬ˆU®õº•ž­ùýw3~Þ5Ƈ̈́¸A\l]±%í³â”rxÔ.©‡ÿÊùÝ¡_ÚåoU Î[¹×©V7„n€Xå|¥c£óÕÞE,-äUÿ;þÞÔøˆŒq™\$$‰9Ô…úC\r]uH¹p-öfÔ¯^ø¿å—íBåézˆŒÖ©÷UƒóF×+·tÐIX éÁµŒÔ¥¹¯M­N(Dꉥ…±ã:c[ÿùòB3)†¤IZšô`¨´”^¾¢ë’Sy×&ëÚä킚_<¢zž°òûqF°bÕ unºFDÛÄÐ)Xi&G‘+µ£¬s]ï^#"¡ÁõJÇfúÝÌ _ Á®õ¢êœ¯D(+µsMˆk÷ÿ¯†xÙ  ŽúýzÄÑ,wht½´Šxð?—@iî*Åñ‹~]ï¹FÄP¯}-A«ŸŽÕa%E®ò ÂÈ^©Ô#ˆÕˆšãÍ@32½Uäëwê©ëýr#¿£·GDŽ-A;Àj ]=^(š%‚µrhã5#çõë• ð" íœ:ïÓK=‹¨£J`' ê m$$é}¯á7‚ºÅêÍþFl¿±-h‡êQhPçRÕøÝÈý¡ú €ÍꬿUä¯EŒt»\ J õd¾Ãéëm¬¤ŠUΛ1 µ¡Þý• ˆž7â8ƒbedG¿R›ÖŒ¸NÀjŸzþ€Vìÿ•ޒèh†‚óvÌ÷½`¥÷6C­ÔÕ{O³õÍö{5Ï[+žÀè±Ñy£ç굡cºÀ™ k¼×ìû[íójܪÿ¾Y"jåý·e4p ϶ÓÏf¿©5Þë l4ü)·yC»­Âÿ;)R0,”’"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/ActionBar/NewPlaylist.png0000644000175000017500000000364611050625206017102 0ustar aliali‰PNG  IHDR€€Ã>aËmIDATxœíÁnã6†‡´[¯Sd ú˜=î©§¼Àžú&E/»Ý<Ñ¢{(¤ÙC¢­ªÈ¤DÎÿHü¶Æ¤&â§gDËÆ{OMÛ•­í@S]í9:1Æ™×·ÅCÊV¢˜1Æxæ–+˜×¿mŒD%õƒoŒa‹Ü&(ÓŸþÆœ?|øðËñx¼÷‹r†¾ºUª¿Æ˜Ùû˜ÓÇD_îË—/Ÿ?þÃ{ï²vô*¶KÀn·ûùþþþ×ýž¥Ë&úDï=9çh¿ßÓáp8}úôéwk­qÎeŸYÙ£å½÷ÖÚ¾~ýú÷ÝÝÝO—ËåÍç®±3&¥]ªm¨q¸цƒtm›÷~öëq[çÜwÎç3=>>vƘ½1¦›õDÄ9°¯“”É,ÝžÓ.Õ6Ô”áû©×S¡ûšíÚkk-Yk¿onë·Ó˘±ÍDÒ@R÷×k)Ã×)„ÚqÌ/¦$V@€ §]¯%„ê3× F¡]DÛƒ`øž#D2‰WS H¹†¯• W©‰\mæÎÆŸ…ûq¿Ü5V¸Mã÷9ŒûT{ X£¤!˜ ùã}pEv¶ˆâgiÃm×Úp©h d“€@ž¡¦C ‰Í ðc,íT©„l©¼-@ ¡ju€T2sk)¤ø4Gl  Lé¹ÄXÄjœbŸ ÌôKÛÆÊ… =5ð°`(jÝJ&ʃ  8s70Õ&u+9Å&%—€)K¹¨¤FkÛ$$> ,5hk‚@erP;ÒwC¯ÕD€˜4CÓ®×B6 èC˜Èi‡`ø^U@ƒÁ±R!€ŸŒ…rðQü*A n±°¤jUòÌÕÁø½šP£H¢YK ’x¨ù&‘t š¿²> Üœ‘èOž¡–¬'à–Ú»!›ÇŠA %ÕwcûBñc®BÀ_ÆB8ø(~,… 4„­Ö¼˜jC‰HSJ™T§h5wSm(iJ%&‚°ß Lm'AIxÆRU $Zg$(éGiAdRÅÛPjêC!|?#A{BH!?Rç½ÔNS>Â5ƱÔ, JëDN±ÐW¯òp üR{@„2?¸ÕQÀjC fM`IÛ– h‰Ú¸ÚB_’8Ôž²¯T?rUµj+}ðQüPõ'…¦Ú4œ¥m)‚¨¤Úbmfù(}M0u€T›†¢2Pu€Þ¶ô k€ÛÁ¥1»früP1 œÒ @ðCJÐi`È^úà£øÁ­êˆ‰ÙBöA¾Š~=¼4×ptŠÖböµNä!(^ˆÙ%Î\$üÈ SNæ@³k… Çè4ðÚ/†¯?¤$ Ñ: @òCå²ð&>© V@ˆè—ˆBP®e`4BPì!Q½=Ö>ÕŽ20%#‡ Öôvíg§„Ðià”r©ÖpðK×$Ä€µvÑC¢b¶ÜöÚ‹>%Uí!Q1[nû”3w‹TO%!Ù/¯öjðG$± 5ƒçh„¹b»8÷q¦ ‚4?àÓÀ±ƒ“·Ü¾CöÔƒ_n©[.Ù·†Ô’[°¿’k—8s×|X#Rl ¶J`L ‚¯ þ¬©T°rü€Ïšt êv0j@‰Ë¤êµÒǵB ²Ð à“ʯ‡Ïm[z¢Vj_œR]˜s€ à†‡CE~:6fß ©íT¤ýãâkdÒ,4äÊßX"`m„ìÚ!€[,ErÛ¯‚*?³å´m,ôªà¢40ô­ÕZÔÈLBÛ9² Øo£¦H¤ÚZ(ØvNßE¡›„X#Àp]@ès)6ɶRûÖÁ¦ÒÀÁ[­înàÚ!࣭ڸÔ. ×8"lb Vú˜ |H¤oö¯ )©øÑ¨Úm%þ'V³*X²mN{tZ`fÛœöÈ´:À‚¶¹~-ì¬rU0*!{-Z˜àSnûÔ¤ÜåÐZmÑ RÑRpƒ`ž]}€xí–º”Hù¥. @ør¨Æª`È®* ˜r1lׄ±Ðî2¶•Ú·dÆë Yk=ù÷ïßßœN'º\.ÿ³Çna^³ÏÙ>ué Ù—ú€¦ãñø#9®þ²¸½½5çó™îîîþúøñãoÇãñäœ{YæúrÉÜ*F¥.‡OÑn·ûçáááOk­uÎu}š\'­µæÝ»wööööðíÛ·º®»!¢ÝµÏsÖ Jvey"z&¢Gc̳sÓlˆ^΂Ãá°Ûívöt:"ZO½÷ôüüL]7jç].—7—›¡O9BƒËC]×ùîå 9Ïä Ë€ˆèééÉQ†c]בsË.mÎ9rÎÁ –”Œ1†kà¿÷¹•ƒ×4­¶*xãú¼g‡K^º ¤IEND®B`‚qlix-0.2.6/pixmaps/device.png0000644000175000017500000004474311050625206014227 0ustar aliali‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ-‡ú„ IDATxÚܽWlÙu¦÷­½Ï9™YiÊWݪëûúön aº €-Dr¨)j(M„¤`(4 =Ì<èIz^¨PÄÈMÌŒÄ!AÍ¢H‚@7€ÐpF{sûzSÞ¥?fï­‡s2+3+ËÜ60ÌU7ëäÉ“{­½Ö¿þeŽðäqòÜC’ý*=O ¨ì§ yúÀÐìg $@4ð:WÞ~ÉþCX7ù ôŽ ½L y —= @Éþîe¯ÙûæO×2Á¶3eˆ²ç°žý¬µì÷VvlØŸfeŸÒ]®z„]*À(0žíèYçÜ 0Ì8ëÆR¦PÙ{ ] ¸ìw$¢¤T5Yneυ칬fJÑ̬ÅO•uŸ"ÁëLxÅL˜ÀpÂ9w¸ËYw<zE”äDDõ}YQˆJi´çãœË^Lc­Á9‡sýòsÎá¬#SŽH”l‹"rx x¸¬d Q¢ŸEŸp¡K¶[G2ÏÇsg€{œu÷GD¤$J”s­= Å åÊ8ãLŒ3>>J¥\¢T*R*ŽàûZë¾Ï3ÆÇ õF“z½AµVgcc‹õ Ö×7¨U7h5ª“ "8ëp©E¢dxWD^^.WµÌuüĺ ù Þí…Ì´ÏG{s;ëîæDIË›˜áè‘Ã;v„cG癞¤82B. Ô¶°Ööý|tŽ|OF4šM–VÖ¸~ã6ׯßäÆÍ[l®/¶©•H-D"JÖDäUà{™2¼ Ü6~­‚ü„ Þë1ï‡sιǜuO§DI^D(–Ç9zìΟåÜ™“LOMRÈçPJa­Å:‡IÌÁßé£W´§Q"ÝÏhµCVV×xûâÞ|ën\¿J£¶Ñë.BQrED¾×£ W% ý“¢ò$ø"0 ÜÜïœû¸³î#"2 H¡XáÄ]§yèû8{úS“ãh­‰ã¤+ô壣 ¾ïaŒaumƒwÞ½ÊK/¿ÊÕËïÒjT;øÁŠ’eyøV¦ ïdxáÇ®òc¼ÊüûpxØ9÷´³î1`LiÅäÌQzð~}ø>æfgPJˆ2¡ÿ$=”R¾‡µŽ…¥e¾ÿƒWy釯°¶|k,€%ë"ò}àkÀ73¬°$?.E“ðUî&cÀ#ιŸuÖ} ӞǑc§yâ£qï=g-—IŒ!I’.*ÿ‰T’.§çyxZ³U«ñÚëïð·¿ÇÍëïbÒëw¢dED¾ü=ðàP¿òöKÉ?hèxàpŸsîgÝÏsJ+Ž?ËÇ?öQî»ç,¹\Ž$IpÎýÄíøƒXÁó<Â0äÕ×ßáßü67®½Ó±V”\‘/Ï/eÃ(Êiן>éœû‚³î^@ÍÌŸà“O=É÷_ c°)˜Â:»?V?!ôº”´Ö„QÄ˯¼ÉמÿË·¯¦PÒ‘ïÿøúÚÈHø(gÔëι_rÖ}¨Ëc<þÑ'xòñG¨TJ$‰!1÷>v¼¨G!Þï5yZãyšjµÎ·¾ó"ßùö 4j›·pCDþøð °påí—¢ŸjèAøãÀyàIçÜo8ë%rúÜ}üÌÓŸàðülJÆô†n™ŸWòS®ú=´—’P·n/ñåg¿Î»o¿Š³QÒ‘¯ |% ?ÔHA>dáç2„/ðKÖØ_¦Šå1>ñÉOñȃ÷’/亡\?0_Lɼû?Økë„íVÈ‹?|¯í«k`•Voü])T?,%ТðG2„ÿ¸sî;ë~Ãá*GOœãW~ùç¹çÂD q§‹ëRŸêzþÉûÙýî~¾O¬Ð÷½H©ä$1hOsôðGce½ÆÖæªà˜A8/">iæqk|j®µ¹¶è~â`@øO9çþ3gÝg•ÖÞ#=Éçö&'Ɖ“t×›ŒÄ±Îáݧˆô-ÚOó¿”Üþ~ïk³Ä“1†ÑJ™3§ï"6Š¥ÅÛ8kËD$ÈhäÍC äCþqàιÿÂYw_~¤Ä“{ŠGºß÷Hó¾byù Åï÷;y^Êl¾øÒ«|ë›ÏÓnÖ;QŸ|Xý Ýþ„ø´³î¿vÎÝ]›äsŸý÷Ýs€$1kúvÁAž =½¯çnú“îÒ÷óܶ`½–í@Ok±&u{‡ç119Í­…EÂVÓÎe–`Xÿ -þ„ÿŒ³î¿qΟšãsŸû w8Fb ÆØt—ÐïöîôÒ$ï&„Úì÷È|ßáecjr‚é™Yn/®ÒjÖt¦yÒ ¥L ô,ü§uÿÌ9wbêÐ1>÷Ùg˜Ÿ›Å‹5vÇ®è˜Mç\÷o½¯9ûÁ=¹#Ðgýà>¿ÇJ ûž;Ö%{½R)shî‹Ë4ë[ 8Óƒ >%РÏï˜ý““³GøÌ3ŸâÐÌtjòéjwïb0ð{ßÿE>P§.çƒ":ß}ð{î¶.KP)•˜™™fayf½ÚQ?³ïW ôû~!ÛùŸrÖýžsîÌÄÌažùô'™™™J‘¾±©Ï·vÇ.ô¡}vîÖ³O¾÷€¶tÖËÙÔ:”JEf¦§Y\Y§Õ¨ê%XŸšk¿W%÷!|? õ>íœû/uTƧøô§?ÍüÜlçÓW_'?bÎ^}@dµ?ÚìãàšyZ#J¸½°ÄsÏ=GucµÃþ{àßdÑAó½DïÉŒOÍiÒâËÇœsÿ©³î£…b…}ìã™ÏÏŠ4¬íCÆý(Ü}èÏÝvcD±ý4ÅÛÇÿhžÛŸ?¸f)WP,)WF¹½°H…>Â1©gYĵ͵Eó¡+@–ØÏ’:¿á¬ûy?È©G>òQNž8–ù4·gLüa›Ûô3özîÆ Wÿº÷[¯J¹„Ÿ+°¸p“$„yÙƧæjwªú=úý³À/8ë~K”äÎßó ÎA)Õ|ÆØ=wá ôýÄýòM¿}_Ÿû~ßß²µ´Ö""TÊeb+¬®,à¬%%Ò…›w õ{ðû‡O8ëþ©ÃM9~–¸—\.ÈHÛ©ïyïNþì±8`b—ãDx_Š·Û®ßïs{-Ê“BCø‰îïÖ¡µbt´Bµ²µ¹Š ‡D$&ëMŸšKªÞ`ªÌôßëœû5çÜñÑñiî½ç<ù\Ž8I0ÆÜ9PÛÌž™¾Þ ÝnÇZ÷þ€à~Y@ƒz=w’(º“‡Á`&ŸËqï=ç©n­SÝXõp|VD.“›¾CÚ¶öÁX€l÷³Yϼ Ð÷Þ÷ ‡Í`:Eï‘–½cž­ZÝÁ±ï9|û€¯gà_‡½S—`­%ŸÏ¡uÀòò"61„1¹•¹‚æA¬ÀA-€OÚ ñ(Ž/þÑã§™Ÿ?”ƪÆâÜ6Ã¥ÕÁ<‹(IßÛ³sî$ŸQüx@wx þëA-‡±¦[\âD¡QÌÏbuí4W.¾Ž»> \!md­¿oÈv 8ãœûEçÜ|e|ŠÇ¡•&Šã_"±ÉÁŠ3ìþ¯ S¦ÎBìzvžÃXs`ÅìÛ÷9{Úñ^ëA¾ÿÜÁ!Êu¯óÄñc¬­.SÝXÕ8žÎ:“®ž<÷оÜÀA,@íþÇuOy¾Ï±ã'©TÊÝ2í}}ÿÀŸûòöz *Ó{ytÎq'çz/Ÿû~¯õŽ0”I×1± •J™cÇOòV}‹$Ž'EË3¤åæ+¤ªïM²JÞQà¼sîÂøÔ<‡fgpÖwëôí.9îáÏ&_¨a5»u ;ì¸Î1ƒÛíõƒž÷N¯õ½2ƒÃÎí{‡fgXZšgeáιÇDä)àÊÉs½³W…±ÞÇôçSι_vÖýb/¨ÓgÎ2>:J’±}âg8ùòþAXÚ°|Ý ÷@²ä`×úÏ×û·Î{‡²ƒž·Ã‚µ†$Ú›”²Îâ{>¢ë뫘8öJYTpc|j.Ü zû„}cÀ? xSsŒVˆ³f^öêNªaBÌô3Œ‹$x¶1{×{lÇ…yž·+·] nödêDdÏœÁAÖçN+жI²ô³ÇF+LLͱxór~x#ƒÑ §¢wÞ9÷¤sît®0ÂìÌ4žçu»uz/ø½²m"²+[§ö©ï¶`óda·É{ ÏvîƒoØù;ßù½–‘ ^W§ ivfšµEÂV3Àñ”ˆ| ¸yòÜCëá·G–° œÂñi@MÌR.—H’dhžRl}©RÒ¥>÷Ûy{)Ö^Çuþ> |õ¾g?ÁïwFFÑöDÏwÎQ.—›˜eéÖpœAxø!i9ÙÀ˲}8çι<ããxžGœ…};À5ïSàz—¬Û‘Þí_L·#õÛXÊ¡ï~ܰÝ4ìÜZ«7üúöà{R€Þõw%BÇxžÇÄø8« Da;'ÈÀó¤M&õ} ‡õ;æœûà•*”JE’$ٮ뻳v§Àµºc´¤¥qÎ’$®G‰\÷uçÜÇíJjNUßÿ İã†]߆Ñ÷®]K¤£p*¬¯ÜÆ9wˆÜ¼4ŒðöàüïvÖÝëù>•Ê(Zo“>{]ìÁîvÁ‰íËØ¾_eý‚ôí"ë\Ÿ¥ Ìf?w?nP( pÎô9%nßãl¶ ÷ û†­Ýäö[{c Zk*•Qª›+$q\-Ï‘uï§9àsîq ”Ë)–Š]fj¿6íÞþ¾½¿Òjè·‰Ý3QÔÑôâHžG~ˆÑJ…f»E»ÝæÚõlV·hµÚ]й7†î(×^B²Îõ-²ˆ`ÕNêwØqÉ®ñº½cÁ¾ph“g ÅR‘\¾HoŠsîA9¼N:Ål¸dÄOü=&"Š‚ ŽcL&üÞ.Ùƒtâj¥v|¡Ž¢ì= ±ÔÓS“<ùøGx졇QJhµêhå‘˧žü8ùBžj­Êúæ:­V›«×®±²¶N«Ýbye-±±9¸ \¿S¢†+¹{o»v/A›ø”AY˜¬+ Å Íú8f¾yòÜC›½Ä7dÉ'HS¾s~£P( D¶5ìv×ÞŽpÍ(FßÎ3¶‹²ï:~„g>õqzð|íášË—¯óâKßEiMy$G®Pbk³ÎSû$Ø5>ÎùÓ§ð}O{lU·hE!ëëllmÒjµxûâÂ0d}c“Z­±m%2¡ FV¥%î{7,Bx/‚îw·÷î& g-žçQ(ðü€8 =A$­Þ¾L6Ðr˜øÀŒsîÀròùqg}l©ÙLîØ]Ì|çÿj¾à 8¸\ÌSÛZãÍW¾Í‹/|™ééiÍLsöÜÝ™›ã#?L¹TÆ1åÒ(õzƒ×^ñ4ÊZ*£@ñÀ}1ªG™Ÿ™IÙ¹|!-ï¶I_}qfo€—duvg›T¯b˜=ÌÿäX™kïþ€ãÇOP¯×i6›´šMbÛBDcƒç <¶ªu®ß^ã/¿‹Ö9<ý×øžPÉ1::±#sœ8q”¹ÙC<øðÔFŠ>~œ\G”Â:GEÄqœa„¸‡aSøžâðÜ!Œ±$‡ç¹çüyb“¤ÒDØÚÚâæícXYYaeu=]ü…eê‰s˜ƒÊîC%[·?PtÎáÄac‹Vš\¾€ÖI{‚\eœ@4¨0霻È)íáû>Æš.S¶õ:HÝgvºê'i†(Æ [iµ[Xã¸pþŠB¢8ÂÓAFKV¸š •GÔjш£ôš]J¼ÔªU–—xûÒ»|ý…ï9ò¹¥R‘J¥ÂüÜ,'Oçé§žâÞ‡cks³ .µVÝÖù]wý‚únéùth¥Â‰˜%-õ‹¼ì`s‡qˆ(•²J=m݃ìU€Aa÷ÅúC.J€ìÐÎÖ¥Oc-NRŰֲ¸ÞÀ×aB!G)ï±¹e0ÎátW¨ ¹p &%M µ—Pa•¸¾DÒXÂF5ĵqI„‹ªø*À)u /c-Ö¤ °8‰ã8¥|ÁSZ{˜Ä¦`ѵq.EÞh?Çøø8‰q¬®Õù«ÿð×|ñ‹ˆ ´Ö(Q}³÷ï&øa м1†Ž<1„I™èl~ï®ót:~F£é]5lïdµzÍLïÏÁ<|¯Âtóï=çR{0eÖn?;9k-Vù€G3ŒÀ:¶ª[iâG ‹ÅàLG$i–Î9œ7‰Ë&˜~œC³“Ä1XIho-m.o\!Z{nb›«X›€uˆsZáë<ˆƦVƒn9¼C€Ä$(¥qQÄâíÛ\»t™©éY …"KËKLÎÌqåÒ%¼ ÀËÜìn»|×0oˆð‡W(ÙîR$,l߃¡p×ùGª^OXqÎMhÏïX¯èÛ²GµÌ°ã†½fw!…:é[k3bÆ€Í:x“¤QƒWÀJ»lâX‚KÒ{9Jk´òqÚCû%‚Ü.¡\ñÉ/ü5ÑÄc,6F! Æfâ=x‡>Žš$Q•(ÜÂÕÞ…pW»‹¶0­\ÒFDã‰F¼ #¦H‡Z80&ƃRš»Nfye…õ:qóòȃ?Ì7¿ñ-ææfû6Ù^Â?ÈŽï}=Mƒ«®2hÏ'I"œsS¤õžx’JÅwΕRÇ?u}û˜s·êšA‹pR±®¶féÔþ/BÆÊ¥™ŽB8 Ö¸4æ—¬jVôЮ%ãûU:ï‰ z&­moÖŽeîºü”’TØâp~GèQØÂ$1žŸKûøzvs¯ø†)ÆAÛd³9{¦ãŠ]ÚØL„u\š*Qiˆ&*Ým¢Ó*]çÈ«1& ¶˜(¸~³JåÐ(W®VyeuíZ " ¸$Û©…Y›n—º ã@Y‡K, ƒø* Qº-$­upé@hñ—Òê¥òþgÊ=wŸgn~®Ëµìøv³;• ‡LêÉ=ÇQH‡ÙýU§ Óì oû‘à¬Ä¤¯eѲi Ö¹‹8g¶{Tã(– <ýÈI^»¶ÂúF›Àkqrf‚¤Õ ž$46ZliÅúÊ5ôHv’¹kÓH#IM¬§s$IˆKš ’Œ„r(—àDe. BÒŠi. U“P.pæÂ}<÷•¯ •ׇ¯ö¬²&v*t—Y½¾ö¼Ì%;ɯCÃw’A}Av¦=É׿S3Ôß *†dô:(Ó9KG$q„ˆJóÞJ¡TÇJxb{Õqk£JؾE†ÄQH¾Tbkí"6|ÉYpR5ƒ3©BJŠÅÐhœlñÚë×øµÏ?È—_¸Ìó߸HhGŽÍòÆ[ <øð1žxè ï¼{v%1raŽ‹—HÄãÖÂh‰N]s$6Nk°JL_b IDAT`ÛéV25¬m#茌ê˜b¶Ú¥¾¬±iù™‰w,ívky‚I’,—aÓxp‡‹ê’é;¨sâ¤]GÖÝ{öÄvh§HW_dà¤Ã™…0k " q,Ý”dzëöT!:Å0¥°Ö°²¶Ž’ˆNß}YÍV šM|FRíö àhßÇGa¥M¢4…‹¥mêüÞïÆGºÀó_ú å’&Án.®c“¬_ P> aƒ¸¾6Æ9ƒÛÎÓ˜(b«qìØ49-,o†F  ¶øŸ}ƒÿùûN"~ÿÿ|–é‰"±ÕüOÿÝX«6øÒ7®1R¨¤–éªÃf:kR‘)Mls[-Mˆ ´B”Ny èI¤·C (½]n¿¿yï‰Ûv„ÍjWKЛèÍd]½. ‘:"uœë×0É,°Þa¾‡ 7þîn }ýÌéüîoý&‰ùÒ—¿Î×_x‰j­Ñ}_Ú8Jiz£ çHB$ ýœCT€'S]¡Z[!7~”Âá0ù%¶Ë·o2¨ÄoýêÇxëÍKÜÿÈy¾úükÔ[†( ùíÿö_Sññr>a«‰ò´Ê!ÊG2®ÃI¶g]‚RŠ ö2‚†x(ÑY(à (@$}_·EL¶ï²c=w/î† †Cé‰H†lN+"›¤7¤ì–…'@UUëìk-Jë>еCvø&PøŸzêq~ýW>ÇÂÂð'õ ݲ0Ç6æ¬ÜcÀ‘à£ñRÇ1m$U Ò<4B¼z•öÖmòS§YŽgX‹Cê·ªll­2]ª°¼¸Éx)àÉÇÏpãêÏ7® =gq Î% ³µ@û8å°.Æs>8ƒ)L ‚"b×Aé ¦µ(3tCétê7=»¶C®õøï!î`˜K¤Úî2B$ãJTD:#  à½óê îÜýK€-{ x°Ó…cŠ?wÝùû ‰þÒÏ?ÃÏýÌS¼}ñÿêÿþ êfŸ†w«Kf¦Ü>ÝÂKÁ& ®S(Ä \BÇÖJÖ‘ìtm yëUfr Ξ;ƒ±7/½ÍZµÎÚÛ·89?Å‹/]ar²”^r8#8'ˆM…aIPÊâ\”b“`uê9ê#( UZ‹æþ]—™3¢º“C„í{eí.}¡Z¿ÈâGú3~;ŠnCDºaµÍjD¤&¢–€ðíW¾i;eáh r3ce›þ¥›Ø<ñAÁ^GžùÔ“|þ3Ÿà7ßá_ý?A³Õî!¥[ÄØAýÎY&û麅bÎ ‡•$»o–´&-åʰ" „ (²²¸J931–à¾ST”ÏÊÂM–××Yª6¸º´‚—/â¬Eiú…Mçð9eÑÎe7ް$ˆ¥ª' È„ Tlu—3¥¯³ð×ÓWAÕ˪no·kн_>½–`§|Ü6—³*"ëƒÍ¡hˆÈuY“äDò}±¨RCR¿DúÎ9æÍò›¿ñK\¾rÿýßü)Q´Mi–.§U¼éè¥4‰ ÎZÐnGX+¸¤Žó xºÐ“òHcuåÒRm'¥R3«5ŒNxóòå•W/jò§ïeæø)üR™bÎgue‰Ë7—ÑÎál‚!.£–t›¬u`ã.ÐsÊd@Õf8A:ÄJª YÉݬfV ˜µ¾ ï«ØÛ% ³ƒ¥ùƒxÌfõÙ8ùµA°@K)}ÃSµÎNï˜n‘i[orè aÞ‰ãGùþûF£^çý?þ(JÇ™i¥ðƒ¥2úÔu&x’A.œtj“´©µ Q‹6‚WGü Ú+ ¬#Q‚R¥lZ0" (Á™˜±¢‡øŠ­6,÷ûHa”¹»ÎÒ®+‚‘i‚\Ê8ã’Gœ)”Lên2@ÚÛ» ]Z‹hE­À¥n(]ðî6èîæ”þµ$¦ºÊûU‚~ú¾¿>Ó:‹ V)}™tf`2˜ lË"rÃY;m­íNõ6‰tMÎ…ß1i¿ûÛÿˆãÇŽò7_ú*›[5ŠÅ|ßËÆ«§À(I ‰Ip.Gøñ¢±ª“¬N÷»Òœ<1…8ÅêzcÚÔZ]˜"Ÿ¯¤ ÇFh çQ*–P¡x´ZLMR]opëâë¨Ò,~~]œÅFmœm"‚ó’,ñãL+%‚”QiqHW@^—}s@I_¿À6÷Ÿ`lzÞ ð3÷×?jv§KØ_ zeÓSœ–¥¥ì`›ô¶2[}éà·^þ†;ÿÀÇ#`U”zg¶&À€é‚w°óî>š#‡áyÿ•¯16Z!ŸÏa­%Š¢(îv§&Qu!¡ïçQ”±*ANÓj€øn¬æ(í9<7…VšõÕ%–·êèâ^PÊʺ ·6о&È¥§¨Š•9ë(æCZñ-ÜØUI4N©Ð“:Iõ¶½ I+«ðÉ•fñF&P&Éri_Cú{–RéðH‘ÎÎÜ.v5IzCM?Hù¥Ò"Rcícd` pšˆÆš(U¥V3h¼õò7'„H¬+¥ß°Æ„&‰rä êÿÛmç‹>t¯¿ö¾§ ØÑÑ2ívH£ÕN'Û—êí,"I:Ï¥øÞËç¯ÿ;œ7Êjñ²²¾J>_d|bì*ÉÆU\0BPšEçJ( ƶ°Ö·"œSTëU<ÏCry‚BE­%Ú ÃHiŠÄ$$­uLí 6Ú¹åS`bÚk ’£ÆŽ§%äZcTƽ‹í_·žÍ“ ÜLæó9ÊåR– 4Ù½—ì@÷ôÁ,ÁP˜$ê´û½ r½º›rÄò®ˆ,[kŽ:gPÊÃÚdϡλ à[ßùÿè Ÿaii‰ÍjQšz³E;›©#ÓCº¡‹Î(œÙî» ##')• Æ4[o׿e„P—YX˜Á?.võ6žöðrEt.‡§5N~^3^Øh@;Œ©6kDmƒiµ0Í&Ú"ÚËc¢5l´…ø”§ ‹ò(W&ª/àå+F"ªF"Ž4ñJºlb‡ÃèX:cR—çkÅØh™0ŠÒaí(Në’žÆÙmæïàJБµ¥´yƒôör;§„½õòóh:çn+í½i=j’xˆèŒ^V®†þÞy\¾zƒf³ÅìÌ4s3S¼{õQ =¾÷K„‘åü…³\~÷2ah0N#V‘ÄqV}T —?I±$8Ú8Û&ŽoÐZ~“hÁC£Êg0… 5I’‹ÅS LW‹C“çy·Ub}!­ðOç"Øm`ê·P^9£“&:Cy^ú÷pU˜ ¬-ŒÁÓAÖNžÑ½¶”õ°66Ióþ‰IHŒ!Ib¬u)ÒŠØKð´Â|Â(" £îlæþÆ;”+Ø^¿í, IR~Dio¸("ëoþðëv˜@Dât÷ó²õt’D^¹m3dö¾ à„va­åž §xõ­Kᣆ¶›wQSžžçá™C´ë[,ܼE£Ñ¤ÑhGc<¢(åyÚ+’ Æ(–=Œm5׉7Ÿ%^B5‚ÊÏ£+§ 8i;‚Ñûب9tÒÊj C Æ: &ÓJ-Ÿm`âˆÜØù´ö/ÛÑ®0K¸yg qs™À+dõÿ=ewJí(žé˜wc’¤ËΤŠÐ™èÑPݙϸ[„Ð-lSö5M’(«£P—”R—è·C2>`]D^¥IŽt¢íV1Ùµ h·¬à;—®sáÜiN?ÌÝçNñòkïìê¯zÿßle®J8|æn| q«Amkƒ……ZÍ0ì‡hë“Äšày^0ƒö #:•’Ä+„k—‰VV³8r„ÜØ‚ÉSøA71áΤeX΄Ý8^*X×BŒCë|7Äò‹‡ˆªW‰ë«Håd*wµCR8최Ê“lbºÙ;QÉæü¦­Qœ IïN÷rÿÙÆ$híù!pYÁ}ž•Åknzî„‘pÒY{^Dðƒ\í(CL·D²°hs«ÆÃ÷Ÿ£\.sìð õFÈÒòZßH˜½@Œd=v‰qXñF*;yйùC”Jyrƹ(je+m°&§°‰!ŠbD)–g(–Ç(æß,‘¬½LãÆ7×ÞÆš•Cy¾´ÐÉ&^®„WœGéÚ±6n¡”Ÿ6›‰ÂÆUD ##Ó˜õWñ‚Ý­ˆÃ~P QkòùŸû’+Ñn5ILBG,//›¤Kf¹LÀ‰É¦–Äñb€–½í_ÒÅPQØÂšíùËJ©?¾ûÆK_«ïªÓó'"žˆŒ;ÜÆ$~ä‡L‘]'…ô  #r¹ÇŽ"—Ëq÷¹“ÌÏÍrãÖR öš­AÒ{®N»xÅ$VðrE9ÊìÜ<‡Ïá)ƒ1K61ÖâyÎ:¢°IÅX#x~™Òø!ÆÆ§Èé[}‡xùÆÔSÞE·ˆª½ƒj]GùŒŒ£1)à"”HZm‚V Óį ƒ\FÖQXÃ÷ Ô«5>÷¹£s%Z­&IH’˜•••¾ûØlàD§³Š’Äô—å ™ÔÒ'øÎZ9G»UG¥3‚^@ä/¹¼²p5Ù[æNdYɬIkÏC{þЋæó;Bë­O¿tõ£•"ÇÎ#¢-ñÔ3;3E«²±YÝ¡åC“K=_²ó§8Nˆ#qšÊÄ Çï:ÅÄ䣣eò9E«YÃØ(+ØÌrÖµš„a„HŽ _b|¬ÄX%O¡•6tÖ¶VZ—ðs>¡Áó|”\ÒÂÙ6&\#?zŒ¼_¬¿Òg´ÖDíž—£¶Yåó?÷ ”_¤ÕlfQ@Ìêê‰II¶´ Îdž0ŒÃp]¼›»íí¥Hâ´’Z{~C”þcà«ÀúÊÂU·§¬,\ezîDÖª/ekÍG­µ*—é¢YÙÃdK|úÊÆ³ÿ¿uñ*¥R#ó3ŒŒŒ°¹¹I¹”籇îá£>À±£óÛ›Ðï0ÌLvhÖvañò%¦fç9y×]Œâ)‹(Gµˆ¢6HzçRßó/ƒÂ’Ëå ‚k aE[µSÅÍåWY¹þCL{+[*õñåÃàÙˆd-³²ʆí:ž°¹¶Á/üüÓàh·›Ý‰¤kkk˜NYbˆcC; iµÃ.HZù;l=zzZÍ8‡ç?@äO€×ÞøÁWw̳õvs1°âàEíù—’8:—Ä~K«a3%耓Arh°g ÷õ¿øë¯rõÚm~þ³gllŒ8N¸½°ÄÖV•éÉ1~ý—>M.Ÿ§Õޏ~c‘µ-.]¹ÑMonÕRB'Þy+¼t>@ÿ5DI:ëWræOMâ)K«^£ºµAuk‰‰qzèžýòßvU»326+hI’ˆÅ¥5î½ÿAÞ¾x“8¼Fãúk$‰ŒÃ÷Џ Zea`Æþe, ÃbL»;/`;Øî ´Æ'†f«M«Ýî ¿§¥{h“í`âG)M…Yso!òM¹8ˆþ÷T€×_|ÎÝûèÓ5àšRúyQêLØn(?ÈmW gcÉû„>¸ó‡*…ðÃ×ÞáÊõžüÈ}<öÐ=œJ>ŸX­5A°±±A»Ýfzzc×oÜ쎗5ư¶¶Ö°•$ Íf“0 ñ<ë`¤<‡ççRÂÇË1wì¹\ŽÚæfÖ†ÝLjÒz†v:@*ɦ’$1 ·I¬£Æ4š-Â0"Šâ¡¹€¡JÐ5ÿª«üQØ&‰#ðÉç|FGËøž6kŒŒŒär˜ÄP¯WQJ±¾¾N±X¤\.gè9e——– £c,­f È¥÷éËp&¡YߢYÏFÔdC$Ó¤ešNSÈiQ©µ–V»Å­×hF†z½M­‘‚ÑÁÛ×íl­ï©úØl¶i[žö.f÷ ¼ÖKýX^ûþ³îÞGŸnW•RÏjí?‘Äá}a»E¾0²#Q±s>ì1 þ\^Ý`em¥ù|À¡™I&Ç+ÌL391ÊØh‰™©1”RÌN;‚ ‡§UF«Z­6ë[567·ØØ¬Q«·hµÓ©â[õËk5òù€|Îgis!ýœJ1lj'xûí·™™™á±ÇcllŒëׯséÒ%”VŒsôÄ)¼Û·‰â˜V³ÅêÖ¹B‘\aßð¼Nš8%“á€Î}Ïgau+—/ÑŽ¡Þh³U­uïÆ¶¹¶;ý¾½~íV³3Ø£­”úð]`s7ó¿Ÿàµï?kï{ì™Mà5íyéœ=ÓnÕò¹|¡o]Zaûüþn1ëndOç\’ª0Œ¹rí6W®ÝÎÏ#_È3RÈçÊÅŠÅ•ÒãcÊ¥¾§)æóŒåî³'PJS(䈣Ñhñµo½ÄÕë·i¶ÚTÊE´V$‰a«ÖâÓÏ|–C‡ñ/þù?ÇCETFGi4üþïÿ>Ï=÷8Ëܱó(±„a›D¬®,R«ÕH"M'x^@ytŒNè,Ö¥Í+¯¿Éj­M;†­jZ½™•‡»=Ù¾ÁRðA­óÞv«–Îpð¼Eä9àú«ßûÊžwêÞ÷vŸ³‡ï2€‘Ôù1&9éœ#—/ìkÞ÷r{)ÈàLOënqE;Š©7ZlÕš¬oÖY]¯²°´ÎÛ«,®lr{i¥• —VYY]eye•8Žð´â#ßÃ'Ÿ|˜V;âÊõ6·êÔmé èò;¿ÉÑÇ3ß­ºÉ˜'žx‚·Þz‹×®pîüÝ4Ûç4N|Fǧ™ž9D>齌6V—hÔ«i—²R´š î:y•é#´BCµV§ZkôܼZÐE5$ÞÏ~WJÑlTI’Ïó7”Ö|X\¾}Ž/X¾}…Ùç `”RÎ9Œ£vÉós}7]–= Eµu?áw/N©m¿ÚS2Þ›g·6Ã%1f›z£ÉÆf¥• V×ë4BÃÒòk›¬®¬¶[Üuâ0gNáÐìÕjƒ­j>† [k9rä(÷>øêµz“V«s{åaº‡=£(¤YßB{õ|ÿKÀŸ¼ùê÷¾î'_ï ­ú"*œ³ßñ|ÿÏÀýçÍú–LÌlfS)‡Í ~¯ÂOÉ”~m—lhDïÍ%Œ³ØÄ¡ÄbM ´§iGKË«¾ÏÚ†b1—ãæâã•ýÈÃÜ}á ?ó©rýæÕj(ŠX]]Å÷}677»×Òh4˜˜˜`me™Éù±Ô"¹´m­ã­³h?Ol,N ÌŸ¸@>ðQ,­¬§ì^÷{ìZݳKNçµÞM• ßÇóý7@þ?õênqÿ[€¥[—˜=|ʈH(¢B‡;’$Ñqk …‘bßí&ðZøJW)Õc)t·¤\u+q]F¼Xâ$å×7ª-¬‰ˆ¢6JåR‰éÉq¦¦&iglE¬¬¬°¹¹I³Ùdqq‘—^z‰#ÇNÎ÷_§^±Ïý¥ùŠV;¢ÕjE1QF,´‰vpíºk­µÖšZuƒ8ñü`KkÿDäo€›¯|÷KÉAd{ Яy^ðÇ8w2l5Ž6ýÅR¹«Õ»M ÝÍŸí%ün›X6^}ð&[´u µÚ‰Ž{ïG`¬…8­ð}ãâ-VW7˜ž¸Îèh%ŸÝ= ÓÑðkkk4 ‚ àõ×_Çó<Ž»‹Z˜–¯›4Qc¬EtzŸC-zûæZ{dµ ð°ß}w ¥=Ï£Q¯¶øAÞx^ðwÀß“Þ*9¨P…;|<ðøçŠüÿÝ]ùo\Õþι÷½7›ãÄKgôSD©DUÄVP@©Hm¡UûKÿþ5ýŠ(´¬ ¨R¢„-!-4­()eñ63öìo»·?¼ûÞ¼Ù'q‡+Y¶glç~ßYî9çžÌj­ŸôÜÖï” rÛǦ¢ø¹awüyX áå‚«|ôôÀªôãDÛ²0RÈ€µ Iat­VµZ ÕêFG·cmm‡Æíw܃Ù[nÇâÒrԉ߯i_«SãdãRìôÀxàT8¤9ä þé=Œ%Ÿ™áyVË‹`–°ì "ú=€Ã§OZº<%.~µ|EDG,Ûžñ=G§t+¡ÛÓÀù€ƒö¤“öîNWÊËP*„í8kÌòy/øâôÉCÞ'ìÞ@p‰¨IÄ5bš |oÊ÷=äó…®[¾ƒR—}oô"À'ãô¥¥>»ø4èœ84ðƒ(šöázÂè&§öB:y¬®ÕP«5"içN¨7&BúfózHÀ©[P*ðH„þR^†É̶…°Ñ Dtš™Û sŸéM!ÀÂÜg˜Þw£Ð"¢*—A˜ |oÌBäò¹èÒæ:º‚w€í÷t×þù€ï;äŠO >âr,×õÐv]3´R'ž}‡Oa=$è3‡ÝWíΣ„Ù‹J¹ ÏmAZ¶/¥ý*ý À)"ª~ôþ_Õ¥`yIH‘ ¢­ñ1Ýì{ímA ËçL³æŽ”÷æê{í~‹¡à§U~l營HOèç“´A­ëb‡'²B KIDAT Ñ©‡ÔÝ-ô ’ÓÏÄW»ŽŠ}'§^Ó&dô¿¯V*pÛ X¶Jib槈è$•.üË"@Š>"Ô˜E„›=·U‚Ù\.‘”Žî̳KÛnaRÓ׆Ӏ§¾N«üüèçÅy%½n‡,ÝÏch¥M¬ÒDкŸiß —qùwLm®™§¾oOd´'•ríVÒ²•”öqfþ#ˆÞ°t9à_6zHP'¢Š`± à&Ïmø~‘@pË ”¨ín;'º‚çóµŸôNiNµj‹%KJy^ûFZãÂS­»‰kƒNvN÷™ƒÄîÇŸ)úŒ»u¥ Ú}«ã‹¬,/Âs[°l'°,çEjÿ-ÅÞ{CmvB€„ûxjD´Â,ÎÑŒïy“ÍfÙL.IõoúèÅ’/â°nZ~¯Ô÷Ÿ<×£q¤ˆ«å^µßK„Aáíó‘ £ê9éeÔuÍ}ˆ¹ üKKE„AËθÒr^%æ§°°Qào( ‘À'â:—Yˆf±S…Áîf£N,,ä²Ù¤©S'Û—–À´C´ðÓR/ÄpàGÇË~w¦.;=ˆzÀ%õ ·n26…i"H!Q¯7P.EÁ<ÛÉ6¤edÏDÕ=zéÃw_W‰Ù† &Áîý³&PD«,ļ"†ÁL«QA¨QÈ"“Ð{ô3jŸ{œ¾N| Sü8 |î^ ™€>,=(ßNf YLNµËF‚ন—QÚÉKj&{³{Üy½•R ÕÕ 8™Ü²ÖóDô¢©ìYùðÝ×ÔFãµá€â7Ÿb÷þÙ€ˆê̼BÌsBÊ€ëÛ­F¶Ñl ›Ë!ã8‰}Rv"|©:€Ä1K?-ñiÇêbVZJÓá|$HúÿQøN (>Ñ$ZÅÔº®‹bqíV–íh'“ûTù43¿àŸÊÿxç/êJ`uEàºÙˆDTaæ!­"³Ø†þdmm•…B!rÎzº‰‰iiÉ1.–òAàǪ>iÑr+&AÚ4`èÀ $ºŸ™SãZY)ay1ê“è8Y×v²o3‹g‰è5ÿP¿Rà_R6ðRÖî}\Ñ6{µÖ·)¥~ê¹­‡}Ï-8™vNMalÇ“:UI/äYÚÁßà­èêV4Ë04Àθ{•”x…¡Jº©T†0ýÞÊ• –á¶›°lGÛN¶ÈÌo˜|þGZëùSÇ_ñ®46b3pîëÿê=37yªÌ¼@D_JiBL7^]­P³å"—Ë!›q¢ŠžÄ1É×Ý£6 ü´6èÕ(ao«¶è9Žnˆ@ VÛÅÙ³s(-/Ðp29×v²ï1óSÌü2€,Ÿ:þŠ¿Øl `þë3zÏÌM¡ —…Ÿ i5ÚÕn5ò¥Ò \/@>ŸC6›íOˆÄÑBã+D!D—½¿Ò+M‚ØGé> ¤½þèÈ+¥DÛuqvîæç¾†çµaÙådr_Ii$¢çÌùþ õŽ 7 ÂUXwÜÿ3àØ`Fk}[†ùž{wx#D„±±ILOï¶m#=1yî’zŽ'c󿾕h¤­2“M;&!gVµZC±¸€ry:º¬©-Û) !ŽRÑûÑåꉣ/›ÅU!€!AÔÛ<Y»“ˆh­ïÃð!ßsàûnˆ0²möìžÆÄÄ8lÛJæFZ@$G)!x`ž=.ɺ”ÅÃʳ9ªŽ_/TÑEÏØñô¼èÚ÷ü¹"jÕ ´Ö°,G[¶SB|HDoj­ßp¦i㉣/««ÃU#@zÝùÀÏ-DS­opk÷¾÷à ðÆÃ0¤ln“˜žžÂöÑQHKtUÿtÀV}’zYÔ£Y†½Và‡X][C±¸ˆå•´š5! ¥­¤e—¥”§œð¾ñîßë¥æÕÞû-A¸ëÁ_YFŒØ `6 û|ß¿Ó÷Ü}J6ä £Ø99©©Ø±c4Š'0G·jã¾)à{I±~ À}D`bX–4}\T*kX\\ÂÒò õ5cª$,Ûñ-ËšBœðwÿð%€¢ÖºùÞ‘ÕVØ÷-C€xÝý“'Ñ<Ã,€QÓÆO¸5 ÃÛ}ß¿%ð½‰0ô-"‚íä0:º ããcÛ±#…lÛNNq_Þ‹!B |ïßð<µzåÊ*J¥2ÖÖªðܦ©ƒ´LÆÎª!ÎÑ)ÿ2Ò>§µ®h¿{øµ•ö{Ë ^÷<ô¤É’ ODãv¸.Tj6‚[‚ ø^»Tæ” ˆ(šI˜ÉdQ(ä1R(ÀÉ8Èçr°- Žã$Ž£Ý Ä‰S:ºàûh4›pÛ.jõ:êõÚí–™Ú5Ð4£î|)eYJù¥`þÀÇ>ÑZ`Ei] Þyóyµ÷yË ½î}ø—DDÒœòÄ´ˆÆìQ¡º>Tê@†ß ÃpŸRj< ü[)EéD if§óɸz­£æ©k[]ijiifö…u!Ä¢`þŒŸpFk}V+]°  ¦µnÿÛsj«ïí5A€xÝ÷ȯÈÄöËœ &Ê8fŽ•£Zë]Zë=*TSaÔù|ÀˆÖ: ÀRJ ,„ȰCÓ¤‡£ÚLR ˜¹%˜ë,¸LDóD4‡hÜJѨõKˆºo7µÖžVÇýY]+{zM wÝÿ诉"1–Æo°8¦Ïa@†ˆ Lœ3DD>¢"&žpŸÒê&Ž“¸€–Òª  ¬µ.¨XÓZ׌t·5\nk­ÕÑ7žU×ê^ÓH¯û µwQd"b&†bÀû•&¸ý¡íp•VžÖ:0ÄPZk¥µÆ[¯?£¾ ûö­!À°õÈ㿥ؖ9ÛÓ ˜AìzåêÛ¼?ÿgO ÁïNæIEND®B`‚qlix-0.2.6/pixmaps/DetectDevices.png0000644000175000017500000002661011050625206015474 0ustar aliali‰PNG  IHDR€€Ã>aË IDATxœí½{°]×}ß÷Yk?Îó¾q/pñ$’¢$R")K””*òCgO[h"§Mb7ÍÄiã4®”Ø3Igêf\»î4c7•âŒÓ¦3¶EH¶$O,™VdË„e ´DŠ„ERă¸x^à÷}{¯Ç¯ì½Î=8çâAà>T}1çܽÏcõû®ßZë·~뻕ˆð½€ýÑ% C‚ C¢(*þ®EQôö0 ÖZŽ¢hw†;Ã0¬AàµÖxïqÎikí’µvÖsÙ{ÊZûš1æ¤s®m­ÅƒµçÅ߯Z¾þg¶É5pw7»÷ ‡€¿ü0ð`·ˆh­5J)”Rh­)ÎyïQJ µÆ9`àyà?\ÙØŸrñ½D€øðÈŒ_-.ˆJ)¼÷A€ˆ "8çðÞwþ.¼aA Ãùñ·àËÀ¯ßØØŸw 7»÷?øƒ?øŸ |YDþ&P¼÷ׯ- í½¿éè&Aw×X\ÆDäãÀŸŸÞµ1¿ðþAm§1Àä#­fsRÊ8ÿµÖúç‚0ŒÃ 茴Ö1AèâZîöut\>Ðñâ=Ö{|ÞÏ[k¬µxïoŒœÃYÛðÞÿOÿˆòRJ©dxdäÔ—ÿà|ŸŸ±¥°­º€Ñ±±_û»@ÒuºÔﵺ˸NgmgÀv'ÐaVEAáEz¿¬ü*ð¯ºÎ@+ÐúCÀËwü…ŒmC€¿ÿÿayÇääSaÀ£o"zË3d­}’ïàÞann.V0µÙå¸l‹ºÝ…¸rù²–‰Í.Ëmb[ ®¶ žÿú×›<øpp³ËràÍÍ.Äí`ÛÀZû¿×ªÕâ8ºõ«7Þ9œÈï÷µ×¾ºÙe¹l+LïÚµS)U«Õ[¿x“`Œ¡Ùlî{òÉ'£_|Ñlvyn…mE€4M?EQ¦èÌÍ‹îF¢EQÔù~!MÓwh­¯ox¡î[žGŽÑJ©’1fRê½Ý×D„V«ÅÈÈÃÃÃwõùE´ðnä½g~~ž$I(—ËAP„—Ë“““ããÿxÓZ{h=ztK…¶D$ðÈ‘# ˆ1nÄÞ÷Èw&N:UªÕjh­IÓï=·?1(ÂÀ"BÐ tÎuÖ ‚,Öp[pÎqýúuâ8&Š"Ò4eii‰}ûöÉøøxꜛÎ-*½œNçÇ=ztÓŒ°¡àÈ‘#!0 <‡ÉFõóçÓ@…,švKxˆÞ¸?qþ0 edd„‘‘¢(ÂC£Ñ`yy™••Úí6ÞûÛò iº‘ÿ­ÈD{ó£h—ÓGŽy“lÖp8›ËG½óÐåbCpäÈ‘Ÿþ&°‡¬Eßéw÷V2°fñf=†cÇŽ Q­V‰ã˜ 0Æ044ÄÐÐív›ååeh6›k¾»ßw *ƒÖºo™s@x(?ºQÄ;fŽ9røÂÑ£Gó–?ò.±Q`ø±[½¨»ÂŠ ,ZØÝtU…qªÕ*“““Ôëu¢(Â{Oš¦k–‰‹Å€J¥B,//³´´´®wéîRúýž0 oºV|Þ€ßãùñ8ðõ;þáw€"À—€¿<¬I¼è‡Î­xºøîeÝîÊì~^«Õë´ôâû Ri­;«}E¦sç¥R‰¡¡!–——’ ;ôÂsƒd€êJFYïw÷”ÿ4ðG}_|°!‚àà«ä®Áç‹¿‹×ÏûU^?‚xï©T*T«Õ"åkÍûƒ0¼ÉãÉ"E¢ˆs¥¥R‰V«Õ·åꬵ´Ûí›Ê\x¶Þì¤â«À+}ªôžaCð;¿ó;öÈ‘#ŸóÞÿ`­áEp 7²€çæ–?¨ èNèèFÄqÜ1¢Òš(ÿ{ff†ó.pma¤¢´¢V.39¹ƒééijy ©ðÅçÙ>ËɃʵÆt¼×ðŹn"èì$ZëÏÝïà†Í’$ùš÷þ¸xÿ”ÀM­¾xÞ›‘³u@gvàœ# CœµüåË/óâ·¿ÝÜA6Lwd#¯ÓÓÓ<þîw34:ºæó‹ñB7 OÑ{¾Hí%@aôîǤ8®µþÚ­êõ­bÃðÅ/~Ñ>ýôÓŸöÞ?Uœdä~$ÔÒºóùº»‰¢?×aÈòÒßúÆŸsùú»÷Ű« %}#'Î ¬X8×€×/_æË—/óÎGæðÃÜ4H,¼Êz³ï}gÌÑ•dzKÐZúÙgŸýÞ˜pÎ=ãœûYynŸëÍúuE…aÈÊâôãÞûß+þ¾•ËïG‚J¥‚ÖšF£sŽz½Þq÷E/Šbðž7¾ñgìN’ëRa/Bj,Æ€PføÓe¨ì™fçá‡IZÍNŽ¡1¦3h\^^¦V«Q©T0ư´´„ÖšR)Kêv탌ÞÓúÿƱcÇ~ÿ^Öû lJ(ø©§žú7"ò3pçˆã˜r¹Ü!€µ¶Cc qgå2W_?ÁÔÕÞ¿# Ë &&FÙ½k7SSS QªÔ°í«K‹,\»Æì•Yf¯^£™:´†_[„ÊÛ&®à¬¥V«Ñjµ:1…••êõú„]3Û%€Rê×?þïWÝ÷b³ƒþ;kí’ˆü|¿ù{?t @÷l¢¡{ïq^X½v•‰ù>°#sù#µ*‡dÏž=Ô‡G«ÂRj|©L¥Tbtx˜ÝSS\¿~³3ç¸tí:“ü•:¼pîMxðX“R©TÖL-M{ÝïÆ“îVŸ_ÿ¥_|ñîMß6…Çà{ì±—Dä_‹ÈnXßÜj˜¦)årc ‰µDs—x¼U ãã£<øÀŒiÀ¦h¢t›À‡à ÚZ”5à=õj…ì£VŠ™™e_U¸¶b8µ8ËÃHú‰zDëÍ€KZërâĉϾ¥Š½ lêÆ'N|Ö{ÿ^cÌgŒ1¬w9ú½(*ÙZÛé“Óf“}é ;K06\çS”àRçÐÞ¢!HT»‰N[ÞŠ#G`-ÊZ&j5öŽŠ·•¡Ò˜ÇX‡1¦ÓŠ× u—}ßöyïf¶@>À«¯¾z ø[‡zÆ{ÿ«d«‚·5,^Wx¥ÖCÐ\e_(ÔBÅŽj™@8ƒ²Ê´Ñ(x›¹^/(›¢Œ!tã2"xg¨D!ÃQæ%v›„KI‹0Ê2ÒŠi^?ôÎú¸ýÓZëÿñÌ™3_¸g•yØ2[ÃΜ9óy¯µö׌1ioë/žw£Ûø…wP¦”¶ØBEk”sHjPÆ¡A™mtš Ó&:i£“fæ Ò6¤)ØŒgÁyJª¡b2ðˆµY`)òιA->5Æüšˆ¼w³[ÀtcffføÙ;w~Á{ÿäkÝÑÂõ–…­µD¥7Ô¢ŒÝ¦ÝÄ—#$ŽÀhJy´8¢²À›¬[À$`lFcpI ï…@èr„åj•kssïE˜70ž ‚à¿ý“{^yw‰-E€W®\ù“;v|ÄZû%àƒ–Z»n‚  Ùl2±{I*Ä9’å%Ê ¼A¼ç²É¾R(°o ¤1 .m“6Vq&„,Bï©TªÔªUšÍ&µZmÍl ½^ Ã𣳳³3÷·öî [’×®]›©×럑ÿ8h9¸@‘½³´´ÄÁ‡æúð(íå%JaíóÖÑ^Z$JÂz¸ZE\„Óš,B àb ¶Õ&m6Hš­ÌÅx…ˆ£!0½w/­f³Ó *WÑmu-ô|rqqqK¶0VWWÿ T*}^D~|PEw/Û¶ÛmV—–>ð­ï\`Ä{Dx^Ón’š6íÕe\¢‚®Ÿï­ÔÐ4†Ä Ö …GðZDhÖ&ر{çÏœn^‡èYK>ýû|’$p_+ë.±eƒ`Œù cÌš¥ÙntÏÂ0äâÅ Ô¦vҜ܃5‚ +`Q4ÆzZí„f£A«8ZmŒs8²u‹Âù|g±÷´€ààÛ˜¥\.ß´Õ[®.)™ß¸Uô–°å "ÿ 8>àZçðÞS«Õ¸2;ËÒâ"×w?D¨l¿ `ŒƒÉž QÙºqÁˆÇˆ 8#¬ OîÚÏì…ó´Ûm¢(ê,øÜ"!õxþ¶$¶,ðéu®wZ[DQÄÉ×^eex’+;öaŒŠ:H<´ÄÑ´úÌØ©F„¶ZÖÓrBÛCj¡-‚±ž6piÿÛYM §Nž¤V«­™Þb=åÓùoØ’ØòÈñ[À±J¥rÓ…‚Å4pxx˜ÙÙKÌœ;Ë¥ÃO°P­“XG[„¦ZšÞÑp޶ó´§á< ëiz¡i¡í¡-µÂ޳:¹—×O¼Œµ–R©ÔW[¨Žåe߲أ”úYàZ÷ù¢å÷ÄÆÇwp⥗8·°Ì鷀ŸJÒ¶´¼§á=«VX¶Â²ñ,;ÏŠó¬ØìhyOÓ mç0V¸0µŸÙƒï⻯½Æùóçë$‡ß? ¸ü#ÙÒû·¼÷/ÅqüsƒRʘ€µ–J¥ÂÐÐß8ö§WS^ô‡¸<6E;q´ŒeÅzV°â„+¬ZaÕ +4­#I, Ñœ9ðÎ=ò>^ýu¾óÊ+ìØ±cÍ÷­—ž—õÄ}¯˜·ˆ-= ìÅØØØåÞsÝaàÖZFFFpÎñüsÊâ£ÒxÛ¸~í"»fO1Ô\"6’m? À à³¼ÀV²0±“Ù½s=æÄ /pñÜ9vïÞÝ ÷¢—"Ò·¬[ÛŠJ©5[ÆÖk… Â0䵿üKfΜáíï~œ]ü&Ú+ÔV®Sj¯™¯4&.Óª³2¼ƒysñâE¾ûcXkÙ³gOgãg? ð·¿Áp±­ÐýaÝýqµZeïÞ½\½z•o=ÿçD¥S»¦™˜œbh|Š8ÌìÔJ³Lžù™W¹:;‹8×Ù?8(Ü»^¶ ¶=ŠAX¯æ_"7==ÝI׺8s–‹3gû~^Œ Q«Õ²åå[HËcíŠmKéìúi4lÝ[¡V« \Ä)røD„$I|Â`Qu"ƒÛ Û–ÅÖ¯ýû÷sýúõM+‡Öš‰‰ â8¾åõ­ˆmKÈH022ÂÐÐЦ•¡[m|;b[6¿â7ûûß*¶¥^ ¡~"Q¶Ëx`[ ‚5£¶"|tt”¡¡¡õ9î ¼÷,,,°²²BµZíÄ D䦲nUly9rD‡aX6ÆìÞ³gÏ{@G$*Š"â8&I’;nuݳ€õ„A)E¹\¦ÑhtÒÒ ký{öìyÏOþäO¾nŒYšßW []*a“dŠ`içÈŸ?H&™²F%¬X—º­¾¸Øh­‰ã˜jµNf !išÒl6;;zn— "ÂÂÂQuT–——Ù¿¿ŒŽŽ¦Î¹yà™ðÓ p2~˜ãÿg*a0DfäÂÐÉ |ØM¦v[µ»¸âuår™ÑÑQ&&&£R©†a¡îÙQ [ZZbuuõ¶<ëd*aÓùñ¡îËd*a—ÈÄ N‘©„%#Æ`åèÑ£÷}%q#UÂ~œLûo?ÙÞ²JØ­P§P§V«EQwªvç1Œ"êõ:qS«Õ:DèÍ÷ëýŽ~ë·P ÓduP¨„}¤ëšÀ¹#GŽœ>ÿ½ 6 |”,w z5{ºÏZ$S\㘉‰ êõ:iš¢µî„x»3Фë–0Zk†‡‡;ja½r´·³oqè¤÷>Ë6îÿ¾%»?Ñ}ÃFà€Ÿ¦K$êVjY™J˜€„Áiáƒ$bŠHa±"X< #´𞎈SA‚B(*I’Î2³ÖšZ­F£Ñ¸igRñÞ~èÖ‚µÛÁ×ûÝ=Ÿõ½¡†á+"²®JX÷^À;Q ëNÎè>E•J¥£ÉÂjæùæ7¿ÉÌÌææHšMPŠúð0»¦vðÀ½ìÞ³ïú-ŽBw 7æ0¨õßR%,ûã&•°ñU¥Ô}U Û°YÀÇ>ö±rÎ}P7«„õ‰ÊÝd/æçç×(„(¥ZC­5õz½“$Z*WI“/û%Þ8y È:à©:Ô*à=,¬fŠ ÄQÄ{Þóûö˜„$I:Þ`ee¥ÓŠ‹²-..R­V)—ËYÀèèhG¸âNUÂòsÁ<óÌ3÷uÙ†ÍÚíö1ïý ƒTºÿî~¼•L\¯°¹‚G1‹â˜Ù‹3|ãëJ˜Â†·OÃH¢0Û&d;ÅÚ./À‹o^øÆ œŸ9Ãc¿¥Tg—OÇ´Z­5sþ~¸*a/h­Ý]mß>64ðôÓOÿ]ïýÿ]üÝÏÅ÷>ö^o·Ûk<€÷¾(¶ˆËÄår…Å…«¼þ­xç.øàÛa¨”éyÏš›ú(@)ˆ‚ìó×à+' Uxä]ïGÒ4¡Z­²¼¼ÜQ–––¨×ëk<@áàæm¿ÇÞYƒÖúï=ûì³ÿÏ=¨öu±¡q€\ á‹ÈpoTº=ˆ1†J¥B’$AÄÒâu.¾öO? ï~ kåÔ‡¡Rfhx”R)Æ;Kce‰ÕÕeZ«gáÐüWþè•çÞøÓŸÀZÛÑJ’„8Žo*ãݪ„õ$µ|O«„ýçÞû/ßÊå÷#A·(D¢Šuz½N+IˆÂ˜ÅsÇù ï~ Sÿª„ìÞs€é];£ZB!Þ´IÛMV–™›»ÆÅK™¿Ö@l¶SüË߆kñ*#Óˆ7Ôëu–––:zEýD¢zUŠǭ¦¶ákÇŽûý|à¿ìœûgpw*aºU:1¾ÚYOºržGÆ?*„½;GyàÀnÆGkÄå˜0òh JÃJ2ŠwÙ£(Ó ”°î2Á`•°â\×õ_>~üø†6i1èùçŸÿçO>ùd*"ÿ¢»e÷#Áz膵ö†HTj÷yò”bØ5]gÏô•Øã½E\ A®‰x âÐbpâðÞ •er4¢¤F8{a‰(€'öÀŸ^ºJªFnÈѬ³ ÝO%¬x\G%ì_|ñÅùVêöN±i«/¾øâ¿|ì±Ç^òÞÿ:Ù$Öõ·šÆ0ÖaÛ žJ‚ñQ˜‰P’‚„hB|+“€Q âÁí Z Þâбkf¯ÂÃSðÚõëœnÔHSÛ1â ¹øîó·áö/j­ÿû'N|þ­×ìaS—ƒOœ8ñùw¼ã/XkøÉ;×ÖˆDYO‰e‡j Cp’">ÀKNgêÐÚ‚Š@A¼Ÿ‚¤ Äàœ!ÔP¯ûGS^o†"Ž$I:7„è-c‘ ·$Ào…aøÏNœ8qñÞÔêaÓó^}õÕ‹Àß>tèÐg½÷ÿù-TúM{ÑmüÂå ŠZÐ`|⬱ñ!b5>ÒàïHŠBå¡f.#s)âSD,Öf+7åvÞ tpãûx§ÛP ;©µþÄ™3g¾xÓ›7›N€gΜùâž³Öþ ²M•1ÜÚ tÄ9G•(Ù”JZg^>i¥Ä‘B"…Á*‹óJåQ ,æˆXƒ³)â¼Mñ©Ã¦ÙU¥`¼¡Ît‚æ¯u⃄"» ÞÕúSàß„aø‹gΜY¸—ux7Ø2€ŽJØ?ݵkלs¿É:*aEå£p­5Íf“±‰ÝÐ @åÁɿڄ@%(j8£B»f†xD bRl»IÚ„¤-Ü‹d$0Êå*µj™V«EµZ]w 0@%ì§gggŸ»¯yØR(0;;ûÜ­T ä(–m÷|ˆ•å ’ôq”«Ág"`´V!i7ƒ*„@Ù½|¼ bo³ž µ¹ñ}6d˜oÀÔ®½™œL—Hd?|_%ì-"W û9ùò 7 k½Cš¦4V—¨M¾Åöjp¬‡Hr©x)€C©Ü¼B6 TY‹÷þÆ{½Ëº’e_ebç^.ΜìÜlª{U³W$ªG%ìç¶¢JØ–ÖX]]ýCkíç Å­~ûôn‰:êðNõÎe-ߺÌ}Ÿ.— 4.ké©Íž[—Eþ¬ë:lî=R0CïFã¹zõjg'Рd”¢¼ùòçVWWÿð¾WØ]`KÀóo©„u¯:ç¨V«ÌÏϱ°°À¬z “ÝåŸyh׆¶Y /SÂu=÷™7˜ó5Úå¸tq¦“UTD!äv«„ýÛª¯;Å–'€ˆ|*apí0ŠbN|E·ƒóé¼…ÔdK½©í1´¿AŠÂ —½>5ärÁM§í{XYi1sölgµq½i`Žç¿aKb;`]•0¸A‚âö1 óóœ=sŠÓò>.%1.7fš·úÂÐÐ匶Vþzcàõô!ün^{õåNžám¾À–V Û²ƒÀüðS•J¥;µz HÔèè(ß}ý;D¥áÞAñGLáðÂtp#;µ÷Ñø¬ïw91N%û¹à绯¿ÌÜÕ«LMM­I(- R·¼Jض €ˆ­õ?¾ìì½Þ;‹¢ˆÑÑQ^~ñ/ÿØ}ƒîÏÙ]#ö¹Ft X›Ïù–S8må’{„×^=ÁÌÙ3LOO÷mùŒøÙâ*aÛ‚Þû£££Ÿ‘ÿ·8×; +àœ£\.366ÆKß:ÎâÂaVú s•Yöšï06ˆ4ÄùBžÍ÷- s~7ݣ̮„¼vâóóóìܹ³(Go¹n"D®ö‰f³ù—÷©:î¶ ÆÆÆf{Ï­·' R©°sçNξy†‹.pð¡·sq÷‡/·橨%B¼hRU¡!ã,™ 03sšógÏÇqÇø·+%"}˺±­ÐOy«Û%÷#B†ìÞ½›¥¥%^}å[¼ñjÈØø£ã;¨ÖvGY4Û)ÍÕ%ΰpýA0>>N©Tê;ØëÍcè㾯v¿Qd[½ÍÇE„‘‘êõ:ív›¥ÅkÌ]½T| Ez¨RŠJ¥ÂÔÔQ~_ õ"Ð_¤j;aÛ@D:{òWWW ÃÛû)J)†‡‡o¹wgåqüÛA1Þø¾HÔ#Kû.sàÀæçç7­ZkÆÇÇ;wÝnض€Œõz}ÍΠFqãÈíh|Øæ€µ;p6J©Îd;b[À9·ÆÊ"ÒÙ)4<<¼áåñÞ³¸¸¸f·R—æÀ¶l+ŒEÅóB#(FFF‚ ¿°Ú!NðÒ5Tù pÐêHŸÃááaæææ:YI£»¬[[B#¨GŽ €*°—L>æpH)uhqqñѹ¹¹Ãý4‚n ÒôñÈ’Çy£(¢V«“}NÖ‡'iJ³±J»àEP¨þr}ª«W#hii‰}ûöž˜˜xÅZ{–²/oÈD£¶„ŠØ¦x€\ªD¦ò™lÌCd 'ŽèÌåçò;vçzsïû¶`/€P­–Ÿ`bÇõájµ*Ò¤&¥Ñh²²¼Âêê ‹‹‹4-œµäÛFo|–A:D8,"‡{J’óÀ›GŽ9KFˆ“À¹üqH6R4j£4‚ÞI&u€,Ùó ÙÂN…[HÇÜòd@A#ÍÈÈ(cc£T+Â8Ä{K;m¡µÂzƒ .EŒMŒRª”XZZ&iå¢ÑB§˜Dbk @ ìÊt2Ѩ+dä8E¦(6|çèÑ£ß~Ku±6ÊüàŸÜÉz¥TÔŽÜd ib##ÃÔj–DÚ(ÉîŽ5¨P#ÎãHq*Å“b½í)WKþ D¯!À ãZߤf²QY·w0?~¸ëÚ¿¶=¾ ü°f¨Þo£d/Ö¨‰ô “€dzB8T—ÇÖ¦\Q!iÁ‰&ô‚X–ñyÚ°œ6xmð*E”E…ÙæRo=ˆÞÝ ô+›ˆ`ót°"GA÷!D÷o,Þ׃å¼îî6„J©¿ž~¬_%ô Dt·ê~ÛÃo|08ï³›A‹Ëûçâ;… ÒHàpªV!àVJ«œZ`µ´‚×Ùý£$¢¶\§º\G¥ ´ÅëQ´ÁáAi3ÖÂkÝ÷(vk­³QÅ-D£rR<üÅúµûÖ°!xæ™g®|ìcûðcÝ)Dr} ‘Ž&ô´zÉ{òü=7‹DyDÉÇk‚àH x¢О¹‰9.î›anô*I”âƒ<Ð"£¨¶kL]fêÍi‚v„„ >pX1*$³~ž?N¾P$rtõR…JX¥²÷h@+• D‘A)‚®µˆ.‚|á™gž¹rï,q36l`Œù}ïý%Ùís£gã´ÂgÏo%tl  Á«¬€Œ §„ ˆ@{ÒŠðæ;Îséó¸HDé°3a(v¸á„ CIDATÿ +µU–ÆOrqúû^;ÀÈéq f‚28 4â^ O'P èä'vG({4²ŸÑGªã%”º¤µ¾ï:F€ßû½ß›ûèG?úŒsîè]Kï~¼-PLÎQÁe-_åÆÇ #-˜ªãìSg™ß·HD@¨uöæÀãqÙ P^¡Dù,¤)§Ÿzƒ=¥ÝŒ¾²ÙN:8> £•ï"éØ?‹tàV"Ý@eÃÝ žùÒ—¾tcÎ{Ÿ°ÑAŸrÎý=-ÎÝjKøM$èž (ðxD *ð8o@9¬´ˆ/ÎèKû—)AV[ ¤Õ)QÕ5¼-Ó`1Y¤•4±ÆøÑŸŒ3Ž¡—‡P‘!q Êq—&(!D{´–,³@e$(Ö(ºÑ+ÓGÐ#±è½ÿÔ=ªöu±¡øÊW¾ròÃþð§½÷ÿ¹nò P¹ëUÑÑ"ƒumJQÄÜ{Y>¼J$! qqpø0¿µƒŒ—'©ª–”³ÄB{žs+g9½x’Ë«i§) ¸þ¾ë„×@ͤ.¥WI#ÐbA”ïSåÿ1âöNkûèu‘ãSüÇ|òÞÔúúØðH µöW¼÷OOôkí݆î7= ¢ ë»Ù\_´E0Z¼JP!ÙÕfé±eÂPC“µ Œ}C0PSuÊÄÄD( ŽbjaýñŒVG¹°²““׿ËRc7,,>¹Ìè•:&1H˜¢b…8“Í Èº›Ll¢ó;o)Q<ï¹þ¢Öú½—u¾6œ_ÿúמzê©¿åœ;ê½Wq~=/ÐM€0 3ãkRÙÀ@p¤ÄUE˶Q*eåmd4ŠÉá){£åQ\dHU›1 Ác1X¬²Ø ÅÆ–¡ú0‡Ôƒœ ΰ°2OrÐîiÁª'( ÞO\Vƒ:/_pÃ8ï w·’ˆéºþJþùç—ïm­Ʀ¬?~ü»O<ñÄXkÿ/à¿„›[ÿ"x²y8P!ÓkɦUdM.°x Q­D»mqq›ô°E‡ŠZ©ÊÔÐ$ĵ±:ÆaHh£P<ž”CŠ "ë Äž±ú8mÛ¤¶H¥Ä3 "CPŽðÆe3’ ‹†áÏ|ó›ß\s‡ôûM[~饗®=öØcsÎ=+"¿ä½Ÿ,®õ ùœ ²J×E¸×e-O[¢r‰hMZü˜ #(WKøØc£: ) ǡтÁÒ"%ÅDg &2Hd‰Ë-IpÓ G<•ᣦeÀ©,ˆP_eƒAc,Jƒ&Ó$Z§ÕÏ)¥~>‚ÿÒK/møÒìf‹D ð›?üðŸXkø èiýy ¨ AÞíjP:ª0Ûø¯b¡†,MxTI£b Sl˜b¢C‹M@ÒµDèìâ91Òœ &JñÖ`#‹ :RÈDCPª˜–EEÆ£´ ´Ï<@£ðÞáG£ô~7 ÃO¾ñÆg6 ºûbK$„äð_8pà'¼÷¿""‡ ‡º++dî_{$phí 4Ô*1 ”5*R¤A¢ž'V)!!Ù R°8"‚ÃâH1´i‘Ð" [¤ABƒÒÀ …¯{¢aMm4fq~%ÛhjTà2o¤¥â¬ÅzÉE(njýg´ÖŸœ™™ùÝ ªâØ(033ó»{öìyÎZûKd‹GªXì¹ã” u¶ÉåA{‚¬´™«G:s¿¨PÑ \ã ãLt¢ެ;(TÂ,‹!!¡M›&«,²@[·²}„aöUµZ…r-"u A`µÏK×ER-Xo±Æ¡ÕšŸÿ> ß?þü}òܶ.^¼8ü7“““ÇœsÿND" ›7”ä‡GGŠVÚ :<Îx\cÁ7Qaˆ:Ô´hq•Ë4Y¥N*5bâ¼ ðX<-š´h²Ì MšeQ¡"Á;M`;vŒ`Òv¶R¢³(¤Ò !Ag³8@ŒÖúï_»ví?ld}Þ [ŽæææþÃÈÈÈ~çÜÿ\Ä×!¯äΞîl(8tÆ'´L“éÑqÎù6aþ¦+´iä}_±X<ƒÅåd §=¢Qž1)³cd„ó3ó¨ “¥r÷Ïšä!çm/~qeeeK¶¸@„1æ×¬µß1Æ`lvt#›Ãg‡&»ÝÊÂò"ÃA…I«òàLþz‘¿à1¤¤¤äKSèüED¯X-TÀ>5Ú³ººBGw¾œ´¦lÎÚN™­µßqÎýÚý«©»Ç–&@³Ù\²Î~ÊXƒI³£:ú=Ù}}–––H› {ë@á`¨Î¿¾YiE’‘†¡4b2-3¿²L’´ ´Fœ€ó]ÝS^*Ö:¬±˜Ô`­ýT³Ù\zK•qŸ°¥ à¬ûŒ8¹¡£Ûe'/à¼ÞÞXu›Ÿc²Qbj±„S‚xé´Q¿fH¹Ò9Šåi29áÁÅ!‚®ÎÍ…%¼®X¾v óìV$’˜ˆ\tÎmÈÍî[ž"r=ƒ_êäàuÛNâ<ÞzÄez~å¨Â«‹«õØLÛRròìEj—…8YgxQ‘"Ø|Ο§ƒàò)`A‹`ÄáSÏ¡ÙO\fùú*3çæ(\`Á…Oo<Þ^ã)BÐjðÙ´(ßí`[ wŸ}øà¡ú"ÍN@,X#Øl’miBIUÁ*N½y Î%¼çÕ!œ)'`ÚxÒ®£ø[Œ0z-äÉ35Þv¡ÆÜ¥yÎÏ\£¬c0¦-Ø–Â&Ù÷º4'`Þú‹AçÃ}PDþéfÕ×íbËÆzѾ"WßvèÑÃâ‹>Wez¾F°© P‰Â6A‚Š<ñPïÚœ={Ñ¥Ý+cì¹Rc~ܱ\³$ AeQdj­€±Åˆá%Ms±ÉéÙ+´V ¤c¤aš`›“hl‹Œ†¬ pи]°mШbÔ–¥âå7ú°¡ š‚ÒYÆ-aö¢¨V¦R¶,/$,­ÌQ¯ÃÈPýµ2ºe³6ɲÊmÛÐh48½Ò¢½ PÖ\[aVÀ4l\\\K:$"ºw °å±í Á ¢Á*ÒÄ·% *éZ*&ÛÅ#žÐ”ÊPŽæJÊêR‚JAqÏ'›M @ TPb$ H› ÛT˜ØU0 0M0­¢Ëlê¯òA`ÿL[ÛŽhÐ’íè-•*¸ÄÓXiQò¡óX'ë)91B˜ QâÐe!Œ!(EaÞYËÛ‡Fø¼B ´àÚ>sõ ‘`ÕaÓlCáÚŠvÃÓÄa¼ÎLpëbÛ Ø„¡-TÊevíœf~yo¯J >PØ@’‹þ+¤,ØÄD ó=ùN?¼(Èc .Õ¸|ªqm…mjl+3¸´¤™÷Á+â0brrŠ8*e›[ðj}C[ ÛŠïyÿ»^9y2O–Íûí±± ÆÆÇ!ðèÐAIc!(9tÙ£K.{^òè8*íQ¡±äüÓ3.Vá†øPãb/HEãj›j$UˆÕˆ×(ш¥“¼èðÍw½ÿ÷õ¶ï÷ ÛŠ'Oô(žÏÓÎç«lÖ”@© 3†Éö zTv+«ÁHêñ‘ B!:K&Y¯qyË£4À¥ o4.ÑHnxLÖU €U8£Ÿe(i­ME¿ðÛ¿ýÛ¯¡;Ç–S¹žzßSC©þTiwò×Ó+ñ_]s1º1 b¯tì³–y‚XP‘C’µþУª“Ç- ïqïK5b4>Uø4À§J¤8oصa”ê´ÿL{Ù}úرcߨ¨úx«Øv(ð¿dÛ'«¢ó_›ôIPÕ‘ ¯‰$БÏ Uä(íCŠBK A×]²mFâñ^”«F;ñÊ9£¬˜ÀŠQÞå°Ê9£…$–é¯\+ÕWW"H>$ëyKbÛ ÿÇÍ˹A> Ⱥºâ¹ÎoÄmo ³”6?gɇ}ô„zŠÙã'¶[ Ƕôï º-¯ºŽéÉó*¾‰Û„ñåjÞó*ìü’¶dù%Wnš»~š]Ț‘!Ÿüïè¹DÐÉ"NhX0Èqæê…æ¾¹‡-ýóŸXøç5›ù| ÓIÙÏûOÈ8i4nA¼áè#}û¹2§®Ø”_N\}ª[`a£ÃÌ¢~‘kOºD•žÖ+?§°xÿMÁüÊ‹ÿ?è5:A £9tbÚᜒ¸†@ßþ#B,ôíb 7r! º¶‘¯u¬C¯k Î1ö]j벸6Ì+ûà1ÿeuO§Ô¿Yuô‡°¢ã×fr¢<ºôä”ÖéžXvN0wý™/yµþ¡áA-Ë ѰéÏ¢—¡bw=Fù%¡ûP?ôê‹îC| i:‰à…–è5>ùeäºÇŽI;Ÿ;/Ü iûà•u¾Kk15¯Á+Ž ´°áyDqccÔ''c¢KOÌ+;/·îì¿Oõ~΂v£„&®ËºôwAc'¸Ä"-g †:N…š‘=Tì nâŠvèã› ÓYë`¹ã+`óQæWÂ)m=ܳK0)o-&/«‚ÿ²Ï@®¹âUØšã—#×6¦E•œ½îŒÜœOOý{è¨g!PÕ&×A×¼DEÇ ÊÚCÐ^kz™:ÀÞ•¢?`4†MAo¯, .Æ ™¥0ù)‡®ÃÐð2Xů€{n ¢+‘Y¬ê¹ˆ©ˆ†÷ÊE˜¸d|s’+1W4Ï*œ¹º¡<¿ªÑïôé3¶_|ñE§7n._¾üßANU[ ÛQ¤,§¦%ßÝønG“q0öœûÙ…pŒ)uDL—ÃÐ'½ü Ð/p5LCŠàšŽü³Ø~.v>œM‰oq? y'áY0N ¶c|Ên¸§Uc"bÉLÍ­EFù‘æƒGN=¿xñâãk×®×ܾ};¤©©IçÉ“'Ò=ú¿À²Ú,³²œ¶ø¼y`6zMLÃ>Y„%Ðó̄ւûbhyd£§GD^Ùð*ôFE“¶=–GS±ñ[/¬krAÙC7äœõ„ìtŒKÜ—;à–² î©{’»ÅÛêÑÐx/^Àµk×ðÕW_áþýû/‰üÅçÏŸg¾yóf(E‚€á½/£"ñÜÊ:nÉ›ÆFäaÓþˆ/ØCôtN‚Èu!´Æ/‚È- ¢ ¹g¡'‰a•äü«#°õÙ‚#¶|gòÇ#°ü†5‚×ù28ͯ‚sâVx¤lÇüÂ}Øyà0N:Eä/rä)òŒ<ˆ<~üñGùæç/^<¸|õZBAA¾ìžê=ï_€ÞKÆÅÝtãDŽs`3= ¥; wãg䛑ó|y.‚öø…èéšBB¤Ò¡7)£2Ý[g…Å_X#ýœ·;aüÒp8&a\ÂfŒŠÛï”-(ذŸ>ŠÓ§['ÿÓO?1ò¸÷  …*à;3ì´½ƒÆ8· ï_€>¾©“YË5ôÆÍ9¦3:¢Q0vOÀÂU[Q¼õ\¢ò‘U¼ ÉË7Ã|j´\’ E®‘+´Ý“a¾3"Ñ;ht}@4q)t½óa¸ÓÓÊQ±£ÇŽù߈<Ù?PôëN );ÓfGÃ#`êCGgW3'wO££ãû`pèJÃ’ZYç9ktfBgT(´G…CoìløÏ[â-°~G.]¹ŽêÚcðŽ_ ½ñ$‚8=\QФAË-=ÝÞÖŠá!Ë‘¾º5ŸÕ¢áرVmÿôéS.ò×nÝFAé„%$cÞ‚d/]ŠÅÙÙ¯33³öfdd¸ÇÇÇ«š˜˜‚ƒƒß!õȨö¹Å¸ê9?Òµ†ŽC´fAä ÛÀ|\²»kãæWwqéê ¤¬Ú“IDÞ)"—D"™Òc!Í é˜’´¶ì¡Cuù_“ðà¾#òMß~‹í5µˆJÉDX\RRÓ°lÙ2¬Y³eeeؼy3Ãëׯ?°zõê)$FWAddä_';lØ0¥¥%·cøðáãIóƒgæÈ:†¤êŽ üI×.ºvÓ¡c?"ûÆìô5¨Úû9nÞþß>z„ »ax E}l´`”‰ôåë±§z/>?t¨UòMDþÑãÇ8qöR 1-&1 ó‘ž‘¼¼\qä·nÝŠ½{÷’ˆoÏsäÈ‘ç555G«ªªÂ µœœœ‰‰‰MB‚AšDÊS¡Žà¦b`?-Noä”&]Û) 1Þ AÐ=‹”Ò°²l;Î^ºgߺãà‹€ø|Z¾5û÷ãP]ë‘ojz€[wîbÃŽjÅ΃Oð,ÄÆÑô˜™‰‚‚¬]»åå娾};öÓyêëëqòäI\ºt 4(qíòË/¿|yáÂ…S$HÔÎ;EÑÑÑBrÇ» `jjÊaðàÁB‚íËÐV– ÃöÍ´¤LÇÊ:Ls׳õ¿¨kã·BL%LƒöÈ ˜MŒALú*TVÂÃGOp÷ÞÔ>‚ššý¨k…ü;wpïÞ=;}Y…¥ŽKDxt,(·1—’’‚•+WbÓ¦M R8pà‹8Μ9ƒ«W¯rÄ¿ùæ|K)óìÙ³·Eó‡^R9CßG766jWVV <øÇ(** ”””òòòB‚AZNNN†‡,ý-+%ÈÈ«t’6°–Rá#kc÷îÝÜ9Ξ=û³x¬f<¦´!Òxõêš››ÁÛ¾|ùòÓó4EÆ~÷ÝwZô±ðÏ ORi‚ Y‰})ý^"ƒ“ ô¬'}¯7b2ôFø‚¹ÂÀn*âR?ÆŽÛ)ò5 [r6eQ“ÿòÖ-?{k«ö )§sâç!..‹(â999 ëbݺuزe gg–Û¶mã`ä>|"ÆEÍ bò-}÷Šîá̼y󦚛›Ëz{{¿³Œ¨<¡Aß—ãÅ`Ò3sê`0Â+Rßzâ×zV^еö†‘}2rWã‘g¶?zôè/"éêuì?z …;‘”¹QÑ1œåSSSQéYÉ|?~ü8ç–‡¦ºÑ„ׯ_ÿ&q¶˜+Øyìííaddt]CC£­w@È;@,€"v-‘íÚËDÎÐÚsœ¾•ÇI½áͽm½‘•WˆúÏ?ÿ•í¿ ò ç.aÓ®ýˆO\j[HHH@WéóP\\Œ7rQgùÎÄcΡ§A.ßY½`ögß±‚xîÜ9nLnm±šÀÎiee…ùóçƒ"ÿHKKËRWW÷ÝÓ@ZZZFJJª¥Š¿D(”Ó·p¨?|ÂV=K·—QIYhhh ñöôÏä¯ÝüŸ5žCÝÑFÎÆ,ÊéééȤJÏò½¤¤\”©h W;nÞ¼‰»wïr–g¤XT)¿YÕÇ®]»@EçÏŸç'ñbÃuŒ=¹¹¹˜;w.ôõõ_öíÛwŠÁŸx'Ø«— MªÉuéÒ¥]‡Ùjáñ¾¼Ö@Ûž:æNKœýßÖªç0ò¬Õ½r»ŸDbj&—çÌ Ô¿91X¾WWWsý}~åÊñÓ WèX¤%-϶ì3FžÕÖ™¸~~~ðððàêFxx8455ѱcÇ7”!ï쀱cÇ ¬­­Y[Œ9RЬ$K§–¨8pàÀö½{÷Vêܹ³"uIA:‰út4éœ[Xzë µ*V°¾ùæ>/^Eõ‘ÓX@y?jÔ(Ìš5‹j˜½™Sq–ÛlŸµ8qÔY¡{ñâWèZ[L6:³ßÆÆÆ‚î•#MS"üýýAƒ²²2ÔÔÔîÑÖÖþsR·nÝtYH`ff&EE–¬¥@"JãÆS¦ *Óçœ êêêŠJŠŠœ3üf}4ºú@]ÃÝ»_7³éðøù˨>|Å«àî9£IOOOdeeqµ‚u u–ãŒü#úMËöö[‹ÙŸÕ;;;nvذa\]]¡ªª têÔéa×®]gXXXH“£ÿÚ¨Ìz(Õæ !ÌRD\–DPpqqQš0a‚2A…öU˜ Cn¯¢ÒA1 4¦ÿžu›ï7=|yŽR ºþ8*÷DRzÜ=#Î@‘¿Gä})ÿ¥©þ3I222²¿ ŠŒ±±±<¥„¥JG‚:¥ˆÆ€ºõéÓ§»f·®šC†Ùö/«Ø¶âÔùKÏöÕ7Ð3ÃA”TlEJÖ’fO/¯G$À^^^œ]ÓÒÒP[[Ë>FŒYÿ÷D`õ%$$“&MâdPp~&O޼ImÏ•îSسgÏ¿Í[(1Èñ­P‘º„ M‰jí۷פB£C¶3"Õ†Ðþ0åöím:ªª9ÍŠÌËÊ/¼S\^ùrEqÉ«a—µuu?&78;;ßõõõ}3eÊ®5²ŽÀÚ«,¿Yñk™÷,çY EDDp…”µR:—ï|ä/ˆD"û1cÆüc¤Åí°={kÎþï„ЕÀ|¥Oø€ÄDî°¤ÑÙNAAÁ©]»vžÔ4üi$++Ú¹«æ"S3Ë23 Ë ÊËl:~!ƒ"µš ì1ŸgÓ§Oof’ F¬%²ºÀFjVø—{féÃòÍlŠ¤âÆ‘§NÅr¿‘j—=¥¬"(9ñËszçAH–'®D gB*¡ A“ÀÊ©!#Îþ‘0”`Ep …ÎDÌ“Ä 1fC"HXÚO ›J¤ï’é»Bº¬¬l}¶˜¾[JVÝ0~üøKdë—,²Œ{`‘8-X±£c°jÕ*®uÈŠÉ7“°GɉãøÀ°ûìÌL™àŠ!&/×"âê|Ä»KïK@ž¨ # ì=• Á“„ð!²D0„ˆFÉÂ\Â<ú;‘H¦íBB a·ˆì›Ey\5mÚ´»4̼a"0{³‘–u ²4÷¬Àfæ²:GžH7Sä1×±‡[BþEü}«ñ<Ú‹ç !~“¼²y ^QVMtl¤êÃ_ˆ]Ђ0‚`OËàNð"ø’SHŒéDr&!”öÃiI"Ì!òÌqä”x¶O–N§af‰ð„FÙæE‹q“ã Aƒji?;"ÿš„ØG.coJ‡Ì ƒƼZüý3:ð¼$Ó£ÕgEþÀN¼ÌúÝ=xUuyŒø ± šñN°á…`n`vt%°›óàad>?&€Ä˜JbL#!¦“ÁD„¥Ít*¬¬w§………5P«{žœœŒ?ü‹ºù4ìl¡Ì™]›ÎÇ1˜`Âß›.Ï.Pá á«¥ý;ð¹/vX->ôx•ÙÅúñ)aÊ‹aÉ×&ˆ«„Ѽ0cyqœÎtã.$„+ áFp'<Èδu£æ=yòä¥$Âê÷o$Èÿ@í¸˜`O¹oFB¢}H¿éGçÛ_“ž$ye¾®µkMÉ4P(€âÊßYBˆî|Jˆø´‹Ñ›¯ýøÈ;Ä”¯f¼M-x‘ÄÆGq8°"!¬Iê$¶aÂ&:88l$<'òO‰x6=âZÐß)ÿûÓg}Hª Úô›îôû.$ªïâ‘W’ˆ¾ü»¶?%^¹ü %ÅèÊ+݃Dì]^}^˜^¼SúðèËw‘~-À>û€„`‘4¦ˆö'LH ²»%O'Äy"ß›"¯O@DÄ»q "®N¿íÔ"â’ÄÛµx¿ñNs€l+bˆ!D¥ /JWÞ)š¼[ÄŽ‹¤Å»§5h‰%2=©Xj‘"²¸ˆ¢­C³ƒ6‘×¢¨w§¨kq5:¦ÛáwHK¾Ø‘á.õg")‰ù@Ž?™%þ‚ba:HˆÓ‰¯#jB©KÖ¹ÅgêǪò`ä:2’DV•ˆ«SÔUI”ŽT<[Z[ñ7ÞdI’þ¢ä»C±(baÄâH¾7P’@ûßR+øùE ÁFp-ˆ¶|m'Iøo“þ#A„­#Ýâeª¬äþ"d[”‘¸–$Ñ÷FöŸIR¨w…°´­¶Õ¶ÚVÛj[m«mý­õ§Á0£Þ–ÕIEND®B`‚qlix-0.2.6/pixmaps/miscAlbumCover.png0000644000175000017500000000450711050625206015675 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ"!L©ÚÇIDATXÕW[Œ]UþÖm_Ï™9s93Ó™i;–vÚÒ"‚%C|À%úPŸŒA_4Æh‚oFˆ/hb0 Fž$x‰Š>˜ˆF ZH¡-”‹…-í0Ó™žvæÌœ³Ï¾­½ÖïùôLK)ìdeíëú¾ÿÿ¿õ­½>Òñ¹k×€?:º¥ÌÝ`šrÚÊÁÇ,X…1"N´fjÜáçŠ4Z¼ti¾yêT#Ž×Y^xzzûÀô¶á™ÐQǦ+·n›ž«NTÇÊå²ë8.Zç¦ÙhdËKkóï½ÿ–㕎 ·Ž-ž<;?¯ÀÓæZìZ÷''ùÕ©-ÛFK‡ænš½gnïÜ #Õ±²çúcŒ10Öþœ "Q‘åIv©¶Ü|ó7O½õÚ™gÖW×þ\«­Ÿ]Xx:@…«ÌÜ?¸s²|ÇìΩ>ù©›o›Ø4¢G20FD×NcàŒ@¤óL/--®¼|ìøÑ3ï.þâÝ·’ckkO®_IB\9ÄÔÔ—‡·MÚwëÎo>pëÁÁÊеVh­™ÖZkEñÁ­ó\kͬ%„¥ÒØÄøVÆ‹¹B7Ö8f“éµ°JåóƒS[ïÛ`÷·wíÙs£RÊϳœuAõe\ëžÖyž·Ïóœ1.Êpe ¬¸¡¹–\ÌÒmçÒôd~ééÃþÈÈÀ;oÚöàŽ];o䜻y–÷@zƒ^§]ù^žg –ËÃ…iN§qüN)¨,®­-úfÁa!Ÿž|`jóæ½…Ön”ç@Gd¬¯7Æv¨'@t®»ï*) GŸfÜé­3ûj +_9¿6rxè4ð•P©è²[¼{ÓìäíÆÚ Ñh _å]p"‚ï»(‡Œ$ÉPBúí :³©ßQp® ¢­hI*‹U.×¥ä·GtŒH)Žï|ëKØ¿oÖ×#žë´ÓÎ9„”(²»wÍ`rÓÖÖ"PgʲËVáº.”j—àòºÂb)fG|¨Å¸÷"ãl]HŸº¬»Â!9\GA9 Ï}IšC)… ðñêë§ñü ¯BJGI4¢ýüøÏ˧†~o,!D;#R¬n™s¬É½–ÄùÉ”fß~™,N×­ À¼m½?zì·hF1f¶nBÅø×ó¯à/ÿ7Ê¥Ž9òÂàû?üvÌNÁQgΞÇû 58ŽêÍ„þUÕOMÊþË=œÀ©½€êÞÃ%]¸‡C}Ï•b³DÆ¥”0¦ýq¹¢0DÀÀ@ Žãl°ic ’$ƒ.4ÈZYEÑ›‚½f¹Ítq6Ñ⻢ÎÿtáÂ/[â‹_,üÁ¥H9ázÞ%¥'1ÇQPJ1Ž ð10PîyD¿O8ŽÏsáyíšw#Þ=dÁëqnþù›µù§V‡»¿dG(ýtìæTÌnw=R®8SJ"ø¾ßk]ð.¥T¯ÎW.áÖZ0.É€Gq¦Ÿkåòñ¨äÁÒ}fãOéÒq;0yW]³¼Æ¹™q ª¤Rž+™ï{ðý`CôýDººà¬œ Ë£Vš¿‘z´^¯¼‚S?Í>ð·¼uáÅ"¼k¹úç¶êûáh–<ßs™ç¹½ AÏózéï'Ð@&+ìêZ‰I<Êóô¥Ö;O$¶/@¼ò‚nMÞ{žSz’P0ßUcaiÐ ƒPø¾Ï|¿~ƒé:'ç`nuAq#ŽçkøéFA?©±àDëøÉõ6&rÑñÄ'.†>ˆ ÷ta2r”àÄü —Š1&g``œnˆñ,Óº¹²¾¾8¿RÿÇrœþLgÅï—œ±÷pô‘üãì »‰dãû ­bÄõ‚}ž£ŒjßPNûJ I%]PEåY½™$ó—ZùI¦_Ê›×O¯D+8þD0ú¸›Ó«ˆàs;[øù`|¬TÊV-£QÂ0¦%ˆ.I­¾Åóv2Æ_¿‘p÷ø?ALA†‚KïIEND®B`‚qlix-0.2.6/pixmaps/playlisticon.png0000644000175000017500000003276311050625206015501 0ustar aliali‰PNG  IHDR€€Ã>aË IDATxœí}[%ÉyÖ—·ªsNŸÓ§O_æÒsŸÝ]YÒš]­nÈkƒ‘ óà°7^A¬xæ‰Gž ƒ^°M˜—Û!l#ieK–„C¶¤Ý½ÍLÏLwÏt÷¹TUÞxÈÌSYuêt÷ìtÃôDEݳ²òûE¬µxúå_"tÿ1­í“èi8€mØŽÏ?vôúW ?~Dõxœ¨.ƒ=l3­¡”B.à cHh8à‰_ëZ¹%< =‰ (H:“ùÚ©öÚ¥‹K¯‚ç¼óÁ»¿vûöèGB  @ù{´¿§I<1ô¤1@]Íð®ò z/üôO_ûõÞ ½ÄQ{ò¿õ?~ç­¿ûÞ{»¿Ã9Z¤/G£”|‹'P 4ÙÂ'êà'Æ@$ m¿ü© ÿ´;à—èRÚ¡Xè‹3Ÿýì¥Ön³UcÀ´ü}Á|ÐZÙO =Q/㉠ªö‰ÖÐW¯~ne¥õë,‚´^Ú_ÚŸë Ðï‹ËO?½ò·¥DÏ4Q¡Ì'ŽžP—PŠ|a-’$xîúêßá­!ýWÖgýi ’| tü/ðìÓ£/ýà›ÿZJ3¡®D €Sÿ±SøÄ˜‚'MT5€*{þüâ_\[åŽõ_þ @ít hÿØà§±º"žºöÔòÏ+ EÕ <‘ZàI`€yÒÏ $œ“öó×WÿnÒpÒÿ+pØzÇÞZ¤ÿ°ÎYòܳƒ×Úmºb J`QÙMÏ=±ôD¼„§ºä;é—°çÏ÷~j}½õ ÚHž¬`küZì"Øà'±¶’\}êêà甂D©êšà‰¡'‰‚„r¿´Α|äúÊ—Óî2£ý¿ XX X,hÀþÏ€wÏ‘çž|©Ý¦+ÆBør8šµÀ‰§“þ2qÜOPÅp)óçz¯œ[o}œ.}H®V¹;Ì oúwñ4À΃~k«É•§./ýu%¡Q2T(;Ö'½ýNþ Dl¿€KpŽäùgW~1í­2ºô3˜:ïÅ û.PüÈ¿?BÈ“ÅWÀ»çÈõ§¯¶[tÉk8$|’ÚìD¿L,ý U€ZRÂ\8×û ç×[§ƒÏüiçð©{€|.Šó)uP·Ý6_[~§V“+W//ý¬÷T˸á$·áÉ®|D18㜈çžYy-í­2ÚlÈ÷P¦ömy»¼è1`²øS` çÈs×–^m§tÉX0ÌúOÔÙ/çß’æÜÙî+çΦ£K/ü œ¤ßôŽ»ÜZŸá÷z¨ w? ¶ü VW’Ë—.,þeíò ª~@xn\ŸG'¶â¨vñNí>Aèµ+ý_H{kŒ.ý%wJOù¾»ÃÂoÝÚ¨[€ÙÐ¥Ÿ„èž#Ï^í¿š$¤mí4³žÃjõ8‘t ®s¬öCÖ§Ou>uù|û'Øòg€äªXÝrRŠ2³k¢m&w‘5ÎXý‹8³Özîâ¹Å/(=ÕÙê¦à$¶åɬtD!îµ>òÌòkí¥S ]zÅÅûfÈÛñNŸ@Ÿ‚oKyл®ðþç,^¤Ï?µô‹B¯‚ô‡çžh:© {þ ¥`N¯µ?yé\û“lù³€¸ÀòÀNÜmÖxµoèa™2‚Š\¾€Ÿ[ygÖÒë—ÖFi”f ö=N¬8i @£uðü9JÕÌžzðåö`=¡ƒŸ,Ô ïxM`«¶ ¡€ÞÔ¶{Ðà³HúWéóOõÿ¦¤Óà ÐZ½N¸ c¶¿ŸÃö1§×ÚŸ¼|~á%¾ü€¯PNú§|æØþúqk€â¶×§ÀV_ÁéÕös—Ö{_ðZ Î žè>‚“ÂAÊš¥?@Ÿ¿6x­½t6¡ƒÏ¸KÔ6 ï¡ã¶{™”fÁ@=Ô&` èÒËHú—ésW¦Z E5,lªß‰ Sш‚ô)t¶µõòås /ñÕ¿à¤ßJoû•U×ÀÖå1·mbs`€ü` €­€¯}gV;×/í}Ai(T€ãÿk€c£yýýqìï¤p.¡K/;üä]§,èÒþ[ 7ð×3C~±¡›˜zÏùèÒ'‘ô¯’ç./~Ið©/˜bVòOBÛžŒJzŠm¼ ý/]\_x‰­¼ ðSNj‹<°^ÍÃFR¼ã1Hðü:¿å’Hl|ísX[é\__ë|¶4õžzÜ`ßÑ>p¶Ï^î¿Ú\HØTúï”)_ÀWeøgÃð> tìšÈ40@n¸ ô?Öà*{îòâ/rFÂ`‘Ø×û4_ý4 Ö“yéêÞFGÒm<3˜*CXiÏÁ'(îzˆeˆµÏcýÔâÇÏê|^*”CÈc-pbè¤0@“ô Xàúåþk Ë:lð /ý!å@UºvÌP ûüñŠ_oSø°‚ö?ŠÖà»~iªâì`Ð'† g¨ö‰5@â¥ÿ£—Ïõ>ÇW_øŠ¾¸åî²ÞÆÉ6؈1L$õ3çƒyð¹‚bË9…|±ö2Ö׺?·Öù¼tŒê¾À‰/ðXWÎS]úÝè {ýRÿµîÊ•ü„Ã*¿謦îÍìv‘SXѦ,cj* W>Úÿsh/?Þ½ØûEÎjõ:ac×JΓ~çùkеåô£—×{Ÿã«/|ÉuàHߟ?9PWMÓõMÌB¹ ȯ>…s§ú;·ÖyEºÏEêãNÄØÁǶbÅq¿Ëù[˜ë_ë®\ê°Á9õ¿ï¤´’Ûö]EûxSî›:à1ð6ºF;_´ÿÚƒ§ø³z¯1 aK-Д|léqaZ[€ªCœ¬Di`uþø¥õþçØ)/ýê> ·Ü]ÆFU%ÚØ©nÒ¦zAUcNÈû[„XýóX_íìüjç'uU ÄßÄï¿ëcAÿ·+Ò”1k¢Ê„¨~ìa®_ZüòÂòÅï?hä7+# LØi(ÊúMÃ<¯%ê& ñ¸g’|°´ÿ,ZKWØ3ç{_¢dª¡b-P æ8l»9ý¿äÄø¥C»YwúܾXé'Ï_<Ýû_ù(ÀúNò}×mU‚CüyùÁÓŸ±ûu afAŸ25tþ_B²ö œYé}lµŸ¾¨4,ʯ‰¦]ÔÑ‚è=ÿŸÓQ<ïeÀ¶ámØŸùÄ @ËX˜kçz¯vç:bð¼¼q³Æ_ )÷+Åúž¾@€¥¾³°žÅmú4ì[ ¿ аþutW’ëç¼v÷AþM_oÿõI%Ñ`ÚÁ4´ k8“™süCÑ ðË¿D†C›ž¦û÷?ØÎé(_k‘h z♫gÿ’Xûq€\‡Ü(óÒL£föBf¬ß÷½€$ÕúEl\…äøØt8™?oÆNûˆÄÚÇpñÌÛ/ú`ïå;÷óÿÅânµþ¤ßÉ…pŽ¡™ 5]iÏý&ézý+ö@f™a€C^jýžyáO<ÛF¬µå=ÆÀh   Ò&„¤Ïž_ü[½åõE1xÎuÐä·à<ôŽ$9Ø~¿ï·‰-ÁŸÑ5†eĤ¸°.Xÿ,,]J®ŸÛùòƒ¡ü߀Ý-” @3 JIY(!•‰¨¢lÓÌ|Dû1HܪcÙÄÄZ;ôƒ¤¹Éí«ñx›F3Òcaµ†…n Ò¥”,Z‹Þ —œ[]l_'Ä^e—Ï,wÎuRrªÝâç–žþg>ãÀ/n„E€ÖÀšVÉ7eø1€`ò&`•Ô V@E•)›2š§‰šŽÇçÐ:¨=èíïÂŒoÁ{€CË ´,e¹Ì¥m·2i7nnojƒ÷¼uo7ûþƒ±¼K†ÆØÝLÚ!|Ê›Q0JJç12+uMÑ´C›2ÀŒ´FÇXtpŠ“Âº…5Ú:u‘pF—¬Ew±#N­õ[×!OQŠËgíõN‹e”œJ¾Øj§œ% åI –/€&‹ i4í¢ Âzo4u’/íù-@núcdäXÝÏ€Nkû©ÿúº®Y,À±äÌ’ÕŽ1MÈ ¬ÚŠ!ŒBç»0Ù.ˆChYXÇjhŒÝæÖÆNvKkûžÞÚÜ˰3–wÅž1f7S˜À‚A ˜×%ßÏj‡ EšL €r(S¯R2›N¢@(kЂA$œö­Åb'e+§—ÚW9%×(ÁåSýÖùÅ?K)YM>hµZ‚%‚ò´ð.H@. ÇS¨ªïª5á ­s¾Š­è=jÒnkŒ¶ƒ °¡Mê>ÁaAkZ¶§Üxƒ2ô„„v*Ñj0«ÁŒr‘‹.ª1¬’^1Lt1\ÖÅî²Í÷ž¹"‡P2ƒ–Òdy®ŠBíjkïŽ }ûöN~ËXûŽ6xks˜¿¹—«»ØÕÆìæ9NÁ(¸¯)!e˜`êÄY+f-  ²ðÏmñÏ^'"át À"#XZ_î\K9»f-.-wùùÕÅô,%ä´Hør«Õâ"Œ%-¤ ¤=°´ šôœêæÝdƒbl h =…yãÅúp-$a Ç»6xøMŽZƒãÂĹá_ì?ÄŒeª>Ä´p¿òM Ýv×Ь^C„į4jŸ^æV XÇPX9¢=9LL>\ÕÅÞªÉ÷ž¿"GPÅJJ“…,¤¼o 6÷r}óî0»e,yGûö½aöñ4[vXh{ÿ—~ÙÿäïÁ)RB@Qöƒ|åutm SNZ—×z?Ëya©Ãέ-¦ëŒ‘3Œ±•v«%D"oµ¤’,” §1È<ÙKðtüʆ«HTâ´ñ#¿'¨U=vž7 ÀFê<¸îÀÅš`žDÇ÷ÖÁ®çÐP–…ÓlÁµAPª¤žë‰ŸíCÐÐYe´Oc‡Tv0'¥æ€šÀ#X9‚.ö ó!láYL ”4YQRªmkí½{cyóÁDß4ÖþÉ»Fÿ>Sv‡Q¤p’&ÉW^G_`¥›œ{ù©Õ_[[Zø„è´ MtÑÜê&dV9h–VE “z£Å/wÃÊhÑå:äõI(3rObé®_¨I#º)‚¿@P2ÚÌ;Ô·}ØO¼U%ÂiÂý6óuL§©©??«-#fðmbÂ1éΫ ¶ÂÈ1t1„·@¾“ï"/r<e?üæÍûûÎ0ÿ£à !úÇÖûÿøì™3/´ÖŸëœÒU¯²i$^¢uÐ ¶ZiRk`„|»õ€*·6ñ¶WûñÈ ÷\lm Vı÷>ªƒÞ-*£bRB]¢|Aì&F¹ 7Å`ÐfQÖ›ø|W0‰S& ‹ƒ$xZ6«°ÚÁ€Q F f#­1ÙB{xbë½g>®Í?ù·ïþUŸ=±ÜZ°„cýÔbûådå"XgÙõ° Ø¥Ï5ötI>bõUXÖ¶5 ¢uPïSóž_WÓþ8ñ@†ë*@EåÆL0-'NE×5ùó4IýÚMÀš˜M7yéCˆA@Kf ~á¥i!¬–¬]}žõÏÐ`rд5AgI£»»õÑnŸßÉÕŸRöZ-YÐ. @|•ïè¼3³Dj{jü‹Î¨×@My§(䈥‹˜èú&p#6A®mØžÙ¯×s?m‚ê¹™ˆ"Ô/.3Ö q½Mµ‡Šî šÐû$6/¤$5æ[{_͵Ýcm™›P‰¢÷îýñïÒ·î­}òÊòßkÑd´IX´tZþÁ¾S "bó‹º@—š¯v}ØõS¾w/Ü©þzÌ_«dìÔÙª±3æaz]\áP^â4ÙÌ™ö÷DÞ¼µàð™q ‘ÿ3[ÌôÁÜX ð Y009TV`¼+‘ïlÉ÷!‰4ß½³÷o~¸=ú J°`.žsÄ)ßÞýWé'¯¬|¹ÓÛHŠ‰ÅŽì£ÝKÐé·AÅ‚ãL;ó*5•D`„cг;m‡$ãï3 e6Ùä 5˜ªŠƒg›Ï‡úÆ @SÇp(¯›2BìK¡ṵ́=ÓÑ;Ny,º?Ìk” ±àIg°Jb²—a2’°ãûàêäDšïÞÙý?Ûþ{JÑ#À^(‘£ì£¶‚añíÍÑï‹Ö§®¬¼º°xGÆb¼Ó‡Ì4:ýÒnÛ…$Fº¯eŒub•ÕµRé¸}+/ÜØ2þfBff¦Üpì.‹ëj+X~Î:Þ™¶Cüþ´vqíY3å5Ô!h ÚÚ«Nêu˜r’c¼W@e6¿®o"‡4ß¹³ûÛ¶5ü-F±àÁŸ¶ûâ‹ Ç–0ŠÎöH¾÷`\ì­µÄÓm‘ m9Ta •„'ëÀuÇæ˜Î¿{Ð  þ`ùÉöœe†â–jxÖTísk6º©©žMŒÖÈÑõƱsÊij—X£ÆšÅº~‡ö)§t« LvsLvsh)l LÝÄØHù‡·w~ëÍû£ÿÆ((rc¿ÎØ_Ä"ª FÑÚ«÷·ÇùÖéNò\‡ç‚ £ dn@‰ãÄ;Ǻ˜m” mðÆ Žíâ´1ãý&KaÌ,¦Zfeœ j T³»u«ä¼Ú¹zêõ¯3IåXœL³@:Z«®®¦€ÊrŒLPd9 H¶¦oa¬µ|ãöƒß|ûÁäw9!%è#¿ÎL8\À™Á1AXÓ„£·±›÷ÞºÇ>suí7;® ú0ÒbüÀ@)v×8m¬dè†h×û鵪­b5C\Þá«1FåãNoÙ‚ã5! ”Ÿ×êÔt#gãàãï°Ù<èºPHTöóí1õÚ§Â8põOW€dyæ£ÙÐÙ}7:zLm`èÀÿ­ww'0pC8l38-PÀußK6üÉx²&7öòïüÁÛ÷Èg®®ýüââfÇ¢k-ò=# :‹4IÞs1h~Ïõ‡‡†©ß-ìKÑ…ÓÞ´8 õÄæ n÷ç=g_É­IâwñŒQOåÒ ©OÀn2#sŽ“d­ØV˜ìe^ê¡H¾ªî`¨”|ãöƒß|wwò¿?H}Pÿ4ûâ‹Iæ¦^ Â(’ÝLßÚç[§Ûé³mQbqbÝà½Â€1J-\ÞºçÒYƒ 1GµO½cã9}ì>ú”{€|¨]@5vÑÈ´ç 5pj±e? +û(¡¶Ô£ dH»wUc@Ž|]‡î˜ö¹85ø4Wºäúfl]ä˜ìfP¹_I ÛÕw1”ªxãÖƒßzwoòûÂ)àü°ÆxMÀ¾ø"šÉz¦£Hw3}ks”ÝYi%ׄl9-)@}¸§¤%cÖq¿è¹ð0OKœ¾x \rÃH׈jèFûª=tæ¥Ü4ƒ›ŠJHÚðF•뢃Mç,ÊœA“zžÖ?f¨àcø4¬š8†•{nÛQŒVðöÞ?Ãh éé`%Tž#ÛË`db”SýÙ&¬¼‹¹ýÖý{s˜}CPX8°GpÀïEûAú Š}ñE4°™f#ŒBìúÎæ0û`%M®/pÕ¢ °H@ˆ±JX0î[‘wÝZʶšnx›­3¸Úuk3ñÎd<‚‰– L¢j5á\·X£ÍŸwOíšÊ­Ñ¹&¿&0D=$6 P™ ŸåÐm›0b¼ƒ1kí3€ÕPY†|˜ÁêÐVKlVnb·Ðã¯ÝÚþêíqñíHò÷P‚4@PÿÁ¨0@xúhÓiÓ0‚d(̓ÍQþÞJ+¹¾À8smÝT»!ÅÄ»®GK ý”ë¥  ë‘ï;(-\kãyûçšl,0«Ömó9ÓÈ%n©¸ÐF-Q¯\0%Þ—0²Ôj\j9Àùí3!ÙÅ(‡Õˆ–°ZÙ&L±…©Æ_»uÿ«wÆÅw ƒRÚèÁóà~Qð>€¯Y#Å:60Aê™àý•Vr½ÃU‹2 á‰Xm"&°Ž“M‘CÇFùkjü04OO…ý¤æ¾Ú&mqгæ•Yq{˜0ö-¬vAS¤Ëï@fò‰Ñˆ.`•ɶ ‹-ìüIñHò_"ú@…}ñÅiˇÄúL5kDL°œ&Ïv¸n1F` !V[X-Á‰WyÄOÙ®Fx´¯¦›²a¿ ðئO÷Ѱ?çûù@©%fîmÒ@u&!å³…­†ÛÈ÷våmV»$‘÷±©á×7îõΤøcïíÇö>¨ûÀqè§ÍŽ3AÕðF­²M€ˆ‘46†Ùú‚_[àºK©…››?Q#˜Â¥Šõ·ŠžcÒÇQ©óh?_?ßè½4€ÒzT@#óìÇxó´Ä¦¡rÎ:&@û d.QŒÜÐrä»°“@îA©!ÝÞþµ{ùýÈá‹ÁÞ~púr”’_™û†ýç7¬ýæùG1„&Ata¼L«N øD™Ñaöf_ˆk]n»”€ÃÚd: ›1¸è€-xÀ y<À:¬­ŸwÝ<€êçgìÿ<©Æ|àçj9ÀÇÏn¯BkŽbäÅÙüÄP¦ÀæDî|ýöö¯nåêGÂÙüøJûÇüNúÃ×F•Hˆõ•òŸ‡…´A9õY˜‹·ã—®_¶2àÝ„ùÔù•/¯/wΈ¶ð]Ô„% >ïž°1—!p€_Ðü~fÆ4¸ ›žB‘S˜b«rX•Æoœï|}ãþ¯måêM~HðÄ^ÿįç‚_ÿ@´ÂÀ ÄS²'p“".À1AÐ pLÐU¬›°3Ÿ<·üÚ…•…3¢ísL„‚ð„%HZ ¼Xí˜`Æ÷l Øi:^oèýÒÌ÷½ÎMáß\à£*†sË»¶SdSð­.Phƒ;£lë»~};Soy›¤=¶ùÁé›&yP³ùs¿®Sôµp<»EÌm8é_ÐCÉm N—_<»ô7®¬ö®´?€•,)D;a-?ßÎ.ÐøqrÅàÖÏ»¾r¯­Ÿk ö‘ö°1£jÍ;VY‡ã’`”Q9 rX-‘ ·FÙoÜyð+C¥oq2•ü]”v?NïÆàÇsÌ+à  "‡tÑ€'ÌorÃ(º…6Ûoܺÿ«yíŠí^i÷ˆ5€–0 P„@´ˆÔ€áÁ& ò¿Þ/`m;ÜÛ”%¬›‹Fûok)â†{ë÷‡ûik¡m £ ¬ÊAtk$²Bãæ0ÛøÆÝû¿2RfÃÛüàôMP‚¼XíïK¢Wã–à8„±ÊåÀ‚8ñ0uD”Æî½qkûWoloLö ØÐ±¡s˜bg®X’–NÒa–¸V&4¦ÅLÇR= µÑ}¾á§ãbf>¢e¢ZfülD÷Ö﫸]‹Œ´®@;›?É5nîMîDà+Ì:|±Úa^£Ã·ßL!& ¦Ç0ž¸©…ÒÄ>A@W[¤‚’ÞKg_¾²Ú½Üé%pYCˆv„h׃öai?›_9×ðžMׇyf¢^Ö<‰¯—ß X©,I•Ãè“LჽìÎ7îÝÿ—5ð÷P:~AðÂÀŽêÕ¿>pš˜Ø7:(°ºÚBJ–^<½ô¥««½«ížã®ÊSðT¸äÐ~Úê *Î0ÝçfA &ãa@ŸÙŽ´H¥ìSäë¨çz·+®IDAT¥…F b-´Ì0ÎnìŒßÿöÖ¹Ç$öwøBœ ·?ÅÀC1AŽ z~»k,R´_8½ôê3+½tû xBa-M0ê‡E†êÇÇ÷óþëÇc›ß?#½vÖæO·k~Á¼:VL‘Û±PŠ€P-s Ç oïŒoüáÖίJcw˜³ù»pRì}pöŽ|à!øP!bÐ=cÁ´_8ÕõÙÕÞGºK)„psP0N\oâÃPÓåó˜ HxÓ}ûHûAiáøÜ³¢”…R{#‰»ãw<ø»^òcðã$Ï4\[ÝΖӔžV­|8oœ/ÐbŒ- qVÛi ‡v¬ƒ$t”ÓÅ8†Š»\$\˜8µ[ÆbÜãü\*(£qvXÚïòŠã7ç\]]ï› ²Õý™ñÒ ÀVL@Cݧ¦Ã¹? £$¡ä<,&p“H‡ð.€KûC6ÖÁtÔÿ ´@˜í:¼„`!gŸžNç>ïÕæ…ˆó®ŸçýÇ÷ÔA›®íláLbUÏ–Õ¤jçÂ&8º”ö¡pìàÅÚôÈt ÀàOó0‚¢µœˆuÆIuê< ÷ý\ AÊÂ=‡†Y)çfö#`“>Tw±sB¬ ж¶Ø‰b¢ØÆ×û!ŒŽKÌ#C Yèr¶Æ)í*p8Ÿ7xèÐLÐ áñµSP“ôúùXcÄåL·´O\¿b” EÉYа; or¬tTNàA4 ˜Ý„Ò%Æè¬CwÐ4{ý¨_ë7fè 4”;„¹_v vÝ´ŒèøT~£ûü1N RB[7vª9CªýØñ9ÎÄ/APca—q¾ÍhËEæC0An=POüÍ!"¢²*÷7\3ôøÚ¦ðïà]Ý,(RFXñ§L9^}þ»cÃé¸L@Ó c¡;”=“ æ~¡¤îQ¨nšŠ›‚];¶ï8;«úL·kZ R¯ˆÙr \€c€ÐÓ 0k¸Ž„Žƒb8â—à '8ÏÃlö¶áŽ:æ•+ývöž&°Ã}1àaUµ ¼ú9Ûp~¦þ¶¡<—^d|¹ÞÔhÖ­Š68:N'0žp‚Z EoU$ëŒÆ“2âð|}Ðus NaíÙZ ìÛæóu1·ÍÀ»÷w¿þ0v†SÒ×Ön’r¦–@u¡z,AMŽŽJHoÑUÎH†æªz4H»ßhŠê€O¯‹@oŠè3f!œ·szQú)^8#à”,S §mT{Pê,$:Nõ¢5µ!K %ÎIÕY3û,u®ÑICéȱîý×íøÌ±pmä°5>Ëî4u0!:§…C$@RBÛ}ÊÎùè1þãX£ã(8®pàdf,ì2çWSÊRFIéÅ›¸¥S[Óå 4çÿ+ê¾ðøÚúà‘}£€¨.3CÑý3 c§‘@‹Ö¥ìš)3¨õÿ ‹68j ^ÁéŒc0)!—SAIðÕ¦ô0¦ i@ȼ2‚*ozÞA@ý\XW®o`ˆévôÀ&àã{2 \DÙ§½<6:N'°ò'2˜”ÐóIH? èMT÷ü£U…æ1ZSИ¬ïïzplãû*Ûµ F»ŒË”¯ ’w,‘ü8"8r:®0°ÆX€Bz+Lœa,L ù¨àé <@“´Ï“ð¦cõΪy ×ÏUœÃõ_¹×E ”­1E›¡ªò)š‡Þ=2w"(hP`©Íèi—Ä£k€˜æ2=(S0°øžúÀ’ʹ¨À-P«\Y‚‚eâFPßCÕ <¶H฼˩ógÿYJÉ@, NJ‡è°Œ`›[uâÓÂQùu§(ß~¦¬ÚsãÑBáYq9ñvì”Öûðæq}-B[Ë”_ñ›¤j{äxuq%Ã67z@ù•eœR5D Ö>KãµÕÃÂG[®§¼ˆ…Ì5vîÈ3í5‰ä,f(íGÏŠŸ=/ ˜W¾)¸û€£´MÈSÆN#P£Ø<ÒìàQ™€zΚEÛÔZ€\m êþK5¯[÷aÈÖw<@ñ/eh˜«Ø©¥A!-²LáÁHê-©î-q¶ÒO…HƒH’„ æ§,À{®šþF¨ÎNÌ0âI/·kf†‚póÑQ-'Æ ¢ð¥¤Ké…i¢—¯7dÕãÆ©µ˜ÎîM…û3VºQ E¦ s"“( …\k{G·Þ”ùÝèSvîi™¾t†%—Â(c"M¤ D‹#I¸û˜•XÀ÷ï?[çtŽâ0´=Ì`^©g½Î¨2KاnlÀ ag‚LHU ÇÀÇ•˜¦2-@Ð_¢Ì9€@m”Ï!œ€éõ^ÍR ÐÔý+‡¥tZCKéÀÎ ÈLBI £”Õ¸§åí7‹ìëwµzÓXhF ýÎeãwVYqåšH_>eõ£%)²lÈÁ¸o $­I+O»îyÆÿAŽÝbdiJ@f¥}¿´°5Á€è)ôáÑÆ¡à±Ðqh€Øyñš€ôRB×8£³Ý‡r½Í`‰û?Žè üFÁHvžI¨\Â(­•^kljy÷m™¿q[É?Q#àž æíé=­þtK«®1þÜS"ýÔi¦×a`¬V™Ä„çB@x†`É,:ý|~(†p?Ë$¨L/?#õ5Maý0qBVÐå L „¶ ¥YHxÔAõ!ft]KYœ”vô0æ @Úwÿ-àæ. rºÌŒ’°,¥Ü²­åÖ YüѪø–´3ÂÝÈÛUV¤ à0J}gS«?]gâǯðôÅU£Ï#ÁŒ¬peùXB$’–OH²¤‹N+d;Àä¾û§_…öó ¬ï b@èå‘5Ê¢0Çd ŽŠêÝ•ÓøÕz@èµ6§nÈa:2ðÉ"Ð8àý/R¬Vn͉„– Fùß±k % H¥°£ÔÎ;*ÿãwUñÜb—P?ÓF<Þ>–"€€s‚Ôù{Z~ã¶–rž%/\æâ'–©ZJ‚óÌrX£Q( ™sð„C¤Iš¸¿§,œZ+Ž Æ[nê—ºFf˜‚¸”0I$¹dͪcŽ%d? âX Ã@.§œ{€ÓtáÐYuª>Ì»¯ŠLB檿Z'ZAÊE®°§åèU|ç]|-³v‹TʧjñgÕñxdŠè3w¤¿­‹ß½©‹o_`âÅ+,ý‰%¥û‚s¡@ ‡6¦PÑ’HRÂ…{‡ÖÀ1Áøžûé6%˜þ\«î a©%ç}+U„)Z¼ÛàÇ<DÓÉ…†j#]гœùA !‰2Ó™c€Îi µäŠ %Îké~FMµ†1 2/ ‹{Re7tñÝ÷tñõ‘µÔyåWµaøÛú0Þ>8¬ñ„˜)<# ÑÀÞ[Zþ÷›F}û/]ÑÉ }¥Î D0§r¥ 2 щ Ð=åÌÃÞm Û­:Š‘ €%à”`ì|,i`—T;†ŽœŽZÄö*L½8 ì´\ã|øµ5@ÒNû€VÐR¡È%L¡`±ViÈ"GžJ™¿¯‹ï¿£å×v­yŸºçÕë‡g€V¼í5BZX»õ#]üö-#¿}A‹O^VÉGûJwg‰a„rXËQhU($‰O„s`û± ï8 ÿ~× œmBÖ`у›%$Ž‚#xdt& 2€ôBN‰0ˆÀ÷oÞ^:§#È1¬R…s¶ KU_9ŠI½Bª›¦øÑ ]üþkÞ&îE J ë¥æÑñàTœ@”óµà(0Bæ×- $H'Önü©-þãM«¾uňOWâùžTiš(!#@(ƒÕ…äPE‚$U BíûÂîM÷€xª\ß'€ôSåìiî`¨}%üaé‘àõ¯XãÍ@ì­åô=“ºÀC@ ß †¯òK®(¼Q ÄjX£ òÙ8Ã(/Ìm­n¼eòßÛ¶æG¤|èø{úø Û¦‰”>@'ý‰/£…r> M”éÈš›ß³ù¿{×ÊKWµøÜºÔOw¹äíT8Fð>‚1¹’‰ˆhý Àî- y¿ÀÕˆ¹H€/öÔQÿ›ÖFV= ^MtÔ Ž[™Ð½Úb„Ñx"ˆàò.œÒ. 2XåTf°óÄh¨¢Àd4Á8+솖ï½e‹ßß²ú‡P^âƒ]?«Ž·cà›æÌDýµ %ˆèþÀ©/#…Ó)Ò]kn|ù»ïXùÔS2ùüY¥¯t¹¤­ÀFZ@i]pˆTŠèžìm ?ÑpœØ¢„$ W-™&Íë}Ózÿò/‘Gš#àC3@䯕Š@fà .&Œ‚„^¶ðÓèÎ Ú€œÀJ*X­A¬‚,rd£ ãqŽ -o½måܳêûÆ%nF<ç@ðÁQ@þÕ?¸ŒMW`–Ä—•¢d‚%#tÂ1æÇ0o}Ûfï.[öÌ•‚z]ªË B’VK 0VsH­À &ׯŨ™ß'Ð1dÒŠôÇíüØå€†Ñ+HA×Ë©`<´kÃcËkçô©Ù0Ãp4Á]%7Þüæ†U¬€ sÉš:ð±š5€BÕá›™T ³ þ(#Üþ¬fâŒÍBá×ai{FÀô÷·¡ô¾U¹œ‹—ÏúÂBªÐI9¸÷”æ0R' HkàÿX”‚1Š¥g„%ü€T;…Ž”ŽŠêžiˆú}B×¹ e×gâR¹¶˜@I÷P£$&{ ‡lÊbëÈoÞ„ú#ŒXÒÅ?<¬^ÿ#Vø¦&Ô‡rŽqÃçY"*£î„gäÑ"hl@ûÑß?kÙÇ/NøK§2~¦—JtÚ °†Ci –¤ é" ·k‘0‚„bÑÁnT· ©«Tp¨T=cE´È#p=i„bVæ0RºÝÇî±]ÈPôä°[~žÊC¼°Žç*šùGš/ Õ°_g„8¹TgˆÊÿò¦(> úëDï¬U/\™ˆ—V3µÒmq,´PΡ‚å)˜èŌ̒.qe…¶¬;Ùq0ý¡éØ…—Þ³1«•V›é` t‘a¼7ÁhwŒí<Þ€üÖD#ƒ½ï7˜•ö°Ï—ÿ ­é¯XñÔ*ÀÁ ýãuz_<ÑE\nx^`Î0IæÔID™CH,0yŸèß»ÃôwÎöç/ø‹Ë™ê÷Z¶´‚å„rŒ³ 2kî‚û8Á£‚©ô[¤øË»ôiBYÒ^”ùÃÝ1¶'Ùø]¨ï¾OÕׯ°w©ÓAâ¸M6>,ô`£ëàï|“×g5ª&ˆ!aË IDATxœí½yåÙUßù9÷Þßò¶\kí]­´j„›n6É!°XD€%ÆÃÀ‚ÛÃL0#{b<6 ËDƒ¶°YŒ…„³Ib“,„¢»Õ’zS«këªÊý-¿å.óÇýýÞ{UtwefUewRœŠ[Y/ëåËß½ç{ösï•WKò’_¸êÏxA‘´j % Ôì}Â_þw|ˆƒÎƒ÷àÀ†>.¤x¿ˆ%ùpF­’«ã¤é@’ôHžènÇÈR’(ί ›£‹(ù}à÷ÉÒGÂÃïØ÷T;òF¡ÐŽÐ0¶ýæô«‚"2P ÃÈ2Â2Ê Ðô$a !3!ÜAn:¤œÈ²^'5fi¥›t2#½•®JU®ék“v:¤y—Andšn¦yâÌ&>|‘Ï|öì۪ɟwóŸþã~§wã Lÿšñ¯ý·‚&„PŒhà2=}múˆZD:Ú¨®QrŒÜ¬ÐSÇ»Y7ïå½#KÒ,‘…¥\%‰–ŒAbŒ1ô;z©b)ú™¢Ÿ hA)AkÖŠÔ(´Z„Xð>à|Àz‡wžaá¹ýä2Eè±¶Y%¯|}ÿõ÷}ÿk^ÿ¿ÿ“ßvÿ/>ü]›ÿí-ç÷º,‡®Q€Â{Áà¥í¹#4ÇQº‡Ò+É”bhY£N°hVušòN©—éÎR×,,ö´îeª£r-ƒÞY¢9ÚÓt3a¹«PF¡!ÑšTkR#hD!sšÃáqœ\ŒË@aÉegT³5ñ '–QY²3ªNJ6FEáŽ=eYPV¬õÔ¥ÅÕ6óî_y˜õ¾øëçNÿà÷º|‡Öwó~ú·EÉëËž9–äzu°°´$zp¤«{½Te‹¹ät¡§uÖé’å–sM/U¬ô5F ’H#…†4Qä‰"O„Ü*D³OðˆŠ–€ ë£¤Ž«@]ÖFŽÒzF•cR9†¥Ì-ÛËNQ±9.©JKQ[ÊÒRUEUä†ÚBåÁ»øáÎ7~…ÌæœjH5ªc+ůýÚ}ar×?ùÏòÖ/½…·ÝµÌÅmËjFe ‰ ”µc£¨±u ¨š2@‡9é—èVº0‚9m ’B®ÑZþÒ2í†'¬ûºî‹Ž¼áÈËîä—>²Æ?SðÄÓwR:á³g&œ9³Íæ°dclÙ)F쌶aâ¡òøVâB³ðš(QZ QsC@ëFâ­ÐÊ •F+R%ºaz| 9uˆÒøà Á8oqÞá½#xªy‰ö¥@9°Í³µQÈôãÀ¥É%b¯tHà_óÒ;VøŽ¯»v•£áÌ–çw>~Çy’05*wNjZÉ™Æí@¦#³Šq¿ÑqEŒLãÑ‘á‰JP*Ai…%_)DÔTò[¦´s,>jæ‚w8oðÞáœÅz‹SuÌHˆ€³!‚@¤RZG—66 Bð €,IýÜ>ñÀ)ŽY¢›j~ëÏ.ò觇j<³¥ÏEZ͘Ÿ´øZGhm0:Å´ŒW­õ¢ÔLˆ4¹ y §±‘þÁ{´÷XoQÚ Å9C­*¼rQ#‰‹fFÆ·æ"ÍsÖ@ö€Ã %aäá—~ãÓ|ùëoåå/»•§>±aþÏÌü¤e~”z£¢™2^k(ƒ¨V (ÔÔîA.áE$4Ê(DÛߘïâ4Á[\kR¬¦– +U”j  Zÿð­6h4Ck®"™{80È¡oM<§/VÔe±»Ÿ“ÆÖë9[?Uÿ‚ÒšDg“ uÒhƒè†IêWÒ$rTd¾’ÙÇ·ŒiCÆÖ¿óAM“;‚Fœ#88% e…¢–2úˆpÄo5Õ¼YÛ'MÂUÑç=Îû+ýäŒùJæì~Ë|…2†Tg“6ŒOPÆ µ™2ß4LoKD-@b6 |BˆL÷Ab2ÈœW8Q¸Æ”x5Šm# 'ÔTêFâ›Ì’HC[—˜÷oöA‡-5^¼‚¿ÌK~2j6’K™/ ó“¢MŠÑe¢PZc”Â(iߎÖj Q!AZ‚İ.jçÎAíÁz8ÁE1ŸŽyG²ž€‹ê_‡¨l£££g?º:¼@4Ö5ò\¤[箵÷LÁ Z“©yæ'èÄ t‚Q1[˜4Ãh¢0ÒäddÆ|.-B£ú¼ž1ß)Áø3‰JaÂy…õç¼K1©%q5Îwq¾Æûh¼³P{D:1øû¤Ã U­Ãc}¸Â"H«¯g h!JHTÚ¨û$2¿‘|­õ”ñ©Œ‘)Lk”`æ¤_5ΛÌ9£Ašˆ ‰LOˆ¾P¬3X5Dœ›aê8ï©ÊŠr{DÀ£ŒºQ ¦éÔ¦({)Í%L¢—O´ÿi3N’$'19&I1IJb ‰Ñ¤F“&Bfb:95ŠDCf (Hôœ? Õ%&YÚŒmÓŠ2hª}¡Ñ1OÕ~Äe’Q ¥âë± lM,ë¥e§ðls6’„b<Ænçò{§C€ÆÊ:1—\AÁ4ÉfEÅ´€"©A§)&ÉHÓŒ$ÍI’”41¤‰&K¹Qd dF‘HL”þÄÌÌ@b Ѫy5At#ÓÓ£M«†¡ÓhaÎ\Т|8ÎESá}@iEYÃV°œ+j>¿]2•Pz¼sEÔhû¤C":2M’z u¤yÓ·M׎ˆB%Fûždi’‘&†ÌD†wRE7ºMõ/OT¡›*²TÑM©²DHµjÔ›øÌŒNy,,97³÷Þ$ÞBec±©ªµmí=µ­©ª@UyŠÒQU>¾ÇyÖ×.Nì¸UUpµu¸Õ•ü¦;Ž/®”c|p›áÅq4ezKympÜ3f*½£È: + Š•›WIËÆÄ½6 £5yfd) MWM/#ä:2:ÕBªT´ZEæ¶¶Ú5ñ¼€¯b¦t‘‘ÖÅäŽ PYO]Yœ Ôµ§ª=Î:œƒõÍ²šŒÆ…¯le+;)kW–ãjÛ¹Pmm—;¶/k7¼÷ÛÞúW» oý¶÷Œü¸ÜÆû ÐÊÇFðÛú‘W½óŸ¼òÞùŽÛ_z+£Ï_dbCÔrû k€Î>á· !zï©@×@€£ø’[WtS–{ŠTÀ4’™)…j~$Ñ1!Äl«³1Ñ6”@Y:ê²Â9÷ïÁ:‡uõMë&£¢r“b✷ÎÚ¢*ìØZ;ÜÞq£Íõrۖź·nÛÕõ¦³~§.«uïÂÐnˆõÛ¿MC  „0AQ¡ÕÌ‹7_‰&Š·IáÌg(xô—yñÙw,ÞvÊuˆ~Í>èÚÀìï—ï‹Z à<œÝ!YY SŠõóÎL¶YQ9½NÎò’&Óg=(¡²žóÕhRÛIQ†Ú–Þ‡2*[¹áÅ ;ÙÚ,¶|1ÙqUµ\ØðÎoÙÚnÚÊoÛÒïàüç·!DF†0&„1JJ”8Dü”yM˜Jó’ö­§p ºpû?×û$Û#wëJËʲÏdÐáôŠšÞ$¥s2ãÜFÍÞg´3â–c7Q¯­}z|êéGªñÖyWÔë!°UUaÝvˆóCœáÃ6° ìÂ%”Ôˆ8¤É*Ì[ÚÊ›¾º°kÿÀ¬‚°Õžº)?4Èþ>õðÀBµ3f«(Q;š~Ò£¼¸¾uö3}¯ôó÷Ž;UÆ &/;ÏDs§ÝÄ–1æS@ìKƒ&=þ|j€ƒ–´Po]ÓËúÈxÂèá'~Rgù¯ö»˜Ë~à¯͵£· §&Ùo9ààê7—ìí÷5ñýÐâ7-rÌhpòqç£Ó®Å¦—>5™§çUä:‡¹a=õÄSƒT \Y]U…ìÐPkM{üÞéÝ÷kLÍäë:0©,1Jçpc0¿1kAX‹¹}}ÊáÄâHðXë!zG»ì ù+@±ÛQ¥#Lö€kd8˜ú!\R ¹DŸK;[çöìƒi0«¼n_ïrj¢Â`›~³ç7tИG{¬—ßX4+%OÀ}®Á5À󑘋‰ñ\šº»A(\E/XC×È8@ l:m[¿CD¦Í7]ƒüË!BÓ3/ÓM37&ÍkÂýÑ!³þ¾pƒ" ´s!˜€ƒN¼ˆÌì_ÓƒY¦›H¯’¯˜ò?Ü `ê ]%o- ý¥í¹¿¦}Ñ!M5I´ƒájú¢%µFSiØ7R0'õâoÌ0pÚôBpœ—:@ƒùWÚ¹{:¤¦§d\½¼¡éð Ý6ç Þ8$³ÜG˜~g_tˆËÁ³n/7š `¶¯¬}±Ï–°Ã«šDHÜtyC‰¤V*šC­ö÷1‡4 œk‡¾Q‹­ˆ[‰¯|(Ö³Ð!Õaš 7j³ýíÉfû kä`"&М™3÷ò†Ós¶¿=ñäy5®HfÜTlŒ¼Ñ¨Å€õP4‡K Ú}¡9ëðNc4·éÔ¨\Ü!¼:¼N`Û áà h˜9J˜S²:¤¢ó×N ðBrº'˺¡n4Ì'€ˆy€çu{øó•Žæô-fGt$Í÷&<Ôn”}^£À'„ø9'¨­‰·’`ž«:¦m_$ñx€èËìj»}Ð!Õý€@ñ§çŽ=HŠGðïœSùJf‡`îƒïù——§ÎÐÀyÛxñÄAž”ÖžHÙöEhÙÕ)ùÏD‡aÎÞ7!akêÀ2X\Éø®ïüîÿåG(vª„ƒXŠö&‘é¼Õ¾}ŸÃíh!èv!dvðAÐVÉüÀk¸ï»_ÉW½î8ßüƒ¢ªýÁ€ õú=LKÁŠ}5 ]#Î…ƒ!DIÐÒ\°4ç ]ï1qÜýµ·ñ#ïx9o½û&ÞóÓ_I¿o¢OОÚu=GK­æSBíBÒrc·tmÐ8¥:šBˆh‰çå¶gæ^ïô—3~ò{_M¿;S _ÿ7nâ|Ï+a§<´’.³ï=½>9{+Ž]”m ~€Ôì „Æ'R$ý¥ã~×+¹û‹ü¥GúÑw¾‚»¿æ6×LO†¾ž#4~Š8{¡< {ËË]¤FâIÈIí®ÝÀ¿õ®çpÁ‰ÿï|ÆGêw ?ù÷^ÍÂrg–¦½^C˜9ßJ@äô9<&à=ÿò+Iµ@ig›5¯ûˆ*^úpIp=†$ð~üKY]LŸu-îþâ£üÀßyE>ØAk€¯ÓM¼çÝ÷ÐÏu¬KšJØôŒÜ6#v½$®tÜû†“¼í'¯¸¹õ°]Ï´€pü .Ñ!Äðèà@"þÁ÷¼&N\éë‹þæ¢Æ™S¤.­\a÷½óå»Z ïìT°6aÅ4T»VϨZ´&€òÌõŒtÍð£ï|9wõ­qòpý¢@˜“„ÆÈu\á¹÷ËOrÏýeÇïYII ·+Ø,â5aí=Ä×bH¸d-bbÐëæõ®1pMOMŽNÐkø†‡ÖÙ®š+P¯5µj5´Lo%ƒë“ @ª¸ï/ÛßÏ+‰;ëôè§L“6û¥Ë³ Ò>ª Í#ïúÓ¯©¸ûKŽòïx9lVñ1üõ!Î_5RÕªÆëaû_œ{^³ºÿEiý”í2jƒÖ_¹ZS˜E?! ì)3]ÎMϰÕäÆS}maÖ‚jnâ3‡ˆkÿ»á¾o{éµù<%0±°Q@/¼Éî•ZWO.µ¾ù¬çÅ œ§é¹}…‹™±ú'ŠäÒ!óªðZŽÒrï—çžW_…ô_N ¨-\G0èý>»\ºEé;{}œë{sB먎,¤z¦ùÞÕ@5Uá2)¸fAЊû¾õIÿ<µê{}º³wMpÉ[Sµófî»úÀƒ¹:C€*€rÍ¥ê꜠ùJ)‚̽¾V(éÕʵù¼Ë©}ÌõVòvóø­  ùÚhМ•ÚkÎvAwwŠ{ØGúru­[Sµ×,B€i1èZD÷ëK®þ³ž‹Z9]/`5ß›&¸è­Mz@v ƒ½<§}¢Òèý1«u1 œ¿VýZ9˽¯;Î=¯¼NÒ?Oóš`9‡ÎnAf?/—~S½ 5Àåd}ÜÍÒÓ{°X Í9>øæ¨ØkeZÛÿ-/¾ºÏÙ µó_kÌA7¹Z:õ‚/ þ÷ ×% ؉Äè ð³¤Î^RaÝæÁk@…åÞ»ŽrÏ€ôÏS ‚‹ÕWÐŽÏ,áMgD«wEÏïýi-1.ÞÍS·™@˜E—§‡÷KÐÂ}ß|€Ò?OB4oçÇp¬;½õ¹iþ âç¿»›¥xþ4@KBÁ¨Þ{EPæ}ÁkøŽ{ï:vðÒ?O­&8?™µ—=MçÝü¨„& Ø}1àùÌÀ^Ý<çh"ƒ4;¯º¸á¾oºó:Ov$Dæ_h@ Ï´0-5y¶-ÀôâÓÝÐ Ðä  ë©t?ëhßß,@hD®† ˽¯}lÿ³‘×âü$¾vá2ǰÍ̱=¬—âF@ô ÊæÀƒgDý_–‚0göM_qß³´z=o¤F52²,/eq}FhTü܉éØU€ÊV@ddé¡jü™gëjÊ¡Qø¯Rü_hÒ?O.0˜Xþw_Íïü³¯àë¾üDÔ SÀÏ’a…má¥Ý½ xá€C µ{v{Ý:!üÕœQôB•þ9nªùÚ»ŽñþÿçM|í›nb´ÆoàTó³ÉzöykHa¹÷K î÷¡¼ÃWÓKß( é+L?[Î{ÝÌd)bt¬•ÕŽº(ïŒ Û“‚ò"C÷‘ÉFùÇ¿ýÁSïÿª¯¸é±A× ¥™p+ÆãšiW(­_te¼°¹VüãÿùUüæNñ?Ü÷¶mú‚Ÿ‹‡wk š$ÊUHÿ³­nPm¦2ðJßAÏ|³É^–­.Ð]°¼´ÂBǰÚKée# Óì=•ŽÒrak’Ÿ=¿qËÖ™ o/ŸÚzû7~ßþÏc'û¿õc?ôêwmŽêO"8¥uŒ<ˆ•u톅°Ûó›_ø òjs§fið·î½…›oéݳ½]LÀ%íQ»¤«“þËW·}íÆ£ú•?DG½“å´§–sÒåþ‹ËÃb'e¥£è¥rÉI¯%,¥)‹i‘AŸ³GpæøYFëŸjøm?òcþæäxï½ÝÛŽ¤EYÐúJÏXéBÙå‚,1™áBŽ"Çû[NX|üN<lŒ¦ªÛòAyhG™ªþÀ\˜xåçHÅOì/ç?Ïü6& €ûÝ?Ýù©w?ðcüÈÙæH¶@®!Äh²¬ÃJ¿ÏMK}Ž/(V{šÅŽ¢—éii£²žq%lžq=ü\Wñ/ñLÒ5xr”ÔkÅÛïxE`¹Wó°hL§CíⳕU HÝHÅÁÀ“"á5ˆÜMß¼NzÉIÏœ4´“¤i&*–7몦, ˰Žöo⤠ .|`s»ú‹~×8€NªaRÇ ¢jœÀ½(X>’ó†—-îu&—ä!™EQö7?xúÕoÿ‘?ú™úbñtô¬«83d‹}Ž®,ó¢#n_1_4¬ôƒL‘6GÚÔÎ3©;…G$&s†…àCÀÚW»X0;šÃ™ O0¶ÞìŒÊþùõíþÆÓkw”g6¾~ûbY¿ömïÿØw¿ýÅÿæ­o½ã?šDÝÆÐ#F‡º l\|‚Ýh€IÍwÞ}'ÉþŽ“bÈ!ª¿û/>õM?ÿŸþªpœ…¬‹NjG“,ö9vô/>¾ÀKŽnY6ék:š<$jp*+¤Ú{ûã*%Á{­êxº;¬øä?E²˜“[%ÉR†ET˜§7Ë]ߥv5Ëþ=dÇ£úU(~\½ƒ®îËb‚Zêt» º ò”ånÆ‘Ž¢› Z„Ä€Cá¡ÌŽz\7F'kë&-z…¹‡µs²'õ?_‡Ô€ýã×^üc¿øÈÏr´ÛeT€µñÔ0£ £¡Ÿw{ rCf„Ll€"P”¥¢6w¬ TÊÚ3©[…g³ðl—žqUS–E—ó—>‰É$5(FN@xïg›WöF ¢tr߯<þãÎàq¡tPØø¿FÅlef0&Á¿]Ž´ðQãyp.¬ Ô®‚*°]z6ÆžóCËÖx‡z2‰Ò?­z6¥a'¨,ACg'ñŽ¿X¯ð!ˆ’+›ý˜€VTßðùþ÷¿ïÔ»¤Þ;¶l‚÷Ð3ÈÑ+Çñâc‘ù·¯&ék Tmo£ F ÆF7¯ Êô±0T4 ­JÇS§v0K}mBä ùtšµë$zþå®&ÍL§Uÿéƒg¿âOò·ÓžÂn8¸ŠÚ'UIÜ´Z{ËNåYy\€¼LcßCÃCf`b“*°]¶F[Ã-†ÃÍh÷ëˤß…¤ J+”ƒIá`{³dWÎ{×óÒ?ù®w?ð=ïÿà…wqË’¦¬<ë#Míâ",$tV¹iu™› «}M7UhŸ½´qù½‡ÊE8®£&¨l vëÀ:·Í´6P äºÉž+´Qm~áÊóYþî·ÞÊB7¡M îbâÓ$„­¿ôыߑ­.˜0Ü"”uÜêe¤a¾Ž_} ('lŽÇºlWš,‰àV}´µaßÄ:ŠÊ1.KÆ“ŠÑ~X6g0µ4W泌A†N ¢b›Éw\Ïn0guÐ@õ¾?9ý7~þC~ŠÛ–2œ‡áÆÍ¹],åôY꺩  „‰õ ¸µ TŠÊ³Sy6'ží2°SŠºÂÖÕìä%)ÈAi6{0>ûQÝÞÌ@ªÅ}ä3[7ÿÙçÝ[Õ‚¥²uôâ4t”üDÑà…ª,ØnPÚšÍ4'1 F+D«&‰:àœÃZ‹µuUPÖÞ¹KÚž €@®àXŸlaÀB7'³ q{8Eï"ÌÙ [ÅÂwþëÇÞŽ,÷•ÔøóÛ°Ó¤fS ƒä)ISÓØšxjH ™VsëW7 °aåÙ.†žµQÅÎdWÔP6â¢cT'§­QF\ˆ^Õ•’_>P7׫T»¿f%P©Öö}}úUÛyï&™lá\ÎÌ_òIDATc~%ñÞ£f[ßšC¥Šj‚Á°xI1¢H´ŠG7ç8£°FSÕÕø=“º"h@7©î¶"VûÈ‘,uSÔ¤„²\ 6„„ð‹÷\ ù”vG^õþý#+]¸+ígØí¿=‰z,m f¬ól•ÎØSzÈ‹˜÷Ž)Ü€õ쥃¢ ŒªÀVéÙ•lì¬S ‡Ñú0; ¢5¢ÚŒ1±üå}bºw¬ ú\¼¸Á´àÖQÓ‚ ™ mRÒ4'ϺdYFžr#d&šÃ&š‹f öŒ”"x–™vÛOFA7EN,18z”A7EÏÚÖWÖ¶sÜ-íN4¶R„pîâxù½޾«{Ó ÜÎ7œ@YG”&4 <ãrÄÅQŽ Ý"šèµY 8'_ZOQÆ•eRLM¶)†Ãè`Õ4à™ªy-˜^“$à½àÝ•/‘ôÑή,›£ÝÙJ$øx5Aí8±˜ ƒ¤RM¨Uc ¤€QŠÄ$$:Ř„<5 2E'Ud&:½m&°´AQºùH[Ýlí½n*F]7¯2¸ù$'WWÈtÀI`óÔÚ¹þ¸|ûï a÷ç—_µ›Ö¢´ØŸÿýS_º‘/¾bY„‘« ¶Ž\LTTÿ‰Š‹`=£ÉDÛi’‘h…Ö iwõ x½üº±u]P•&Õ¤±ûÌìÞ”‰ŒFºtV0Zò4°ºú !Ë&š ÛÃbw vñjÚ‘s KW扡“v¨k‡ë¦`ëè N«™–ƒ‘æAKTù©,Q˜&enCÀú0Åv˜¿©Õ0ÊC'AŽ-³xóÍÜ|l…¥®a¸5öxQà ›¿G7=E„ß5€õS?$ÑÚoì„7v»™ G|Q#¥%h5SO-‚àk˰âðXgÑI†1 ‰1¥âQ¿”Ö1”Q Õ,žs–JÛKOi£…Ù‰Uz‹=Rð.¦c¬Ö½~&J~óÏ6yËkÒËõ´ÕêY)ÀÄFÚ-ç‡ÕéZ ½nÎÆd„¤†'1 lŸ³Åjà<Á»&÷Ðv0µÍ¬ñ>Ĉ vçÞÇ~?¥4^kк zy‰•›nææ£ ,v ÛÛ…/ŠÚÛIвüÙð[ßàäÛ~ß!üêW_›T𰱓FI8·>Ñ¿üÀÆK;Ë'˜¬×dßt3ëDE;؆BZaLJ’ä¤Y‡<603BªÛ\xÀ{¡v¢VŒ”Â{G­4U›ô€¹ÔSˆ;h—{¤K}²˜MBov(7X²gŽ|`Ri>{~ÄB?ÁYÿœ¡£Ðø)Ð+ÖêúPnÛ«Ëfsk ŽÐË¢Qk›X§@ˆ‚Çy]Yã÷Ðlj±MšÃ· Oi´6hm°Z~‡îÒ*+GŽpË‘>ƒ\qqcdŸ>µ±³°Ø]>ó©Ïýù|ûìIúaØ.Î-am»LËRÓI‚6 ÎBªg{ýMã )@Ç-5)I’‘¦ÝÌÐKt€V¨ ë (Jë‘0/FÒ”V$z rÓ ÝcGY,ÐI4FƒŒ`c8âÄœèF>“ „@å¿ò‡Oóõo:†sÏ]5‰mÖ• b”’…%óðãl|ò¶—Ü|שó ã´1X¥p“¼£=Á<21A”FDM{8ƒ@hÎ:¢ßªµ!1 c V§$i‡´Ó£×[`uyÀ‰Å”~¦¸°6²g;6ͽvv}gòä¹gÙx|Pô»»–þ]à%G;áÙ­%lìT„ $O3‚OtŒÇ'*¸õT«[ÄŠ–ÁhH!K„L J©XïvžÚ7Îah;}›¶gEãyè¥ÈÑenº™ã«K,wDA1¬(w†ïç‹nò,ä‘Ïå +á3ï°´šrëMÝ+›„qå9snC팊ñ™sã÷²ñø®—Þ¼ÊgŸ‚à-I’Qç¶,ðÞ¢´"5Ú¤˜$#M2£ÉLœž ©‰þó!FG!`àœÁ¨.©Ðï¤, Vz-pîÜvõùÏœ9mGåi#ýÛ/þé_ü(;£G)M‚l:Žï­ÃiWQÀé­ aghKÊ ‹©pN@” 2ƒÏ(êKÕÄè!‚÷cÃôø’ù¬­±Bf}À5ïAD´‹Ì律•e–NœäøÒG Î{Tb8õØçλ\ÞÃjWbr¡­—>)áclRk…6òœù#¥ëë;<ú‰ÏA¦ÛÅ/?ô‰G¾ûî7Ék'¥åìÆ•et:]lmq¶"„€V±¤yªéåÂ × rM/Sd©B X˜T‚H•°ÔS$*#K5ýLÑË EíÓ§·ËÏ=ôÔS“ñ™ÁÑåÛÏüÞÿ—áñ'—öQº" ðÄ£À·î†­À.ðØZA~üÍ·ù_ùƒ§½n—m[¡²„ÐÏ£ ô­˜©ïÞùÆÓEÚ¶Ê"‚Â6Ã7Ž‘h…Ñ Êhœd¡C¾´ÊòêQnZé²ÜÑTÖaëh<Ï>~æ],æŸÇÝD˜WVFðã‚¿øWïC¬½BÖ,f,YZ‚Ú¬Û>÷Tñ?sÛ‰ÿüÚWݲøàçkà %Õx«>Ä“:¢jWô2E?×,v4 ]ÅBWÓÍ4Fbº{\*ŠŽLžF)²D€õ¡ ?vaøùGÏ>udq ’<{Ñéÿú§ÿ¯}òñ_³ã Á‰Àp7,-ÃnÞôÈZ9uªŸZÛù`ªwÜmÇõ§Çc´5‚ðEÙ„-Zc”A+s¹¤qׇXùk%-Ò„H k”II“.ªÓ§Û_beiÀñÅ”…ŽfTXqkäN$ŸüÀ§>궆÷£2M7¤iŒ¡®”MRøÔgðO=FL­]‰\|GÐô¨×>öÉŸ}ï~ø[î¿ë Ovž8½ÃŦù%D ¹‰*¿›irÅBG±Ð‰åp­¡¨…I(­Â6‘© Šqé9½^ø>³=Ùn½ø¥'Ž;³QœyÏïþ[þÌï€Y„z ¤Œ÷öØVúvíÈno—¸ëÝÊ…õ6Ïmš¬XøooüÚ×Þû‰ÇÖÙÚ‚wÔÕ„ºã«Ç$ YÚ#Í2Ò¼KžçS)èeÝFÇDˆs!Ö ÇÎÄ3*,ÎÖmè÷R–ú)+=M'Ulköéád°ØÉΟ]_{ì×ÿà­ˆú™Ö$ÆsbÕÓMÃÏÙISøäðé€g?þ}~­©•=° «'¿ù ¿ïmÿÇW¾ée+ãŠs[ÖrÁœ%§B'Qtèfš~c úYœÿ¸ USüò1znËòÄÓc»¶>,‚󮪬zúcŸ~äâïýñoàFŸ³ á"°aÂ$Âý»Žv €üÇ>,åO¨ð[ïprÏ/¾õMßpÏû–Ž-ÉŸ?ºNe-â=ÖÖØºÄÛ… “”$ÍÉòœ~ntƒŽ¦—iº™"iP[ϸ Œ Ǥrx/h-tRM7Wô3œÛªÜÙ3;ã«þæÚxòÉûÛßÃÅ ÿkÄWå™\ôP^¹/¾ïÜ®ÓÁm%Ԁ΀>è%(ºä _rìÍwï¿å w½è¦%ÊQÅΤF¤‰ÐMbäÓI„NÛàºitÃ\1l«€qå9»>OoÕ~»©ªÚžyà‰sO¾ïÃ÷O?ùI`dÂkàÖAmƒƒ¯ˆ ÖÂý»bì® ¯ÿ×ÂF¥¨kŸÉ+^ö®·|ßßüWz>}zH];T£}‚÷„æÌ2­5y™~¦t ƒnTy Êz&•§¬ÖǾ.­b¾<1ŠIxê̶]NÊcÇW²³Ÿ»¸ñàϾ÷'¸xî7ÀxÐpe욬•+B0Käï®nÎ%PH°~8Êñ[ßxû[¾ìÞ×Þûê;_rë²î(A“@FјEž@Öô=xAqz}º`8…ÇN¯gŸ¼pñÜÇ~Ì=ôÔ㌪upCpàÖÀ_ÖÀo€ì€Œ!\GÈ÷ ÉQE­ 8–åÅ¿ù¦ÿ–ÿ髾Î5žQØkAF溢c¸ÓM„n¦èwZ;¥[”u ¨eë9A‰Â†ÀÚNž<;¬{¹ ƒ¥nöñ?|è‰Ç~áýÿœÑƇ!™Û Fà‹Øe í!rךZ´i€ @–U`æÇOÜÙÿ²—~ÁËïºóŽÝqòÈÉÕž96ÐÒo´^fÝTnKØ™¸°¶9vgׯ£ÇOmm=}êôÆ©3ç×'Oo®±Yl³QޏXlãª-°›3°~ÂP€ªˆ5Ñë€ïoJ]yu’:Þ»÷ÿ÷×|÷×¼åÄB‡SçGì%Ðil`š@ÖªÁLèe±~ǰÈùÐ8@žÊÆšNå£ÒsaèB1±ÁdF­oŒÝGõÿtýƒòëP? z;JÞŠ ` º]€½rw7KÐ Mô;@Xµ zÌ2$ ä¦ÏjÚãH•cË+·Ü¼rääjiay/tÓty‰‡à‚ÔÁºÚÖÕ¤˜ãÑpRO†ãjkXÔ6‹âéÉ(¬†¬wxz²CYnG§Ïn6Œß¶1P5à÷âì¡@ˆk;¡IÐg`íèðOßûÔ™'¾ì|ó;ïzÝ Ú96·K*ë1ZÈ覊N¢O8‚ “̇ÁD‰‰¶°¬!(ÅR_ËyëùèïþÅ“þç?ü0geAuÀc†“Yfú ×­Íhƒ™¨šI˜îOžxz™§—ºNF¹-.êR:é$diÒ5¡°¦“%*5ZH N4…JC*ÁjBY¹Pä…§©—‰bÔˆD )e›Èðb¼7ižÁ2þžæ¾®àfÏ~t³c×Þ£ýýɧžúÔ^ûæ»Þö†×½æ•'» ©k±.j„T Y y"$ZbÑNb´_Ç3+ïðx;³aüóGŸ~ìø >õ(®Þ€¬Iñù&Zžª[ÞìÚ ï“Zæ;⢗LÓ_!ÄïKM"%FO0º›¥fœå&Ï:Yžw²¬ÓIÓ^'Kòô‘O}âÃw½äK^ú_𢗼üæwœXLWšn¢Ht#›(íÎÇêרt¬mþÜú¨|òôÆæ£OœÚxô±sç9·víb›~6a‹ªI\ôPBhÔ½ÄRÍl®‡ô·4M^Ðf÷C|q(©P2AË¥:©QÝD›<5:M¥‰6ijL–Ý ˆHpλÄh›U%FW‰V¥Ñª@É¥&h™Ãèì1&JId¾£íØ¥íoi?û|¬Oâ"#¤™€ÎAç”å©ê“ŸÝxèÜ©•‡Ž/Üvôä-'–VOYè¯.v³…~¦tš…om=)m5™“b4íl&ÃQÉΤì§ÃAg‡:Œù”âeÈLõ@Á²·áׂÚ-(vîu4 B‰’ "#¹ÉŒ’ÌhIQ‰1Ú$q(cŒ„¦@\[åÖÖ]k­j£U¥•*QR¢¤@Q jB hâýVò§óß+óaïh%Ì5¿¼„0‚`ˆ=0‚6~褄RM†ëaÓw &ù°êu˜äI7O%ÍŒ­Â éå(‚IHÆÖùI¯°ãQªG!Q#¢eßÚ@i$!4 ˆ¡×Wúç× uˆš×Ò„ÔˆT”¤J©T)I•"QJ-Êh-ZÑÊ(¥’Þë µrJ‹×J¬RbE¤ÖJjB…’ª™ë<ã[Éß7øw €î"O˜ÙÀЏ7¥FÖh)It!‰žtó´›w³N¯›çý^–-ô³´ÛÉL–¥”R!_ÕÖ#ØÚº2-l‘]扣&µQ#´¡eDMcÙFÌ<ßù…8`H›wh×%j!‰g?ˆÂˆˆ­Di%Ji¥D5Ý/ÞIPJ¥Ä‰ˆW"V”8,"³1cz;fGÃîCúafžàÜ™MÞ¨ JŒ‘nj¤“j•%‰Î“D§ib’,5:ÏŒRJ‹÷>ˆà­õ66°L]&FÚèI­Ô#´Çx_ÆDæ?£ |¨Õˆ-[ߨA)D ¢Q¢šêxÜ*Jïÿ "%â›>P¯À©¸¦Á#±ÜÓ»Z _5Ø÷€gÐ-E©QRFH®DåZé(B>1Ú£¬ÑªÖZ•F©J‹hU R ¦v¿­*lÿ $ÿ’å¸ìë´iùž AÚ.Hi¼* „¶°a¨´ïò"—üŽpY}:ßîß÷$öì†p¿ŸÁ¼W5@tZ&(IEI¦”¤¢%ÑZ¥1Z+£•h­•h¥Ä‡€3Úk­¼ÖÊj-µ©c‘Q¢ý‹_›D<— iߘóZF̧IÛÊYÛ2í⾚–Ȧ%³±qÒÞwäE233óNÏåªö¯™ôÿñ¯À‘LÕ;IEND®B`‚qlix-0.2.6/pixmaps/miscDev.png0000644000175000017500000003502311050625206014351 0ustar aliali‰PNG  IHDR€€Ã>aËgAMAÙܲÚ IDATxœí½iŒe×}à÷;ç¾µÞ«W{uwõÆn²Ù"Ù\Dq¸È²B‘–dOlMâÈð‚™Ä1ûƒ>°ƒ|2 ÈùÀ_äLbc<Ž„ÁX‚¥dà!mr"Ñ’H‘—¦ºI±·"»ö÷ê½zû='ÎrϽõªÙ]õšlMüî»÷ž»¼sÏÿþû9Gpg‚öá&G”˯ýë'=zr8Ê8ŽE¹\žªV« !Ä®7r¹\ýƒ>x#Š"-¥ÔRJýâ‹/¾þ'ò'u@ßäF°ÿÄa¬ ´Ïÿ‘+Ããï~÷»Ÿ rffæá(Ц„SÅbñœÖZäóù¢(ª}Bu ÃáðÚp8¼*„н^ïM­u#ŽãúÖÖÖOƒÁÖW¿úÕ×l:8†O€0>NpÿåÑ·¾õ­GjµÚ©Z­öP¡P8'„˜¾‘;.‡×â8¾ÒëõÞ Wvvv^{æ™g^†ì&ŽÛN„=<÷gög÷<þøãÿy©TúÇù|þáÿ.`0¼Õét¾W¯×ÿýsÏ=÷·üǼAB·n7xÄÿáþáâïþîïþñÂÂÂï‹EÆ,žÿƒ­5ý~Ÿõõõÿë{ßûÞ?ÿƒ?øƒ‹BˆÝ-ãü¿Û‰aó…?ÿó?üÉ'ŸüóÉÉÉc¥R‰B¡pÓ°²²B¿ßßóúÕ«Wo¾B·HtZïÝÖµZ©©©]å…BC‡ÝÒÿd¡ßïÓéth·Û|ðÁÿÓç>÷¹ÿèaa¬Üàv€Gþ׿þõ§¾ð…/ü›Z­6Y.—)—Ëär¹]ÈX]]åêÕ«¬¬¬põêUÊå2…B‘ÙÙYÂTÔïA ¨NNR«ÕR×ü{í=„ÏÝ苵Ûùs¤õÈ}¯×ec}Ãܯñû^¯Çææ¦¡ÖP,üßœ8q‚Z­Æ=÷ÜC©TY•Á`à  Óé°ººúÍ_üÅ_ü}  H”ÆÃí"€(“ÿ÷ÿÂÌÌ̧&&&pÏçýÝn—¿ú«¿¢ÙlrúôÝÌÌÎrèÐ")@ )̱D „4È•¦\pÈvç‹4{i>×Ù‘võ#…å¯LWÓÚ#={¬´F+ Z¡´%­í{4±½®µFk…Öš•Õ®]»Êòò2GáÌ™3œ;w.UG!¼ýöÛÿÍïüÎïüï@›„rãxI„}où/ÿò/ÿëR©ô))åžlÿ­·Þ"VŠ/ÿò/û‡U<@ÅØ^Œ?H?-“~'»^½ëÀƒJÿ$w%?á!aïwçîú¡…-Ìóè§?M}k‹—_~™ÕÕUžy晤¦–óùÇ_ÿõ_§ „R©D»Ý&—ËMþéŸþé¯ík_ûW¤­ƒÁí"€P)—Ëg„ OÉ!!h6›;~‚ÿõíˆ?ûw1—¿û¥yk<Šé®K÷¬ôåæ<8 Ë3ç :ØeˆÀ—¥nO‡èõ‡°ÌЉ7ßïð¯_Øâ;;Á{¿Wdjzšíímjµšoó¸öâRA±X|ø710¸`BJƒ$ÇÒBÏggfá’¤2ò럟åÞF9Jqƒ‡<>ÅÙG³ù[Rþ÷ìå£X=)u,dù d®iÍÙ%¾ùÂìhÃêsy¶··™ššò–GØ>¹œAS¯×+% Þ$cã&g÷~åW~åTˆøápˆ³ÿwüdSPUšRQ«ämµœïé"ùì°—KØ…=w]ߢù—b™k#œ¶:üß âC @Ùýý§Ê\šï™ž™Nª´;v›R*‡á®9nž§ÝnˆÎœ9s @J‰”¥ö¶\D$iô 'L ]+ù†À4 ´v ½-³Ú¾UwÕ}S­µ ßj÷Ŭòg ‡º@† xëÂÞ( ?ÙÌ!Èvp¢(òåGŽyƒ³ˆ;â8Ž„©Õû/_¾Ìdì8¢œ@ÄíÑÂìb áZ^Ùž®öh¥¬™¡ÍÑÞM£ˆB§ý»üwåB‚ÔЊ%£ê8œÅÍ ·C ªT*ÞM"=KÕê¤ïR ¦*C­‘ÊÞ'Ý—š–Û%>ÜÆZ®1ª†£˜Ñ(vŸ¥„¬<÷ee/Š4â½2($B*ë¿0ްãÇ'Õ®M$ù|>ün‡ü;–$ Ož´ó½RXÚ)‚ŽxLÇšW×ááC’x˜t ¥Tª­‚3Á^ŽÎ}ÂírË£Gž µÙQP¯×­¿G‚Èœã¶w[„ZW‹ïñÂÉq«(ÊÀþOéþ¹àÊ^ôàœÅtZæ+(Rö½ï﹄NÄ‚v1 !òÆDêœh– ~.8€¯à*NÁâáÃX1È¡™¼ñH+Ë…ð_/„Èôð€=æâ(UQú›wCŠDG!?TòìY„‡Ç^ Ø{U(œ% ¤d—èLgó>m»±ÀXÙ  µBïÅ‚½‰àõ cÛ” ’¡†XaöZ'‘mz_¬:Ûûܵ˜ Ÿ*u.|ùÐmbaö®L…÷ á£-®<7e¯Ùú(´¯“Ò0Ôæ| •=wu×&JX(È”~råÊ•Ý)DJBðGôG÷í|`"¸m`zzúä(¯VH½žQ|šÃˆ²}Ò+tž˜²À# „éÁ#Ø¿pnÐüLWT÷ú²w0ìD–ƒ¿,ÅÏÔWxÑaUOƒ8+"®`ö?¸Øá¥ ;"Á¥mM´”„Ç“ú& ó':N;X€åÅbÑû7œG+ëX]]õÇ"!±Ö Ñ|evŸ{FDdC"<¹9O`ÆLÔˆ„*DbþiÞc~C$»^ë-ghvbþö­–7DjÞohæy;S×Y”R©ø€RêçF@JéÍÀ6-“•*u£ $¥JÈ@ù þÄ!5D´.f{¼÷ìN¯ ô§¬¥B»n¯3ç8}Ïœ9½×éŒo/÷xåýݾ²JŸ4²DB”KÚ( Šã8Õy´Ö!û¿‘gã¦à¶À}÷ÝW…ðQ !•j…†ÕˆOç‰u‚`Åîž/G”eÅ™rgP¤«é ¥e\{ä'—ÓÈβü 8ï5~Óû7wb¾ÿn›fŒÒ #a¼ƒO'$â½¢¦®#Y<|@'8Š”Ï<óÌYHä~ö8„HF<%f*'ÐÂp!Hiÿ!ÂU¦,*d¸‚HtMÜaTµ-hÐBg8@Zh©Mw2Þ=K/Ö¼ýAóöбoÂY6æOöâLÙör¦àƒ>ø0ðíQ_²¸-@k-½²kWWW)OL #ÓÐ1%0Cu¤Á dgn:nàoʈƒ½ìKYZÔG`òÛà‚ÁáŽCŽ>4p~µÏÅÕ½¾BDæ&i­i¯ìËß¼<$Ÿ›àòåË{T,ý}v¸ÛØô€qs‰!€(kŽâÝn—8Ž“k‚”˜ôvÔIÏNqp£+Ķ&BO :@ú&”¾G™x…O »×~nŠ€+VìtµA¶íÞÙž”¶ÿgXÞ(Î8*$l•Âýß™pîܹG\a˜ 0êCçææ¡aÀbÑxMH#7ï(ÖŸtò ]\Øs§CxᲓFW^»‘fç"Ëž­¢Àkþí~¹¥xo­O«§Ð–cI*'‘CSs•†Ö+ " v¤$ VK1ÈêPA&õØä?Œ_H RJɰÇ;ßv¡ró³ms½”“>¯CZ9,t¢&¹¡ aÚ¾S®Ã8‚-d‚t‘ˆ÷†/ â…J”9+f¼igîkÁ‡Í˜+õm‹ø((º®KZ‘•ÿÒ(&z­B’˧Q1ª½„ÌÍÍâ%¯ZSe×,U7 J¥ïׇ,–¤÷¸ mÌ1‡p©4" Ê€´ÆŠ´×#AwHsž·]b:pøh@I­% ŒÎîLÿÞ–[1¶†ôÆþ—9:¥ÎùŒ‚§´)Ö4–õk­™‹àgѱ’°9(‹U×ÎÜa"¬XXX8zýÂx@Hõz—Ò JYÐ#ãžõºÉàpÓ VØd)ikãîõ¦ #žŸÔÉBØQÖë·ÞѬ¶õ®2ƒ=„$Ê)b‡øžöžhüRƒÒÆá…¶„ &"ÍêÐ$Áöz½T }¶í2휮ø>áv˜Q>Ÿ¯f-€QJ ±)­*ƒD© Â`ˆÂ"ÙiÙoî3| –Aã‰äGù ¯õ;ož²äÑ(ֻЭŽf 4:ÖÈHXŽ 4ˆœí(L÷7{-‘DêÝ¢ Ôsee…“'Oš:g:Kà òºÖ°eá¶(!ÕfcÛ!L”+ #I±`u­QBxäKpGemãÒ  h)BpAXÎé YÝÙVÀ%j´”¦Ñ‹iô5½¡F+ÐDÞÂHìw“î%‘qHjü D +Z„Ph¡½h 9Ú®»s(&&&¸ƒ­ȉ‰‰Eg~TFp±Xä'—š<}¢d¹@ÀÚµ1í´Eé/wr-\ÃáMKá­‚l“)Í´bM³¯‰•aùJZ¶ûÊ -8ö ²¥áÑÖz -„@GFè]÷ˆ‘V@ève•Jež;T kØJ&…A|Ûs|‹E(ì›×6ŽPÙÂô ¡™íò@RAØÞv ©½á¹Â™rÐÖÐQÐBײ}ÓÓBjˆ%R)”Sêœ-Ÿ ˆ@[dkÐ)cÂJƒhat?Ïôb@A^À+ׇÜW©ŒlÐf kç;N t" ‚„‚Ã`Æh‡Gò´ñ(„–¦ÇkÇúmpˆ=Às…€#HÛÃú@_COÙcûwR€Š¬XP ¥0Îëб'±õò;'¶+™(xš N„ˆv\ )“ ”¯ïTN°ÕSCÈ“¶©ãLVÐ)| (ôî…üù…ù”¹æœ@RƒP--ë×&2¨EH"eÓ÷•á =¥‰…@IMo€1%Æg !r !¦½_v¯E¬ÑDHOFž «¤ÓÑ÷h¡‘Â$š ,'P¶LV(ÐÒ˜î>Q |~„§jöž9sfòâÅ‹w”ðòÿ™gž9ûQ@HÌš­®ÑÊÁP­?rlßn¡ñ©K-è42±Ð(±4Ι©ˆ"‰È×±C~á‰@x™zh—×',WPÖ‹çˆ@$*ËQR¬\Žfï»î6z(æˆÄ“±0VÀ½÷Þ»«íœ%å8é—¾ô¥{/^¼xRLq_0vàœ@¡ÌÅ®_¿À;­"yAo˘¡å2'‘émQN ¤LÊ”&ŠÌ=FÖ @§ü iEØdvïMBmD­@ljÃH)ƒ´6 ¤6ÎažaïÖWàlƒ”Bêð”a˵Un¶ºñ.^>ŠýgBÂc1Ç•è8ªp Ǿö2ÕœéÝØxÑ\/Å7` +m{ŸsDAY„ox). #»åŒXŽHD@(™÷ÊìÿËtãùÿ—Áˆœ¤(yrB ~¸ÜçèÑc»uD»YA¾Íw=x 0nˆN:uøÈL €‰ryô›²ç"¸äŽ…H—ãd©;Nö†%€(QÞì…g› <Ù'uOê²ë;2§2(ß3Ý;(ÎÙã\aw^ ƒÐ ²ia"€±‹€r¹<¹WöoÊÜ3#ˆ#ÁO6ú†m[Ϙ”Ž][çNØö.? ¶g‹qî¶Ì¼CØ^-Se.kǸéM@G)[¦±óÿXñ)Sqòlò{®@kåßEŒÏt÷cïÛ(þÇ_œ6vµOÖ|vJur äÃx•@ ŽuI)‡þ8„z½Nu²†Þ\æâ1¹u÷®åÉ^ZÖ›-Ïîñ>»—2q¤g”,ã¯RÖ2=;X²‡ì aÉ$SjäõdŸ}_›7ß¼Ns»‘nÔ=Ì@«gÅ0v+ V«‚Äqá7KÛÛÛT«5¶ê ¶·›FÉ“Vw@˜c˳¥0ÊŸ´3„I«äI!¥H5Nz)£D1´lÂ]ó•éü{?|ËçéBCpÖù™Ÿ 9n¢Õ€N§Ã0ŽÙÞÞy›”2U¿q&…Œ*•Êb¨¼ì倠'hÍNs›—^z )%sssÜsÏ=Ô&küøÕWxøáG¨NNR¯oòÚ«¯òèg>Ãìì,ï_úFƒG?ó™ðÁ”Òì–HÁ!?“¶¦ƒìÐñæžK—.1Q­ÒÙÙazz†z½A>y.333ËÆÆQÑëu)•Ë䢽^…Ŷ67™_Xð3—„ÙF©F Ú.L­¦p,žÀ±+"Àö^ˆw037˜&Þn6¹rå* ó ,_[æÿþîwùæ7¿A+.^¼À•Ë—év»,//ÓëõAkÛÛ¬¯¯£œ1oݺè ²XkmÒ¸t°)¶¹÷šä>Âc&4סÙlÑÙéiµšôû‚ÍÍMZ­&;í † Eš­&Q±|íN‡õ M.Q.Pˆ3íèëùùùSÜ®` ÈB¡Pq6«Ë÷ƒÝ"Hä 2šî ßãáGA©˜ÿøU¢HrùòeâxÈ—¿ü˼üòè÷{ÌLO¡±Ï †&iÃ%€ ÔÚ \X"6^éëf'„ù™¾ânpâÄ òù¼Ïç?uêÃá€\.O¥R!ŽcØÙi3??O±XdéÈ:Ý.ÕjI"¡”b8ŒÉçò”FÀ(îiç\[Rȸ•@955u2tZì%.]ºÄ}ç²Q>ÍÕ+Wèõû¼ýö[¼ùæ›”JE~õWçÿîoétÚü»¿ù¤Œèõû¬­­™(c³Ón±¼ü!¥R‘……+“ÁÅ='Çø$ !&yý¾fÑÖ:¥¸“‹/033C¥ZE ØÙÙamm !`ié([[[ÌÎÎR¯×Éçó ã!Ãá'N°¹µIÇtÚrù'OœD©4I:Û0tñ€Ô'ìÆ­D#/î% ”¶yA¥Råð¡Ã¼ùÆ?q’Çû SSÓüÆW¿Ê~ô#ý÷?p?ßÿþ÷ùÁ€’cÇŽ!£ˆ—_þó óÌÍÍûL ¸<Û‹c¥¼5án%ä :Í\ôцøpy™ÙÙ9–––øðÃAÀÒÒÅbÑ r©oS­Vè÷û9r„íæ6 µyÀ̉˜‹rLLL07;Ï`ا7èS*–A+êõúž Θ±c73æÊžÈw,Ï5õý<Àçξ4?-xüñǽ ÿO¾òDùy‚Ýýat%“±dÙ½)Ð"FÄV¹fíðh$Ê™† 9â_zìXâ½[X\4Á”Oª“UZ©†!_A‘¢é¾Z‘ÏçÙÚÚJ7j†{ºóq&…Œƒ¼ðµ¯}íQWá\.‡Öš(ŠRÓÄ8(•K†@ Î|Ó»†ÖÒŒÁV‘´#…2@ª%£E V(Ï·i_Îwï"Âþ‰FÛ ÆÓ#ìû»Üqœ#©*¨{æ(}o€L{Á†¢(ÚsM–Æ™2V0MÖÕG˜«««øÙ2¬ó$$H¤±BG2Á4¥ì0+éú©Nù×•Ž û—§ö)í¢t^%°–ƒ5Åìoú §I$xOT‘˜#nÑ»¯ÙkØS3WP>Ÿ;ÓãòòH)í¥ô…Ðét¬Ù¥0É}Ö§"P dŒ$"ŽM˜7!kß# 'ЮÇ[÷nl§‹7A'‰¥;@0…Œ£‡@Ô¥~º—ƒ{p9{\3Ï'ÞÈQëÜ 9ôÎG=’ [£MÀ(2"ÂfIx±«lŽyhƒ%I¤Â;v”©c‹dA$”bI„MÆÔ;bÇ<(³È†„®¥.ªàÙ ÁëÒ­å/¸|³Òˆ¾Á‹²j\I!ãrI@ÎÎÎR)`{q„ÉZ ¼CÆ8rŒSÆsÂ(¥ K× ›…” ®ÛçµÒıJœ;¶Liåu¬ÐqlCf~_0áAYH;ŒT°W™²ìqèlÊ:œvmõ×DÒ(Ínæ4{)ÔÏ>û콌A Œ“DqË,²G!ß‹*C6ÓÙìXN  te%(æ~)œì¨X™‘((”¹­!l``5ÿ†b³=4&¢‡˜XÃü„ R0š|!L4“9ÃBDÜGÇÃ÷z§?zW³-ßÅ-}@$ÄP¯×G®E丩[xc\I!ãÔ"ë¡™ÄÂõë× å{¡kߢ­®i‰À5Ú."0--‘Æã§2Ÿ#*”hÉZñáÆ€ÍX³~ý:«W®íëãNž{€ÊD™éœæPIpt¢DI É ²“8zðI†¡_!¸®GÜjÉÀ¬<“LãïËŒ® öÙ¤D£a¬VÀüüü)7·-$T›%Ç:•vÖ Z¤Ë÷UÆ—§¤ÉÆÑhc»K‰1BGf(™Œ‰d„Ì ye‹Kõ;Ý.v›a·Íl)Ï¡™ý}ê‡çÌ»› &çæ©Õ¦˜®Npzn‚{§)åLzšÖ&Ë75½o¾sNnÕ ¥ri¤*á~\I!ã W?=l˜6*̲kf%ÞE;S+‰ßv†!n“´iܹš‰@+ Älonðúù t»:­;:Zkãw?rŒ·ßÿð–?lf¦F!§YùÁKl—ËtçæÌÍ1œ[¤uä0Þÿ)" ˜ÕÞ5¸ÆÌ7Ùv° R¹æöûl×{®"æ ŽcŸrÿý÷%)d\à–”ã Ê¡í„@±ÔDÂpŽ\NÒÞÙ¡ÕÚassÁ`È=gÎP(–ÌH[¡mºµ4^<Õ'Fóî…óLHM¡ È• ä1˯H)™žâ©'—öõa›k0?;ƒ‚B$© L•rDqŸÆæ³³³ô}ò¹LJ—UÚ6ÖÖ¹`cÓS3h3==C¥:I«Õd»Ù¢ÕÚÁ­*–…¬"í:“”n¦©;H œŸŸ¿/ e¼÷Þ{Ì/ö¶µ@053Eµl•ÌŽÓj·Ùi6ÙÚXãÅ^à܃rèÈЂ¢ÛíP.éõz>|˜\.G¿ß§ÑhÐn·}.]·×çü›ïÞzãä"Ξ>Êôô4X;}rr’……>Ìää$Õj•f³I,Òé[Bþþ¥—¨×·¸ûž3TjSTk5¦j“467¸þá2 ™B¾Ö°¼¼Ì]wݵwcÛöWRÈXu€½B¿£t´¶Ã’©J…‰b‰~@Ÿˆvk­¡7ˆi÷,-áüÛoqüøqz½ˆdŒ^.—£P(0??ÏÄÄ­V‹••†Ï<îô[{Zö‚HFÜwÏI&«Uâ8¦X,R.—©V«ÌÏÏ3??O¯×£ÓéÐï÷(J*Žyï½w9|ø0=¥)GE:*¢»¹M¥4Á Ñ`¢RaP,Ðiw¼yØétvµ]8@$hÃö ãÔü°Q+„…`²[r†MJ¨”Ë\¸ðs‹‡ÐyE¹6ƒ±Väó¦×]»vë®0=3m”Da9„LNNúÞ©µ¦\.3 ¬HɱóÁ:kk›ûú8 T*˜8ŽéõzlmmyB7si ù$(ñÓŸ^0›J•Bi‚B¹B~¢‚î÷ØÚn0Œc–¯]céè1Ú;më7Ø=ˆ6ìLq{3pqqñw¸?—¿õ[¿uoÈîãb/B˜¬dås;í6ËËË ”fzñ(²×Eʈ~¯Ï06‹Mu»]¢œË3 V¯×£ÛíúFiµZ~xU©T¢T*E+kçyå•Woùã")ù¿ø9fffÈåLJW»Ýfeeůâ1i·ÛËerù<Ýn×d.}¸Ì`0`r²J¯×£×ëB”C ût»êëët:Ž¿Ë;Š¥òž!)¥iÀØ’BÆÆ¦ï…‹îE†å èõûò9Ö××Ñ &Ú„DzHµ”ç'?½l×<ÎææBk´´vvÓ3ìâŠ>úE‘_nå»Wب·öõq«ë›œ9µ„RŠR©äE€[ÒU)E¯×£P,ÓŸ⦆=sæ^~ðÒKœ>}š¥c“l­¯èáÍ5¶6V,w&1šRq· ¬…{Æ2.ˆ´Ör”Ò7*¼±±a²`¬ó§T®0ùÙÏÞ£Ûípd©ËÔÔý^—Wßz‹ .ðØcÿˆæöŽq–aæõzƒN§ã¹€3•&&&¨T*äóyþ“_}³VÛ¾IDAT–ôéöõq'O¥7SÞnnn²¾¾Îöö¶çJ)‚Ó§ïA+e:h¦§f˜žžæùçŸç‰'žàøÉ“¨~‹Öv“ë×?dccƒÇ{ŒÞ ç‰@à CÂ.1Ô†ŽC+`ß0 Y­VkÙÞ¾×çãÒ„rÍÚ¹¿Ä_üſ䥗^òIÝn—N§ÃO<ÉãO>eÒÇ~|ßää$««mšëë>þ µ¦ßïû%Øóù<µZÇ)‹©…™ö‚n·ËÚÚkkk¼sþM›ˆÚ#Š"ŠÅ"ÅbÑO~‘/¸ë®Óä EâX{Ëfss“ÿô×ÿ3žþ9¾ýío355•²óŸzê)Ž?ÁÊêZ0¸$æÚµ´ÇrÔ„›Q-)dlpüøñ{ ™ìF" j@(iè˜v§Ëõû@}«Î~ð}ƒ!§î>Íݧïf0ˆiÔëÞ‘¢­—PærÌ/,²¾¶F½¾I{gÇ&ZéõzžƒÁ®žuèÐ! …ô˜ü«W¯îþÀ´÷ͯê-„àäÉ»8¼t”ÅC‡ '°½;P»Óã™g¿È/üÂç¹võ2ÌÌÎpæž3ȨÀõëk¸ÄX ÈZ{u¢q%…Œƒ$˜QÁa(xÔ¨`·\¡TìÓ¼´Òô•æƒë+|ú1&£ÙÜÁåÛ›ùu°ñz‰ˆQ”c~~B±H¿×ceå:õzƒÖ®1u!¸©êS3â¾lYur’C‡sèÐa ¥µÉI”² šò9¤¶Z-´Ö,:Âüâ4š­F˶‹ &KÕßLVPFøD•@r:@²|íÚ5BuI.foN5±6·ó)â–±Ž@›­¡lb‡DF3Ó³ô=*•*§N¦Ùj±ÓjÒjµØiµØÙiÓéìÜÒÇÕj5r¹Ó3Ó”Je¦gf(•J!È òE@½loN2 Ž»Û#Ü t!a”G|$s{zÁd …s}â"’dsv]îe¦)ÝMöbÃÂÊ~L&g”Øœ ¡ñéÞK ÊgòäròùJÅ”Êeæç扙ºãul¶š np½ †Ã˜JµJ.—Çå¥>Rš|~3wIƒ©ù O@ô®×c3¢’¼†Êä$k«Œnä ¢ãH »p‘ÀpPH¢(ò™?&Ln§ârs¿‰DÎ ™L!og­EŠÈƒÀŠ"—W ÚB˜ÕÊeÂNµÖ ƒt%ƒ\.áòÃ0dá4ö]HG'“Lg{<ŽðTpì’BÌ7lä=ÂëÏ>ûìg —臄ÝÀfL#Tª5T¬ÑÒf¹Ô3A4vI5i¦Y‰í6Õ+–€Ha&l7ÈM'דnÔFÓ¯ƒk*V)KêËls*×e}Ñ^Çú¨tJ¹3×UªÌsgÚ÷½óÎ;»ª’Y6.œ|ãŽ0% kµÚÉ RåoÈú®^½jƒÊäBš‰!mhܦábD¾áar¼ÿÑÎ-ìçmqù„.°lµÑ#„HRÁ…’&ÕlD¯Ó™£D,'OˆkÍà­g :×®siû¼'åÞãô½•@ÃáЇ„µÖN —‹Å‰Q‘À,´ÛíÄࢬ–ï@a“@¬)é‰AXv®-g‰ñãWˆò½|7W]f‘ϱ‹ã­•”¤éB§ˆ \*Ö Ï!”·Âr°|r‰@ ŸK5pÀMC¿À8’BÆÆ\ÁÍÌâA­m`G„J<ífý0ÚŸ%mˆÁM‡,7"ä;=Â\0½±½ÓbscV«E³ÕbaaãÇOYȬ¦SýË#Ê!4ÒMçN8ˆV葟F¼B§ÙH5ô=àܹsN 9x'оð…£YÍÿFÙ@•Ê$±Rvx—ÄaÇY¯Ñ±}Ÿ5bëþuÄ`äxì•>w°x÷:¼ÀsŒ‡=š-¾ôÅ_¢T*ÑëõøÎw¾ÃòÕ+;qÊ×3‹tHØzª÷› éî”À@'HY–;Øg*•*YóÝsûÁg 9(€<{öìÒ¿!¬­­!s‘—‡àš‚›Þu8èóÚ_¦X,Ðl6i6› ‡Cޏ‹G?cœEF;pö@š ‹t~žVŠû￟ÜÑ£üëðùyxöÙgyî¹ç<‚Ì£)k7'h`Ðëñ·Ïÿ óó!üPñÚÌ‹‹‡w#Þé N,†T#gÜÁAG åÿ''¬,Ba8è½…®­­Q™œAÇÚZ}.!\XvïLB¸þá|ùË_BcbBr×Òår™úOÿŸ~ô3 g€DT ÊéúšÄKç ^¯sáR‡¹B™7WO{¹š¶|O”ü¤w‡Ç 6Ö×yö™gxâ‰'XZZâ_þë-¾ü…þÏñ?£çÍàQƒxH9Tr¬”æâÅ‹œ9sftƒ\vI!ca$ÐVì†I!J+”VˆØÎ,4:XîKãÚn48}ú4ÿí?_æŸ}µÊÂÔÀæäP±¢#’üzd²Š˜s쪡Þ}÷]êâ8Ñ¡Slo7¸¸}‘8މ33›‡Höç*$ó㻽½Í¥K—¨T*üÛ¿[Cë÷Þ{/ë›ÛLT+ wQ>àt«Ý(70 -,,œâ& D÷ÝwߧÊ: 6 ¡‘µNÇgÖ;ÛAçÏŸçý+‡Ù\=Ïÿ»Ò¢P(0Y­z+"5® ¶í+H<‹8}lP&/±ÝK%Œúêï\{Çç1øæWÄ2ƒã……Þ~ã5¶íÔ5µ‰i®-÷(éÐëw)ëŠéíï¡;višX`lRJr¹ù|þÀI!cÑL?:°³³Ã¡£'Ñ*¶ Ÿ±Ö›ÈðÁ ÇÿóÜÞ»<Å_~®bÅDß2žF/ö¯ŸûÍ4j$ËËËtJטžû4›Ëuä;ïðÀǡ܈Ȩ=‰AiÍÕ«Wyçwxÿý÷yíís¼uá ÿø³—©NN£â8‘&®·“ ÝÅF­¯rÔq.sðN77`à ØÓ¼téwÝó)›Ô“ßo:súlll°¼ªYßðâ‹/2)—Ë<ýÌSÞ9c¸Þ'³oÁ.÷ˆ°5¿zõ*=¹L÷pÍå-¶úSî»ï¾´µnB¸rå ï¾û.µZ¶¡6·À… x衇ƒ¤ƒ`÷ Þ: ;‰„mèmiEÂ.3üVa,`nnîtX±pŸ? çëÄÞ–±Ú$`R¤7š9TýUÞn¼M¿ß'ŸÏóK_ü²ÕiÌC·`¤‹gü@¾²ÎÇP¯×i¶^ïÓ¼¾ÍÊûïÛº)võ¿ÐLéÚG¬›Í&W®\1)ê¢Èvï1^¼Â#|¥bK8Ž˜§}‡Òšv»=º±ƒù …¥RéÀI!ãP£B¡P¯ÞKðë |ÐGÛUÂUðöééi6Û³ "iµZäóy3A”6J ˆMó%§m»z°säµY©Dè<Í>ƒŽI"ã˜Xë]Ï)—qJûw¿ö±©©)Èçó´3lt‹Ôj5d”K‚>–pBÄ;½@)ÍåË—yôÑGÓm¿/Œ[Œ#)dJ ·\œúFkMTªþc…÷îi„²lÛøƒÈE’ééi¶ß[‚‚`ii‰ÍÍMÊå²]‡HAטÖð‹›=üÐè\dâê¢D{kHÔ~¨šŽG#ÚŸ»# ßߢ³³³ÌÏÏS.—Ùjϱñö DÒ²|•Øýæõ‰èF€ƒCî>1G7'&&³•%._¾L$sÖ .¿?L!#6.¨P`zzšòD™\A³´´DEÌÍÍ!e„Ö1viËîƒ÷1{=Â$¢T*‘%Ú›}*±drr¥TŠxS¨Ø¥ãûtâ2š››c~~žZ­FTŸã&ý,Š"/¶Âà¶Š¥òæäÍ@ÿé©b>1G¢‰‰‰ù½bÖ!´Ûm?Ùƒ ú˜U¤HûõÝB ÓÓÓ”ËeŠÅ˜¥¥%ƒsssD‘$¶¾uƒ|H ¹,¤9ÝàLM±X¤ J´·”‹‚Ú|Í€FEPŠ·&£CZ¹\fvv–¹¹9âœY;kqq‘(Šª R˜Bz¨ì&€P”:w°ãM ‹À!;\#vk¯NÖ9'Ž_FÕèB˜ì †C3°CFÈHS­V™˜˜°ƒ4 ¾7y “Ù[8ÂÊ&L;o [¢»9 žID@¬âD|¤*o~Ap®“+¹\ŽJ¥B¹\¦l×C˜ššBˆˆ¡ŠIDF::èΫ“Ó{7xЩƕr`¸÷Þ{k€ŸÛ>d¡£¸@±XòN çüÑ®5f;¼JJÉé¾ÿJ¢‹EJå²Q$»GhãA‰ÉWÑ€®o5h;Û–Pl ˆKx¿½rÁžl$0y|Ïs­a¢:I>Ÿ÷½øÐY3R)ÊEèþÐë N©L§‰™ÒjíIJ§Wõ€I!û%/ÿŸ~úé³Y·ï^¹kkkäóE;˜Â°yÓÖh{pµZ¥\Ðé™q½^ÏÎ à|ö.JV+<*¬“ëRš$ƒž‚Æù3 /ÿ g =} „Þ¿ô¹òNC¸k7†äóycá Þ²ýd¯´©Ã¥K—vÿyЮZk?0å I!æÚibœ1 VVVPZëØÏ±/]>@&ϯ±Ýâî»–èuW®ÌÜBn=Xiãô Ì=i½<þïU`B‡Ã¡yNiÊ…ÊÊ^•0:õœsàø«^¸›Ý÷7›M6%ÿ_C¥¬Ç/-Tfq ¥• {ßÜZŒpð¤ƒp ˆ8ŽýÜ€n¶Ëð<Ãâb»8£¶ËÄÛ©äÖ³"M¥Zåîãïpò¡YZ;éüíVxD;Áo“>âñ»Ö‰Ç7QÖTuþ‰XÈÌ"Ú–…¦ Å£Éf ÀZ>uOƒr¹lF éÄüS:L%OöJkÏ@6/ÐÁA“BJÑ©S§Î„•Jfä Þ&ëdžqµÉïò&êõgÏžåøÃM.]*rô™g˜žž¦7¨ØZ—ŸµÑaYXkÛ¶ÙDP' aÙº¦kn~Uæ\‡wh ÅgÏžeee…‡Ú`r²ÏÌ̬lZ“]HOr ­'2Cœ{‰Të ÝÁÀþ™,•J“£²Fc±Ž„vIŸ.94Qê4ðîû—™™ª+Xù$‹‹‹Œ‚¬¢íÊôg 9(ð‹D9ø(™¥µ¦R©ðä“Oòä“O&Mìg?û+++¬®®òÞ{ï±S_ecc“æŽIލV«DQž|>ÇD¥Š@årT&ͱùÓÒ!=ÃqzCÈ"9(ëu;t»Ð0ˆì4›IyÏLQ7Y™`nn€Gz€Ó§OS©Tü>l·›0Ö²°°p’OÈ k}ÔÔp!d‰¤R©ðàƒòàƒ޼ߘ‰¦Ýä†`Vü}ËË0ðö}R—©©™[j™n€À Ö™s¾dqq‘{ïN¦œyÈ"Ø!÷fàVi±jˆLð )’`•°Z&n|·pàØ“Hno¼ñÆ-Ý÷Ýw§ºMp«½>«™‰¸?VG·~ó7óQç”#7Kn–ö û!šÛ·Úã³å´Ö£¹o°ß0¢äææ¦Ì†.Cu«p£9r~Þa¿ßæó]Æ”—‚·µµÅO<±Ä>‰`?à@­u´¹¹¹k{qø£žá ß±×snÖP!ÛÛÛÔjµ%>f%l(x}}ÝX #aXøFc? nd߉0¢Í¾# \e‡ß™Võ¾u€ýra+!†Ã¡™çwÄ\|aåÇÑ£Ãu'q‡qÕiÔ;B½*ÛÖÖÖL^C‚“E¤@k3Êé£qû'ò²ñqÅíøÏ½Þã’TBÛöÂ… h­Y^^^ác4µÛžþùמzê)ºÝ.?ýéOyä‘G( 3¥Úˆ!£æú(øy`ýY¸ÂE¥ÛgŸ‡ ¿­­­qåʃçÏŸ¿Î­¹·<ìWИÈðúõë¯9räáóçÏsèÐ!:äoº$‡!Üì;özï¸`¿½|TÖQˆÜìþF0ýTô½^×^{N§Ãúúú`ˆÁ‡Ih¼Ø/ˆпråÊ+óóóK)ùñÌç?ÿy¯îyB‚5ÜlÁ|\à2›„ŠZX~£QR·áüÇçÏŸgmmÁ`ÀÕ«W_ÅàÂÁ-Á~9@ ôÎøÃïŸ={öw€Òúú:?üáùìg?›Œÿû˜`”î–ß,ÜŠ<þ8A)E·Ûå½÷Þã­·ÞòñÆo¼ô0Dð±€cÿ} Óh4V.]ºôwgΜùe0ãûý>O=õÔ®Ù¸ÿöJ)Þyç^ýuƒý~Ÿ÷®^½z è`ÀŒ<¹Ø/pж_|ñÅï=zôi­uI)3ùÂw¾óŽ?Îìì,SSS~”Ì?ÀÍÃöö6ív›f³ÉÕ«Wi4ôû}†Ã!ý~Ÿ×^{íÛ@ C}>F 0×6õÜ^~ùå—ÿÕã?þ_j­Í0ë8æüù󩇿ææü©Z­F>ŸgvvvŸUøù‡Á`@³Ùd0°½½½ë<­uÊØÜÜ|ÿÍ7ßü°MÂ>6Ãnº@Øxå•W^\ZZzäèÑ£ŸÎår#çßýàƒÑ3aƒYý£P(¤ÆÔ™éÚMÃò;67“ÕÉÜâ`”8‡ÔF£á87 ®c Úív÷…^øÀÐÄàáÖ^há f`ŒQ>ZÀ&0ùÜsÏýůýÚ¯-ÕjµC·’øÕ¾nö"ˆÛÁQB¤†"øvCH¯¿þú7VWW/`ÚÝÀ-Ëا÷(xVe`8 œ¨V«÷~îsŸûí¥¥¥;'û(¥h·ÛÛ¯¾úê7.^¼ø=à2p XÇtÂ!3¸çs@˜ŽG#ÇŽ»ÿäÉ“NMMÈçó¥jµ:w£ý¤¡Ûí6íÖèt:­­­kçÏŸÿ°,«ÐcòN`¸@ž„€CÀPä,Ü‘#GŽ …Êìììb.—+ONNÎGQTªT*ó¹\îÿ76ãÎÎÎÆp8ìÅqÜm6›ë€n4+½^¯³²²r½Ûíî`Xºs¸õ€ Ž!€ULÏ?û‡ñ€y ²kÀ´ÝjÂ(Ú-áyL:YÎnMOOÏV«Õi)¥œ››;ˆ\.W¬T*ón²}ß1P­VùÀj·BÝív›½^oÐÃá°Ûh4V•RªÕjÕëõú¦§Æ#¶a°û>É;¿ŽQ¼w0„±/Öï`\®:G9 ¢'‚­ì–Ïì1¸ÍEl2sއ—G=A&:55µEÑîe8oºÝn£Ýn7ì© €±½½]o6›u‡˜Û»-ÞcïìœÝB¤;§Î غs¯cÝýrOŽÓWë3…íæízý¨-ÊœgïFìC¢ÈŽOÇ>¿Ñ![eŽ!pÉ"}¯-ìÙáq–(²÷*vÌ ¸ç–?£àv8ëÝ;åˆ-‹¼Q½<»â£Þ%F\ÛOšT¹YB{õ^[x}8¢,{¬÷xoöu°>®höá–ÞdÑŒêå»DÁˆëûÉq öò°ÑG•g˲\b¯²ìr™°.·þ?ô—ŸžIEND®B`‚qlix-0.2.6/pixmaps/qlix.xpm0000644000175000017500000012700611050625206013757 0ustar aliali/* XPM */ static char * qlix_xpm[] = { "128 128 701 2", " c None", ". c #00070D", "+ c #000306", "@ c #000D1C", "# c #001834", "$ c #001F40", "% c #002044", "& c #001B3A", "* c #00142B", "= c #00060F", "- c #00040A", "; c #000407", "> c #000309", ", c #001937", "' c #00397B", ") c #0052B1", "! c #0056B9", "~ c #00489B", "{ c #002C5D", "] c #000812", "^ c #00060B", "/ c #00050B", "( c #00152D", "_ c #004696", ": c #0054B5", "< c #002F64", "[ c #00050A", "} c #000409", "| c #00336F", "1 c #004FA9", "2 c #001023", "3 c #003E86", "4 c #0053B3", "5 c #00060C", "6 c #0055B7", "7 c #000710", "8 c #002C60", "9 c #0050AB", "0 c #000913", "a c #000E1D", "b c #0055B8", "c c #000810", "d c #001126", "e c #000B17", "f c #0054B6", "g c #003B80", "h c #00070F", "i c #002855", "j c #0052B0", "k c #000408", "l c #00428D", "m c #0054B4", "n c #00172F", "o c #000205", "p c #0051B0", "q c #0053B4", "r c #000204", "s c #0053B2", "t c #003878", "u c #000B16", "v c #0052B2", "w c #003C83", "x c #000F1F", "y c #003F87", "z c #00080F", "A c #000E1F", "B c #0051AF", "C c #0051AE", "D c #003E85", "E c #0050AE", "F c #115CB3", "G c #447EC2", "H c #6896CD", "I c #88ACD7", "J c #A7C1E0", "K c #C5D6E9", "L c #D5E1EE", "M c #E0E8F2", "N c #E9EEF4", "O c #F3F5F7", "P c #F5F6F8", "Q c #EAEFF4", "R c #E1E9F2", "S c #D6E1EF", "T c #C8D8EA", "U c #AAC3E1", "V c #8BAED8", "W c #6B98CE", "X c #4881C4", "Y c #155EB5", "Z c #003D85", "` c #0050AD", " . c #105BB2", ".. c #5C8FC9", "+. c #9AB8DC", "@. c #D2DFED", "#. c #F8F8F9", "$. c #F9F9F9", "%. c #9DBADD", "&. c #6192CB", "*. c #145EB3", "=. c #003D84", "-. c #000E1E", ";. c #0050AC", ">. c #0D59B0", ",. c #6192CA", "'. c #B3CAE4", "). c #F4F6F7", "!. c #F6F7F8", "~. c #B8CDE5", "{. c #6695CC", "]. c #105BB1", "^. c #004FAB", "/. c #1B61B3", "(. c #87ABD5", "_. c #EDF1F5", ":. c #8CAFD7", "<. c #1E63B4", "[. c #004FAA", "}. c #165EB1", "|. c #98B7DA", "1. c #9DBADC", "2. c #1960B2", "3. c #003C82", "4. c #004EA9", "5. c #0451AA", "6. c #6E99CC", "7. c #EBEFF4", "8. c #739DCE", "9. c #0652AB", "0. c #003C81", "a. c #004EA8", "b. c #296AB5", "c. c #CDDBEB", "d. c #D2DEEC", "e. c #2D6DB7", "f. c #003C80", "g. c #004EA7", "h. c #5E8FC6", "i. c #EFF2F6", "j. c #F1F3F6", "k. c #6291C8", "l. c #00060E", "m. c #004DA7", "n. c #0450A8", "o. c #99B7D9", "p. c #ECF0F5", "q. c #B3C9E2", "r. c #7DA3D0", "s. c #598BC4", "t. c #3672B9", "u. c #1C60B0", "v. c #125AAD", "w. c #0752A9", "x. c #0550A9", "y. c #1159AD", "z. c #316FB7", "A. c #5588C3", "B. c #78A0CE", "C. c #ACC4E0", "D. c #E8EDF3", "E. c #9DB9DB", "F. c #004DA6", "G. c #0853A9", "H. c #AEC5E0", "I. c #93B2D7", "J. c #3A75BA", "K. c #0450A7", "L. c #024EA7", "M. c #3270B7", "N. c #8AACD4", "O. c #E3EAF2", "P. c #B2C8E2", "Q. c #0953A9", "R. c #003B7F", "S. c #004CA5", "T. c #0D55AA", "U. c #BBCEE4", "V. c #DCE5EF", "W. c #6290C6", "X. c #0751A7", "Y. c #044FA6", "Z. c #5688C2", "`. c #D4DFED", " + c #BDCFE4", ".+ c #0F57AA", "++ c #003A7E", "@+ c #004CA4", "#+ c #0751A6", "$+ c #BCCEE4", "%+ c #EFF2F5", "&+ c #6E98C9", "*+ c #0650A6", "=+ c #034EA5", "-+ c #6391C6", ";+ c #EAEEF4", ">+ c #BED0E5", ",+ c #003A7D", "'+ c #004CA3", ")+ c #014DA3", "!+ c #A1BCDB", "~+ c #BED0E4", "{+ c #2364AF", "]+ c #1B5FAC", "^+ c #B4C9E1", "/+ c #A2BDDB", "(+ c #000D1D", "_+ c #004BA2", ":+ c #81A5CF", "<+ c #93B2D5", "[+ c #034DA3", "}+ c #014CA2", "|+ c #85A8D1", "1+ c #00397C", "2+ c #004BA1", "3+ c #477DBA", "4+ c #7099C8", "5+ c #6390C4", "6+ c #F7F8F8", "7+ c #467CBA", "8+ c #004AA1", "9+ c #1357A8", "0+ c #E2E9F1", "a+ c #739BC9", "b+ c #6793C6", "c+ c #E1E8F1", "d+ c #004A9F", "e+ c #A8C0DC", "f+ c #86A8D0", "g+ c #7AA0CB", "h+ c #A7BFDB", "i+ c #00397A", "j+ c #4A7EBA", "k+ c #B6CAE1", "l+ c #024BA0", "m+ c #AEC4DE", "n+ c #487DB9", "o+ c #00499E", "p+ c #034B9F", "q+ c #D0DCEA", "r+ c #E1E8F0", "s+ c #1558A5", "t+ c #1256A5", "u+ c #DDE5EF", "v+ c #CDDAE9", "w+ c #024A9F", "x+ c #003879", "y+ c #00499D", "z+ c #638FC2", "A+ c #4D7FB9", "B+ c #467AB7", "C+ c #5E8CC0", "D+ c #00489C", "E+ c #054C9E", "F+ c #DFE7F0", "G+ c #B1C6DE", "H+ c #ACC2DC", "I+ c #DCE4EE", "J+ c #034A9D", "K+ c #003777", "L+ c #5584BB", "M+ c #F5F6F7", "N+ c #2361A8", "O+ c #1F5EA7", "P+ c #F4F5F7", "Q+ c #5081B9", "R+ c #BDCEE2", "S+ c #A0BAD7", "T+ c #9CB7D6", "U+ c #B9CCE1", "V+ c #00479A", "W+ c #2C66AB", "X+ c #2964AA", "Y+ c #2864A9", "Z+ c #003676", "`+ c #000D1B", " @ c #004799", ".@ c #84A5CC", "+@ c #B9CBE1", "@@ c #B6C9DF", "#@ c #80A3CA", "$@ c #003675", "%@ c #004698", "&@ c #D0DCE9", "*@ c #5F8ABD", "=@ c #5D89BC", "-@ c #CCD9E7", ";@ c #003674", ">@ c #004697", ",@ c #235FA5", "'@ c #0E509D", ")@ c #0D4F9C", "!@ c #F0F2F5", "~@ c #1D5BA2", "{@ c #003673", "]@ c #6E95C2", "^@ c #B1C5DD", "/@ c #AFC4DC", "(@ c #6891BF", "_@ c #00060D", ":@ c #004595", "<@ c #A8BED8", "[@ c #7096C2", "}@ c #6F95C1", "|@ c #A3BBD6", "1@ c #003572", "2@ c #2F67A8", "3@ c #D6E0EB", "4@ c #000C1A", "5@ c #004494", "6@ c #15539D", "7@ c #EEF1F4", "8@ c #014594", "9@ c #11509B", "0@ c #003471", "a@ c #004493", "b@ c #4677AF", "c@ c #C4D2E3", "d@ c #C5D3E4", "e@ c #4274AE", "f@ c #003470", "g@ c #004492", "h@ c #6A91BE", "i@ c #98B2D1", "j@ c #99B3D1", "k@ c #6890BD", "l@ c #004391", "m@ c #88A6CA", "n@ c #7095C0", "o@ c #7196C0", "p@ c #84A4C8", "q@ c #004390", "r@ c #A5BCD6", "s@ c #5682B4", "t@ c #5783B5", "u@ c #A1B9D4", "v@ c #00336E", "w@ c #00428F", "x@ c #C2D0E1", "y@ c #3E70AA", "z@ c #3E6FA9", "A@ c #BDCDDF", "B@ c #00326D", "C@ c #00428E", "D@ c #D5DFEA", "E@ c #255D9E", "F@ c #265E9E", "G@ c #D3DDE9", "H@ c #DFE6EE", "I@ c #165297", "J@ c #185498", "K@ c #DDE5ED", "L@ c #00418D", "M@ c #E7ECF1", "N@ c #104D94", "O@ c #114E95", "P@ c #E5EAF0", "Q@ c #00326C", "R@ c #00050D", "S@ c #000C19", "T@ c #00418C", "U@ c #F1F3F5", "V@ c #084790", "W@ c #094890", "X@ c #EFF2F4", "Y@ c #00326B", "Z@ c #00408B", "`@ c #01418B", " # c #02418C", ".# c #00316A", "+# c #00408A", "@# c #07458D", "## c #08468E", "$# c #F3F5F6", "%# c #00050C", "&# c #004089", "*# c #E8ECF1", "=# c #0F4B90", "-# c #114D91", ";# c #ECEFF3", "># c #003169", ",# c #000B19", "'# c #003F88", ")# c #DFE6ED", "!# c #164F92", "~# c #185193", "{# c #E4E9EF", "]# c #003068", "^# c #D6DFE9", "/# c #235998", "(# c #255B99", "_# c #D7E0EA", ":# c #000B18", "<# c #003E87", "[# c #C2D0E0", "}# c #3D6CA3", "|# c #3E6DA4", "1# c #C1CFDF", "2# c #002F67", "3# c #A6BBD3", "4# c #557EAD", "5# c #567FAE", "6# c #ACBFD6", "7# c #002F66", "8# c #89A5C5", "9# c #6F91B9", "0# c #91ABC9", "a# c #6B8EB6", "b# c #97AFCB", "c# c #6C8EB7", "d# c #002F65", "e# c #003D83", "f# c #4873A5", "g# c #C2CFDF", "h# c #C3D0DF", "i# c #4773A4", "j# c #164D8C", "k# c #EDF0F3", "l# c #013D82", "m# c #1D5290", "n# c #002E63", "o# c #DDE4EC", "p# c #2D5E98", "q# c #E3E8EF", "r# c #AABDD3", "s# c #6E8FB6", "t# c #6D8FB5", "u# c #ADBFD4", "v# c #7090B6", "w# c #B0C1D6", "x# c #AEC0D5", "y# c #7191B7", "z# c #002D62", "A# c #255791", "B# c #F0F2F4", "C# c #0D4586", "D# c #0C4485", "E# c #EFF1F4", "F# c #2A5B94", "G# c #002D61", "H# c #D2DBE6", "I# c #5E82AD", "J# c #5B80AB", "K# c #DBE2EA", "L# c #85A0BF", "M# c #B8C7D9", "N# c #B4C4D7", "O# c #8BA5C2", "P# c #003A7C", "Q# c #2E5D93", "R# c #F8F8F8", "S# c #2A5A91", "T# c #275890", "U# c #002C5F", "V# c #000A16", "W# c #BFCCDB", "X# c #9FB4CB", "Y# c #9BB0C9", "Z# c #CBD6E2", "`# c #002C5E", " $ c #577CA7", ".$ c #23548D", "+$ c #1F518B", "@$ c #F4F5F6", "#$ c #6184AC", "$$ c #00387A", "%$ c #063D7D", "&$ c #E1E6ED", "*$ c #B0C0D4", "=$ c #ABBDD1", "-$ c #073D7E", ";$ c #002B5D", ">$ c #6687AE", ",$ c #4C73A0", "'$ c #456D9C", ")$ c #7290B3", "!$ c #043B7A", "~$ c #D2DBE5", "{$ c #E0E6EC", "]$ c #154883", "^$ c #114581", "/$ c #DCE3EA", "($ c #083E7C", "_$ c #002B5C", ":$ c #4C729F", "<$ c #B5C4D6", "[$ c #023978", "}$ c #ADBED1", "|$ c #5A7DA6", "1$ c #002A5B", "2$ c #ABBCD0", "3$ c #859FBD", "4$ c #7A96B7", "5$ c #BAC8D8", "6$ c #013878", "7$ c #154780", "8$ c #E3E8EE", "9$ c #718EB1", "0$ c #6686AB", "a$ c #EEF0F3", "b$ c #204F86", "c$ c #002959", "d$ c #4A709C", "e$ c #6F8DB0", "f$ c #6283A9", "g$ c #F7F7F8", "h$ c #6182A9", "i$ c #000A14", "j$ c #859EBB", "k$ c #91A7C1", "l$ c #033876", "m$ c #013775", "n$ c #839DBA", "o$ c #97ACC4", "p$ c #003573", "q$ c #013674", "r$ c #A5B7CC", "s$ c #BDCAD9", "t$ c #225085", "u$ c #1A4981", "v$ c #B3C2D3", "w$ c #C1CDDB", "x$ c #073B77", "y$ c #002958", "z$ c #073B76", "A$ c #BECAD9", "B$ c #6D8BAD", "C$ c #063A75", "D$ c #033774", "E$ c #6282A7", "F$ c #E9ECF0", "G$ c #CDD6E1", "H$ c #11427B", "I$ c #002957", "J$ c #0F4079", "K$ c #DBE1E9", "L$ c #073A75", "M$ c #043773", "N$ c #5678A0", "O$ c #D3DBE4", "P$ c #D2DAE4", "Q$ c #17467D", "R$ c #002856", "S$ c #093B76", "T$ c #B1C0D2", "U$ c #E8EBF0", "V$ c #91A7C0", "W$ c #386090", "X$ c #033673", "Y$ c #023672", "Z$ c #315B8C", "`$ c #88A0BB", " % c #E3E8ED", ".% c #C4CFDC", "+% c #14447C", "@% c #000A13", "#% c #00346F", "$% c #053872", "%% c #9DB0C6", "&% c #ECEFF2", "*% c #B1C0D1", "=% c #7B95B3", "-% c #57799F", ";% c #345D8C", ">% c #1B497E", ",% c #114279", "'% c #043771", ")% c #0F4077", "!% c #1A487D", "~% c #305A8A", "{% c #53769D", "]% c #7792B1", "^% c #AABBCD", "/% c #E7EBEF", "(% c #ABBBCE", "_% c #0B3D75", ":% c #6382A6", "<% c #F6F7F7", "[% c #738EAF", "}% c #002755", "|% c #2B5586", "1% c #D0D8E2", "2% c #D1D9E3", "3% c #375F8D", "4% c #002754", "5% c #00336D", "6% c #053770", "7% c #728EAD", "8% c #F1F3F4", "9% c #7F98B4", "0% c #073971", "a% c #002753", "b% c #184579", "c% c #9BAEC4", "d% c #9DAFC5", "e% c #1C487C", "f% c #002653", "g% c #000509", "h% c #1C487B", "i% c #89A0B9", "j% c #EBEEF1", "k% c #F2F3F5", "l% c #97ABC1", "m% c #275181", "n% c #002652", "o% c #0E3C72", "p% c #6280A2", "q% c #B5C2D2", "r% c #6381A3", "s% c #002551", "t% c #000912", "u% c #113F73", "v% c #5E7D9F", "w% c #9CAEC3", "x% c #D4DBE4", "y% c #507197", "z% c #002550", "A% c #003069", "B% c #123F74", "C% c #456891", "D% c #6A85A6", "E% c #8A9FB9", "F% c #A9B8CB", "G% c #C7D1DC", "H% c #D7DEE5", "I% c #E1E6EB", "J% c #EFF1F3", "K% c #E0E5EB", "L% c #CCD5DF", "M% c #BEC9D7", "N% c #54749A", "O% c #6884A5", "P% c #58779B", "Q% c #003067", "R% c #6481A2", "S% c #5C7A9D", "T% c #00254F", "U% c #617E9F", "V% c #00244E", "W% c #5D7A9C", "X% c #6581A1", "Y% c #00244D", "Z% c #002E64", "`% c #597799", " & c #6883A2", ".& c #00234C", "+& c #567497", "@& c #6D87A5", "#& c #000911", "$& c #002E62", "%& c #527194", "&& c #718AA6", "*& c #00234B", "=& c #4F6E92", "-& c #768EA9", ";& c #00224B", ">& c #4B6A8F", ",& c #F3F4F5", "'& c #7B92AC", ")& c #00224A", "!& c #000811", "~& c #48678C", "{& c #7F95AE", "]& c #002249", "^& c #45658A", "/& c #F1F2F4", "(& c #8499B1", "_& c #002146", ":& c #426287", "<& c #F0F2F3", "[& c #899DB3", "}& c #001E41", "|& c #000102", "1& c #002A5D", "2& c #002B5E", "3& c #00244C", "4& c #001630", "5& c #002A5C", "6& c #002045", "7& c #002A5A", "8& c #000C1B", "9& c #002148", "0& c #000406", "a& c #001A3A", "b& c #00132B", "c& c #000305", "d& c #001123", "e& c #002651", "f& c #001D3F", "g& c #001C3B", "h& c #000915", "i& c #000206", "j& c #000E1C", "k& c #00132A", "l& c #00162F", "m& c #00152E", "n& c #001125", "o& c #000203", "p& c #000307", "q& c #000202", "r& c #000000", " ", " ", " . + @ # $ % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % & * = - ; ", " > , ' ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ { ] ^ ", " / ( _ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : < [ ", " } | ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 2 / ", " / 3 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 4 & 5 ", " ^ 3 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 6 * ", " 7 8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9 0 ", " a 6 b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b 3 c ", " c 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 d ", " e f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f g h ", " i : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : j k ", " h l m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n ", " o p q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 8 r ", " k s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s t h ", " u v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v w 7 ", " x ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) y z ", " x j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j y z ", " A B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B 3 z ", " A C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C D z ", " A E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E F G H I J K L M N O P Q R S T U V W X Y E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E Z z ", " A ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ...+.@.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.L %.&.*.` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` =.z ", " -.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.,.'.).$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.!.~.{.].;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.=.z ", " -.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^./.(.Q $.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$._.:.<.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.w z ", " -.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.|.).$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.P 1.2.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.3.z ", " -.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.6.7.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$._.8.9.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.0.= ", " -.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.b.c.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.d.e.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.f.= ", " -.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.h.i.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.j.k.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.f.l.", " -.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.n.o.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.p.q.r.s.t.u.v.w.x.y.u.z.A.B.C.D.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.E.x.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.g l.", " -.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.G.H.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.D.I.J.K.F.F.F.F.F.F.F.F.F.F.F.F.F.F.L.M.N.O.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.P.Q.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.R.l.", " a S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.T.U.$.$.$.$.$.$.$.$.$.$.$.$.$.$.V.W.X.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.Y.Z.`.$.$.$.$.$.$.$.$.$.$.$.$.$.$. +.+S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.++l.", " a @+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+#+$+$.$.$.$.$.$.$.$.$.$.$.$.$.%+&+*+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+=+-+;+$.$.$.$.$.$.$.$.$.$.$.$.$.>+#+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+,+l.", " a '+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+)+!+$.$.$.$.$.$.$.$.$.$.$.$.$.~+{+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+]+^+$.$.$.$.$.$.$.$.$.$.$.$.$./+)+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+'+,+l.", " (+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+:+$.$.$.$.$.$.$.$.$.$.$.$.$.<+[+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+}+|+$.$.$.$.$.$.$.$.$.$.$.$.$.:+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+1+l.", " (+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+3+$.$.$.$.$.$.$.$.$.$.$.$.$.4+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+5+6+$.$.$.$.$.$.$.$.$.$.$.$.7+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+' l.", " (+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+9+0+$.$.$.$.$.$.$.$.$.$.$.$.a+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+b+$.$.$.$.$.$.$.$.$.$.$.$.c+9+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+' l.", " @ d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+e+$.$.$.$.$.$.$.$.$.$.$.$.f+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+g+$.$.$.$.$.$.$.$.$.$.$.$.h+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+i+l.", " @ d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+j+$.$.$.$.$.$.$.$.$.$.$.$.k+l+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+m+$.$.$.$.$.$.$.$.$.$.$.$.n+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+d+i+l.", " @ o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+p+q+$.$.$.$.$.$.$.$.$.$.$.r+s+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+t+u+$.$.$.$.$.$.$.$.$.$.$.v+w+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+x+l.", " @ y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+z+$.$.$.$.$.$.$.$.$.$.$.$.A+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+B+$.$.$.$.$.$.$.$.$.$.$.$.C+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+y+t l.", " @ D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+E+F+$.$.$.$.$.$.$.$.$.$.$.G+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+H+$.$.$.$.$.$.$.$.$.$.$.I+J+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D+K+l.", " @ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ L+$.$.$.$.$.$.$.$.$.$.$.M+N+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ O+P+$.$.$.$.$.$.$.$.$.$.$.Q+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ K+l.", " @ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ R+$.$.$.$.$.$.$.$.$.$.$.S+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ T+$.$.$.$.$.$.$.$.$.$.$.U+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ K+l.", " @ V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+W+$.$.$.$.$.$.$.$.$.$.$.#.W+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+X+#.$.$.$.$.$.$.$.$.$.$.$.Y+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+V+Z+l.", " `+ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @.@$.$.$.$.$.$.$.$.$.$.$.+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@$.$.$.$.$.$.$.$.$.$.$.#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @$@l.", " `+%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@&@$.$.$.$.$.$.$.$.$.$.$.*@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@=@$.$.$.$.$.$.$.$.$.$.$.-@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@%@;@l.", " `+>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@,@$.$.$.$.$.$.$.$.$.$.$.j.'@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@)@!@$.$.$.$.$.$.$.$.$.$.$.~@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@{@l.", " `+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ]@$.$.$.$.$.$.$.$.$.$.$.^@_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /@$.$.$.$.$.$.$.$.$.$.$.(@_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ {@_@", " `+:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@<@$.$.$.$.$.$.$.$.$.$.$.[@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@}@$.$.$.$.$.$.$.$.$.$.$.|@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@1@_@", " `+:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@I+$.$.$.$.$.$.$.$.$.$.$.2@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@2@$.$.$.$.$.$.$.$.$.$.$.3@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@:@1@_@", " 4@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@6@$.$.$.$.$.$.$.$.$.$.$.7@8@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@8@7@$.$.$.$.$.$.$.$.$.$.$.9@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@5@0@_@", " 4@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@b@$.$.$.$.$.$.$.$.$.$.$.c@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@d@$.$.$.$.$.$.$.$.$.$.$.e@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@a@f@_@", " 4@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@h@$.$.$.$.$.$.$.$.$.$.$.i@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@j@$.$.$.$.$.$.$.$.$.$.$.k@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@g@f@_@", " 4@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@m@$.$.$.$.$.$.$.$.$.$.$.n@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@o@$.$.$.$.$.$.$.$.$.$.$.p@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@l@| _@", " 4@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@r@$.$.$.$.$.$.$.$.$.$.$.s@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@t@$.$.$.$.$.$.$.$.$.$.$.u@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@q@v@_@", " 4@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@x@$.$.$.$.$.$.$.$.$.$.$.y@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@z@$.$.$.$.$.$.$.$.$.$.$.A@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@w@B@_@", " 4@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@D@$.$.$.$.$.$.$.$.$.$.$.E@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@F@$.$.$.$.$.$.$.$.$.$.$.G@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@B@_@", " 4@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@H@$.$.$.$.$.$.$.$.$.$.$.I@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@J@$.$.$.$.$.$.$.$.$.$.$.K@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@C@B@_@", " 4@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@M@$.$.$.$.$.$.$.$.$.$.$.N@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@O@$.$.$.$.$.$.$.$.$.$.$.P@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@L@Q@R@", " S@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@U@$.$.$.$.$.$.$.$.$.$.$.V@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@W@$.$.$.$.$.$.$.$.$.$.$.X@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@T@Y@R@", " S@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@#.$.$.$.$.$.$.$.$.$.$.$.`@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@ #$.$.$.$.$.$.$.$.$.$.$.6+Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@.#R@", " S@+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#U@$.$.$.$.$.$.$.$.$.$.$.@#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+###$.$.$.$.$.$.$.$.$.$.$.$#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#.#%#", " S@&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#*#$.$.$.$.$.$.$.$.$.$.$.=#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#-#$.$.$.$.$.$.$.$.$.$.$.;#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#>#%#", " ,#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#)#$.$.$.$.$.$.$.$.$.$.$.!#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#~#$.$.$.$.$.$.$.$.$.$.$.{#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#]#%#", " ,#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#^#$.$.$.$.$.$.$.$.$.$.$./#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#(#$.$.$.$.$.$.$.$.$.$.$._#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#'#]#%#", " :#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#[#$.$.$.$.$.$.$.$.$.$.$.}#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#|#$.$.$.$.$.$.$.$.$.$.$.1#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#<#2#%#", " :#3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3#$.$.$.$.$.$.$.$.$.$.$.4#3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5#$.$.$.$.$.$.$.$.$.$.$.6#3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7#%#", " :#D D D D D D D D D D D D D D D D D D D D D D D D 8#$.$.$.$.$.$.$.$.$.$.$.9#D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D 9#$.$.$.$.$.$.$.$.$.$.$.0#D D D D D D D D D D D D D D D D D D D D D D 7#%#", " :#=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.a#$.$.$.$.$.$.$.$.$.$.$.b#=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.b#$.$.$.$.$.$.$.$.$.$.$.c#=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.d#%#", " :#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#f#$.$.$.$.$.$.$.$.$.$.$.g#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#h#$.$.$.$.$.$.$.$.$.$.$.i#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#e#< %#", " :#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.j#$.$.$.$.$.$.$.$.$.$.$.k#l#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.l#;#$.$.$.$.$.$.$.$.$.$.$.m#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.n#%#", " :#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.o#$.$.$.$.$.$.$.$.$.$.$.p#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.p#$.$.$.$.$.$.$.$.$.$.$.q#3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.n#%#", " e 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.r#$.$.$.$.$.$.$.$.$.$.$.s#0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.t#$.$.$.$.$.$.$.$.$.$.$.u#0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.n#%#", " e g g g g g g g g g g g g g g g g g g g g g g g g g v#$.$.$.$.$.$.$.$.$.$.$.w#g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g x#$.$.$.$.$.$.$.$.$.$.$.y#g g g g g g g g g g g g g g g g g g g g g g g z#%#", " e R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.A#$.$.$.$.$.$.$.$.$.$.$.B#C#R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.D#E#$.$.$.$.$.$.$.$.$.$.$.F#R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.G#%#", " e ++++++++++++++++++++++++++++++++++++++++++++++++++++H#$.$.$.$.$.$.$.$.$.$.$.I#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++J#$.$.$.$.$.$.$.$.$.$.$.K#++++++++++++++++++++++++++++++++++++++++++++++++8 %#", " e ,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+L#$.$.$.$.$.$.$.$.$.$.$.M#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+N#$.$.$.$.$.$.$.$.$.$.$.O#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+8 %#", " e P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#Q#$.$.$.$.$.$.$.$.$.$.$.R#S#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#T#R#$.$.$.$.$.$.$.$.$.$.$.Q#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#P#U#%#", " V#' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' W#$.$.$.$.$.$.$.$.$.$.$.X#' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y#$.$.$.$.$.$.$.$.$.$.$.Z#' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' `#%#", " V#' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' $$.$.$.$.$.$.$.$.$.$.$.M+.$' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' +$@$$.$.$.$.$.$.$.$.$.$.$.#$' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' `#%#", " V#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$&$$.$.$.$.$.$.$.$.$.$.$.*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=$$.$.$.$.$.$.$.$.$.$.$.&$-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;$%#", " V#x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+>$$.$.$.$.$.$.$.$.$.$.$.$.,$x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+'$$.$.$.$.$.$.$.$.$.$.$.$.)$x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+;$[ ", " V#t t t t t t t t t t t t t t t t t t t t t t t t t t t t !$~$$.$.$.$.$.$.$.$.$.$.$.{$]$t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t ^$/$$.$.$.$.$.$.$.$.$.$.$./$($t t t t t t t t t t t t t t t t t t t t t t t t t t _$[ ", " V#K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+:$$.$.$.$.$.$.$.$.$.$.$.$.<$[$K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+}$$.$.$.$.$.$.$.$.$.$.$.$.|$K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+1$[ ", " V#K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+2$$.$.$.$.$.$.$.$.$.$.$.$.3$K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+4$$.$.$.$.$.$.$.$.$.$.$.$.5$6$K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+K+1$[ ", " V#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@7$8$$.$.$.$.$.$.$.$.$.$.$.$.9$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@0$$.$.$.$.$.$.$.$.$.$.$.$.a$b$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@c$[ ", " V#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d$$.$.$.$.$.$.$.$.$.$.$.$.$.e$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@f$g$$.$.$.$.$.$.$.$.$.$.$.$.h$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@c$[ ", " i$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@j$$.$.$.$.$.$.$.$.$.$.$.$.$.k$l$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@m$n$$.$.$.$.$.$.$.$.$.$.$.$.$.o$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@c$[ ", " i$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$q$r$$.$.$.$.$.$.$.$.$.$.$.$.$.s$t$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$u$v$$.$.$.$.$.$.$.$.$.$.$.$.$.w$x$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$y$[ ", " i$1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@z$A$$.$.$.$.$.$.$.$.$.$.$.$.$.a$B$C$1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@D$E$F$$.$.$.$.$.$.$.$.$.$.$.$.$.G$H$1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@1@I$[ ", " i$0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@J$A$$.$.$.$.$.$.$.$.$.$.$.$.$.$.K$E$L$0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@M$N$O$$.$.$.$.$.$.$.$.$.$.$.$.$.$.P$Q$0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@R$[ ", " i$0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@S$T$$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.U$V$W$X$0@0@0@0@0@0@0@0@0@0@0@0@0@0@Y$Z$`$ %$.$.$.$.$.$.$.$.$.$.$.$.$.$.$..%+%0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@R$[ ", " @%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%$%%%$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.&%*%=%-%;%>%,%$%'%)%!%~%{%]%^%/%$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.(%_%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%i [ ", " 0 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | :%B#$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.<%[%| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | }%[ ", " 0 v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@|%1%$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.2%3%v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@v@4%[ ", " 0 5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%6%7%&%$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.8%9%0%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%5%a%[ ", " 0 Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@b%c%M+$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.g$d%e%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@f%g%", " 0 Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@h%i%j%$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.k%l%m%Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@n%g%", " 0 .#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#o%p%q%@$$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.r%.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#s%g%", " t%>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#u%v%w%x%R#$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.@$y%>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#>#z%g%", " t%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%B%C%D%E%F%G%H%I%j%M+R#J%K%L%M%$.$.$.$.$.$.$.$.$.$.$.$.M+N%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%A%z%} ", " t%]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#O%R#$.$.$.$.$.$.$.$.$.$.$.<%P%]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#]#z%} ", " t%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%R%R#$.$.$.$.$.$.$.$.$.$.$.g$S%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%T%} ", " t%7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#U%g$$.$.$.$.$.$.$.$.$.$.$.g$U%7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#V%} ", " t%d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#W%g$$.$.$.$.$.$.$.$.$.$.$.R#X%d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#Y%} ", " t%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%`%<%$.$.$.$.$.$.$.$.$.$.$.R# &Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%.&} ", " t%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%+&M+$.$.$.$.$.$.$.$.$.$.$.$.@&Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%Z%.&} ", " #&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&%&M+$.$.$.$.$.$.$.$.$.$.$.$.&&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&*&} ", " #&z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#=&@$$.$.$.$.$.$.$.$.$.$.$.$.-&z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#;&} ", " #&G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#>&,&$.$.$.$.$.$.$.$.$.$.$.$.'&G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#G#)&} ", " !&8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ~&k%$.$.$.$.$.$.$.$.$.$.$.$.{&8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ]&} ", " l.U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#^&/&$.$.$.$.$.$.$.$.$.$.$.$.(&U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#_&k ", " o `#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#:&<&$.$.$.$.$.$.$.$.$.$.$.$.[&`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#`#}&; ", " |&1&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&2&# r ", " ; 3&_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$a ", " r 4&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1$o ", " c 1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$6&k ", " ; ]&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&8& ", " i$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$c$9&; ", " 0&a&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$R$= ", " o 9&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$x o ", " k )&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$b&+ ", " o }&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$R$a c& ", " r d&e&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$f&[ c& ", " o r * ]&y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$y$}%g&h&o ", " r i&k j&k&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&m&n&i$o&p& ", " q&o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o r& "}; qlix-0.2.6/pixmaps/folder.png0000644000175000017500000000357511050625206014241 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ#mÍ`¸ýIDATXÃÅ—MŒdUÇçœû>ê«»¦?æ †™ Œ‰0dk45$…èJ]@`aŒ‰$®Ô]˜¸PãB†…1qƒA‰cŒ‚ BA¬@º{èîªzõ>îuñnU÷L†ÈbŒ/9uï{ワÿýŸÿ-xó—F»¤—½Éu0P^Jî @­ °t€•âu`Tÿ+pxk¼- ˆŽ³K `ÀiàLÜq t#À4Ú%e ®nˆ§Ña 4qLãØÉØ\*®±ŸFŠ“huçϺ̲ðÅ;ßÿ_á;?_°ÃWßvËûn¸y¹—Í´RÕZU+gZ›ÓÚ™U‰³:™þâ¡§~ô³~?úã/ïf<¡j˜säyF¯×£?è±~ø N-œ‰q£„Â=ßþÐ¥¥Þö‘÷|üÃ7½ó›U÷X¯òÂr×±>HAD ¿Äߟ{ñÉçÎnüp}eyÃÌQQUQÓÔT33ÍU5#„<2UMU5U‘4„ »»ãÑÙ¾ðµO|éî×ÜCÜïÆg¼Q-tŸ.ޱQ$œH3®84Ähу~{À5V9ù–£×‰ªŠ¨!¢¨ª˜sSUD¢-æÂxZÕý¥á#À}îÔéëë¿n>~n|îe9“ý é§$µ²ýlK­™Cç#5¦4QQQAµe¨³Ç–¨ "ñY ú½Ü­®­œúú§n¾ïÓßø1®njï²îªv»”[ªªP u©gçp.E’u)âD âÎÛÐF–Bü‘a>$€‰Ðëf'¿{ïÃMÒIÞÊ’t‡ýˆ5¶ýà ¾†¦$øB „¸Æ!–!.G,oç–¶Ïe.- „ò<½âö}0_ô¼¿öü8yqTUÅò<é"‚à ¡_ê@ nÍuÚøâZFÔÅœ°EÌEhÙÀ#!˜9~üòe`ªKG®Ùpiþt»{ÎÏþ˜€Ù Ô_ê‚PîfÛ„z ¾Šïçµ§  XŽ$}H‡@Ò!io¸rðÐúÚ\bùÇcß«]ÚyB͉@d_bÍ+"4 ¾$T»øb?ÛjÁÌÃmŽJÄÀr,é,u:£‹œ~ïçyñ‰üÁ,)‚Ÿu$6¡ Eº ÔY¯¨6¨Ôˆ:Ô\;—µ1j’tѤºâRœ£ý6xœY–çÙ±aô§Ÿ<+.}¥)Š-jOñBU7LŠŠ²ªMDe¦b¨"UEÛEÕ¡INÞ]fyå ýÁ'† ’çùeºÝ=9þþ½¿Ý|÷©Þs³ÝɉÀý!ÀtV±½3¥(ëÔ",û AÕÚ$TksHS¥ßË9vÙÉÑËÐÁ*âúdy~hk2Yh}öëß<º|æÔU×ww®Û87fk{ÂÖö”Íí1[¯OØϘ%³²fZT³}ï§³’¢h×ÍßM‹’²ªIMt”ÜfH3a2-Fš¬Üã¢Â ›º:úàcϼzÝÕ«Mµ‰ÄN¶(ÉVO:y—áòp/!÷$ç‚[Y!͌ݩgôÊ.e8¼™ÓÕÓ'wÝ]w|課¬Þ±±µsd¹ß[K²niÒtæÔê¾6ë\ gNsõ•—·gºpæ=$ÎçÈþûñÎ9få&ÜúÚJànÿèwHuîN!h+(’¶‰$h+2hìŒfŽ~7EýU‡ˆƒE[¦K›€²oŽ´jÜ1Ý8Gâd°¶º4tKËK£ÙÖ¡šä&†ÅPL 3EÍP& MUák‹Ù;Þ\¢£1‹@ ÔÄHÕ1µ¾™ôšª\s;aõ[ig2,g£Ï„²ÈÌ”‹šÎÁh[v”èþ¹ž§|‚D‚5—:(&MÖï¦K®—1~ywõ+Ã^Õ›n>YV³Ä™EDzp¾Ì"D1<ѹ&Dké‡<‚'sJ!ÎåY½${ò>ŠZ—“éèË;¯ž½343gÎ.êüB`jŠI[ó-˜y§l™’;{B…ÛSêF›w9€“gnâéGïy}íøÛ?Û4MºñÒó·ùéT/ wAXÚ<‰`t@[A;åc- ECî=|^ñŽþr?y¸ú¯gÿêdgó]ª¢ùh•šV¦R¨êÄÌ*3ñq fT-¨©Ô#R‰H‰h¡¢cUŠJ-"5b~§Ðß]ØMýù§¬9Ñ›ìl­@Á‡Bð µÆ¥ªàhå:‡›øÿ¹êÏÕ¸iÅ™!ÿȭ¡[?@¾r%®¿Žfø÷¤‹\ì̾yöa¼oâiÈã}Cðž<0ud½iÖmoðMÓZö}ã›ï[|IÖ!ëÎóÓY½–ÿûõO]¨¿ cÃ:IEND®B`‚qlix-0.2.6/pixmaps/noDevice.png0000644000175000017500000003127111050625206014514 0ustar aliali‰PNG  IHDR€€Ã>aË IDATxœí½i°]×ußù[{Ÿ{ï›ßbˆ‰  D‚ 8ˆ£$Ò´HÑœDYREr7Û-É’å¸ÛnWW¾u*•ªîtWªõPi'vºUWyHlY‰cÇŽ%[3%Jœ@b"&o¼ïçìÝöÞçìsÞ}‰Ü¨ƒwî¹ûža¯µþë¿ÖŽXkù ¼‹ºÒ7ðA¹²åxŸ—à}^’+}W¬XSì"ˆÈ¼™+WM¾¶çÊ5 z^Ýó[+ P 5Ô 8ap¼Ÿ±A±XZSs¶y¶Eg6¥Û4tZ`L¯“^åÅï_™¿.`AÕ“èäE,A‰Q‰X‹ ”(Œc!Cx_„G×…\` QŠºJ¤ÍVf­öæ™Ó¬CèÚ,=¼¡9™*2 dWö–ßýò~QêJ3 7êšúÌòí[žX³ÿÁuCëo×íÓ¯súÇÿ¹}ì{/ý¸55õ;Jñ{"œZ@z…ïý]-ï ¦4CJqg}8ù›lعnÿ~Æ7n¡>T'f¼oCc¸vïkù³½§Þš;$ü=“rÄÂ,×1¼@ &šU"üúêØyúåŒ6©þ:˜”D#JÑ·eŽÐ|sîé™”ƒµ„ÜIÉ€&\Ÿœàý¨k۵<:(Ü?24Èê{ž ®[€€êIÀdÔ—¬`ëǰmW?5ø”hv)a¨]é‡x·Êõ®J`Pi6(á3C ÜpßcÔjs0ý¶¯’áŒ[Áô)ôøF¶=¶›ñ1VÛŒçk5nú¹NÛêº|¨¨4ÍÂãƒÂÎe[–²êžûàè_ƒRäqbèK›0ñ6[v²åCcÔ-‹æCZ3Äuê.¯gP úE±A[>9 aã/<‹ê‡™S8yZ/|ãþІéà l¸ï–-gÔvy¦–0.ÐÇuØ^×Ýù"@¿Ò ËSƒ–u+w­aùþ»áÈ´«a­K [<ÅH[0q”Ɔl¹})5ËÃwiÍ×!¸^ ®C*áÖ<ß_‡Ï½Óo`¦Ž»§6Á÷‡?~_Óoô³öž¬\Aݤ¼ÔX+\®àzTô+ň5|¶¿Ã²•wnaü¶}doü)¨k-˜náûsÈÀ*Hç`òu;ؼ9}p–ÍÐàÙçk­\—  „ºUì­†­¿ø98ývæVjXk±Ö€M}¯ ßŒWÑ0uh°vÿV®•¥<¯Ö úŠ>á"–ëMD,}Z³Te|®¯ÅÀºßÂð¶]t_ýF5Àˆ´Åu÷ÙÌsœY˜8D²a›÷¯`@q–GÍ(®‹r½)@¢4}(îI  ŽÂ¶Ï} {â;˜éˆÔ°6ÅXëtÀZ¯¦pAD`ò0d ÖîÛÁÊ5Ï$šÍJ®.p=)€ (Å2›ñ…F}ã“ûh¬ÞFû•?†¤Žë…ë]Aêø@ˆ ð‘i8{µz+[îZIŸb³±|ËÒ;úXýÔ/ÓyåH'Ž€oýÁÒóÄŸ- p÷Ù£†­&ß‚NÆ »¶³vS mø¨”b ¨_±¸Ìr­+@’(úTÂ.º|VÚ°÷W>’íŸþ!ª6ŒÕkR¬1Î÷<ì[w,Wǰơ€ø> ÌÂôQX²†m÷­c AÝ^КÕÀ ×hrèZVQô§†_²“ô­Ù7Äø‡?C÷û¿™>‰­@æR¾68õLù, ¾Å Þ8„02¯)ˆ 0E`ê(¤)Ën½‰uÛ¨ŒÀýÚE×dŠøZV%BŸÀÒåçµ}¿úË`Z̼úÇPq½¼¦ˆý­µXI#ŸOö9ø§â¢¨@|^`ê8Œ¬dÛ=ëêC¬áY¥Ù ×( \« Xú•¦ß _ÉÎPÛú‘U ßö­ýYó8ÔúÁf¹ ó°Ï'{ª0GƒKÌr4˜: í.KwÞĆ[úQ»-|T©k³£èZU%Š>î—÷64Üöå/B{йW¾‰$Ã… ƒ cŸo(,߯h`¢¬°qiâ<*í7œl`9[ïYÏÈ`xF)6]‹ÝÅ×¢HæÆùbù­ô zÇÓ[ØüS?ü·d³o#õ!ý±å?Šd÷óÆ+GN &'„Q‡QpSÇ Óbìæ­ÜxëÚ°Å“Z±„k,E|ÍÜhTt"ô‰âæØQ‚Ý_üvö­—¿ÉHO+Ïý» á )$ø(!qT`°1Î L‡Æ6ß»‰‘aÃ'”f·#\C(p­)€²Ð¯5+lÊW[Çá¶Oï¡¶ê.¦ðØî$Ò„õAø4Èã~B?°Vaƒ=a4yß@Ôc2„“oC»ÍÈæÙrÛ Ê²ÊZžRÂ8Ž \m{MÜdT´@ñL6Íò±•Š/~ìƒÌ¾úgH2 (,±½È]aùDŠ€ï,ê–•Æ¥³"9„†î,LŸ€Ú[îÙÄè`ø˜öøˆàš@kI40¨5[éòÕô Üñ¥QCÛ™üáÀÎ6±µAl–yF[ä}ÀMy?O—ÂBÿ] dž„ˆ`æmè´Øx#ÛîAF,<«7àF]õí{Õß`Tê"$~yn‚¡%Û6?ÿwàØËt~öQƒcX“ùÍD¨]ôú‘[»¾."&‡¹ÿ7Öÿ$„1!—œ9 zˆ-woeÉRÀðˆw Œp ¤ˆ¯Ð@M ;mÆg:Sp÷WŸ@5nàìËß ›ÎBR[0×_ÊøÙ T‹d!<ijþ ‡ <, #Ã%†ÚMk×pÓc(CÝZ>¥Ôµ‘"¾@ᬈ„ßh¾M}ÓÞk}ŽÖ‘—iúk¤)b $x0øA.œ³UË7–ÌXŒÍpÃ@"brá_Ћ°ÌˆW ×GàQ`úÐ`˽[X¾lÆa‡WmrèZP ¨z;;s<œuàÀ¯¿€b”æOþéÎQK E±â……s!î7 ZA¢H”BtD+D%(%ˆV¨Äçýs4ˆ\Cj ˆD3’VqÓã(÷»g•°‘«®v¦ê:|„~cùêì1ôMŒ±üîGi¾õCÚ‡¾j,‰ª{È/¦ú ~ø—®ij5˜k¶°í&Úhk±0XD,PÓ ‘š»z–w`ÅEˆ+Žd(N fOA}=›ïÚÄ+ßy‡cÇØ©á µ4¹JšX°öüu.­h &šºsÜ¥<øåÏ"¦Nû•o’e TB>·ÏgëÄ'vŒ )˜þÉ›œù®C ­‹+dÚ›hBÖ£k5+v/sÖÈ¢'ŽbŒs¢À*À:708ŽZ±’wßÀñ}kyZ ßÈ,Ó¸%g®:%Xx÷<ܰ{÷÷ÏAèé•ôïyˆ©Ÿ~‹Î‘ïRë¥Hñyç9ìc-ôk:GÓ|Öÿê¯ÑX¹†¬Ýö‹F `1VÌ`uÚsœúÃÄägß²“’O< *L&h·œ$ëÙxǬþ«“>b·ª„§”pÄXÚ¸ÕF®ªµÇE¬}Wž©&‚²Š·§ØœÔ…û¾úw Ý¦ûê_’eÝWÃÍî±Q’†"oo' Ó¦;mØô¿‡úò]tñÁ½ŸãÌÿsÙÜ,$}ÑdR°bŒrÇÃ6} Ç‘¥ËÙyÿjŽþÎQ¬å"|S,³Ú8$¸jÊ¢@kÜ¢NÂrkùÉ£p÷g7SÛp;ÍW¿MëÔH꣈Mýjn‘ Š;m0²éwÞ·ŸúòEsn ®bì¾_!k·+¿ ™Äéc:s0}RaÝÞ ¬Ù¨Èº¬ža)WaGѢ܌,>Ôp£}~qv’eÃË„;¾ô9ìÄ$sÿIëPsóûCOÂ}>æü¥BÚLIÆnTIW.®’\‰ˆÅ„ády>!\Æ+€Éü>0uZ30²”=¬F Ãc"Ü.0ÌUF¼EÌâ’@ ôiź,ãË3Çáþ/îAoaæà÷è¾ýôà¨W:ÇÊþ˜H¸EºV´±˜´{Ñ7b3ƒ GâÅ xùsÿ ;çz »–U{Ö³qkB·Ã˜…gEXÎU†‹ƒfQ Om5ÿ}ó†VÞ¨¸å3/ž>EëÍÿŒJýº¾q}/áX¬¶d™Á¦—€RJ!©ÏæAFybIÉëÂÃéw 5 cìyh d!Ü‰Ë \5)âÅA€Å£ KM ;MÆç¦&à/?Œôo`îààÌ1T£H «Ì;òÁá‡ïŒ…®Kð\ÒbЩ$Åóœ(­œ1,M4ñJÙmÃÔÛÐÉX~ËZ6Ý\§Û¡n-/ˆ°–«¨·p‘Hࢭ£8(Šu~múÍ·ÖØôÄ´O¢óúŸ®JòÆÏ…müØ},b\˜æ6r~@rñ.@°]ã—‰¬¢@Ìm‘!ÄO,~榠o„ݬa Yƽ"<,0ÆU2Å|q|Ñ¥Àëü’X‹Ö û²YŸ›‡þîÓH2ÊÜë‹™9‰Ô + _¬¶wâýsΠĢt™EÙ‹TS`JÁô£1!Uœs˜¤)L‡N‡ñ›×rÓž~Òb-ÏŠ°Ž«$E¼8 `/;Á%€J4}ÆòkgO¢oþp+¸›ÎÑ#t} © €ÕQ¶Èø( dÝM9aä¿„HEŒv¨Nè^Ž;–ȇ…ÙÆÌž…Ù HúÙyßZ†!ËØ<"n.Áç‹¢YvÙ.@[KRççZMî1mxè+ÏB:ÈìÁ¿€æ$ ¯hÁç[ÿ›3óœ©ç¦‰Ë勹„t¥Õ›J1±K1Ø”òñ‡¦@kZMž€N‡±MãìØÓ í‚…g¶rŒ"^ؽ,PÀ€ÒŒt»üæÔqôÞ/cìö»izƒôð÷°µQ÷U˯ <Äæ9*d`Å#÷¥¸)?Sȸtq8ùçbLaØ\ÌNÁ;G`nšûF‚4c ðqÏ®hX¸8py$P¢5O¶šl®×àþ/>ƒm+Zoý9tÚèDRè¶—ðãÌŸ«D@Á ʧü/¶XA2§H&&}&@[úwH…VÎÌÀÑÃÐn3¸nŒ[÷60]0–'vp…Q`q4¯sñ ;ºþ@¢Xa ÿó™cp×'7Pß¾—Ù7^¢óæO‘z_ôî–’ ‚÷ù’[>%áã“8:ã’^b5‹‡•Ba¼AvæA×ÀÄœsûsm˜š«¸yÿR–,,cµ¸ñ2®àøÁÅqæ’û7”ïðùäì$Ë—Ž û^|35K÷­ÿê$§O²>¤ ìßDý¦NNýo™˜K‹TŒÂ*¢ãaq)åˆrf»pfš™»'§›g& Õ¡ï†avíí'ËÀXö•[hbqàÒ@ýZØd-¿9y îúÜj7ì ùæKdG_G5W-ßFˆ`­OúÚ‚#„ï°HGPF.å ¶VtÉâs¤7°`.Ã¾ÓÆžM±ÁBˆÐêÀÔ$dÂÍw.eÅ2HSF= Œã¸À{>tlq8@ç¢ ŒôI¬æKÓ§é[¾FqÛgŸÆ¼3IúúÅ6´¿=Ÿ\ ÐnÊÂw'‹%Røa1eÅY±\¼›UVÓíâRÁDþ?ö2©ÅN´1ït cÝø?FdÞvvZ-’ñAöÜ1‚†G€‡…ï©\¾XÈ:Hp p{ÚåS3gáÁÿnjx“‡¾G÷ìqDøª!Ïo kªð€CBÁ ÄÏë¼Ø’ªãýº-Hˆ%4ÓÅœlc§Í|ŠP>í&& ƒ­Zʪ•BšÒ>íSÄï9¸ì‹YÀtZ{M-B]i~uöµõÛ5[žy”ôÄiìÁo¡jÁZ³<ü+YxUй9FÇB¨–Tä"­“¸HÂfþú‰ÂfæD‹î©.¶ks/\ƒ‰n¯¤“ÓÐl¢Æú¹mÿPh|ðW`.Á" €%í^<ˆfÖá£33ðЗDôfßüéÓôûEÀS,À­;ÏòýîBÉ ­,™¶HvñjtlW°‰c¬æÙÑfÖ¢’‚¢Ä·PÚL´¸¨àìt-›v±f­87ω°ž÷8E|Ù X²ö#€ý" ÕïÌqÔͬ~øÃtŽ¢}è‡$õ¡r:7°~âtkˆ\Wt‘$òÇÄú Œ8à'\T1d˜:¨AVF÷Ø,öŒWöÀÙc}£ŒùK( 05 ³³0ÔÇž#aÐÈnÇà½]‹ø²ÀX!»0œf‹Vüüìwfmxø‹"iƒÖ‹¤M$‰ßäQ(B~IÐî"&ºŠ„¯Ä¢I©R»xÐ}5é±Y:‡ÚnD_Ãñ‰ÀÔDüpAŠ¿ÁêMü9XH­CNƆ£lØ BŠø6óv/á°dÝö…V®‰0ž ¿5s Ùù‘aÆöï§õÖdÇ~‚’AwK%¿î­=pàü_%&êò½J€²axxâüxj{ÝÏ9‹™™¢ó Ø)CÒ‡{ÑH8„§÷%:íÏ#ƒAS¦ç`zúëì>0J¢Á6Ÿ–ðM1_]X .B¢ží6Ù <ô+£f ùæßbM 5E¾0SŧËWYù|á=‚nqHeRÃ¥yÕNËýþÜA°ÑßSÌR¸ýžœÀà"‚v—57³i³\àInå=?xù `,öü @C+V˜Œÿñô1øÐ“Ëܱ‡é7_‚S¯C½¿X…#bSB,p¿•Üeá—\@Ã’*{I#‚¤¿N½Fi$ÉÒí¹ƒöXö¥P`¶SÓP«±çîQ50†•X~XÊ{° é"„–4=oˆUÅ/6g†{^|svŠÎ߯h3ÑÞƒµ;+²|6~@U?" *3KíŇ&Taý½ÀßpΊ4tþU®,ù1"LLÁ\›[†Ù¶½¸À£¸ñ»Î._¬ôœ™@ôiͦÌð?Ìœ„»>}#ÉÆ­Ì¼úvâ*i>å”nâýwA¸AÐÈÞ˜“D+¤ÊbõÅ?ªâ¦ÿ奇ÉEÈ!¿RgAö!@+u¹¥Øu×} 0†1gÆy—“C‹â²tÁ( $}úEó婳 ,Y!ìýÔ#tŽŸ&}ë{ØÄe?ÔÇÖnra…€sK3…µBA@´Ï¯^ÊÈåê>‹”.2úá«ìæ¨Pªl«ýÎä 4[,Ý8ÄM;óA#E¸—w9,\”(À,œe ‘(v§]^˜; ÷}þVôòÍ´_ý64Ï¢j5ÏÜMÅß—ý:Þòî›Höñ¾žìRrÁ 0”vo¡”Ⱥóý*üW  ”ݤ™C„Ýû‡ã<× "¬á]L]~ÀàÖå™_ßáƒâ‹³g¨¯Þ¬ØþÌÃt½AûèO 6„(…’Ìÿ  ~…5G¤nñó‚&~I,J)Ï.Á•v…†¸¥ÉT$è<æ‰Á„'޾h¤s¢‹;ñÌÌÎ1²v›ÃÐ1Ë\Šø]?¸(™@;^§±õDsg«Í£íi¸ÿÅ}¨¾aæ^ù[ÄdHCûù}eá‡óæ¤.ò¢1@•Ä+Dà¢P  3YÜÙ…–zêæªÀ9\ƒ5¼[ˆöœ ©YÀDŇvÞ9ÊØd‚›Q´Ç.JgÐ#nûDËà·¦ßAoÜScãGï£ýÚ«ØÓ¯¡ký~Pef[q5¹SøB!¡XD R×H§‰}˜…ºõ¾V}øNZ¯ü5sÒ‡}…à‘Hˆ„/gò9û7þжÜðž* ¢-L·°Ç¦aÊ gÁ"—¨kúTÁ”ò[„Ð/¿•·JoS­,é€@»“3ô÷±ûŽA‡nù“¯E¼h(pÙ  ë t­äšÅ'ÚnÑîûü½Ø33´ßú®{{'’[1¥Ø=Žåc%p¹SÁ £ì*¼V í.rb9ÙFe n&™(ÜÎEÉ@¥Å9r¶/eR˜×Ïï+>À9Ä%7ˆ4azZ)7íaÅ !uJð `Î, \–˜nÊK¿û;$ýy„"@M+Vg†/Ìœ][Áð®›iþì»Ð™C'~MŸÒñí#AÕ¿JBÄðso37÷ø4 RÑ^ $©_B% `Uq.ñ\ "Ï“uõÀù”B:.9TkpÛþÁE¬xJXÜ…&.ë$ª–P©‘ôÕÀ=R0dàéV‹5ýp÷/Þ‡=yšî‰×‘¤Q5Ñó€\ø!—Jø@Pe‘¹rl9Óu U/„£=|ë:¨S?ã‚—çñ•³'P‰€Q@$ôÀJíEþb¡—¦’S"fÛlÙ=ÊÊU* ÀcÀm,â ¬/K^ÿ“?&©k¤ž€ Q”f«5¼87w>±ž¾Më˜yõ;H·(×±ã3zÊÇôñ`BQÈ]† ¾>MáÔ,œhaEÞ?ã…A6#ÀOÂôÜ©Eνd³ðûÿVùVŠü¾R (D,üˆ”?q .ÀEÜ”¶‰)Ô`ÂÞ~è˜{’gV°Hɡˊ+kƒ ¦[ç›_ù¼ Æ>ÛšcÉøJÅž§÷“:„9}UkxA‘ðËÊPvÞ~x˜(ÀXd¢ Sm7j3qÂ(êBÕ"©-àïß=[î‡N´q¾ÂZ?9=§ÃýC8•Ápøq*±ÑŠ_,[ž'üp¨¢•:¡žuÎÍÁt“wްæof9|8£Vãaà?À Q™;·”Î].YŽÿ»$™Ë‹%8Ü™e<ÛmÂÞço¢6¶”©o…*¥n% ÛÎIn ENøªI!A”…¹.L¶ å§{é„+Þ?/æ ü» é¿,¬2Å¥öj8…ÿ4ãÀ:¿º:låo€tÌ`}Ýzô}ü·WÉÄF]gbÖöqÛ!Ž}}k©‹ðð] ‰[uì’çæ]’œ}ý5ê}5ºÝ:¿ÿKëEødgŽ‘7Ö¸åc·Ñyódê Ô„¡4±ðUlÂn@ÀuǦL6±3™‹‚à{ ¼zb ûku¸íñØÉ“˜©wÂq|tIDATPÚÇMq…[ ß)-.óu|NÌB×æÙ¶’OוÏUˆÇr¡Guüû~ò§–‘_¸Ýÿ_“Ñýÿ’e¹_ÝGmýË-ÿ´Éöÿû7ùÁ¿{¢ë¸B® ûѵ”*#R‰+„–‹\JÏ"=wóbýõšmhµ¹õ®ú‹ežvs‰£ˆ/XL§Ö‚Ò ÿüÞ1…³þõžKÛ°í®•¬¸q í£sËŸßUàÓ‚e-œ™…cÓ0“ò]¯±µW÷¥ÚÀ‘µ‡cq¯ÒP³œþžaðcw°þ ßÁ­ÿÅ’Ñ&Šñýÿ þÉÿÆOÿÌB=Îå„Cš1¾^‰›H¬íó!¿'8_±pfš¥+kl¿µÌ…§+§ðËÍ\,¸pÐQšß>0€R4”bD4ÙŒƒ£°ã¡›èž> íYÄgG<ð7>~·H³=:gÚnÖVÒòcË(Rpá³PJÉåöÑq ´Û4‡úØøâ_¸–fUÛØ_þ¡¯ wÜ€}Ÿ(AEJ_Ó¯É|EÈÑ@.NØöû"n5–™&» 38”£ÀÏwp M\ØÌ8¡ºØ¬ +Åv².l½kcËtOö}åQ:W(P@i{b{lÕq ´Ïæ•,ˆ²Õ‹*FÖˆT,Þ+)„Ê·t ÿõ à•`ݯþ3“â¼ä!aŒ@~³•cU.PŒd_ΫUE˜˜ax‰bÇž~üÈÃÀ'q‰ë¯í‘  /Hµøgûj Ÿôx¤¬WlÿðfºÇß›!¢<.Féº(Õ`'g±G¦a²›³~T”Ê­Â~ùRDºqÃÇÝr1L¨VbI†Æö}r]¸ Žn£±¾vÅç{…¬*BÈäŠXQRˆ!Òø U‚<{i`b†[÷ ±d‰„A#÷à”¡v¡®àü `mîÅ•ëëa§µìS@»‹96‰}{é8ÿŒ70üà*ËaSô9·|Ê0Zòµ‘Åçǫ¨5@R8ö‡ò¨å’ÍÀ©ièrÊ j‘Å« _¿—RT¡Ï—êþ9iJ)- g›l¿¹Æ «5~‚Vœ"nœ œW~ûv%8æ?*Â}ÖðˆV°ã¾uèælÚE”c0§gÈMÂtZA3‘¬Ê>ŸÂ§÷~)ëDÕ÷Ç¡[â:y~ô¿BxÛçùJ¨óƒ_wc’¡bŒx'ÆŠÇ„&(BO$¨(”a!…¨*CŒt ‰í°g_\÷yà&. 9t!.@! ˆb ðɬC}õ¶1V®­Ñœ­°3-²Ã˜S-×cª a—ž'~þX h P1tG$\ʰ_걋ï‹ÀÀR8ñ#xõŸ×ZðyýwÍ7áÛÿ – W|½¬Uò©*÷ÖS)pç|¯²Ì´Ø²I±jmÂÂM\`ŠøB\@—½ÃþznºëhžÅ¦)æí)Ìáih™¼½Ùåª-=pN”b˜§Œ ½„_rçÙDCc¾ýpøwýµ«7Yfë-ø½=0(P-®­4h[œ3%ªutŠy š+.$ØÊ]Y 3¨´ÅmûêˆäTáq`ç™b~Nøí;ÄóÖ <“uaýî¥,[–Ò9ršô­IÌ™Nn°¡]óH'’!ñ~Ìú¥Ç7`OáG¾6¸‚0D(g溒ÖÐ7ä ü?½ÿåi˜yüƒ¡û.†þOðõ[\ø8¸QJÓƒtEÉ4%î1Ïç÷Rz#Áù,¿§"Ìv¹q ¬Ý˜.°x‚"EÜSÖ jÆ¿¸CD¹Q¾c?g2öô )¶lï£óãCdS]÷¬I!t© ]*ßU QEû1æùõªð£ý Eq㇠Æd d’xóOàð7at- otùÔæ!˜< Ýô-säÑ× §ÄµºµEׯ5ŽZë~¯TÔ=ìû<”ëð" YãÎeÄWáu4•‘F±°‰Úª×wá{+Ðé°wo±ÃiPôóÀÿ7~pÞR.çB€á&à9c`ý¦„Ó§H'ºnІŠäß繬¿déA”­&`8y‹Ša¸:yO+ÐI”Ï7×ê0²VÀÜ4œü®ÛZSпF7@ß '˜‘õ‹ßT´åä/BÑ•aɱ»‚"ŸAù™ÎUJWÌßBž£mX»Â°aSº‹Gpaá ¸°p^Џ'ü‹;Dp)ß%"8:“A¢ßÄÂÈýSFqÍ`Ýà¬;ÏÖ…ÞêýË#ò„FXJ<¼:M)'íуð,€QÞêÃ5q(q޾©ù©ë…*úktSöìL8t€œÁ "- ]j¸b– ëW ƒ&s—dU‚þH B´ß þçA|<X5ŽTUáGÇu¹…kÁ‚PIäÓ£†±_×ÚÕÓ¾~ Etq*:wœâT±¢FÏ |£¨ê³Ç  ú<„ ®¢cY5ž²eK¾êX†äP æ!Àïì%Ð'Ž<_¥MJ/$¸áÏSX¾Ä²mƒ-ßô4°èQ „¿»O0 ÂJà“F„Uã‘Wá?>Aÿ=+¶ôp@¢/K‚WQcõ²jµ½RÀaFhé»(N7RÕX ûï[Öç»1¸×Õâ­?<‹;\šW`ý “pÿa˜¹ë*õ¨+BÀ<Ã'á«–âMÌë ŠÚ­Û,¯½ ´b—…X8Š¥…C‚2$J3¤5·6ÆÔ}ck6¯qb–¢Ýcy†g¨Â©ŽD[õsÕæY¾P c‰ù€ªXh°È„ü£U þX‰ÙGÇóÏ!)ήСo¡ê†"JcÄÆQ5œyÂ$Þ3Ul!µ,Y »n†–'Œ­Ih ¨_PŠ " „Ž¢脚J%·/Ù2>¼r ÃøÌ$™)ˆl,¿|Çηøyðÿ¨$ðJ壤ì÷K„*·*Bèâ71 Ñ9äÞúì…U¾•8ëKÏÆ>;±Å²ðdÅ}+,âΑ³kÊ( yçB„ö lß"ÌŽaë fNÍì8ùÓÉÛ­âÍ´Ë4– NR«ËH2˜l_~ó¬hÄÌ÷–Ë<¶øHVDßYðóý¢ ÌkïÈâU‚ØúÃ÷± B cË‚¥kòîȘ0ÆŠCt]µœ±.ík3ï|=#yÓÖ…tá·¡#$ï,Q ‰a=Bñ‰„-^€ËF«‰ *ßùüÀPb¸qÃg‡73´rR¦ßþþfú “qhç ðo•ÔT]×íøÀбUK¶í¡öúYšÙ)gH Áx,ËøÞ{ZµB,øXøDû±µYs¤ *²|"á‡4eÎ î ä à…o•`Ø>Ýf…ÿ´À¿›¬û¡Ð|¥ü $³»ŸY¢ßæÖcË‚ïõ—Êg‰>X‘L#›v“µg9ñÒ›'Þ<³2S¼ýí’bÝ›!Ôl]i;ÚÞ|7rê$6}5Ÿ]Ê&ÛèXM¥ô'*=à¿ %%¦)Ñ÷ñE繂˜‰{4Èýy@‡èû^ àßfÅg…Ÿ=,Ý_/  sƒÛøéý¥ò\ñ³ÅÒôr/ül¤½F7õrÑéúfϰtùºCZõ7+§œWšºqfáÏ›!&³ ІJ´Jn ë[í\Våž«Ÿ«‚Že;¯RœOŸC…cÏ)qüûŠbä>=&qU‚§ û9Iôˆ§4CKZü:xï7ë ²‰_ºË€M!K KÝwY·°n…W áq”!ï3P]bW¢…Ð.bó$Ü"=t&/½P céK'Ñ˶QZÖ¯•&±*V—ÑAIwfŠæ±—Hô·äJäš¼½Ÿ+ßÅî¹Èwãe$Q†W%ºÈ»ë¤`ÔZ{ö^eóî5ní—ZEø $:ž3y Ô"믆…‘äï,ˆz.a߀íôÃt½øßØÔuÙÔ)ñJbL¡TYæ~o2Ž º™¯ã‘(óiåü]4‘ñäûTöý#eN:'^fnøGdí$Aá×ö‹I µ–¥&çNŸ=5ñ“?ßÐBmXEròn­ëVÎÔ‚J¥«•[”1 lM¼Ì¼ÏÓNÀâct+‚øî[«ÜdGâ*,y¨å{¬v ÷ZÜ&îXœ#~$%_Hí§†g}aú‘õ×ò¬ òçýwfÛqK⊨dƤ…€'dk3W×dˆMýRº’Êð®aíxE ›áMTÜqû©ÿ«lüž.vP™…4£Ý×àé&—¿AóäÁ³¢tÓZ×E™+€Öf´³ÔN(Ýýþño}ëö%[Wcû—Ñš''iŸ£3ÞÏCä#7mC“ÚŠ«“yn!ç{w"Õ¾òY%÷¡ÑKJÔC£„ʱÒ~ÙÒ{É¿§BÙ>Ú…åš@Üðù ÇÛœÚØðŽëøå’P2ìÇàb* Pz‹^¦:O1½áe“X$M‘VfR¤i×ZÓé;sö¸1´~é{ÖV{³,eš9Ù4›KŽŠb‹&Clæ—ø í)óÛ¿*›’åKùø¼c•›™géR©SúЋ_d±óÏRjøèXÕJ£º[¬U†ôÈBBø7Q’R,p¼ô›œBY+ c±í¬kϤ]N¤)g°n1‰’ øWD€D Qô‹¸×îág,¼ª«b·¬BIx—¬ [¬ÒkÚ`Eâu@ò ‘@‚{˜'ìðgޱŽ"T‰/PU¥»´–ÌZZÆÐ²–î/}ϽDiž„òõw2¬B:ïKˆyZ~ ž*Gœ'y7 r.c±Ÿÿnymÿàý^rSÉ~˜‹áZÌ7T‹Ýcø¿‡ÂZ‘‚]¾‹ }!åxŸuþ*”ë¹| ïóò¼ÏË ð>/ÿ?GŸ¶4®¤×IEND®B`‚qlix-0.2.6/pixmaps/playlist.png0000644000175000017500000000357311050625206014625 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØÆÚkßûIDATXÃWMl\Wþι÷Ý÷fìÉxÆNb'qÒ´ ÿDÐJ$% ŠWU t)ªTÄ‚F ¨v°€«,tAK‹Ä ¡6ª‰E¨´J±‚†PBå’8míÔŽí±ßÌ»?‡Å¼7¾3±’<éêýé¾ï;ß9ç»÷îðQ 65991mÌ4´>â‰>‘}´$„†„ Ñ-„ðoïÜ?W¬ý°·¶öéA`ó€¿×Çé^ïÎY§ÙÜ׬×ÖÒôäd£ñÕ©Vë@«Ù˲Dk­P¶(Âf·kשּׂåK««Ë·××ÿÑív/­çù•N§ó¿·Má œÔÚøøä˜1MŒŸ>¸{÷‰ÙÝ»gêccDëDkMŠDýé"¬s°ÖºÎÖÖÖâ'Ÿ,-,-ý}­Óym­(ÞFž|p£XjôÁã@‚,;Ø®ÕNœœ|þóû÷ŸšiµŒ3¦‰yO¡(¬…/ŠÁE à”9mÔj­zý!„ðï\Öó~Iy¿¾2’5 >‘¦‡÷4Ïn·¿shròË cJ„½µpEWºè¾zf£kR¢tܘ) <œ[;–†p³îýêrDBŲs–Ͷkµg5›ÏN?š1qι!À ká¬í«"¢R¥v±Èì–s&Yh{磲&tU í6óS{ÒôlK©Ã\ºg-Pæ¹Ê÷ƒ"R]€EÔd’ìϳìtáÜm£Ô«Èó §€4ɲ£ ¥ÎL0?L#àÛ%K`æ¡ê­D€À‡T¶Ip[ëw´~º×í^û"ð×÷€ŽÀœe{kDßl3‰Š"ëZ{WÔϽþ:^9{ß½páøõ“OÞ¥‰$m¢#«ÌßšHÓ÷Îôz×é¥izª ülŸÖGS"]±¦Š¸$ÃJˆ¶%ˆ³ý,„€Pª "R=芄EçÞ_ù‰/Š?éhj‘†y¶‚.*àrpt¨R~´"Ê9ˆI”©©ÎÕDœÓAäd¨ÕÞÑuc¦Âcß,óJe{Ptߨ|Yë» "œCGdX~øzŒ€¯Xçf´#:À̇º@jKö<9øé›oâ…¹9üòÒ¥ûæÿ‡O<1¬@I¨òbh"šVÀ£t"IžO§ÀA.£Ž ¨È³ã‘.¨T‰€Aäa„LèVxQ¢'ÒÙîýr²Š€L´€ (Á|ôÌǹà#%D$`Fsu p ‰úÎT’¨Tð~5?ïÏÍáüåË÷”ÿ{ÇÉ= î¸þ5‹HNhý ß°—#ÖDB*’ÞÄiˆ¯²QÔ>te!Fò)DÞЬóÈ U1õ"°Q1*EÔCNX‘(FÛ0Œìðh]+¢› ˆTaÕ !:l5rÈQ5¸ô ŒÌUDýÔ”-+€UÀM-" L´JD³T N’òüÛ‹qnn/ß§ªãÙcÇî €+³„€ !ú}#Mˆ÷?×DO¡oà‘µz'cÚqÜÁxuFØ~Ös"o ѸÛë­ð.­1 £ýÏeAV SZb ™—rë(•*ª£òû®äÖ.éM`£\"$ÀCÑDUFýâü<^˜›ÃùùyèZm(r—çøÁÜÜ øâÊ—jð¶BÎ7Xä-Ü!t˜ÖZ?§™Ï±È>.­¨¯˜kiÕš‘V €‹¯|¹á²ù}áÜùw€ ý…¦h(µ!Dh¢YŽÀU œ!%‚!‚)Ó‘Dž¡*óêÚÔïÜW<ðµ…~'Ë@ø\^©-QD» ‡ÀdD¨•çT)¥0#‰ «R¦l»hí°¸€—Ù¹Kó@ghSz°{¼¿0çŠh6ÚÐ&о S I’ †ÖJ)0sŸ@´–DÝap݇ð;vîB X¾Z–K¼-—¯ݵó:1ïM€VJd2"ÊdZ#1Ƙ4Eb t’@iÝ7 *ú 8 ·À¿l¯Â¹?ÀâŸwÚ–ÀU@Žy7„¢ÔMj)Ñ®Q–j­Ó$IS˜4lͨܨ*­‡vK^ÄuE–·€w ‘—ع7zÀ­Ñ¿£»þŒ®ò_ ßëýÍóU ¬³ÑZkc «$QPÃÜ^ˆú t7½_¹µÍ^ó!¼äûÛq`ù•~TïùszÐ @«™$%Iò¸ÑúkcIòÙ,I& Q¦˜5DØ… …H¯kíú¦µô¬½âË¢÷‘çˊȘÀ‘E`¼žecÆL1óŒˆÌ „&ˆvq]Ý " k;I²’w:ûÀá^ÿ?R&‘&s&²ŽIEND®B`‚qlix-0.2.6/pixmaps/ShowQueue.png0000644000175000017500000000401711050625206014703 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØŽìèIDATXÃÅ—KŒG†¿SUÝ}sçåyd&އ8ŽAc!!X8Rä@xÁEbÍÎXdÁ*lâÄ* 0f‹„Dˆ)9±Žc#?âñŒ3ž×½sïíêªÃ¢¯çáç!!q¥£ºêêîóÕ©ÿœ: ÿçŸ|ÒT^!a`Òñ/ÈÈ«cÁ$©ê‰rP ½'©…B€5R˜DWÕÈŒž²È_¬ø3¤í9¾E÷Ã@î Ç0L öÊ~òøTÌõ+¾Í¤vé ™hiQkéJFÓU¹fyUœù­K8Í¥Åe9FÜÎÝî⯎b?u >Š—Ã1ßó+ÎW˜¥n2œ«!®6l6—!\ôÔ|‹QÜ/Ľ>ÐÌS7÷Ù†ï¼òÎÖHÈv+oŽ÷8äkxž-š< ª®&1·n„PXlÖ_¦#DEÄÒv5Ψ奘èïúf›Ü ³É9÷ŒÔSá9Ïøeö£T“¾r•"káÆËaêEQGom% M!©JÕ7Ù/gRÏ!î©ëm‹ÞÀ‹8ßÉÄËÓaUö©«•/UíY„ÂLÀÞ#ÈŽÝÄÝO®A¬ V°™CDÒ°*û´§ýJþ /â¶PE0õañ‰Ðå@ðZKjkskν™@÷AÓ¾råýè}=ˆÈšy3FHǰCŒZ+rxO`êêëQXÀqÞÞK”ñË1–Ü÷Qt„è@» ©oNÿñ¾')b 3Žî}­!± h`„Bo·í½_Âz8ÒÁºoÆÏ…œ]1’Št}iŒÁü¸yY|æ/CñOÌðݘ¬ŠTê`-20Þwyî?Œd ´º]TŒƒ"ÄÀ.ÓáàRkà,-lh¯š†„ðHTň"ù2fêL}~}µ1 ­yÂÊaùºxfÞÅU;²>ý[ ¡:Œ†2ÙU¨LSwXjôõNäè©™¤'ÕÎo-Æ"±22“gÞ…sØÑ©ò!±=!ÈDRŒæå\¤<мOA @ü%Ö—u}HzºPÎø1sÞxžtçž2÷$q i• ÊSŠ˜¯”~J.`$Ú ŠÅ”‚CÁ¬\‚"ßÞ{¾Š¾öcY*«I6˜CÄËÐlh­\‹8£¦ÂÂF€½(¶(º–ó$´ÐæÜöi û>¾ïHkŽ1½Ü«c(¶Œ¨€*ª1„S§6¦ác„n[:b{Ú$rtùú·ÀLîC|åÝrï7@È­±>’–®•H;±yp’°`uÁ5Q¹*1LŠ$Ì_\ßó…+ÃæÃdâ3°ï(ù…Óhk¼_×€XèEIËTEº*rUÄ59V*ÃõÎ2 +«AN«åËÆR‹&E\½yq]p¯=GÜuó…ï”yµB¿AñêIêI™.WCÅ ¶‚5mÔÓŒ…¾å\hJOšë•°¿¿)Ê›eÖ&¡T³Í¥ËèÌYäõQª‘Îÿ8ýÒÖHLîCÄßû–Œ¤ƒ—ÇHFM 6][®‚j Í«tÞø)våÙ];!zAc„X âqázô­âzÌ9‰µ…«wìä±2±0c\|9tâÉ|)|†³–Á$¨-ÄVÀU±ÃwSͺTvîA’¸¬¬ˆ&Áè®ûnÌ—[7|'üÑñå¡k 3·wD[zœ$>{È/U‹Ê•PhU Mì\ÃÚ¦h:IÙº â2Lµ[ÖzU¤XµNÁòÅÂ/¶Þ÷­ø«r|>iþkè'ä»+>ÿ]²áÁá=FН›D¾êêÉît é§6f´¶­í„d$_€öûHó?ÄÖ|ðËÍ•bÅ_Ô\OÄà~}sõæ{÷¿@÷¼ùm’ñzuÌU’ý‰åˆqò¨Íܸ­¥u›&©XkQÐC‘û¼XÍ[Úõ³!×é¢àdQøÓ³­öÜ#ÇñŸô»ÀôæÌä$ÉããÔ¿´3tSã ûpÕé¾Äʤ5Ô‘VôZ«+gæWÃé÷o—_¿’Ïýi–Öì,ָͭ¹ÜÁ¹ *@5…ld€êî†ëß1 þÄVœ”YT(Ųë‹Ò¼Ð,–——èä ÝóÛ@î =¤=€¬÷ßõæ åÑ#À­øÆž…žå¬Cä½ÛŠÞ=¹rk 6:Üp]¶y^7Œñ¶åËè¿4Õ ¨î0røIEND®B`‚qlix-0.2.6/pixmaps/filelist.png0000644000175000017500000000441411050625206014572 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDùC» pHYs  šœtIMEØ%\J·ŒIDATXÃW[Œ]UþÖe_Ï̹ÌôtîÓié…6\:…€õFC@Ó/Öª˜A„ðfÀc"è¢>5Q7 A `£‰ ˆ E°¡:´e°÷™v:÷sÛ×uóᜳ眶`p%+k½wÎ÷ýÿúÿïÿÁÿØc ¤ù±íë5§[R^ML2˜’”¤ 5B ë<%Þq-é¿V/Î,/§àÅ€þ ?'ün¯=ʨã2"Á;¯ ð½þ Ó'Îab|++µì| ¥ -ptÖ¥šiM-(mBCÝ×mM–xe'ù³Ö«F‹ýÔɕޣ.ë;f[ææ+˜›¯ÀÇq ¥ì²œ‚Î&ЀÀW™°qPïåz^Ö9TføÎSÊc0„LPî—äJ±`YlÛ|÷›wwÙÞÏRʬ#RJ].\Ô5º¦5yI#9Ž£Ï ÀÔ/Ô+¥ýTÝ·t+¥Üg­Œ ”‚s×u3]øÜ½féøÌ“r¹¤”°, I’ Žã,cÀPP,M£Ê”"γáºüδt÷ŒŽýOÔ-OW-ˆ¶“+sF£ç<&Ïuáz\×…ëºBàϧpào‚sÞ$Üáþvµ ˆ%£¸q2ìgu³îUýyÜÝ”ÖK{ýÕ P´Æ¹Þl¹=%Î9s ®ë6 ø~FÆu]äóyض ¥tí®Ð®ÿàP°e”g‰yRþ‚˜^šËÚòdñhÌÆŸ›Ñ’¬P“npýBÑ÷s–ç:ð˧ýHÞ1+Š; ¹\¿çºŽÍ93 4© ’XT‚¨¶P©œ¬&äu¥ñ·ZPÿO#™\ÅáûÄÿs;ígX,{cyšÏ9ëûa»C©NFR†ÀXDÀf¡’3IeéÂÅÔÇŸïw+nÿ¡†èz5GGIEND®B`‚qlix-0.2.6/pixmaps/settings.png0000644000175000017500000001465611050625206014630 0ustar aliali‰PNG  IHDR@@ªiqÞbKGDùC» pHYsHHFÉk> IDATxÚí{ypÇ}î×Ý3³³÷b‹ƒ8x7Å<,†’hQ’eI±Y²Ÿ¯˜ò![V”Ê«zI%Ï//É‹sXvR¶U±£(¶l—“XχS¢HŠI‰(R¤Dñˆƒ$n`,Ø{fv§;ÌÌbB"HSÊ«z骩Þít÷ïëïwô¯Àÿç…Üèþ"‘ˆ+ª -v¯X±²Òívç “/ nŠoþí7þ³å}øô§?ƒL:\×¼áV¬\µÜ­ªµ.—RŽDB.—Ú;44ôÇsöÎíÛJó§_ÿßÈç5©¶¦úîT*9ùÌ3ϼÝܼA{ú׿ø@nTGLb„ÐG6lÜX‡Á(!œó¨¢¸þöØÇzö¹Ý£ŸüÄÇÛ¶}5ëÖ®ù“›U›6m~åìÙ³¿¾ó#w9ðòþÄ»¬Zµ’ÄÖ&““Ÿ«¬Œª õàÜ„É9@Q”&&1×Þ}{Îö›éTªøðÃ@V”-\´ðKÑÊh ¾¾þ¦E‹ýî²e+nknÞHü@Ûí·o7Ož<ñ¾pÃTÀLÓüQ}CƒëK_~‘ÊJ%y-¯÷õõõgÒ©Ž¼¦ut_ºtyë-·þî’¥K>J !”pÎ1<<|±¯¯ÿ6UU‡ïºcÛo7¹«”9«ÀC} ¹l&²¶yÓç£U5­]íGC¡ í/þüëX¶t)Ú.´ÕB]ƒ8}únÛ¶½/$+®¦¦%MBð&Ã0î[½z©º\¤X4A@!ªÛ£‚!ª(Êû*<0Gøâ¿€îË]®õoþzóÆ›¿QWßðñªªê¥œ‹xÓâ¦Ø·¾õM²lÙ²/TVV5¯]¿+V­†Çãç‚sp!ÀMÓþL)ƒ¬(”RJ8çà\€s“ . iy󨱋|íÁ wÝ}O±½½í}àª*ðÀ;qäÐ>úÉÏ>øµÍ[nûûEMK”ÁE>Ÿ›HŒ¿p±«³ßï÷yáâ¦ÑhcBX2mu)!±¾O›@é=@øØXòÌÙÓÿ~äÈáï>õo?ëqÞÿ@øêC¡ªª‰ÄØ=ë7lùñÊ›ÖÍcŒ•„±¬¼)Š…‚p©*e”A@”:uÞÐtMdÒi¤SIb:$I†¢Èðx½…*àr¹àô ”ds9q±«óø‰ãÇþîG?zâå•«VñOæ÷–ûýoPê"þ@ ÃÃ*àõ¡(hz£#c¸t± ý}=Ð5 .U…$+ñúüÞyóê~'Þâñú”1ŽT†C¡ÐÖPEEÿþ—ö¶¯ß° ±á¡ Àúæf€€‡8ç ‰ñ1ÄÇbðúðx}B€ Ó,‰áÀË{ÑÑÞI‚‰VÕ¯ÏEqA’$PÆÀ(cdE†êöÀë Uõ‘¼¦£¿¯ƒƒý ðx¼ „B)¡ÄË„@E8 †B·D«ªû_|þ¹Öuëš‹ ß8Ö¬YÃ0"c N%¡ª¦nÜv„†pð•}˜œH¢¦¶^¯”ÒivãÝÆTÕMÜ1ôúû{19‘€Ç㢨àœÓäS¬¯Ï!Ú÷îyᵆ†ù¸&è{ý‰D0‘HÌB„¦Z C¥Bˆ’ð åó8õÖ›Ð5Õ5õPÛ^Ì&0}w (cðùC$Œ’øØ$9yâúúz éº0 †õhšŽñxüÀd2ù/ßÿ矈“'_³ ¼§üîw¾ƒûî»/<)`T·ÇZu{å †û‘œœD8…$ɖ𔀠Bˆ „B(!Ž;Ä•ÀþM’øaèzZÛÏåQ[×&I Ðóš8yòÍ#þÍ_ -X¸èš…¿*„ÒÐÐÐëóùžõù|;¸ T,+%€ Žññ8ÙYVTÁ0Ú Ã¸dú0ç\cŒ)²,TÕ³Pq¹š$&ÕJUËŸ€LW·ÛGL³€Áþ€D«jA(%UÕµÜû±û_þÊÃÿýÄÿù³?¾± ýýý¹L&ýø¶mN¯BÁP„Ppn–…B†®Au{ “Ífö öím=÷Î…þžŒaè…r`£Uµž††Á+׬©ª®»ÓíñÜ,Q©ÒbˆÅ‚rdæ7)Fc10&à ‚ںƥk×oú›_=õ¯_ºã®{c_Ù{M\=òÈ#д<ñzý«üÁŠÅ‰D¢^’¯ªºƒ’Dw(ŠkÕª›6 "Ri¹çóùï ”z1›}ç¸T†ÊêyP„¤S©âÛ'Þøöÿî_o¾ykñÄñ£¿çnI–ÿ|åMÍ;*"Q@fñ ‚1FJÂ;6€¸\ªÈ¤{žýÅSOî‚e7ÞÍË”"ÆÇGçóß©«Ÿßy÷=÷®¯_ðUEQ–ƒ8j1“\0‹EäÒIРB ܯ´dÙÊ?øü¿ÖÑß×½Ûëõf*Âs ¿ïª\1ÁM›6@IòÕ5,l…+eÆ£L¢Œ1J)%±u_”T@tjñ±‘çÞ>yzFß¼ìqV¿€¦SÉÂ;§Žwz}þ3Ѫšy²¢4’„RPBm·Ê!Ë(“!„€Ûãu‡#Ñíó.¾kË-Û×.XØÔTޤ»:/Ä{ì1èº>wHL ™f±J×ò¥`ÇYiGh«vŒ ¡ ^¿Ÿ‚Á…^¯WÍf³ @€À´p˜¡–=Rtï‹O·Çã#u×Gvü‰Ï¸×v%B!8`  ’ °=IE8 UD¶šÅâÖʪjašæ¾šÚy;›–®˜8õÖ›sg€b„Ø®¬Q#•Õ‚[ÂB3jç³… ‡¡å‘I§Ÿïëëí`((Úµn·§íšÛ 0‡ƒ½é‚aœ?qâr-*1¡?PHµ]"±=’µ0 ²,ÊX–Ëž[»áæÖ3o/e¨Þ€‡~ÝÝÝ¡”î…+Y´z^™ð œÈO”>¥CWçÏùc;>ÑÖÙú–˜HfÞK… JÖ~V€FzÒ²,_hl\´F’åš™FQ’d™A€^1G!EQe-Ÿ÷üü§¿¸xé }t$öÞPJñüóÏc×®]÷Ë’ôa0„šÚÆÒojÖÓ…wTƒ !¸ BèæK[n½ÃÜ·w7æXL€Ëf¹|¹sbÁ¢¥c•‘ª-”QÃIbP dšZ:©8I’À«- §W¯ÝÐA299mÐi¡0ç„‹E€ŒÇGÑÑvÝÛ1ØßøX éä$´|‚óiÂ;îÐíõCu»ïq¹Ý›Ý/>ußísÀ™yÀ€ŒÍú˧ž|#™šØeE’„XÆó©ÄŠ(¾X41<4€îË]HŒÇý²âº÷ÇO<6»½›­M×õ”Ïç+¤&rëĸ­™ S].kš· ª¶˜„$Ép{ý5z>û‡„3÷|æáÔÓ{^½Ëx¨àÏå2…3ïœøÍ¶t»¬°EŽ1lx™mÏg±ï…_#1b”²oç—~¿xäÕýW 4ÛfHÑ4m€á Ë9G±X€®kÐr9$ÆÇpùâ˜ÅÂ4õöãR=P\êÇ%Yþb(ROžúõœÕ ¼Ä`©Û³ûéîTjrÿÌͱuÞÒgÅbù|ÖÈfRO ôîÙ÷â³°ìòÕ³ÙlRQ˜Þì BêG">Æ£`ÔJkSBÀ˜—êQ%Iú=?¹]hyür×K× Â(CÎ/_ê<,¸/ß>£ä¦Ü2!²¢Ó4wÇãÏeÒie<>6ë³ ¥R©$,×e‹> 蚆Ë] xÑA¢ÔƒQÈŠ —ËÝ(ËÒ÷ܡЛ]ÔÀÓ/ºòâpâÍׂ~ØA©$Ñi©´9#ïÄxü MËçT¼‹¬³6òt:1M3&„Ð`¹)1õ³£{ÀÐ`âc1H’ÍÆ 9`H ²¢B–•5’Dÿ‰HþͯÒñ싯])ٮζ¬–ÏwZ*@!ILîj(@AeUMW.—¶'\lM+³Åê®\.çRå¼aÇ4M;aÆ™B¡ØÁ¹9L)­à( pÎÑ8!${~e⃂Q:zsZS† ¦¸ô{|™ÿ꩟] –›toÞ²m~0Xq«,KTQ%\ðÒkB”2øÁêHeU®çr×ÅBÁeK®(³¡bæóùBKKK€Vgõ !¬¢"¤nß~ç{<îÎËÅbc´‘Q'|¦œSÁA V3ˆ'%‰=ÆMþ#-“ßõÊ |öþ»æ B@Îе$¥´ ¨23í¤ì´èÔÊ*•ÑM7ßú§•Ѫ]­¹výæñï~ë/¯èt6p(Om†H˜‰ÄDnhhèÎùˆ€@ãüE¸uÛðz½`Ì M%Û”jÉR B)(eQYbåRä_>ÑöÉ€ßí?vª¿xfßU¥¿uÛv¾hq“­ª¬ôÜŒIEÓÄT>” a0y¼>Ï’å«ؼeÛOú>·ßyï´~g;‘,°ë+¨èv»¥{î¹÷ÏV¬ºésÛn¿ ÁP…uf¯º3ø´ïv·wÔÊüd\<Ç…h)‹ƒ÷Þ¹UÿùÓ/ãOß ØµçU!(c,BÖ†ñÓ4?er5 E8ÇjB»¶¥ÎøN`drŽÞË]ç_;¸÷³áÊÖC/¿øž*àl[ ¦?›2”‰-[o›Ü¸y ƒTpn‡Àµ…åÔš-€Sû;çÎ*ù!;(#%@?côä¡#'Ûª£Á‘—K !á‹9çÍ&çk¡a@cà”N ΄ –ðLØizk<‰I0¹Y]0 E×µ«Ûc<˜Ú¡I¶JH_yèáû·üÎ-Ÿ†BÔ49!S‚Û5‚:+cí©°jAIÙ*\„h"„4 A(1© EÁ9á€$8§\;PF!A¹Å**À-…æÅ¢‰l&·× 0b³е|*6<0Z,® `¹¦’YµjUS:9ñÉŽŽ¶ÀæÍ[ IlŠ~ ¼Œò¶.Z+Cì …NµÑ2µá¥¿!B@‚ÒÔžÆ z¨u ¤NN_v?œB@ ½íZ^;€EK–aõÚ G*­“éBa8>6šSU÷œ(é¼£;wîç脞ŸÈÇ‹…@EE5µµ vLí•ÊdÒh9ò*¿vœsD¢•PUµt ¤”Ú"ÄJo•Âh:Õ—ÝFÊ?S'fÕS¡7E:ÄžçŸAoÏeËÈfÒè¾|—º:0<4Ð26;dšfÞ,çÌ‹B€Rª !>$„ „d3¼²ÿ%¨n–-[^¢cw÷exe?.vv P, 64ˆŽö6l½u-j‚$ÉÓ¬÷•ÞƒBÐémÎê—«ŒÕf­¾a8òÚtv\°c‹¼Vêžcl4v6JîPÔµ«Áw+U6:_!˜œLà¥=»áñ¸QSS‹oÇk¯Db|€¥¦YDÇ…6ô÷õbýúزõVD«¢eB”Á§/ost~:(Öcè:FcÃ0MóÊäZ>÷h*•l‡eà¯]–/_]7ü”’û¡ S;o Nchp—.váØG‘ɤí½úTÆÄ:7èííFWWþ jëæQZ¢ué!W¶‘2õ(ýMITÕ‚¶Ös0Íb‰µBðž\.÷Íx|ìmÛ–MÀ ô® €K—.áÌ™Óf0LfBH¸d¥¤’“‰ [%ûL¬<,-?™œœ€ªº±ví:HŒ•ô{JÏ­Zb L¢`ÔÚ`9›,Ë` $bÙ‚p8‚þ¾ÞÑ¡ÁAƒâæœiùÜ££#±X.¼+I;-3:'Èçóà}ýõ×Ϻ\®ïÔÔÔ|„TÛ‹k* ι¦z ¯ÄØ(3÷‘Ε8+T–¦,{ÙnÎ0 tt´#NÃ: Öa4MC}}#V­¾©LM¬; ¡vÜÿßÚÎÿk&“Ù\0Œ#±ØðaLE»…™ÂÏ™6‚®ÞÞÞÞyóêRnÕ½€Ë¡:ç<žJ¥Ÿ|ë­“ß=ä÷R’,5¿@)k Î9±aÃȲ4Í¢j319'ÿ޾~§O½3§Oáì™Ó8wö zz.cåÊUˆ„åݦÅ ¿ßr»='žÿÍÓÿœÉ¤/ÂÉŽZ«‡•j».d•¨B uÕÕÕAq)ëH…BñÜÈHìÛ---/¤R)-•JåûúzO«ªúŽªºýŒÒz»›6m²n‹8:Ï, cÆ¡C‘ËeK7OÒÉ4Múuëár)%á)¥p) õz½ÑîË—^èïKÙ gÂÊ*%gl®X¡±€ sbb¢½¦¦Æ[,šÝ]]ß>yòäiÓ4¶!„ˆÅb±Éɉ7|~ß,Ëõ $,8'ؼy3dYžŠè]]]8vô(Šfå['÷‹ÅF±dÉ;`˜]×ÑÙÙáokmmííéî²ç>ËøÍZæê‹6Šó,ÚƒŽŽŽæZZŽ~ŸsŽDb<ç>46>>ž=ÚÒòÌúõÍýÕ55ÿ dÜHeiZ„h%3(âc£ÐumÊ›”wJ4MÃîvaÅŠX´x1²ÙÎ;‹—öíÅ;§Þ>véb×)ûõø{ -VBb@­MgåíßÊó æ 0’ÉfF«-C]×Ëe ár)€À´[g©tZ+šfžRÊ…@°| J úûñì3OcûwâàÁxóø1$‰ó““‰ï¥Ó©!X”Ç,;Úë°+ÆTcJ}ÊÏüÓ6â>!”«˜“  çÏã>І†FTUU¡¡¡óæÕ!®¥ ªKýÍàÀÀsŠ¢)¥®PEÅÿ¤”6—“‹‚–×àø›ÇI§Á9Ô´ü÷ããmöÊg®&üõY ¶Q´Û;a3 +e;À…àÎ5R]×ÐÙÙ‰ö ¬sEKUPWWŸ<<44xÆî_,]ºì'þ@`±ÍK.MFÖIêºþƒ¡Áã°ìÃ,.ïF la%XéfÝfEzÆ;XjS („˜PBAÀ…€nÈk‰okk{±õü¹vÿ€èíé9ºtùòݲ,¾Œqö>¤õ‚þÓÁ~çn …u—iòýbltÇ`ùÕ¼ ÂlÅ„EÇ<€Æw›L ÎOŽŒüD×õ<¦ØEtC×ÇÇãOUUUo$„, „fšæ[Ù\ö—±áá£ÅbÑq:,&^UøßG¸É9¾ë\( ,f$Ü„±‰‰‰Çúp¥{&Cƒƒ=~_àßÜ÷ÿâÜìÉçò¿J§R˜2ºŽ·ÊcŽå†üËÌ\ÆaŒ…Ba€¼°£bLBèÙlö‰sçÎî³­~–­ÉÚïÉ ëz¿¬Èíñxüçý' +»áï°2y-{.á_Yó)¥r p@0ªw»Ý‹%Yn⦙ìèhÿÙÄÄ„s$ƒegË£ÔÁZ,©„mùí3Ç.bŽÔÿ (Oµ‹òG’$™RJ Ãpt8`vÌ`—jXÅvæ¼S°ŽÓM\c¹aÿ6w eÚÊ‹Åò4¼s<ãd ^Xg|åÂlá×#ü y—6gE9¬È-7Ë{û·ZLmpœ kÎo¶òAAÀZ½™Ñcùç$,—ùn:lØïXú \É”k.” ¦¬¹kCåÔ2,79Œ²; W™ï5ºÿW˜ml K MÌÈÕýWù€Ê©]¯ßZ1"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚qlix-0.2.6/pixmaps/managedevice.png0000644000175000017500000000474511050625206015376 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ'z}‰Ø eIDATXÃWIŒÕ=÷Mõý©g÷ènÛmÚífr0’XÀ&R¤H 'Yd”l؃Ä.YgKVÉ>Blœl %ˆ à¦eæà¡íÆîßÓŸ‡zcõû·˜ %]ýª÷ªÞ9÷þwî½ðŸ/677§ŠÅÉâÐø¡1Æè¸óöD4…€Aï|)À·ü:û§ þÃJ¥z·ZÕò‡vøoZœ¾in~þ*3Ø,="UüôÄøØ™É‰É©‘ᑸP,% ðLkê¦ÝÞÞI6ÖÖv6Ëå÷»ºóZ¥Õ|»f[ëËËá!À––·J§Šƒ?ŸŸ¿0?t´ÏÇR Á'ΈÒÏCpÎÃY 㬫×Ý›++{׮߸R¯V~¿[oüýöÇïìp_â_ǾÈ~xlr`tðÙ¹#Ç^xìô©ïÏÌLгq–sƃä}€uÖöÌ9xçBcŒ)©ÔÐÐPñÐØ¡9ký)—$Q©0º¶´4__]]õß@à"?uj}z`dø¹ 'ž`áøB>_ˆ‰ˆœ÷0Ö˜¹Ï½µpÎ!R‘R-4;­Bm¯µ²¸x¬v/‰{ °)M ”†ž;¾°ðó©™éÃJFÂõ<íõÌš/?ë¯<ca­cqç…Gªõz¶¶×¾¶µu®|î%@>z¡”óÏž›{~|brVpÁ­µ0Æ@[Ó[ÔØWim¾4¯î¿B E±a¦Öl´sÃw>«”Ëí>¥¥%…Lö±á¡Ñ&gfÒôÀm/¬¶ïå¿#` ûàûÑ1}bÚXxHI·ÚíqÝ1×">u§^_³yŸV<óìÐÈÈ¢w^µÛ4,D}™Q_GÔÛùýÉpŸùžööï½btdìHuoï'ù|ë#wÄÒÒ’D”[ÌçsOQ¡Óé‚è@¥D="ýÁt,]ô€!Å }i¦vï@ŒÇ¹Bñ¼µÝoMOŸ/‹/yÿd&“›ÐÚp­M°oŒÍdpþÌãà è&ÕZ{• vö*0Úô]!>ÜC¤o,“‰G÷<=-Dý²P>?LLœuÞçZí6ˆŒÄ±4pX»y·>ySS‡qèÐÏÎâüSßÅÌÌ$1¬m”±¾YÆÆÆ¨7¨VkØÙ­ ÛMàƒGð¾GŸeÄOS>?&$Ã416×MIÚ€3bÆX?S“SpÑ!ÔºŸð1^ã5$ÝÎy 9;z³s³˜˜˜Ä™GqrqíN‚—~ùkká½Gð>xxç8ãl\h8b9­ ¥Àûàû¿š1$ñ$ÂÈ dÁ¡DJjTwvÑ,ßÀ•køÇÕ×á»»`œ;{/¾ô"œsHzî}J$x(à O~*/½w`ŒÃû4I1Æà½O7_ðH4 ^„(*È8ÊdG´åq¨ #t×ßBû³WP¯7°³S9{<ÀY‹@aJ„€¬IºÌYe!etP©Áûx˜N έB(…" @·T0ׂn'°ŽC·ºHºZ;€Þ¹>¸÷Æ$°º g-C@V¤òðÁh g 4BAH!¸pZcm}É`> ¾wú(:m`È%Ø«·"À6A¤B*Qc ’nÖhX«áMEI¢1îç ÆADðÞÁZ$éàØÜ&ÆQ¯µÑnkØ ¡-ÃönG&b\8=JSƒIå ¢¤Êõò…€Nº)°w=Is10bÄjB0~D†Hô^H7¡”O]8+Ëcgkƒ ° ··œèâ+ËhV* ¦²ˆx‚eQ&QoCsï ”æÙ»Ë,±[¨Æ ÔWßù!Þ»ú)´qà‚ÃØ‚®yG¦[Ã^­Q:Q˜¼Oª0Ž ”!IH!@Ôóš±}­èº<ÚD0×G€I3o¡uZ€„Œg3hï½Û¾ƒ¢Yœ È\·ƒÐ­ƒq æ Bq€€f«‰ññ1”·¶Ñh´zê"`|ðw(â·x~¼Dr„sõ8c<·®R©€ÅŽb£¼ÃðøFÆFÒVàk×`k+Éò´ ˆ,dv¤÷¡‚\VàÄÉE¬olÀ ÕîôŠBhx.Q;ù«˜hnWÜ›þ¢äj€`ŒãÝåOpîôCøÅÏ~„ÝJ_líÂ:—æùàœE»QÃúÚm¬Þ^A§¼ ÄÈLAHÀ¹õz ‰6¨Öš`Œ§Ág78ãŸmðÕÕÕ08}4á%ÁÅCœó˜1FŒ1l–wqõ£k¨7ZÈçb 9ó1òù,JŬŒÑxâÛgÑíjäò%oÀaa‚Àõ2œsû%=„šsú’'û‡O?øs]“TwêìÞ¹3BÈ'‰±ø ¾(ïb·R‡RIH)PÌç°´0‹³=ˆà-¶·w°Y±ÐÚÁ ÎVïn"„ÐOë!xm´ùˆ{5öÀêꪟ™|°a¹©±“BÈQÎ9߯ JI(¥)¥¤” líÖpw}×>»†Z3Œòi†!k]?­÷z k^ñ>ü&fòÍ+WÞì~©)ÝܼnGŽo‘ðuNlž 1È9çRJDJ!Šö-JÉD)‰,„Š{Õ3ý§Óž`¿_ñÖZ½jû;qéê»g+ÀákmùööJwzüä]ÏÌf# (%E)JA#DQ„LÏT”FCpѯœè%š^W‚wI’$7Õ¿%½òáÛ§ËÀ¯ü}&››×;#³ Ÿ‹ànyïK‘Š3Ù(RJ±L&Ci$ç ~Ù&0žæ´÷óðÞ9­u¥Ýj¿ç´y9‚»tåò™­{Áïs2¶îÜHÆ9±Záªuz×û“JFq6KJŠT"÷ö}8ˆµs.iµZµj­v³Ýj½JÞ¾,{ëòå?U÷ÃþßN\äO<Ñ."—?,ˆ‹"ùB>2Êd‡#¥"!8Ì9’Ęn§S¯7š+ZëËÞ뿹VóF’ìV–——Íÿs:> qñ"ßÞFVJ^”qf˜K5᜙ J¾D Ž`l-qɪNìFµÛ­òÆÝÖòò²½ß©xÿúršýZ€àIEND®B`‚qlix-0.2.6/pixmaps/rootDevice.png0000644000175000017500000001171711050625206015066 0ustar aliali‰PNG  IHDR@@ªiqÞbKGDùC» pHYs  šœoIDATxÚíY XMùÿ¾·])TDè¶#1B ¥T„©$m$‰6©¦DEZI£Å–25$’ìBF™,ɾŒÝŒ!c³X{ŸïqîéÉó*¾‰Û„ñåjÞó*ìü’¶dù%Wnš»~š]Ț‘!Ÿüïè¹DÐÉ"NhX0Èqæê…æ¾¹‡-ýóŸXøç5›ù| ÓIÙÏûOÈ8i4nA¼áè#}û¹2§®Ø”_N\}ª[`a£ÃÌ¢~‘kOºD•žÖ+?§°xÿMÁüÊ‹ÿ?è5:A £9tbÚᜒ¸†@ßþ#B,ôíb 7r! º¶‘¯u¬C¯k Î1ö]j벸6Ì+ûà1ÿeuO§Ô¿Yuô‡°¢ã×fr¢<ºôä”ÖéžXvN0wý™/yµþ¡áA-Ë ѰéÏ¢—¡bw=Fù%¡ûP?ôê‹îC| i:‰à…–è5>ùeäºÇŽI;Ÿ;/Ü iûà•u¾Kk15¯Á+Ž ´°áyDqccÔ''c¢KOÌ+;/·îì¿Oõ~΂v£„&®ËºôwAc'¸Ä"-g †:N…š‘=Tì nâŠvèã› ÓYë`¹ã+`óQæWÂ)m=ܳK0)o-&/«‚ÿ²Ï@®¹âUØšã—#×6¦E•œ½îŒÜœOOý{è¨g!PÕ&×A×¼DEÇ ÊÚCÐ^kz™:ÀÞ•¢?`4†MAo¯, .Æ ™¥0ù)‡®ÃÐð2Xů€{n ¢+‘Y¬ê¹ˆ©ˆ†÷ÊE˜¸d|s’+1W4Ï*œ¹º¡<¿ªÑïôé3¶_|ñE§7n._¾üßANU[ ÛQ¤,§¦%ßÝønG“q0öœûÙ…pŒ)uDL—ÃÐ'½ü Ð/p5LCŠàšŽü³Ø~.v>œM‰oq? y'áY0N ¶c|Ên¸§Uc"bÉLÍ­EFù‘æƒGN=¿xñâãk×®×ܾ};¤©©IçÉ“'Ò=ú¿À²Ú,³²œ¶ø¼y`6zMLÃ>Y„%Ðó̄ւûbhyd£§GD^Ùð*ôFE“¶=–GS±ñ[/¬krAÙC7äœõ„ìtŒKÜ—;à–² î©{’»ÅÛêÑÐx/^Àµk×ðÕW_áþýû/‰üÅçÏŸg¾yóf(E‚€á½/£"ñÜÊ:nÉ›ÆFäaÓþˆ/ØCôtN‚Èu!´Æ/‚È- ¢ ¹g¡'‰a•äü«#°õÙ‚#¶|gòÇ#°ü†5‚×ù28ͯ‚sâVx¤lÇüÂ}Øyà0N:Eä/rä)òŒ<ˆ<~üñGùæç/^<¸|õZBAA¾ìžê=ï_€ÞKÆÅÝtãDŽs`3= ¥; wãg䛑ó|y.‚öø…èéšBB¤Ò¡7)£2Ý[g…Å_X#ýœ·;aüÒp8&a\ÂfŒŠÛï”-(ذŸ>ŠÓ§['ÿÓO?1ò¸÷  …*à;3ì´½ƒÆ8· ï_€>¾©“YË5ôÆÍ9¦3:¢Q0vOÀÂU[Q¼õ\¢ò‘U¼ ÉË7Ã|j´\’ E®‘+´Ý“a¾3"Ñ;ht}@4q)t½óa¸ÓÓÊQ±£ÇŽù߈<Ù?PôëN );ÓfGÃ#`êCGgW3'wO££ãû`pèJÃ’ZYç9ktfBgT(´G…CoìløÏ[â-°~G.]¹ŽêÚcðŽ_ ½ñ$‚8=\QФAË-=ÝÞÖŠá!Ë‘¾º5ŸÕ¢áرVmÿôéS.ò×nÝFAé„%$cÞ‚d/]ŠÅÙÙ¯33³öfdd¸ÇÇÇ«š˜˜‚ƒƒß!õȨö¹Å¸ê9?Òµ†ŽC´fAä ÛÀ|\²»kãæWwqéê ¤¬Ú“IDÞ)"—D"™Òc!Í é˜’´¶ì¡Cuù_“ðà¾#òMß~‹í5µˆJÉDX\RRÓ°lÙ2¬Y³eeeؼy3Ãëׯ?°zõê)$FWAddä_';lØ0¥¥%·cøðáãIóƒgæÈ:†¤êŽ üI×.ºvÓ¡c?"ûÆìô5¨Úû9nÞþß>z„ »ax E}l´`”‰ôåë±§z/>?t¨UòMDþÑãÇ8qöR 1-&1 ó‘ž‘¼¼\qä·nÝŠ½{÷’ˆoÏsäÈ‘ç555G«ªªÂ µœœœ‰‰‰MB‚AšDÊS¡Žà¦b`?-Noä”&]Û) 1Þ AÐ=‹”Ò°²l;Î^ºgߺãà‹€ø|Z¾5û÷ãP]ë‘ojz€[wîbÃŽjÅ΃Oð,ÄÆÑô˜™‰‚‚¬]»åå娾};öÓyêëëqòäI\ºt 4(qíòË/¿|yáÂ…S$HÔÎ;EÑÑÑBrÇ» `jjÊaðàÁB‚íËÐV– ÃöÍ´¤LÇÊ:Ls׳õ¿¨kã·BL%LƒöÈ ˜MŒALú*TVÂÃGOp÷ÞÔ>‚ššý¨k…ü;wpïÞ=;}Y…¥ŽKDxt,(·1—’’‚•+WbÓ¦M R8pà‹8Μ9ƒ«W¯rÄ¿ùæ|K)óìÙ³·Eó‡^R9CßG766jWVV <øÇ(** ”””òòòB‚AZNNN†‡,ý-+%ÈÈ«t’6°–Rá#kc÷îÝÜ9Ξ=û³x¬f<¦´!Òxõêš››ÁÛ¾|ùòÓó4EÆ~÷ÝwZô±ðÏ ORi‚ Y‰})ý^"ƒ“ ô¬'}¯7b2ôFø‚¹ÂÀn*âR?ÆŽÛ)ò5 [r6eQ“ÿòÖ-?{k«ö )§sâç!..‹(â999 ëbݺuزe gg–Û¶mã`ä>|"ÆEÍ bò-}÷Šîá̼y󦚛›Ëz{{¿³Œ¨<¡Aß—ãÅ`Ò3sê`0Â+Rßzâ×zV^еö†‘}2rWã‘g¶?zôè/"éêuì?z …;‘”¹QÑ1œåSSSQéYÉ|?~ü8ç–‡¦ºÑ„ׯ_ÿ&q¶˜+Øyìííaddt]CC£­w@È;@,€"v-‘íÚËDÎÐÚsœ¾•ÇI½áͽm½‘•WˆúÏ?ÿ•í¿ ò ç.aÓ®ýˆO\j[HHH@WéóP\\Œ7rQgùÎÄcΡ§A.ßY½`ögß±‚xîÜ9nLnm±šÀÎiee…ùóçƒ"ÿHKKËRWW÷ÝÓ@ZZZFJJª¥Š¿D(”Ó·p¨?|ÂV=K·—QIYhhh ñöôÏä¯ÝüŸ5žCÝÑFÎÆ,ÊéééȤJÏò½¤¤\”©h W;nÞ¼‰»wïr–g¤XT)¿YÕÇ®]»@EçÏŸç'ñbÃuŒ=¹¹¹˜;w.ôõõ_öíÛwŠÁŸx'Ø«— MªÉuéÒ¥]‡Ùjáñ¾¼Ö@Ûž:æNKœýßÖªç0ò¬Õ½r»ŸDbj&—çÌ Ô¿91X¾WWWsý}~åÊñÓ WèX¤%-϶ì3FžÕÖ™¸~~~ðððàêFxx8455ѱcÇ7”!ï쀱cÇ ¬­­Y[Œ9RЬ$K§–¨8pàÀö½{÷Vêܹ³"uIA:‰út4éœ[Xzë µ*V°¾ùæ>/^Eõ‘ÓX@y?jÔ(Ìš5‹j˜½™Sq–ÛlŸµ8qÔY¡{ñâWèZ[L6:³ßÆÆÆ‚î•#MS"üýýAƒ²²2ÔÔÔîÑÖÖþsR·nÝtYH`ff&EE–¬¥@"JãÆS¦ *Óçœ êêêŠJŠŠœ3üf}4ºú@]ÃÝ»_7³éðøù˨>|Å«àî9£IOOOdeeqµ‚u u–ãŒü#úMËöö[‹ÙŸÕ;;;nvذa\]]¡ªª têÔéa×®]gXXXH“£ÿÚ¨Ìz(Õæ !ÌRD\–DPpqqQš0a‚2A…öU˜ Cn¯¢ÒA1 4¦ÿžu›ï7=|yŽR ºþ8*÷DRzÜ=#Î@‘¿Gä})ÿ¥©þ3I222²¿ ŠŒ±±±<¥„¥JG‚:¥ˆÆ€ºõéÓ§»f·®šC†Ùö/«Ø¶âÔùKÏöÕ7Ð3ÃA”TlEJÖ’fO/¯G$À^^^œ]ÓÒÒP[[Ë>FŒYÿ÷D`õ%$$“&MâdPp~&O޼ImÏ•îSسgÏ¿Í[(1Èñ­P‘º„ M‰jí۷פB£C¶3"Õ†Ðþ0åöím:ªª9ÍŠÌËÊ/¼S\^ùrEqÉ«a—µuu?&78;;ßõõõ}3eÊ®5²ŽÀÚ«,¿Yñk™÷,çY EDDp…”µR:—ï|ä/ˆD"û1cÆüc¤Åí°={kÎþï„ЕÀ|¥Oø€ÄDî°¤ÑÙNAAÁ©]»vžÔ4üi$++Ú¹«æ"S3Ë23 Ë ÊËl:~!ƒ"µš ì1ŸgÓ§Oof’ F¬%²ºÀFjVø—{féÃòÍlŠ¤âÆ‘§NÅr¿‘j—=¥¬"(9ñËszçAH–'®D gB*¡ A“ÀÊ©!#Îþ‘0”`Ep …ÎDÌ“Ä 1fC"HXÚO ›J¤ï’é»Bº¬¬l}¶˜¾[JVÝ0~üøKdë—,²Œ{`‘8-X±£c°jÕ*®uÈŠÉ7“°GɉãøÀ°ûìÌL™àŠ!&/×"âê|Ä»KïK@ž¨ # ì=• Á“„ð!²D0„ˆFÉÂ\Â<ú;‘H¦íBB a·ˆì›Ey\5mÚ´»4̼a"0{³‘–u ²4÷¬Àfæ²:GžH7Sä1×±‡[BþEü}«ñ<Ú‹ç !~“¼²y ^QVMtl¤êÃ_ˆ]Ђ0‚`OËàNð"ø’SHŒéDr&!”öÃiI"Ì!òÌqä”x¶O–N§af‰ð„FÙæE‹q“ã Aƒji?;"ÿš„ØG.coJ‡Ì ƒƼZüý3:ð¼$Ó£ÕgEþÀN¼ÌúÝ=xUuyŒø ± šñN°á…`n`vt%°›óàad>?&€Ä˜JbL#!¦“ÁD„¥Ít*¬¬w§………5P«{žœœŒ?ü‹ºù4ìl¡Ì™]›ÎÇ1˜`Âß›.Ï.Pá á«¥ý;ð¹/vX->ôx•ÙÅúñ)aÊ‹aÉ×&ˆ«„Ѽ0cyqœÎtã.$„+ áFp'<Èδu£æ=yòä¥$Âê÷o$Èÿ@í¸˜`O¹oFB¢}H¿éGçÛ_“ž$ye¾®µkMÉ4P(€âÊßYBˆî|Jˆø´‹Ñ›¯ýøÈ;Ä”¯f¼M-x‘ÄÆGq8°"!¬Iê$¶aÂ&:88l$<'òO‰x6=âZÐß)ÿûÓg}Hª Úô›îôû.$ªïâ‘W’ˆ¾ü»¶?%^¹ü %ÅèÊ+݃Dì]^}^˜^¼SúðèËw‘~-À>û€„`‘4¦ˆö'LH ²»%O'Äy"ß›"¯O@DÄ»q "®N¿íÔ"â’ÄÛµx¿ñNs€l+bˆ!D¥ /JWÞ)š¼[ÄŽ‹¤Å»§5h‰%2=©Xj‘"²¸ˆ¢­C³ƒ6‘×¢¨w§¨kq5:¦ÛáwHK¾Ø‘á.õg")‰ù@Ž?™%þ‚ba:HˆÓ‰¯#jB©KÖ¹ÅgêǪò`ä:2’DV•ˆ«SÔUI”ŽT<[Z[ñ7ÞdI’þ¢ä»C±(baÄâH¾7P’@ûßR+øùE ÁFp-ˆ¶|m'Iøo“þ#A„­#Ýâeª¬äþ"d[”‘¸–$Ñ÷FöŸIR¨w…°´­¶Õ¶ÚVÛj[m«mý­õ§Á0£Þ–ÕIEND®B`‚qlix-0.2.6/pixmaps/preferences.png0000644000175000017500000000425411050625206015262 0ustar aliali‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ!F—¬,IDATXíW{Œ\eÿ}¯{gïÇÎ>º;˶ ´K«‚D(UšP‡TbIjC5¨ Q|F‰­1ЂÐ_ üC‘ZØ6Ø…¶ÛǶÝWwg·3wî÷ôÙÝÛÙ&žääæ~ßýÎïÜóúÎ!@>€h°p‰ç ?„A;§l1€ ä•RYƒö*£Þž*•Žj%'ÌÈ`À¾Ÿpþ>{Äïêõ„ŸjÏd2y»ºXì\ÞÓ],œZ < C €–Ëe76:¦‡O‰:9Ü_©V^¨áëºZ”CG"n^³X€ú]½¹l¾åâ )øÂÒ¥}«–,ýX[.Ÿ |ßçœsÂ))€RUhë µFÇftt´úή·OíßÿîŽÒTéϧKÛÍÈà(s&†5¯£§+Wh]Sì.ÞµüÒK®è^x^GMÎ9¦¤"ÆÄR¢UP‰*ˆ¥„R q5†µ–zžçå ­™­‹âX^¬ŒñµðޙӥÉ3]r¦Ìëèéε¶}é¼ÞE·÷õ-éK¹€0Bb#ŽkU¢yyf?–1¬³„.ZòÍ-Ƙ¾¨7#ÌP¥±Ò\%æÆõ:{¤›ó·»‹·µ·wtmYTGT>Ã?”Í4Ö6XF[ÖÕÙÕ%•^{xà0tgÏFyâÈÀŒ;x=ò…LSØ|C>—¹5“NwK%™,ÉYÓŠÿ…ŒKXšæ²™öR.·FªxÈ´3#ƒ#€ìùÕJåB!Äút&ÛS©T˜ŒcPÆðÿ k ´14›Ë.˜œœ\g”ÚÅ»z·ÆÇEQ2.0!Ö©`©Œ"OFÓfYz͵«ÑRhÁK/lÆÈØØ¼€‚ 8«¡m-óœÒu—§Ã°·Z-¯Õ±ü€#¤ó£«½ÒäøJáùÓéæ>F’žk…|!7Ÿ´þ¾þαmÛöš‹(`,ÍeÑ¿e¬^¹åJ”PN[cËåÓQyê{„°Ítld(­•¼Š€v*¥XUƨÊJ)(¥ •¬óÐÉ!|êÆÛë¿ÿ;õ½(–è\ÐŽþ-›‹üâWÔåÌÈÕZSÚàj­d–‚¢à2ÊXb†cYãjTÅú/é0 )c84€WÞ-j„h­¡µÆ½¿|0ñ·ß¿ó»u9se;Ø&—XcÛ),º,RJ ©bh£á`a¬†±5ßmøÖMxçÕ'ðÉ—á†ÏÝ„+“:HT‰ c Î9®^–ª¯¯ýú Ÿ¬Ëq°ÐFCªJ)`et1Ð „³¤±ÖΦœ‚ÂÀ´Iÿ¶é¾†€ûé}pß½?Á`ÿ³€{ùžöìÙ·J©ädz©I¤,&^Ç'~ ŠoÂZŸsò¾ï‚ Áw6ºãgĬ8 £ œ3ã°øÐ ê``Ô•p¶®Ä;ûö¡øññù[Ö"L‡xûÍxî÷ò7¿5õáÁ  iæ78c c ­$Œ6µƒÓ‡'&Ʊéч±ñ×÷Ã^Æõ7ãºk¯ivFh%¡c9^SÆG”š 8g`ô4+£à,V\ºÏõ@bí7O¾žxñ©páE%›ÂjO’p”8˜°ÂYÀ¿zû à¯îþÁ]X¾úk‰õ?÷Îí=÷ý”pÊöScÍ û cr>ð––VTßÀÆ}±ü3«®ìÞ³+oþFbÏö'МÍΫaL8à 5ºZ°ÀÔ™àŒ3\wýêyýýÙO_™¸ÿßêïǪ[¾øæª+W!‘ÚÓJ8g* x £å©Ó¶9gÐsÁàŸ/¿ÔÞwùºÚ­'D‚wìÜY·Ä. lÝúrBÖLðÃâ8€­…BÇ…”ÆXsÀßœbœ¹¹†G†póm³QÏÛ1<< Fy‚ („ص{7ÂE+qÙ’•¨ÆQšŒ3`[¸ðöžØµCÕºbÏã~kq€Ÿ3ήÌ­†”2A€æ0ÀøÄ$¸à`„‚°Ú¾3ÆYh¥a­­Ý%ÆÎºh¶ÅF›7œ1?ì:gáŽÿRµ¦Ô˂̜+9`¥´ súÎ9àm <ߥ‚sPBA c \pJj1N¬µ3Žà´Ñæ€sæ!—·MÜWMtŦ\Ò<Û2윙¤ŒBò”2ÆyÍÄ\ppÎÁ)ƒï x~ªöŒ 0:\„Ô®‡š2 pÎiÀ 8ë~g´~Ú ÏTßD[n¦&ª,ÌuÀ)JÉB.DŽQιà„sOxðS)x)aÂOùð|žçÃQRï–ÜŒÄÅÖè÷Œ6ÈjõI;v|hnåmLL¹ùùÖõE³Œ±¼àÜœS?•"©”@s˜†ðc`Œs_8gà5Î:£”WJîÜFÊøÓêäááLj5²t*&Aú˜ç§ÞrÎŽYëBÊ™ßä{$ÕRÆ(uÎPZïz§ÅY£d\•²T©DïIý•2¾‘ ñêéCû&æ›ÉLÇÌïêÍ„éL±z…âò , ƒ¦‚ð…τǬ±Tiå´ÔªE“§ËåÆê×¼MM½+GÃXuÖ øCŒçÀX[±Éojʤ›³Îy§3¶hœÍÈZk"JÙ1­ô@5ŽŽ˜‚ <º·_Ÿm*ž¡ÿõ:13\Ú¦IEND®B`‚qlix-0.2.6/qlix.10000644000175000017500000000066411050625206011632 0ustar aliali.TH QLIX2 "1" "July 2008" linux " "User Manuals" .SH NAME qlix2 \- Manage MTP devices .SH SYNOPSIS .B qlix2 [\fIOPTION\fR]... .SH DESCRIPTION Qlix is a user interface that allows users to manage MTP devices. It strives to leave the smallest possible memory footprint with the fewest possible dependencies, while being easy and intuative to use. .SH OPTIONS At the moment Qlix2 does not have any options that will affect its behaviour qlix-0.2.6/Qlix.qrc0000644000175000017500000000523511050625206012216 0ustar aliali pixmaps/connected.png pixmaps/disconnected.png pixmaps/settings.png pixmaps/device.png pixmaps/file.png pixmaps/folder.png pixmaps/rootDevice.png pixmaps/miscDev.png pixmaps/noDevice.png pixmaps/albumlist.png pixmaps/track.png pixmaps/miscAlbumCover.png pixmaps/playlist.png pixmaps/filelist.png pixmaps/preferences.png pixmaps/managedevice.png pixmaps/ShowQueue.png pixmaps/playlisticon.png pixmaps/ActionBar/AddToPlaylist.png pixmaps/ActionBar/AddToQueue.png pixmaps/ActionBar/DeleteFile.png pixmaps/ActionBar/DeleteFolder.png pixmaps/ActionBar/DeleteFromPlaylist.png pixmaps/ActionBar/DeleteFromQueue.png pixmaps/ActionBar/DeletePlaylist.png pixmaps/ActionBar/DeleteTrack.png pixmaps/ActionBar/HideQueue.png pixmaps/ActionBar/NewFolder.png pixmaps/ActionBar/NewPlaylist.png pixmaps/ActionBar/ShowDeviceTracks.png pixmaps/ActionBar/ShowFSTracks.png pixmaps/ActionBar/SyncQueue.png pixmaps/ActionBar/TransferFile.png pixmaps/ActionBar/TransferFromDevice.png pixmaps/DetectDevices.png pixmaps/TreeView/branch-closed.png pixmaps/TreeView/branch-open.png pixmaps/qlix.xpm qlix-0.2.6/mtp/0000755000175000017500000000000011050625246011371 5ustar alialiqlix-0.2.6/mtp/MtpSubSystem.cpp0000644000175000017500000000546411050625206014521 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * TODO better error handling */ #include "MtpSubSystem.h" /** * Does nothing for now, besides initializing LIBmtp */ MtpSubSystem::MtpSubSystem() { LIBMTP_Init(); } MtpSubSystem::~MtpSubSystem() { ReleaseDevices(); } /** * Initializes the MTP subsytem and retrive device list */ void MtpSubSystem::Initialize() { LIBMTP_error_number_t tempNum; #ifndef MULTIPLE_DEVICES tempNum = LIBMTP_Get_Connected_Devices(&_deviceList); LIBMTP_mtpdevice_t* _dlist = _deviceList; while(_dlist) { MtpDevice* dev = new MtpDevice(_dlist); _devList.push_back(dev); _dlist = _dlist->next; } #else LIBMTP_mtpdevice_t* first = LIBMTP_Get_First_Device(); if (first == NULL) return; for (int i =0; i < 7; i++) { MtpDevice* dev = new MtpDevice(first); _devList.push_back(dev); } #endif //cout << " sub system Detected " << _devList.size() << " devices" << endl; } /** * Releases all MTP devices for a gracefull shutdown */ void MtpSubSystem::ReleaseDevices() { #ifndef MULTIPLE_DEVICES for (count_t i = 0; i < _devList.size(); i++) { if (_devList[i]) { delete _devList[i]; _devList[i] = NULL; } } _devList.clear(); LIBMTP_mtpdevice_t* rawDeviceList = _deviceList; while (rawDeviceList) { LIBMTP_Release_Device(rawDeviceList); rawDeviceList = rawDeviceList->next; } _deviceList = NULL; #else for (count_t i=0; i < _devList.size(); i++) { //Release the first device as all the rest are clones of it.. if (i == 0) _devList[0]->ReleaseDevice(); delete _devList[i]; _devList[i] = NULL; } _devList.clear(); #endif } /** * @return the number of discovered devices */ count_t MtpSubSystem::DeviceCount() const { return _devList.size(); } /** * Returns the requested device by index ID * @param idx the index of the device to reteive * @return Returns the requested device */ MtpDevice* MtpSubSystem::Device(count_t idx) { if (idx >= _devList.size()) return NULL; else return _devList[idx]; } qlix-0.2.6/mtp/MtpStorage.cpp0000644000175000017500000000352611050625206014164 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "MtpStorage.h" MtpStorage::MtpStorage(LIBMTP_devicestorage_t* in_storage) : _totalSpace(0), _freeSpace(0) { _description = new char[strlen(in_storage->StorageDescription)]; _volumeID = new char[strlen(in_storage->VolumeIdentifier)]; strcpy(_description, in_storage->StorageDescription); strcpy(_volumeID, in_storage->VolumeIdentifier); _totalSpace = in_storage->MaxCapacity; _freeSpace = in_storage->FreeSpaceInBytes; _id = in_storage->id; } MtpStorage::~MtpStorage() { delete _description; _description = NULL; delete _volumeID; _volumeID= NULL; } uint64_t MtpStorage::TotalSpace() const { return _totalSpace; } uint64_t MtpStorage::FreeSpace() const { return _freeSpace; } uint64_t MtpStorage::FreeObjectSpace() const { return _freeObjectSpace; } unsigned int MtpStorage::ID() const { return _id; } const char* const MtpStorage::Description() const { return _description; } const char* const MtpStorage::VolumeID() const { return _volumeID; } qlix-0.2.6/mtp/Icon.h0000644000175000017500000001416011050625206012430 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __BMPICON__ #define __BMPICON__ #include #include #include #include "BmpStructs.h" #include "types.h" using namespace std; /** * @class this class parses the ICO format and pulls out the DIB files * from a specified buffer. * This class is largely uncommented as it should be rewritten as a QImageDecoder */ class DeviceIcon { public: DeviceIcon (const void* in_b) { byte* in_buffer = (byte*) in_b; _file = in_buffer; _bestImage = 0; _bestImageSize = 0; _header = NULL; GetHeader(); PopulateImages(); //ReadImages(); //debug FindBestImage(); LowLevelExtract(); } ~DeviceIcon() { if (_header) { delete _header; _header = NULL; } } IconHeader* GetHeader ( void ) { _header = new IconHeader(); memcpy(_header, _file, sizeof(IconHeader)); return _header; } void PopulateImages ( void ) { count_t offset = sizeof(IconHeader); for (count_t i = 0; i < _header->Count; i++) { IconDirEntry* temp = new IconDirEntry(); memcpy(temp, _file + offset, sizeof(IconDirEntry)); _iconList.push_back(temp); offset += sizeof(IconDirEntry); } // cout << "Headers end at: " << offset << endl; } void ReadImages() { for (count_t i = 0; i < _iconList.size(); i++) { IconDirEntry* temp = _iconList[i]; cout <<"Icon: " << i << endl; cout <<"Dimensions: "<< (int)temp->Width << " x " << (int)temp->Height << endl; cout <<"Depth: " << (int)temp->ColorCount << endl; cout <<"Reserved: " << (int)temp->Reserved << endl; cout <<"Bit count: " << (int)temp->BitCount<< endl; cout <<"Byte count: " << (int)temp->DataSize<< endl; cout <<"Offset: " << (int) temp->DataOffset << endl; cout << endl; } } void Extract(void* temp) { byte* out = (byte*) temp; IconDirEntry* icon = _iconList[_bestImage]; memcpy (out, _bestImagePtr, icon->DataSize-sizeof(DibHeader)); } count_t GetBestImageSize() { return _bestImageSize; } Dimensions GetDimensions() { return _bestImageDimensions; } bool IsValid() { if (_bestImageDepth == 32 && _isValid) return true; return false; } private: byte* _file; byte* _bestImagePtr; index_t _bestImage; count_t _bestImageSize; count_t _bestImageDepth; Dimensions _bestImageDimensions; bool _isValid; IconHeader* _header; vector _iconList; bool IsSquare(IconDirEntry* in_icon) { if (!in_icon || in_icon->Height != in_icon->Width) return false; return true; } void FindBestImage() { size_t HighestResolution = 0; size_t HighestColorDepth = 0; index_t CurrentWinner = 0; if (_iconList.size() == 0) { _isValid = false; return; } for (count_t i = 0; i < _iconList.size(); i++) { IconDirEntry* temp = _iconList[i]; if (temp->BitCount > HighestColorDepth && IsSquare(temp)) { // cout << "Replacing entry: " << CurrentWinner << " with " << i << endl; CurrentWinner = i; HighestResolution = temp->Width; HighestColorDepth = temp->BitCount; } if (temp->Width > HighestResolution && IsSquare(temp)) { if (temp->BitCount>= HighestColorDepth) { // cout << "Replacing entry: " << CurrentWinner << " with " << i << endl; CurrentWinner = i; HighestResolution = temp->Width; HighestColorDepth = temp->BitCount; } } } // cout << "Picked index: " << CurrentWinner << endl; _bestImage = CurrentWinner; _bestImageSize = (_iconList[_bestImage]->DataSize) - sizeof(DibHeader); // Get rid of the dib header its useless _bestImageDimensions.Width = (_iconList[_bestImage])->Width; _bestImageDimensions.Height = (_iconList[_bestImage])->Height; _bestImageDepth = (_iconList[_bestImage])->BitCount; _isValid = true; return; } void LowLevelExtract() { #ifdef QLIX_DEBUG cout << "Extracting with width: " << _bestImageDimensions.Width << " height: " << _bestImageDimensions.Height << endl; #endif _bestImagePtr = new byte[_bestImageSize]; byte tempPtr[_bestImageSize]; IconDirEntry* icon = _iconList[_bestImage]; memcpy (&tempPtr, _file + (icon->DataOffset + sizeof(DibHeader)), icon->DataSize-sizeof(DibHeader)); //now flip and store into _bestImagePtr; cout << "_bestImageDepth = " << _bestImageDepth << endl; int pxlsize = _bestImageDepth / 8; int row = _bestImageDimensions.Width; int j = row-1; for (count_t i =0; i < _bestImageDimensions.Height; i++) { byte* tempRow = (byte*) (&tempPtr) + (i*row*pxlsize); byte* lastRow = _bestImagePtr + (j*row* pxlsize); memcpy(lastRow, tempRow, row*pxlsize); j--; } } }; #endif qlix-0.2.6/mtp/MtpObject.cpp0000644000175000017500000004335611050625206013773 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. TODO error checkking when returning char* ? TODO use multimap for track/file distinction */ #include "mtp/MtpObject.h" using namespace MTP; namespace MTP { /** Creates a new GenericObject, a generic base class for MTP objects * @param in_type the MTP type of the new GenericObject to be created * @return a new GenericObject */ GenericObject::GenericObject(MtpObjectType in_type, uint32_t id) : _type(in_type), _id(id) { } GenericObject::~GenericObject() {} /** * @return the ID of this object */ count_t GenericObject::ID() const { return _id; } /** * Sets the ID of this object */ void GenericObject::SetID( count_t in_id) { _id = in_id; } /** * Simple function to get the type of the current MTP object * @return returns the type of the GenericObject */ MtpObjectType GenericObject::Type() const { return _type; } /** * @return the name of this object */ const char* const GenericObject::Name() const { return ""; } /** * Creates a new GenericFileObject, a generic base class for File MTP objects * That are crosslinked with each other * @param in_type the MTP type of the new GenericObject to be created * @return a new GenericObject */ GenericFileObject::GenericFileObject(MtpObjectType in_type, uint32_t in_id) : GenericObject(in_type, in_id), _association(NULL) {} /** * Sets the objects file association, a file cannot be associated with another * file * @param in_obj the object to associate this object with */ void GenericFileObject::Associate(GenericFileObject* in_obj) { if (Type() == MtpFile) assert(in_obj->Type() != MtpFile); //assert that we don't call this function twice on the same object assert(!_association); _association = in_obj; } /** * Retreives the file associated with this album */ GenericFileObject* GenericFileObject::Association() const { return _association; } /** Creates a new Track object * @param in_track A pointer to the LIBMTP_track_t to wrap over * @return a new Track object */ Track::Track(LIBMTP_track_t* in_track) : GenericFileObject(MtpTrack, in_track->item_id), _parentAlbum (NULL), _parentPlaylist(NULL) { assert(in_track); _rawTrack = in_track; } /** * @return the visual row index for this track * */ count_t Track::GetRowIndex() const { return _rowIndex; } /** * Sets the visual row index for this track * */ void Track::SetRowIndex(count_t in_row) { _rowIndex = in_row; } /** Retreives the name of the wrapped Track * @return the tracks's UTF8 name */ char const * const Track::Name() const { return _rawTrack->title; } /** Retreives the name of the wrapped Album * @return the album's UTF8 name */ char const * const Track::AlbumName() const { return _rawTrack->album; } /** Returns the raw track that this object wraps around * @return the raw track; */ LIBMTP_track_t* const Track::RawTrack() const { return _rawTrack; } /** Retreives the file name of the wrapped Track * @return the tracks's UTF8 name */ char const * const Track::FileName() const { return _rawTrack->filename; } /** Retreives the Artist name of the wrapped Track * @return the tracks's UTF8 name */ char const * const Track::ArtistName() const { return _rawTrack->artist; } /** Retreives the genre of the wrapped Track * @return the tracks's UTF8 name */ char const * const Track::Genre() const { return _rawTrack->genre; } /** Returns the parent id of this track * @return the parent id of this track */ count_t Track::ParentFolderID() const { return _rawTrack->parent_id; } /** Sets the parent album of this track * @param in_album the parent album of this track */ void Track::SetParentAlbum(Album* in_album) {_parentAlbum = in_album; } /** Sets the parent playlist of this track * @param in_pl the parent playlist of this track */ void Track::SetParentPlaylist(Playlist* in_pl) {_parentPlaylist = in_pl; } /** Returns the parent Album of this track * @return the parent Album of this track */ Album* Track::ParentAlbum() const { return _parentAlbum; } /** Returns the parent Playlist of this track * @return the parent Playlist of this track */ Playlist* Track::ParentPlaylist() const { return _parentPlaylist; } /** Creates a new File object and and stores its representative data * @param in_file A pointer to the LIBMTP_file_to wrap over * @param in_sample A pointer to the LIBMTP_filesampledata_t * @return a new File object */ File::File(LIBMTP_file_t* in_file) : GenericFileObject(MtpFile, in_file->item_id) { _rawFile = in_file; } /** * Retreives the file's parent ID * @return the file's parent ID it is zero if its in the root folder */ count_t File::ParentID() const { return _rawFile->parent_id; } /** * Retreives the file's parent Folder * @return the file's parent Folder or NULL if it exists in the root dir */ Folder* File::ParentFolder() const { return _parent; } /** * Sets the file's parent Folder */ void File::SetParentFolder(Folder* in_parent) { _parent = in_parent; } /* * Returns the row index of this file */ count_t File::GetRowIndex() const { return _rowIndex; } /* * Returns the row index of this file */ void File::SetRowIndex(count_t in_idx) { _rowIndex = in_idx; } /** * Returns the name of the file * @return The name of the file as a Utf8 string */ char const * const File::Name() const { //TODO error checking here? // no, this should be the caller's duty return _rawFile->filename; } /** Returns the raw file that this object wraps around * @return the raw file; */ LIBMTP_file_t* const File::RawFile() const { return _rawFile; } /** Creates a new Folder object * @param in_folder A pointer to the LIBMTP_folder_t wrap over * @param in_parent A pointer to this folder's parent * @return a new Folder object */ Folder::Folder(LIBMTP_folder_t* in_folder, Folder* in_parent) : GenericObject (MtpFolder, in_folder->folder_id) { assert(in_folder); // cout << "Creating new folder " << in_folder->name << " with id:" << ID() << endl; _rawFolder = in_folder; _parent = in_parent; } /** * Return's this folder's parent * @return the folder's parent */ Folder* Folder::ParentFolder() const { return _parent; } /** * Get the raw LIBMTP folder * @return the raw LIBMTP folder for this Folder object */ LIBMTP_folder_t* Folder::RawFolder() const { return _rawFolder; } /** * Returns the subfolder at the given index if it exists. * @return the subfolder at the given index or NULL if it doesn't exist */ Folder* Folder::ChildFolder(count_t idx) const { if (idx >= _childFolders.size()) { cerr << "Requesting invalid child index for folder" << endl; return NULL; } else return _childFolders[idx]; } /** * Returns the subfolder at the given index if it exists. * @return the subfolder at the given index or NULL if it doesn't exist */ File* Folder::ChildFile(count_t idx) const { if (idx >= _childFiles.size()) return NULL; else return _childFiles[idx]; } /** * Returns the number of files under this folder * @return the number of files under this folder */ count_t Folder::FileCount() const { return _childFiles.size(); } /** * @return the number of folders under this folder */ count_t Folder::FolderCount() const { return _childFolders.size(); } /** Retreives the name of the wrapped folder or "" if it doesn't exist * @return the folder's UTF8 name or a blank string if it doesn't exist */ char const* const Folder::Name() const { if (!_rawFolder) return ""; else return _rawFolder->name; } /** Adds the passed folder as a subdirectory to this folder * @param in_folder the folder to add as a subfolder of this folder */ void Folder::AddChildFolder(Folder* in_folder) { _childFolders.push_back(in_folder); } /** Adds the passed file as a leaf file of this * @param in_file the file to add as a leaf of this folder */ void Folder::AddChildFile(File* in_file) { _childFiles.push_back(in_file); } void Folder::RemoveChildFolder(Folder* in_folder) { vector::iterator iter = _childFolders.begin(); count_t i = 0; for (; iter != _childFolders.end() && i < in_folder->GetRowIndex(); i++) { iter++; } if (i != in_folder->GetRowIndex()) { cerr << "Deletion error: in_folder row index:" << in_folder->GetRowIndex() << " child folder count: " << _childFolders.size() << endl; assert(false); } _childFolders.erase(iter); return; } void Folder::RemoveChildFile(File* in_file) { vector::iterator iter = _childFiles.begin(); count_t i = 0; for (; iter != _childFiles.end() && i < in_file->GetRowIndex(); i++) { iter++; } if (i != in_file->GetRowIndex()) { cerr << "Deletion error: in_file row index:" << in_file->GetRowIndex() << " child file count: " << _childFiles.size() << endl; assert(false); } _childFiles.erase(iter); return; } /** * @return the visual row index for this folder * */ count_t Folder::GetRowIndex() const { return _rowIndex; } /** * Sets the visual row index for this folder * @param in_row the new row of this folder * */ void Folder::SetRowIndex(count_t in_row) { _rowIndex = in_row; } /** Creates a new Album object * @param in_album A pointer to the LIBMTP_album_t wrap over * @return a new Album object */ Album::Album(LIBMTP_album_t* in_album, const LIBMTP_filesampledata_t & in_sample) : GenericFileObject(MtpAlbum, in_album->album_id), _sample(in_sample) { assert(in_album); _rawAlbum = in_album; _initialized = false; } /** * This function sets the representative sample of the album to the passed * param * @param in_sample the sample that will be set for this album */ void Album::SetCover(LIBMTP_filesampledata_t const * in_sample) { _sample = *in_sample; } /** Returns the sample data for the album * @return a reference to the LIBMTP_sampledata_t that was pulled from * the device */ const LIBMTP_filesampledata_t& Album::SampleData() const { return _sample; } /** Adds the passed track as a subtrack to this album * The caller must ensure that the album is then updated on the device * If the gui is adding a track, you must first add the track to the raw * folder before adding it to the wrapper * @param in_track the track to add as a subtrack to this folder */ void Album::AddTrack(Track* in_track) { in_track->SetParentAlbum(this); //row index is not _childTracks.size() +1 as it is zero based.. in_track->SetRowIndex( _childTracks.size()); _childTracks.push_back(in_track); } /** Adds the passed track as a subtrack to the raw album of this object only * The caller must ensure that the album is then updated on the device * The reason this is split phase is so that we can update the device before * we update the view * @param in_track the track to add as a subtrack to this folder */ void Album::AddTrackToRawAlbum(Track* in_track) { count_t trackCount = _rawAlbum->no_tracks; count_t* tracks = new count_t[trackCount+1]; for (count_t i =0; i < trackCount; i++) tracks[i] = _rawAlbum->tracks[i]; tracks[trackCount] = in_track->ID(); _rawAlbum->no_tracks = trackCount +1; //LIBMTP does this automatically for us.. //delete [] _rawAlbum->tracks; _rawAlbum->tracks = tracks; } /* @return the RawAlbum that this object wraps over*/ LIBMTP_album_t const* Album::RawAlbum() { return _rawAlbum; } /** Removes the track at the given index of the album. * The caller must ensure that the album is then updated on the device * @param in_index the track to remove * @param updateInternalStruct condition whether or not to update the * structure on the device */ void Album::RemoveTrack(count_t in_index) { if (in_index > _childTracks.size()) return; // cout << "before removal album size: " << _childTracks.size() << endl; Track* deletedTrack = _childTracks[in_index]; vector::iterator iter = _childTracks.begin(); vector::iterator backup_iter; int i =0; while (*iter != deletedTrack) { i++; iter++; assert(iter != _childTracks.end()); } // cout << "Iterator found index at: " << i << " vs " << in_index << endl; backup_iter = iter +1; //Ensure that objects below this object have the correct index while (backup_iter != _childTracks.end()) { Track* currentTrack = (*backup_iter); int prevIdx = (*backup_iter)->GetRowIndex( ); assert(prevIdx != 0); (*backup_iter)->SetRowIndex( (*backup_iter)->GetRowIndex() -1); backup_iter++; } assert(*iter == deletedTrack); _childTracks.erase(iter); delete deletedTrack; // cout << "after removal album size: " << TrackCount() << endl; } void Album::RemoveFromRawAlbum(count_t index) { count_t trackCount = _rawAlbum->no_tracks; count_t* tracks = NULL; if (trackCount-1 > 0) tracks = new count_t[trackCount-1]; for (count_t i =0; i < index; i++) { tracks[i] = _rawAlbum->tracks[i]; } for (count_t i = index+1; i < trackCount; i++) { tracks[i-1] = _rawAlbum->tracks[i]; } _rawAlbum->no_tracks = trackCount -1; // delete [] _rawAlbum->tracks; _rawAlbum->tracks = tracks; } /** Retreives the name of the wrapped Album * @return the album's UTF8 name */ char const * const Album::Name() const { return _rawAlbum->name; } /** * Retreives the artist name of the wrapped Album * @return the albums's artist name in UTF8 */ char const * const Album::ArtistName() const { cout << "Artist: " << _rawAlbum->artist << endl; return _rawAlbum->artist; } /** * Albums are container objects that hold a list of tracks that * reside underneath them * @return the track count under this album */ count_t Album::TrackCount() const { if (!_initialized) return _rawAlbum->no_tracks; else return _childTracks.size(); } /** * Albums are container objects that hold a list of track IDs * @param idx the index of the requested track * @return the uint32_t track ID specified at the given index */ uint32_t Album::ChildTrackID(count_t idx) const { assert(idx < TrackCount()); return _rawAlbum->tracks[idx]; } /** * Albums are also container objects that hold a list of tracks that * reside underneath them * @param idx the index of the requested track * @return the Track* specified at the given index */ Track* Album::ChildTrack(count_t idx) const { assert(idx < _childTracks.size()); return _childTracks[idx]; } /** * The Initialized state tells us when to stop using the underlying * LIBMTP data structure as it might become stale. */ void Album::SetInitialized() { _initialized = true; } bool Album::Initialized() { return _initialized; } /** * @return the visual row index for this album * */ count_t Album::GetRowIndex() const { return _rowIndex; } /** * Sets the visual row index for this album * @param in_row the new row of this album * */ void Album::SetRowIndex(count_t in_row) { _rowIndex = in_row; } /** Creates a new Playlist object * @param in_pl t pointer to the LIBMTP_playlist_t wrap over * @return a new Playlist object */ Playlist::Playlist(LIBMTP_playlist_t* in_pl) : GenericFileObject(MtpPlaylist, in_pl->playlist_id) { _initialized = false; _rawPlaylist = in_pl; } /** Returns the name of this Playlist * @return the name of this playlist; */ char const * const Playlist::Name() const { return _rawPlaylist->name; } /** Adds a track to the list of child tracks * @param in_track the pointer to the child track to add */ void Playlist::AddTrack(Track* in_track) { _childTracks.push_back(in_track); in_track->SetParentPlaylist(this); } /** Returns the child track at the given index * @param idx the index of the child track in the Playlists vector * @return the child tradck at the given index or null if it doesn't exist */ Track* Playlist::ChildTrack(count_t idx) const { if (idx >= _childTracks.size()) return NULL; return _childTracks[idx]; } /** * Playlists are also container objects that hold a list of tracks that * reside underneath them * @return the number of tracks underneath this playlist */ count_t Playlist::TrackCount() const { if (!_initialized) return _rawPlaylist->no_tracks; else return _childTracks.size(); } /** * Playlists are container objects that hold a list of track IDs * @param idx the index of the requested track id * @return the uint32_t track ID specified at the given index */ //there is a serious bug here if the trackcount is off from the underlying obj uint32_t Playlist::ChildTrackID(count_t idx) const { assert(idx < TrackCount()); return _rawPlaylist->tracks[idx]; } /** * The Initialized state tells us when to stop using the underlying * LIBMTP data structure as it might become stale. */ void Playlist::SetInitialized() { _initialized = true; } /** * @return the visual row index for this playlist * */ count_t Playlist::GetRowIndex() const { return _rowIndex; } /** * Sets the visual row index for this playlist * @param in_row the new row of this playlist * */ void Playlist::SetRowIndex(count_t in_row) { _rowIndex = in_row; } } qlix-0.2.6/mtp/MtpDevice.h0000644000175000017500000001211311050625206013414 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MTPDEVICE #define MTPDEVICE #include #include #include #include //Taglib includes #include #include #include "types.h" #include "mtp/MtpObject.h" #include "mtp/MtpStorage.h" using namespace std; typedef map GenericMap; typedef map FolderMap; typedef map FileMap; typedef map TrackMap; typedef map AlbumMap; typedef map PlaylistMap; /** * @class MtpDevice is a wrapper class around libmtp's device module */ class MtpDevice { public: //Internal functions MtpDevice(LIBMTP_mtpdevice_t* in_); ~MtpDevice(); void Initialize(); void SetProgressFunction(LIBMTP_progressfunc_t, const void* const ); //basic device properties char const * const Name() const; char const * const SerialNumber() const; char const * const Version() const; char const * const SyncPartner() const; char const * const ModelName() const; bool BatteryLevelSupport() const; float BatteryLevel() const; unsigned int StorageDeviceCount() const; MtpStorage* StorageDevice(unsigned int) const; MTP::Folder* RootFolder() const; //basic actions bool Fetch(uint32_t, char const * const ); bool UpdateSpaceInformation(); void FreeSpace(unsigned int, uint64_t*, uint64_t*); PlaylistMap GetPlaylistMap () const; FolderMap GetFolderMap() const; TrackMap GetTrackMap() const; FileMap GetFileMap() const; AlbumMap GetAlbumMap() const; vector Albums() const; vector Playlists() const; /* MTP::File* const FindFile(count_t in_id) const; MTP::Folder* const FindFolder(count_t in_id) const; MTP::Album* const FindAlbum(count_t in_id) const; MTP::Playlist* const FindPlaylist(count_t in_id) const; MTP::Track* const FindTrack(count_t in_id) const; */ //Device structures information count_t AlbumCount() const; count_t PlaylistCount() const; MTP::Album* Album(count_t idx) const; MTP::Playlist* Playlist(count_t idx) const; MTP::Folder* RootFolder(count_t idx) const; //Album functions bool NewAlbum(MTP::Track*, int, MTP::Album** ); bool RemoveAlbum(MTP::Album*); //Extended Album functions bool UpdateAlbumArt(MTP::Album*, LIBMTP_filesampledata_t*); void AddAlbum(MTP::Album*); // Track/Album bool AddTrackToAlbum(MTP::Track*, MTP::Album*); bool RemoveTrackFromAlbum(MTP::Track*, MTP::Album*); //Track/Playlist functions bool AddTrackToPlaylist(MTP::Track*, MTP::Playlist*); bool RemoveTrackFromPlaylist(MTP::Track*, MTP::Playlist*); //Extended Track functions bool RemoveTrack(MTP::Track*); bool TransferTrack(const char*, MTP::Track*); //Extended File functions bool RemoveFile(MTP::File*); bool TransferFile(const char*, MTP::File*); //Extended Folder functions bool NewFolder(MTP::Folder*); bool RemoveFolder(MTP::Folder*); LIBMTP_filesampledata_t* DefaultJPEGSample(); private: LIBMTP_mtpdevice_t* RawDevice() const; MTP::GenericObject* const find(count_t in_id, MtpObjectType type) const; LIBMTP_mtpdevice_t* _device; bool _initialized; char* _name; char* _serialNumber; char* _version; char* _syncPartner; char* _modelName; count_t _maxBatteryLevel; count_t _currentBatteryLevel; bool _batteryLevelSupport; bool removeObject(count_t); MTP::Folder* _rootFolder; LIBMTP_progressfunc_t _progressFunc; const void* _progressData; GenericMap _objectMap; TrackMap _trackMap; AlbumMap _albumMap; PlaylistMap _playlistMap; FileMap _fileMap; FolderMap _folderMap; vector _storageDeviceList; vector _errorStack; vector _supportedFileTypes; vector _rootFolders; vector _rootFiles; //These are used to display specific views of the device vector _tracks; vector _albums; vector _playlists; //Container structure functions void createObjectStructure(); void createFolderStructure(MTP::Folder*, bool); void createFileStructure(); void createTrackBasedStructures(); //Error Functions void processErrorStack(); //Debug functions void dbgPrintSupportedFileTypes(); void dbgPrintFolders(MTP::Folder*, count_t); }; #endif qlix-0.2.6/mtp/MtpDevice.cpp0000644000175000017500000007613211050625206013762 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. TODO Improve error handling / Reporting (once theres an error console) TODO Add InsanePlaylist, InsaneAlbums flags that allows us to avoid the assertions made WRT necessary MTP file associations with all other types TODO Should raw object references returns be of const types? No this is a bad idea as sending files updates the file id we discover TODO Storage IDs are not correctly handled- recheck this- it should be fixed TODO Add autocleanup of broken playlists and albums TODO Remove rootFolders crap TODO Implement NewFolder and RemoveFolder TODO When a file transfer is complete the libmtp struct may have new information this information needs to get propogated up the c++ structs */ #include "MtpDevice.h" //#define SIMULATE_TRANSFERS /** * Creates a MtpDevice * @param in_device The raw LIBMtp device * @return Returns the requested device */ MtpDevice::MtpDevice(LIBMTP_mtpdevice_t* in_device) : _initialized(false), _rootFolder(NULL) { _device = in_device; _serialNumber = LIBMTP_Get_Serialnumber(_device); UpdateSpaceInformation(); } /** * Deletes allocated objects */ MtpDevice::~MtpDevice() { if (_name) { delete _name; _name = NULL; } if (_serialNumber) { delete _serialNumber; _serialNumber = NULL; } if (_version) { delete _version; _version = NULL; } if (_syncPartner) { delete _syncPartner; _syncPartner = NULL; } if (_modelName) { delete _modelName; _modelName = NULL; } } /** * Initializes the MtpDevice and creates an internal tree structure for all * MTP objects */ void MtpDevice::Initialize() { if (!_device) return; assert(_initialized== false); _initialized = true; // _progressFunc= NULL; _name = LIBMTP_Get_Friendlyname(_device); if (!_name) _name=strdup("MTP Device"); _version = LIBMTP_Get_Deviceversion(_device); _syncPartner= LIBMTP_Get_Syncpartner(_device); _modelName = LIBMTP_Get_Modelname(_device); uint8_t max; uint8_t cur; int ret = LIBMTP_Get_Batterylevel(_device, &max, &cur); if (ret != 0) _batteryLevelSupport = false; _maxBatteryLevel = max; _currentBatteryLevel = cur; ret = 0; uint16_t count = 0; uint16_t* types; ret = LIBMTP_Get_Supported_Filetypes(_device, &types, &count); if (ret == 0) { for (count_t i =0; i < count; i++) { char const* str; str = LIBMTP_Get_Filetype_Description( (LIBMTP_filetype_t)types[i] ); string s(str); _supportedFileTypes.push_back(s); } } if (types) free(types); createObjectStructure(); UpdateSpaceInformation(); } /** * Returns the total and free space on the requested storage device * @param in_ID the storage ID of the storage device * @param total the total amount of space on the device * @param free the amount of free space on the device */ void MtpDevice::FreeSpace(unsigned int in_ID, uint64_t* out_total, uint64_t* out_free) { for (unsigned int i =0; i < _storageDeviceList.size(); i++) { if (_storageDeviceList[i]->ID() == in_ID) { MtpStorage* storage_dev = _storageDeviceList[i]; cout << "Storage reporting: " << storage_dev->TotalSpace() << " and " << storage_dev->FreeSpace() << endl;; *out_total = storage_dev->TotalSpace(); *out_free = storage_dev->FreeSpace(); return; } } *out_total = 0; *out_free = 0; } PlaylistMap MtpDevice::GetPlaylistMap () const { return _playlistMap; } FolderMap MtpDevice::GetFolderMap() const { return _folderMap; } FileMap MtpDevice::GetFileMap () const { return _fileMap; } TrackMap MtpDevice::GetTrackMap () const { return _trackMap; } AlbumMap MtpDevice::GetAlbumMap () const { return _albumMap; } vector MtpDevice::Albums() const { return _albums; } vector MtpDevice::Playlists() const { return _playlists; } /** * @return the Folder at the given index or NULL if it is out of bounds */ MTP::Folder* MtpDevice::RootFolder(count_t idx) const { if (idx > _rootFolders.size() ) return NULL; return _rootFolders[idx]; } /** * @return the number of albums on the device */ count_t MtpDevice::AlbumCount() const { return _albums.size(); } /** * @return the number of playlists on the device */ count_t MtpDevice::PlaylistCount() const { return _playlists.size(); } /** * @return the Album at the given index or NULL if it is out of bounds */ MTP::Album* MtpDevice::Album(count_t idx) const { if (idx > _albums.size() ) return NULL; return _albums[idx]; } /** * @return the Playlist at the given index or NULL if it is out of bounds */ MTP::Playlist* MtpDevice::Playlist(count_t idx) const { if (idx > _playlists.size() ) return NULL; return _playlists[idx]; } /** * Retrieves the object to the specificed path * @param in_id the item id of the requested Mtp object * @param path the path to retreive to * @return true if the fetch was successfull or false otherwise */ bool MtpDevice::Fetch(uint32_t in_id, char const * const path) { if (!_device) return false; //TODO get error log int ret= LIBMTP_Get_File_To_File(_device, in_id, path, _progressFunc, _progressData); if (ret != 0) { processErrorStack(); return false; } return true; } /** * @return the name of the device as a UTF8 string */ char const * const MtpDevice::Name() const { return _name; } /** * @return Returns the device serial number as a UTF8 string * This is mostly used for quickly connecting to a default device */ char const * const MtpDevice::SerialNumber() const { return _serialNumber; } /** * @return the version of the device as a UTF8 string */ char const * const MtpDevice::Version() const { return _version; } /** * @return the sync partner of the device as a UTF8 string */ char const * const MtpDevice::SyncPartner() const { return _syncPartner; } /** * @return the model name of the device as a UTF8 string */ char const * const MtpDevice::ModelName() const { return _modelName; } /** * @return whether retreiveing the battery level failed */ bool MtpDevice::BatteryLevelSupport() const { return _batteryLevelSupport; } /** * @return the percentage of charge the battery holds */ float MtpDevice::BatteryLevel() const { float ret = (float) ((float)_maxBatteryLevel / (float)_currentBatteryLevel); return ret; } /** * @return the number of storage devices associated with this device */ unsigned int MtpDevice::StorageDeviceCount() const { return _storageDeviceList.size(); } /** * @return the faked root folder for this device */ MTP::Folder* MtpDevice::RootFolder() const { return _rootFolder; } /** * @param in_idx the index of storage device * @return the requested storage device */ MtpStorage* MtpDevice::StorageDevice(unsigned int in_idx) const { if (in_idx > _storageDeviceList.size()) return NULL; else return _storageDeviceList[in_idx]; } /** * Gets the device's error stack and runs over each error to store its text * internally and then clears the device's error stack */ void MtpDevice::processErrorStack() { if (!_device) return; LIBMTP_error_t* es = LIBMTP_Get_Errorstack(_device); while (es) { string s(es->error_text); _errorStack.push_back(s); es = es->next; cout << "Qlix MTP ERROR: " << s << endl; } LIBMTP_Clear_Errorstack(_device); } /** * Sets the callback progress function for operations with the MTP device * @param in_func the callback function to invoke during MTP operations * @param in_data a pointer to an object that will be used to update the * of the GUI */ void MtpDevice::SetProgressFunction(LIBMTP_progressfunc_t in_func, const void* const in_data) { _progressData = in_data; _progressFunc = in_func; } /** * Retrieves Tracks, Files and Albums and Folders form the devices and creates * a tree, storing each object's ID in its respective map */ void MtpDevice::createObjectStructure() { if (!_device) return; //create container structures first.. createFolderStructure(NULL, true); createFileStructure(); createTrackBasedStructures(); #ifdef QLIX_DEBUG //dbgPrintSupportedFileTypes(); //dbgPrintFolders(NULL, 0); #endif } /* * Returns the raw device that this object abstracts over * @return the raw device */ LIBMTP_mtpdevice_t* MtpDevice::RawDevice() const { return _device; } /** * This function adds an album to the virtual album list * It is mostly supposed to be used by async calls from the GUI when it is * ready for such a fundamental change to occur in the structure. */ void MtpDevice::AddAlbum(MTP::Album* in) { in->SetRowIndex(_albums.size()); _albums.push_back(in); } /** * Recursively builds the folder structure * @param in_root the root folder on the device * @param firstRun whether to retreive a fresh list of folders from the device */ void MtpDevice::createFolderStructure(MTP::Folder* in_root, bool firstRun) { if (!_device) return; vector curLevelFolders; LIBMTP_folder_t* rootFolder; if (!in_root && firstRun) { rootFolder= LIBMTP_Get_Folder_List(_device); LIBMTP_folder_t* fakeRoot = LIBMTP_new_folder_t(); fakeRoot->folder_id = 0; fakeRoot->parent_id = 0; fakeRoot->name = strdup(_name); fakeRoot->sibling= NULL; fakeRoot->child = rootFolder; rootFolder = fakeRoot; } else rootFolder = in_root->RawFolder()->child; while (rootFolder) { //if there is a parent, set the new folder's parent. And add to the //parent's childlist MTP::Folder* currentFolder; if(in_root) { currentFolder = new MTP::Folder(rootFolder, in_root); currentFolder->SetRowIndex(in_root->FolderCount()); in_root->AddChildFolder(currentFolder); } else //else set the child's parent to NULL indicating its at the root { assert(_rootFolder ==NULL); currentFolder = new MTP::Folder(rootFolder, NULL); //set the row index first as it is zero based currentFolder->SetRowIndex(0); //set the root folder _rootFolder = currentFolder; } //add this folder to the list of folders at this level curLevelFolders.push_back(currentFolder); //find MTP::Folder* const previous = (MTP::Folder*) (find(currentFolder->ID(), MtpFolder)); if(previous) { cerr << "Folder crosslinked with another folder please file a bug report at: " << "caffein@gmail.com" << endl; cerr << " Previous folder's name: " << previous->Name() << endl; cerr << " New file's name: " << currentFolder->Name() << endl; assert(false); } _folderMap[currentFolder->ID()] = currentFolder; rootFolder = rootFolder->sibling; } for (count_t i =0; i < curLevelFolders.size(); i++) createFolderStructure(curLevelFolders[i], false); } /** * Prints the file types supported by this device */ void MtpDevice::dbgPrintSupportedFileTypes() { cout << "Supported file types: "; if (_supportedFileTypes.size() == 0) cout << "none!"; cout << endl; for (count_t i =0; i < _supportedFileTypes.size(); i++) cout << _supportedFileTypes[i] << endl; } /** * Recursively prints the folders discovered * @param root the current level's root folder * @param level the current depth of the traversal used for ASCII alignment */ void MtpDevice::dbgPrintFolders(MTP::Folder* root, count_t level) { if (root == NULL) { for (count_t i =0; i < _rootFolders.size(); i++) { cout << _rootFolders[i]->Name() << endl; dbgPrintFolders(_rootFolders[i], 1); } return; } for (count_t i = 0; i < root->FolderCount(); i++) { for (count_t j = 0; j < level; j++) cout << " "; MTP::Folder* temp = root->ChildFolder(i); cout << temp->Name() << endl; dbgPrintFolders(temp, level+1); } } /** * Get the file list and iterate over and add them to their parent folder * This function must be called after createFolderStructure */ void MtpDevice::createFileStructure() { LIBMTP_file_t* fileRoot = LIBMTP_Get_Filelisting_With_Callback(_device, NULL, NULL); while (fileRoot) { MTP::File* currentFile = new MTP::File(fileRoot); cout << "Created file: " << currentFile << endl; //Sanity check: find previous instances for crosslinks MTP::File* prev_file = (MTP::File*) find(currentFile->ID(), MtpFile); //crosslink check if(prev_file) { cerr << "File crosslinked with another file please file a bug report at: " << "caffein@gmail.com" << endl; cerr << " Previous file's name: " << prev_file->Name() << endl; cerr << " New file's name: " << currentFile->Name() << endl; assert(false); } _fileMap[currentFile->ID()] = currentFile; MTP::Folder* const parentFolder= (MTP::Folder*) find(currentFile->ParentID(), MtpFolder); if(! parentFolder) { cerr << "Database corruption. Parent folder for file:" << currentFile->ID() << " which has ID: " << currentFile->ParentID() << " was not discovered" << endl; assert(false); } currentFile->SetRowIndex(parentFolder->FileCount()); parentFolder->AddChildFile(currentFile); if (parentFolder->ID() == 0) cout << "Added new child folder to root, now file count: " << parentFolder->FileCount() << endl; currentFile->SetParentFolder(parentFolder); //move on to the next file fileRoot = fileRoot->next; } } /** * Retreives the album and track list then Iterates over all the Albums and * their tracks. Each track is looked up in the object map and added to the * Album's list of child tracks */ void MtpDevice::createTrackBasedStructures() { LIBMTP_album_t* albumRoot= LIBMTP_Get_Album_List(_device); LIBMTP_track_t* trackRoot = LIBMTP_Get_Tracklisting_With_Callback(_device, NULL, NULL); LIBMTP_playlist_t* playlistRoot = LIBMTP_Get_Playlist_List(_device); //create the wrapper tracks while (trackRoot) { MTP::Track* currentTrack = new MTP::Track(trackRoot); cout <<"Creating track: " << currentTrack << endl; cout << "Inserting track with ID: " << currentTrack->ID() << endl; MTP::Track * prev_track = (MTP::Track*) find(currentTrack->ID(), MtpTrack); MTP::File * previousFile = (MTP::File*) find(currentTrack->ID(), MtpFile); //ensure that there exists a file association if(!previousFile || previousFile->ID() != currentTrack->ID()) { cerr << "Qlix internal database corruption! please report this to: " << "caffein@gmail.com as this is a fairly serious error!" << endl; assert(false); } //crosslink check with previous tracks if (prev_track) { cerr << "Track crosslinked with another track! Please report this to" << "caffein@gmail.com" << endl; cerr << "Previous tracks's name: " << prev_track->Name() << endl; cerr << "New track's name: " << currentTrack->Name() << endl; assert(false); } //now crossreference the track with the file and the file with the track previousFile->Associate(currentTrack); currentTrack->Associate(previousFile); cout <<"Track:" << currentTrack << " associated with file: " << previousFile<< endl; cout <<"File:" << previousFile << " associated with Track: " << currentTrack <ID()]; if (previousTrack) { cerr << "Track crosslinked with another track! please report this to " <<" caffein@gmail.com"<< endl; assert(false); } _trackMap[currentTrack->ID()] = currentTrack; trackRoot = trackRoot->next; } //create the wrapper albums and add its child tracks while (albumRoot) { LIBMTP_filesampledata_t temp; LIBMTP_Get_Representative_Sample(_device, albumRoot->album_id, &temp); #ifdef QLIX_DEBUG cout << "Discovered a sample of type: " << temp.filetype << " with height: " << temp.height << " and width: " << temp.width << " with size: " << temp.size << endl; #endif MTP::Album* currentAlbum = new MTP::Album(albumRoot, temp); currentAlbum->SetRowIndex( _albums.size()); _albums.push_back(currentAlbum); MTP::Album * const prev_album = (MTP::Album*) find(currentAlbum->ID(), MtpAlbum); MTP::File * const file_association = (MTP::File*) find(currentAlbum->ID(), MtpFile); //crosslink check with file database if(!file_association) { cerr << "Album not crosslinked with file as expected!" << " Please report this to caffein@gmail.com" << endl; cerr << "New album's name: " << currentAlbum->Name() << endl; assert(false); } //crosslink check with albums if (prev_album) { cerr << "Album crosslinked with another album! Please report this to" << "caffein@gmail.com" << endl; cerr << "Previous album's name: " << prev_album->Name() << endl; cerr << "New album's name: " << currentAlbum->Name() << endl; assert(false); } //now crossreference the album with the file and the file with the album file_association->Associate(currentAlbum); currentAlbum->Associate(file_association); _albumMap[currentAlbum->ID()] = currentAlbum; //now iterate over the albums's children.. for (count_t j = 0; j < currentAlbum->TrackCount(); j++) { uint32_t track_id = currentAlbum->ChildTrackID(j); //sanity check //This is not a const * const as it will be modified once its added MTP::Track * const track = (MTP::Track*) find(track_id, MtpTrack); if(!track) { cerr << "Current track: " << track_id << " does not exist.. skipping" << " this usually happens when MTP programs do not remove files " << " correctly" << endl; //TODO add an autocorrect option here //report this to caffein@gmail.com" << endl; //assert(false); continue; } currentAlbum->AddTrack(track); } currentAlbum->SetInitialized(); albumRoot = albumRoot->next; } while(playlistRoot) { MTP::Playlist* currentPlaylist = new MTP::Playlist(playlistRoot); //set the row index first, as it is zero based currentPlaylist->SetRowIndex(_playlists.size()); _playlists.push_back(currentPlaylist); MTP::Playlist* prev_playlist= (MTP::Playlist*) find(currentPlaylist->ID(), MtpPlaylist); MTP::File* file_association= (MTP::File*) find(currentPlaylist->ID(), MtpFile); //crosslink check with file database if (file_association) { cerr << "Playlist not crosslinked with file as expected!" << " Please report this to caffein@gmail.com" << endl; assert(false); } //crosslink check with albums if (prev_playlist) { cerr << "Playlist crosslinked with another playlist! Please report this " << "to caffein@gmail.com" << endl; assert(false); } //now crossreference the playlist with the file //and crossreference the file with the playlist currentPlaylist->Associate(file_association); file_association->Associate(currentPlaylist); _playlistMap[currentPlaylist->ID()] = currentPlaylist; //now iterate over the playlist's children.. for (count_t j = 0; j < currentPlaylist->TrackCount(); j++) { uint32_t track_id = currentPlaylist->ChildTrackID(j); //sanity check MTP::Track const * const track = (MTP::Track*) find(track_id, MtpTrack); if (!track) { cerr << "Current track: " << track_id << "belongs to a playlist but" << " does not exist on the device. This usually happens when" << " faulty MTP programs delete items from the device." << " Please report this to caffein@gmail.com" << endl; assert(false); //TODO add an autocorrect option } currentPlaylist->AddTrack( (MTP::Track*) track ); } currentPlaylist->SetInitialized(); playlistRoot = playlistRoot->next; } } /** * Transfers a track to the device * @param in_path the path of the file to transfer * @param in_track the track metadata for this file * @return true if succesfull, false otherwise */ bool MtpDevice::TransferTrack(const char* in_path, MTP::Track* in_track) { cout << "Track's storage id: " << in_track->RawTrack()->storage_id << endl; #ifndef SIMULATE_TRANSFERS int ret = LIBMTP_Send_Track_From_File(_device, in_path, in_track->RawTrack(), _progressFunc, _progressData); if (ret != 0) { processErrorStack(); return false; } #endif //necessary due to stupid inheritence //TODO fix this? in_track->SetID(in_track->RawTrack()->item_id); cout << "Transfer succesfull, new id: " << in_track->ID() << endl; UpdateSpaceInformation(); return true; } /** * Transfers a file to the device * @param in_path the path of the file to transfer * @param in_file the metadata for the file * @return true if succesfull, false otherwise */ bool MtpDevice::TransferFile(const char* in_path, MTP::File* in_file) { int ret = LIBMTP_Send_File_From_File(_device, in_path, in_file->RawFile(), _progressFunc, _progressData); if (ret != 0) { processErrorStack(); return false; } UpdateSpaceInformation(); return true; } /** * This function updates the space usage information, it should be called at * every function call that could potentially change the space usage of the * device * @return true if successfully retreived, false otherwise */ bool MtpDevice::UpdateSpaceInformation() { if (!_device) return false; int ret = LIBMTP_Get_Storage(_device, LIBMTP_STORAGE_SORTBY_NOTSORTED); if (ret != 0) { processErrorStack(); return false; } for (count_t i =0; i < _storageDeviceList.size(); i++) { delete _storageDeviceList[i]; } _storageDeviceList.clear(); LIBMTP_devicestorage_t* storage_dev = _device->storage; while (storage_dev) { MtpStorage* new_storage = new MtpStorage(storage_dev); _storageDeviceList.push_back(new_storage); storage_dev = storage_dev->next; } return true; } /** * This function creates a new album on the device, using the information from * the track that is passed as a param. This function assumes that this * album's name is unique on the device. * The new album will be added to the album's list, be sure to notify any * models before hand * * @param in_track the track that is used as a template for the album's name, * artist, and genre fields. * @param in_storageID the storage id to create the album on * @param out_album the newly allocated MTP::Album, if the operation fails * this value is NULL * @return true if successfull false otherwise */ bool MtpDevice::NewAlbum(MTP::Track* in_track, int in_storageID, MTP::Album** out_album) { LIBMTP_album_t* newAlbum = LIBMTP_new_album_t(); newAlbum->name = strdup(in_track->AlbumName()); newAlbum->artist = strdup(in_track->ArtistName()); newAlbum->genre = strdup(in_track->Genre()); newAlbum->tracks = NULL; newAlbum->parent_id = 0; newAlbum->storage_id = in_storageID; cerr << "Created new album with name: " << newAlbum->name << endl; cerr << "Created new album with artist: " << newAlbum->artist << endl; cerr << "Created new album with genre: " << newAlbum->genre << endl; // *(newAlbum->tracks) = in_track->ID(); // cout << "Set the album's first track to: " << *(newAlbum->tracks) << endl; newAlbum->no_tracks = 0; newAlbum->next = NULL; #ifndef SIMULATE_TRANSFERS int ret = LIBMTP_Create_New_Album(_device, newAlbum); if (ret != 0) { (*out_album) = NULL; processErrorStack(); return false; } #endif UpdateSpaceInformation(); LIBMTP_filesampledata_t sample; sample.size = 0; sample.data = NULL; (*out_album) = new MTP::Album(newAlbum, sample); return true; } /** * This function updates the representative sample of album on the device * @param in_album the album whose art should be updated * @param in_sample the album art encased in a LIBMTP_filesampledata_t* struct * @return true if the operation succeeded, false otherwise */ bool MtpDevice::UpdateAlbumArt(MTP::Album* in_album, LIBMTP_filesampledata_t* in_sample) { int ret = LIBMTP_Send_Representative_Sample(_device, in_album->ID(), in_sample); if (ret != 0) { processErrorStack(); return false; } in_album->SetCover(in_sample); return true; } /** * This function retreives the default JPEG sample parameters from the device * This function assumes that libmtp is initialized * @return a preallocated LIBMTP_filesampledata_t* with sane values it is up to * the caller to call LIBMTP_delete_object to free up the memory */ //TODO is this safe when mtp is not initialized? LIBMTP_filesampledata_t* MtpDevice::DefaultJPEGSample() { if (!_device) return NULL; LIBMTP_filesampledata_t* sample; int ret = LIBMTP_Get_Representative_Sample_Format(_device, LIBMTP_FILETYPE_JPEG, &sample); if (ret != 0) { processErrorStack(); return NULL; } /* //device does not support JPEG samples.. if (ret == 0 && sample == NULL) { cerr << "Device does not support JPEG (proper) file type, checking for" <<" JPEG 2000 regular" << endl; ret = LIBMTP_Get_Representative_Sample_Format(_device, LIBMTP_FILETYPE_JP2, &sample); if (ret != 0) { processErrorStack(); return NULL; } } //device does not support JPEG 2000 samples.. if (ret == 0 && sample == NULL) { cerr << "Device does not support JPEG 2000 regular file type, checking" " for JPEG 2000 extended" << endl; ret = LIBMTP_Get_Representative_Sample_Format(_device, LIBMTP_FILETYPE_JPX, &sample); if (ret != 0) { processErrorStack(); return NULL; } } */ if(ret !=0) cerr << "Problem getting JPEG information from device" << endl; else if (ret == 0 && sample == NULL) cerr << "Device does not support JPEG filetype" << endl; else if (ret == 0 && sample != NULL) cerr << "Device supports JPEG filetype" << endl; return sample; } /** * This function adds the passed track to the album on the device by first * adding it to the raw track, syncing to the device and then adds the track * to the wrapper track. * @param in_track the track that is to be added to the parent album * @param in_album the parent album for this track * @return true if successfull false otherwise */ bool MtpDevice::AddTrackToAlbum(MTP::Track* in_track, MTP::Album* in_album) { in_album->SetInitialized(); in_album->AddTrackToRawAlbum(in_track); #ifndef SIMULATE_TRANSFERS int ret = LIBMTP_Update_Album(_device, in_album->RawAlbum()); if (ret != 0) { processErrorStack(); return false; } #endif return true; } /** * Removes a track from the device * @param in_track the track to remove */ bool MtpDevice::RemoveTrack(MTP::Track* in_track) { assert(in_track); MTP::Album* parentAlbum = in_track->ParentAlbum(); parentAlbum->SetInitialized(); parentAlbum->RemoveFromRawAlbum(in_track->GetRowIndex()); #ifndef SIMULATE_TRANSFERS int ret = LIBMTP_Update_Album(_device, parentAlbum->RawAlbum()); if (ret != 0) { processErrorStack(); return false; } // simulate transfers is kind of redundant here ret = removeObject(in_track->ID()); #endif return true; } /** * Removes an album from the device * @param in_album the album to remove */ bool MtpDevice::RemoveAlbum(MTP::Album* in_album) { assert(in_album); return removeObject(in_album->ID()); } /** * Removes a folder from the device * @param in_folder the folder to remove */ bool MtpDevice::RemoveFolder(MTP::Folder* in_folder) { assert(in_folder); return removeObject(in_folder->ID()); } /** * Private function that performs a search on a specific object mapping * Since MTP defines a protocol that crosslinks files with tracks, playlists, albums. * @param in_id the id of the requested crosslinked object * @param in_type the type of the requested crosslinked object * @return the requested associated object, or NULL for invalid types or * inconclusive searches */ MTP::GenericObject * const MtpDevice::find(count_t in_id, MtpObjectType in_type) const { switch(in_type) { case MtpTrack: { TrackMap::const_iterator iter = _trackMap.find(in_id); TrackMap::const_iterator iterEnd = _trackMap.end(); if(iterEnd == iter) return NULL; else return iter->second; } case MtpFile: { FileMap::const_iterator iter = _fileMap.find(in_id); FileMap::const_iterator iterEnd = _fileMap.end(); if(iterEnd == iter) return NULL; else return iter->second; } case MtpFolder: { FolderMap::const_iterator iter = _folderMap.find(in_id); FolderMap::const_iterator iterEnd = _folderMap.end(); if(iterEnd == iter) return NULL; else return iter->second; } case MtpAlbum: { AlbumMap::const_iterator iter = _albumMap.find(in_id); AlbumMap::const_iterator iterEnd = _albumMap.end(); if(iterEnd == iter) return NULL; else return iter->second; } case MtpPlaylist: { PlaylistMap::const_iterator iter = _playlistMap.find(in_id); PlaylistMap::const_iterator iterEnd = _playlistMap.end(); if(iterEnd == iter) return NULL; else return iter->second; } default: return NULL; } } /** * Creates a new folder on the device, and should update its object id * @param in_folder the folder to be created on the device */ bool MtpDevice::NewFolder(MTP::Folder* in_folder) { cout << "New Folder stub!" << endl; return true; } /** * Generic function to remove an object from the device * @param in_id the id of the object to be removed */ bool MtpDevice::removeObject(count_t in_id) { #ifndef SIMULATE_TRANSFERS bool ret = LIBMTP_Delete_Object(_device, in_id); if (ret != 0) { processErrorStack(); return false; } #endif return true; } qlix-0.2.6/mtp/BmpStructs.h0000644000175000017500000000447211050625206013653 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __STRUCTS__ #define __STRUCTS__ typedef char byte; typedef unsigned char ubyte; typedef unsigned int count_t; typedef unsigned short ushort; /* * @struct these structs are largely used by the DeviceIcon class * see also Icon. * Largely uncommented as it should be written as QImageDecoder */ struct Dimensions { count_t Width; count_t Height; }; struct IconHeader { short Reserved; short Type; ushort Count; }__attribute__ ((packed)); struct IconDirEntry { ubyte Width; ubyte Height; ubyte ColorCount; byte Reserved; short Planes; ushort BitCount; count_t DataSize; int DataOffset; }__attribute__ ((packed)); struct BmpFileHeader { unsigned short type; //2 unsigned int size; //4 ushort reserved1; //2 ushort reserved2; //2 unsigned int offset; //4 } __attribute__ ((packed)); struct DibHeader { int HeaderSize; //size of header int Width; int Height; short Planes; ushort BitCount; int Compression; int RawImageSize; int HRes; int VRes; int Colors; int ImportantColors; }__attribute__ ((packed)); struct PaletteEntry { byte Blue; byte Green; byte Red; byte Reserved; }__attribute__ ((packed)); struct Pixel { byte Blue; byte Green; byte Red; byte Alpha; }__attribute__ ((packed)); struct Image { Pixel image[128*128]; }__attribute__ ((packed)); struct MonochromeImage { byte image[128][128]; }__attribute__ ((packed)); #endif qlix-0.2.6/mtp/MtpObject.h0000644000175000017500000002354311050625206013434 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __MTPOBJECT__ #define __MTPOBJECT__ #include #include #include #include "types.h" #include #include namespace MTP { //forward declaration class GenericObject; class GenericFileObject; class File; class Folder; class Album; class Track; class Playlist; /** * @class Generic base class for other MTP object types */ class GenericObject { public: GenericObject(MtpObjectType, uint32_t); virtual ~GenericObject(); count_t ID() const; void SetID(count_t); MtpObjectType Type() const; virtual const char * const Name() const; private: MtpObjectType _type; count_t _id; }; class GenericFileObject : public GenericObject { public: GenericFileObject(MtpObjectType, uint32_t); void Associate(GenericFileObject* ); GenericFileObject* Association() const; private: GenericFileObject* _association; }; /** * @class File is a class that wraps around LIBMTP_file_t */ class File : public GenericFileObject { public: File(LIBMTP_file_t*); count_t ParentID() const; virtual const char * const Name() const; void SetParentFolder(Folder*); Folder* ParentFolder() const; count_t GetRowIndex() const; void SetRowIndex(count_t); LIBMTP_file_t* const RawFile() const; private: LIBMTP_file_t* _rawFile; LIBMTP_filesampledata_t _sampleData; Folder* _parent; count_t _rowIndex; }; /** * @class Folder is a class that wraps around LIBMTP_folder_t */ class Folder : public GenericObject { public: Folder(LIBMTP_folder_t*, Folder*); count_t FileCount() const; count_t FolderCount() const; Folder* ParentFolder() const; virtual char const * const Name() const; Folder* ChildFolder(count_t ) const; File* ChildFile(count_t ) const; LIBMTP_folder_t* RawFolder() const; void AddChildFolder(Folder*); void AddChildFile(File*); void RemoveChildFolder(Folder*); void RemoveChildFile(File*); count_t GetRowIndex() const; void SetRowIndex(count_t); private: LIBMTP_folder_t* _rawFolder; Folder* _parent; std::vector _childFolders; std::vector _childFiles; count_t _rowIndex; }; /** * @class Track is a class that wraps around LIBMTP_track_t */ class Track : public GenericFileObject { public: Track(LIBMTP_track_t*); count_t ParentFolderID() const; void SetParentAlbum(Album*); void SetParentPlaylist(Playlist*); virtual const char* const Name() const; const char* const FileName() const; const char* const Genre() const; const char* const AlbumName() const; const char* const ArtistName() const; Album* ParentAlbum() const; Playlist* ParentPlaylist() const; //Not such a hot idea.. LIBMTP_track_t* const RawTrack() const; count_t GetRowIndex() const; void SetRowIndex(count_t); //to be deprecated private: LIBMTP_track_t* _rawTrack; LIBMTP_filesampledata_t _sampleData; Album* _parentAlbum; Playlist* _parentPlaylist; File* _associatedFile; count_t _rowIndex; }; /** * @class Album is a class that wraps around LIBMTP_album_t */ class Album : public GenericFileObject { public: Album(LIBMTP_album_t*, const LIBMTP_filesampledata_t&); const LIBMTP_filesampledata_t& SampleData() const; count_t TrackCount() const; void SetCover(LIBMTP_filesampledata_t const * in_sample); LIBMTP_album_t const* RawAlbum(); uint32_t ChildTrackID(count_t ) const; void SetInitialized(); bool Initialized(); Track* ChildTrack(count_t ) const; void AddTrack(Track*); void AddTrackToRawAlbum(Track* in_track); void RemoveFromRawAlbum(count_t index); void RemoveTrack(count_t in_index); virtual const char* const Name() const; const char* const ArtistName() const; count_t GetRowIndex() const; void SetRowIndex(count_t); void SetAssociation(File*); File* Association(); private: bool _initialized; LIBMTP_album_t* _rawAlbum; LIBMTP_filesampledata_t _sample; std::vector _childTracks; File* _associatedFile; count_t _rowIndex; }; /** * @class Playlist is a class that wraps around LIBMTP_playlist_t */ class Playlist: public GenericFileObject { public: Playlist(LIBMTP_playlist_t*); count_t TrackCount() const; virtual const char* const Name() const; void AddTrack(Track* ); Track* ChildTrack(count_t idx) const; uint32_t ChildTrackID(count_t idx) const; void SetInitialized(); count_t GetRowIndex() const; void SetRowIndex(count_t); void SetAssociation(File*); File* Association(); private: count_t _trackCount; count_t _rowIndex; bool _initialized; LIBMTP_playlist_t* _rawPlaylist; std::vector _childTracks; File* _associatedFile; }; //TODO this isn't very usefull if you have foreign characters static LIBMTP_filetype_t StringToType(const std::string& in_type) { if (in_type == "UNKNOWN") return LIBMTP_FILETYPE_UNKNOWN; if (in_type == "WAV") return LIBMTP_FILETYPE_WAV; if (in_type == "MP3") return LIBMTP_FILETYPE_MP3; if (in_type == "WMA") return LIBMTP_FILETYPE_WMA; if (in_type == "OGG") return LIBMTP_FILETYPE_OGG; if (in_type == "AUD") return LIBMTP_FILETYPE_AUDIBLE; if (in_type == "MP4") return LIBMTP_FILETYPE_MP4; if (in_type == "WMV") return LIBMTP_FILETYPE_WMV; if (in_type == "AVI" || in_type == "SVI") return LIBMTP_FILETYPE_AVI; if (in_type == "MPEG") return LIBMTP_FILETYPE_MPEG; if (in_type == "MPG") return LIBMTP_FILETYPE_MPEG; if (in_type == "ASF") return LIBMTP_FILETYPE_ASF; if (in_type == "QT") return LIBMTP_FILETYPE_QT; if (in_type == "JPEG" || in_type == "JPG") return LIBMTP_FILETYPE_JPEG; if (in_type == "JFIF") return LIBMTP_FILETYPE_JFIF; if (in_type == "BMP") return LIBMTP_FILETYPE_BMP; if (in_type == "GIF") return LIBMTP_FILETYPE_GIF; if (in_type == "PICT") return LIBMTP_FILETYPE_PICT; if (in_type == "PNG") return LIBMTP_FILETYPE_PNG; if (in_type == "EXE") return LIBMTP_FILETYPE_WINEXEC; if (in_type == "TXT") return LIBMTP_FILETYPE_TEXT; if (in_type == "HTML" || in_type == "HTM") return LIBMTP_FILETYPE_HTML; if (in_type == "AAC") return LIBMTP_FILETYPE_AAC; if (in_type == "FLAC") return LIBMTP_FILETYPE_FLAC; if (in_type == "MP2") return LIBMTP_FILETYPE_MP2; if (in_type == "M4A") return LIBMTP_FILETYPE_M4A; if (in_type == "XML") return LIBMTP_FILETYPE_XML; if (in_type == "XLS") return LIBMTP_FILETYPE_XLS; if (in_type == "PPT") return LIBMTP_FILETYPE_PPT; if (in_type == "MHT") return LIBMTP_FILETYPE_MHT; if (in_type == "JP2") return LIBMTP_FILETYPE_JP2; if (in_type == "JPX") return LIBMTP_FILETYPE_JPX; return LIBMTP_FILETYPE_UNKNOWN; //default } static std::string TypeToString (LIBMTP_filetype_t in_type) { switch (in_type) { case LIBMTP_FILETYPE_WAV: return "Wav"; case LIBMTP_FILETYPE_MP3: return "Mp3"; case LIBMTP_FILETYPE_WMA: return "Wma"; case LIBMTP_FILETYPE_OGG: return "Ogg"; case LIBMTP_FILETYPE_AUDIBLE: return "Aud"; case LIBMTP_FILETYPE_MP4: return "Mp4"; case LIBMTP_FILETYPE_UNDEF_AUDIO: return "Undef Audio"; case LIBMTP_FILETYPE_WMV: return "Wmv"; case LIBMTP_FILETYPE_AVI: return "Avi"; case LIBMTP_FILETYPE_MPEG: return "Mpeg"; case LIBMTP_FILETYPE_ASF: return "Asf"; case LIBMTP_FILETYPE_QT: return "Qt"; case LIBMTP_FILETYPE_UNDEF_VIDEO: return "Undef Video"; case LIBMTP_FILETYPE_JPEG: return "Jpeg"; case LIBMTP_FILETYPE_JFIF: return "Jfif"; case LIBMTP_FILETYPE_TIFF: return "Tiff"; case LIBMTP_FILETYPE_BMP: return "Bmp"; case LIBMTP_FILETYPE_GIF: return "Gif"; case LIBMTP_FILETYPE_PICT: return "Pict"; case LIBMTP_FILETYPE_PNG: return "Png"; case LIBMTP_FILETYPE_VCALENDAR1: return "VCalendar1"; case LIBMTP_FILETYPE_VCALENDAR2: return "VCalendar2"; case LIBMTP_FILETYPE_VCARD2: return "VCard2"; case LIBMTP_FILETYPE_VCARD3: return "VCard3"; case LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT: return "Windows Image"; case LIBMTP_FILETYPE_WINEXEC: return "Exe"; case LIBMTP_FILETYPE_TEXT: return "Txt"; case LIBMTP_FILETYPE_HTML: return "Html"; case LIBMTP_FILETYPE_FIRMWARE: return "IMG- Firmware"; case LIBMTP_FILETYPE_AAC: return "Aac"; case LIBMTP_FILETYPE_MEDIACARD: return "MediaCard"; case LIBMTP_FILETYPE_FLAC: return "Flac"; case LIBMTP_FILETYPE_MP2: return "Mp2"; case LIBMTP_FILETYPE_M4A: return "M4a"; case LIBMTP_FILETYPE_DOC: return "Doc"; case LIBMTP_FILETYPE_XML: return "Xml"; case LIBMTP_FILETYPE_XLS: return "Xls"; case LIBMTP_FILETYPE_PPT: return "Ppt"; case LIBMTP_FILETYPE_MHT: return "Mht"; case LIBMTP_FILETYPE_JP2: return "Jp2"; case LIBMTP_FILETYPE_JPX: return "Jpx"; case LIBMTP_FILETYPE_UNKNOWN: return "Unknown"; default: return "Unknown"; } } } #endif qlix-0.2.6/mtp/MtpSubSystem.h0000644000175000017500000000311411050625206014154 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __MTPSUBSYSTEM__ #define __MTPSUBSYSTEM__ #include #include #include "types.h" #include "MtpDevice.h" #include using namespace std; typedef vector MtpDeviceVector; /** * @class MtpSubSystem is a wrapper class around libmtp */ class MtpSubSystem { public: MtpSubSystem(); ~MtpSubSystem(); void ReleaseDevices(); void Initialize(); count_t DeviceCount() const; count_t RawDeviceCount (MtpDeviceVector* connected, MtpDeviceVector* disconnected, MtpDeviceVector* newDevice); MtpDevice* Device(count_t); private: vector _devList; LIBMTP_mtpdevice_t* _deviceList; MTPErrorVector _errorList; }; #endif qlix-0.2.6/mtp/MtpStorage.h0000644000175000017500000000277011050625206013631 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef MTPSTORAGE #define MTPSTORAGE #include #include /** * @class is an adapter class over LIBMTP_storage_t */ class MtpStorage { public: MtpStorage(LIBMTP_devicestorage_t* ); ~MtpStorage(); uint64_t TotalSpace() const; uint64_t FreeSpace() const; uint64_t FreeObjectSpace() const; unsigned int ID() const; const char* const Description() const; const char* const VolumeID() const; private: unsigned int _id; unsigned int _storageType; unsigned int _filesystemType; unsigned int _accessCapability; uint64_t _totalSpace; uint64_t _freeSpace; uint64_t _freeObjectSpace; char* _description; char* _volumeID; }; #endif qlix-0.2.6/.Licenser.awk.swp0000644000175000017500000003000011050625206013714 0ustar alialib0VIM 7.1&£H  !kalishahal-laptop~ali/svn/trunk/Licenser.awkutf-8 3210#"! UtpÿadÆæõèæÓÀÛÚ˶¥ˆHEºvdaØ • W T  º y u t J < .   ö } print $1} print $1} print $1} print $1} print $1} print $1} print $1}} pri} print $1 }} } print $1 if (NR > 16)//{} * 51 Franklin Street, Fif} print $1 if (NR > 16)//{} * with this program; if not, write to} print $1 if (NR > 16)//{} * You should have received a copy of } } print $1 if (NR > 16)//{} * GNU General Public L} print $1 if (NR > 16)//{} * MERCHANTABILITY or FITNES} print $1 if (NR > 16)//{} * but WITHOUT ANY WARRANTY; } print $1 if (NR > 16)//{} * This program is distributed} } print $1 i} print $1 if (NR > 16)//{} * and appearing in the file } print $1 if (NR > 16)//{} * License version 2.0 as publi} print $1 if (NR > 16)//{} * This file may be used under} } print $1 if (NR > 16)//{} * This file is part of t} } print $1 if (NR >}} }}} } p} pri}} print $1} } print "yawhoo} print $0(NR > 16){qlix-0.2.6/linuxsignals.h0000644000175000017500000000344711050625206013466 0ustar aliali/* * Copyright (C) 2008 Ali Shah * * This file is part of the Qlix project on http://berlios.de * * This file may be used under the terms of the GNU General Public * License version 2.0 as published by the Free Software Foundation * and appearing in the file COPYING included in the packaging of * this file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License version 2.0 for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include extern MtpSubSystem _subSystem; void handler(int sig) { sigset_t set; sigset_t previous_set; sigaddset(&set, SIGINT); sigaddset(&set, SIGFPE); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGSEGV); sigaddset(&set, SIGHUP); sigaddset(&set, SIGKILL); sigprocmask(SIG_BLOCK, &set,&previous_set); _subSystem.ReleaseDevices(); printf("Ouch! - Qlix received signal %d\n", sig); struct sigaction act; act.sa_handler = SIG_DFL; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(sig, &act, 0); sigprocmask(SIG_UNBLOCK, &previous_set, NULL); } void installSignalHandlers() { struct sigaction act; act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGINT, &act, 0); sigaction(SIGFPE, &act, 0); sigaction(SIGQUIT, &act, 0); sigaction(SIGSEGV, &act, 0); sigaction(SIGHUP, &act, 0); sigaction(SIGABRT, &act, 0); sigaction(SIGKILL, &act, 0); } qlix-0.2.6/.replacel.sh.swp0000644000175000017500000003000011050625206013567 0ustar alialib0VIM 7.1²&£H  !áalishahal-laptop~ali/svn/trunk/replacel.shutf-8 3210#"! UtpÿadG × ôÒÅÄœ“^[ÓI74ï « h * ' Ú F E 2 ý ü â Ø × rm $1.tmpecho "Removing temp file"awk -f /home/ali/svn/trunk/Licenser.awk $1.tmp >> $1echo "Running awk" * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." > $1 * with this program; if not, write to the Free Software Foundation, Inc., * You should have received a copy of the GNU General Public License along * * GNU General Public License version 2.0 for more details. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * but WITHOUT ANY WARRANTY; without even the implied warranty of * This program is distributed in the hope that it will be useful, * * this file. * and appearing in the file COPYING included in the packaging of * License version 2.0 as published by the Free Software Foundation * This file may be used under the terms of the GNU General Public * * This file is part of the Qlix project on http://berlios.de * * Copyright (C) 2008 Ali Shah echo "/*echo "creating skeleton license file:"mv $1 $1.tmpecho "Moving file: $1 to $1.tmp" #!/bin/bashqlix-0.2.6/modeltest/0000755000175000017500000000000011050625242012565 5ustar alialiqlix-0.2.6/modeltest/modeltest.cpp0000644000175000017500000004553511050625206015305 0ustar aliali/**************************************************************************** ** ** Copyright (C) 2007 Trolltech ASA. All rights reserved. ** ** This file is part of the Qt Concurrent project on Trolltech Labs. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include #include "modeltest.h" Q_DECLARE_METATYPE(QModelIndex) /*! Connect to all of the models signals. Whenever anything happens recheck everything. */ ModelTest::ModelTest(QAbstractItemModel *_model, QObject *parent) : QObject(parent), model(_model), fetchingMore(false) { Q_ASSERT(model); connect(model, SIGNAL(columnsAboutToBeInserted(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(columnsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(columnsInserted(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(columnsRemoved(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(runAllTests())); connect(model, SIGNAL(headerDataChanged(Qt::Orientation, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(layoutAboutToBeChanged ()), this, SLOT(runAllTests())); connect(model, SIGNAL(layoutChanged ()), this, SLOT(runAllTests())); connect(model, SIGNAL(modelReset ()), this, SLOT(runAllTests())); connect(model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(runAllTests())); connect(model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(runAllTests())); // Special checks for inserting/removing connect(model, SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeInserted(const QModelIndex &, int, int))); connect(model, SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)), this, SLOT(rowsAboutToBeRemoved(const QModelIndex &, int, int))); connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int))); connect(model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(rowsRemoved(const QModelIndex &, int, int))); runAllTests(); } void ModelTest::runAllTests() { if (fetchingMore) return; nonDestructiveBasicTest(); rowCount(); columnCount(); hasIndex(); index(); parent(); data(); } /*! nonDestructiveBasicTest tries to call a number of the basic functions (not all) to make sure the model doesn't outright segfault, testing the functions that makes sense. */ void ModelTest::nonDestructiveBasicTest() { Q_ASSERT(model->buddy(QModelIndex()) == QModelIndex()); model->canFetchMore(QModelIndex()); Q_ASSERT(model->columnCount(QModelIndex()) >= 0); Q_ASSERT(model->data(QModelIndex()) == QVariant()); fetchingMore = true; model->fetchMore(QModelIndex()); fetchingMore = false; Qt::ItemFlags flags = model->flags(QModelIndex()); Q_ASSERT(flags == Qt::ItemIsDropEnabled || flags == 0); model->hasChildren(QModelIndex()); model->hasIndex(0, 0); model->headerData(0, Qt::Horizontal); model->index(0, 0); model->itemData(QModelIndex()); QVariant cache; model->match(QModelIndex(), -1, cache); model->mimeTypes(); Q_ASSERT(model->parent(QModelIndex()) == QModelIndex()); Q_ASSERT(model->rowCount() >= 0); QVariant variant; model->setData(QModelIndex(), variant, -1); model->setHeaderData(-1, Qt::Horizontal, QVariant()); model->setHeaderData(0, Qt::Horizontal, QVariant()); model->setHeaderData(999999, Qt::Horizontal, QVariant()); QMap roles; model->sibling(0, 0, QModelIndex()); model->span(QModelIndex()); model->supportedDropActions(); } /*! Tests model's implementation of QAbstractItemModel::rowCount() and hasChildren() Models that are dynamically populated are not as fully tested here. */ void ModelTest::rowCount() { // check top row QModelIndex topIndex = model->index(0, 0, QModelIndex()); int rows = model->rowCount(topIndex); Q_ASSERT(rows >= 0); if (rows > 0) Q_ASSERT(model->hasChildren(topIndex) == true); QModelIndex secondLevelIndex = model->index(0, 0, topIndex); if (secondLevelIndex.isValid()) { // not the top level // check a row count where parent is valid rows = model->rowCount(secondLevelIndex); Q_ASSERT(rows >= 0); if (rows > 0) Q_ASSERT(model->hasChildren(secondLevelIndex) == true); } // The models rowCount() is tested more extensively in checkChildren(), // but this catches the big mistakes } /*! Tests model's implementation of QAbstractItemModel::columnCount() and hasChildren() */ void ModelTest::columnCount() { // check top row QModelIndex topIndex = model->index(0, 0, QModelIndex()); Q_ASSERT(model->columnCount(topIndex) >= 0); // check a column count where parent is valid QModelIndex childIndex = model->index(0, 0, topIndex); if (childIndex.isValid()) Q_ASSERT(model->columnCount(childIndex) >= 0); // columnCount() is tested more extensively in checkChildren(), // but this catches the big mistakes } /*! Tests model's implementation of QAbstractItemModel::hasIndex() */ void ModelTest::hasIndex() { // Make sure that invalid values returns an invalid index Q_ASSERT(model->hasIndex(-2, -2) == false); Q_ASSERT(model->hasIndex(-2, 0) == false); Q_ASSERT(model->hasIndex(0, -2) == false); int rows = model->rowCount(); int columns = model->columnCount(); // check out of bounds Q_ASSERT(model->hasIndex(rows, columns) == false); Q_ASSERT(model->hasIndex(rows + 1, columns + 1) == false); if (rows > 0) Q_ASSERT(model->hasIndex(0, 0) == true); // hasIndex() is tested more extensively in checkChildren(), // but this catches the big mistakes } /*! Tests model's implementation of QAbstractItemModel::index() */ void ModelTest::index() { // Make sure that invalid values returns an invalid index Q_ASSERT(model->index(-2, -2) == QModelIndex()); Q_ASSERT(model->index(-2, 0) == QModelIndex()); Q_ASSERT(model->index(0, -2) == QModelIndex()); int rows = model->rowCount(); int columns = model->columnCount(); if (rows == 0) return; // Catch off by one errors Q_ASSERT(model->index(rows, columns) == QModelIndex()); Q_ASSERT(model->index(0, 0).isValid() == true); // Make sure that the same index is *always* returned QModelIndex a = model->index(0, 0); QModelIndex b = model->index(0, 0); Q_ASSERT(a == b); // index() is tested more extensively in checkChildren(), // but this catches the big mistakes } /*! Tests model's implementation of QAbstractItemModel::parent() */ void ModelTest::parent() { // Make sure the model wont crash and will return an invalid QModelIndex // when asked for the parent of an invalid index. Q_ASSERT(model->parent(QModelIndex()) == QModelIndex()); if (model->rowCount() == 0) return; // Column 0 | Column 1 | // QModelIndex() | | // \- topIndex | topIndex1 | // \- childIndex | childIndex1 | // Common error test #1, make sure that a top level index has a parent // that is a invalid QModelIndex. QModelIndex topIndex = model->index(0, 0, QModelIndex()); Q_ASSERT(model->parent(topIndex) == QModelIndex()); // Common error test #2, make sure that a second level index has a parent // that is the first level index. if (model->rowCount(topIndex) > 0) { QModelIndex childIndex = model->index(0, 0, topIndex); if (model->parent(childIndex) != topIndex) //qDebug() << "parent row: " << model->parent(childIndex).row() << " col: " << model->parent(childIndex).column() << " internal pointer: " << model->parent(childIndex).internalPointer(); Q_ASSERT(model->parent(childIndex) == topIndex); } // Common error test #3, the second column should NOT have the same children // as the first column in a row. // Usually the second column shouldn't have children. QModelIndex topIndex1 = model->index(0, 1, QModelIndex()); if (model->rowCount(topIndex1) > 0) { QModelIndex childIndex = model->index(0, 0, topIndex); QModelIndex childIndex1 = model->index(0, 0, topIndex1); Q_ASSERT(childIndex != childIndex1); } // Full test, walk n levels deep through the model making sure that all // parent's children correctly specify their parent. checkChildren(QModelIndex()); } /*! Called from the parent() test. A model that returns an index of parent X should also return X when asking for the parent of the index. This recursive function does pretty extensive testing on the whole model in an effort to catch edge cases. This function assumes that rowCount(), columnCount() and index() already work. If they have a bug it will point it out, but the above tests should have already found the basic bugs because it is easier to figure out the problem in those tests then this one. */ void ModelTest::checkChildren(const QModelIndex &parent, int currentDepth) { // First just try walking back up the tree. QModelIndex p = parent; while (p.isValid()) p = p.parent(); // For models that are dynamically populated if (model->canFetchMore(parent)) { fetchingMore = true; model->fetchMore(parent); fetchingMore = false; } int rows = model->rowCount(parent); int columns = model->columnCount(parent); if (rows > 0) Q_ASSERT(model->hasChildren(parent)); // Some further testing against rows(), columns(), and hasChildren() Q_ASSERT(rows >= 0); Q_ASSERT(columns >= 0); if (rows > 0) Q_ASSERT(model->hasChildren(parent) == true); //qDebug() << "parent:" << model->data(parent).toString() << "rows:" << rows // << "columns:" << columns << "parent column:" << parent.column(); Q_ASSERT(model->hasIndex(rows + 1, 0, parent) == false); for (int r = 0; r < rows; ++r) { if (model->canFetchMore(parent)) { fetchingMore = true; model->fetchMore(parent); fetchingMore = false; } Q_ASSERT(model->hasIndex(r, columns + 1, parent) == false); for (int c = 0; c < columns; ++c) { Q_ASSERT(model->hasIndex(r, c, parent) == true); QModelIndex index = model->index(r, c, parent); // rowCount() and columnCount() said that it existed... index = model->index(r, c, parent); Q_ASSERT(index.isValid() == true); // index() should always return the same index when called twice in a row QModelIndex modifiedIndex = model->index(r, c, parent); Q_ASSERT(index == modifiedIndex); // Make sure we get the same index if we request it twice in a row QModelIndex a = model->index(r, c, parent); QModelIndex b = model->index(r, c, parent); Q_ASSERT(a == b); // Some basic checking on the index that is returned Q_ASSERT(index.model() == model); Q_ASSERT(index.row() == r); Q_ASSERT(index.column() == c); // While you can technically return a QVariant usually this is a sign // of an bug in data() Disable if this really is ok in your model. Q_ASSERT(model->data(index, Qt::DisplayRole).isValid() == true); // If the next test fails here is some somewhat useful debug you play with. if (model->parent(index) != parent) { qDebug() << r << c << currentDepth << model->data(index).toString() << model->data(parent).toString(); qDebug() << index << parent << model->parent(index); // And a view that you can even use to show the model. //QTreeView view; //view.setModel(model); //view.show(); } // Check that we can get back our real parent. Q_ASSERT(model->parent(index) == parent); // recursively go down the children if (model->hasChildren(index) && currentDepth < 10 ) { //qDebug() << r << c << "has children" << model->rowCount(index); checkChildren(index, ++currentDepth); }/* else { if (currentDepth >= 10) qDebug() << "checked 10 deep"; };*/ // make sure that after testing the children that the index doesn't change. QModelIndex newerIndex = model->index(r, c, parent); Q_ASSERT(index == newerIndex); } } } /*! Tests model's implementation of QAbstractItemModel::data() */ void ModelTest::data() { // Invalid index should return an invalid qvariant Q_ASSERT(!model->data(QModelIndex()).isValid()); if (model->rowCount() == 0) return; // A valid index should have a valid QVariant data Q_ASSERT(model->index(0, 0).isValid()); // shouldn't be able to set data on an invalid index Q_ASSERT(model->setData(QModelIndex(), QLatin1String("foo"), Qt::DisplayRole) == false); // General Purpose roles that should return a QString QVariant variant = model->data(model->index(0, 0), Qt::ToolTipRole); if (variant.isValid()) { Q_ASSERT(qVariantCanConvert(variant)); } variant = model->data(model->index(0, 0), Qt::StatusTipRole); if (variant.isValid()) { Q_ASSERT(qVariantCanConvert(variant)); } variant = model->data(model->index(0, 0), Qt::WhatsThisRole); if (variant.isValid()) { Q_ASSERT(qVariantCanConvert(variant)); } // General Purpose roles that should return a QSize variant = model->data(model->index(0, 0), Qt::SizeHintRole); if (variant.isValid()) { Q_ASSERT(qVariantCanConvert(variant)); } // General Purpose roles that should return a QFont QVariant fontVariant = model->data(model->index(0, 0), Qt::FontRole); if (fontVariant.isValid()) { Q_ASSERT(qVariantCanConvert(fontVariant)); } // Check that the alignment is one we know about QVariant textAlignmentVariant = model->data(model->index(0, 0), Qt::TextAlignmentRole); if (textAlignmentVariant.isValid()) { int alignment = textAlignmentVariant.toInt(); Q_ASSERT(alignment == Qt::AlignLeft || alignment == Qt::AlignRight || alignment == Qt::AlignHCenter || alignment == Qt::AlignJustify || alignment == Qt::AlignTop || alignment == Qt::AlignBottom || alignment == Qt::AlignVCenter || alignment == Qt::AlignCenter || alignment == Qt::AlignAbsolute || alignment == Qt::AlignLeading || alignment == Qt::AlignTrailing); } // General Purpose roles that should return a QColor QVariant colorVariant = model->data(model->index(0, 0), Qt::BackgroundColorRole); if (colorVariant.isValid()) { Q_ASSERT(qVariantCanConvert(colorVariant)); } colorVariant = model->data(model->index(0, 0), Qt::TextColorRole); if (colorVariant.isValid()) { Q_ASSERT(qVariantCanConvert(colorVariant)); } // Check that the "check state" is one we know about. QVariant checkStateVariant = model->data(model->index(0, 0), Qt::CheckStateRole); if (checkStateVariant.isValid()) { int state = checkStateVariant.toInt(); Q_ASSERT(state == Qt::Unchecked || state == Qt::PartiallyChecked || state == Qt::Checked); } } /*! Store what is about to be inserted to make sure it actually happens \sa rowsInserted() */ void ModelTest::rowsAboutToBeInserted(const QModelIndex &parent, int start, int end) { Q_UNUSED(end); Changing c; c.parent = parent; c.oldSize = model->rowCount(parent); c.last = model->data(model->index(start - 1, 0, parent)); c.next = model->data(model->index(start, 0, parent)); insert.push(c); } /*! Confirm that what was said was going to happen actually did \sa rowsAboutToBeInserted() */ void ModelTest::rowsInserted(const QModelIndex & parent, int start, int end) { Changing c = insert.pop(); Q_ASSERT(c.parent == parent); Q_ASSERT(c.oldSize + (end - start + 1) == model->rowCount(parent)); Q_ASSERT(c.last == model->data(model->index(start - 1, 0, c.parent))); /* if (c.next != model->data(model->index(end + 1, 0, c.parent))) { qDebug() << start << end; for (int i=0; i < model->rowCount(); ++i) qDebug() << model->index(i, 0).data().toString(); qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent)); } */ Q_ASSERT(c.next == model->data(model->index(end + 1, 0, c.parent))); } /*! Store what is about to be inserted to make sure it actually happens \sa rowsRemoved() */ void ModelTest::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { Changing c; c.parent = parent; c.oldSize = model->rowCount(parent); c.last = model->data(model->index(start - 1, 0, parent)); c.next = model->data(model->index(end + 1, 0, parent)); remove.push(c); } /*! Confirm that what was said was going to happen actually did \sa rowsAboutToBeRemoved() */ void ModelTest::rowsRemoved(const QModelIndex & parent, int start, int end) { Changing c = remove.pop(); Q_ASSERT(c.parent == parent); Q_ASSERT(c.oldSize - (end - start + 1) == model->rowCount(parent)); Q_ASSERT(c.last == model->data(model->index(start - 1, 0, c.parent))); Q_ASSERT(c.next == model->data(model->index(start, 0, c.parent))); } qlix-0.2.6/modeltest/modeltest.h0000644000175000017500000000416311050625206014742 0ustar aliali/**************************************************************************** ** ** Copyright (C) 2007 Trolltech ASA. All rights reserved. ** ** This file is part of the Qt Concurrent project on Trolltech Labs. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef MODELTEST_H #define MODELTEST_H #include #include #include class ModelTest : public QObject { Q_OBJECT public: ModelTest(QAbstractItemModel *model, QObject *parent = 0); private Q_SLOTS: void nonDestructiveBasicTest(); void rowCount(); void columnCount(); void hasIndex(); void index(); void parent(); void data(); protected Q_SLOTS: void runAllTests(); void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end); void rowsInserted(const QModelIndex & parent, int start, int end); void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end); void rowsRemoved(const QModelIndex & parent, int start, int end); private: void checkChildren(const QModelIndex &parent, int currentDepth = 0); QAbstractItemModel *model; struct Changing { QModelIndex parent; int oldSize; QVariant last; QVariant next; }; QStack insert; QStack remove; bool fetchingMore; }; #endif qlix-0.2.6/modeltest/README0000644000175000017500000000263211050625206013450 0ustar alialiModelTest provides a way to check for common errors in implementations of http://doc.trolltech.com/4/qabstractitemmodel.html. ModelTest continuously checks a model as it changes, helping to verify the state and catching many common errors the moment they show up such as:
  • Verifing X number of rows have been inserted in the correct place after the signal rowsAboutToBeInserted() says X rows will be inserted.
  • The parent of the first index of the first row is a QModelIndex()
  • Calling index() twice in a row with the same values will return the same QModelIndex
  • If rowCount() says there are X number of rows, model test will verify that is true.
  • Many possible off by one bugs
  • hasChildren() returns true if rowCount() is greater then zero.
  • and many more...
--- To Use the model test do the following: 1) Include the pri file at the end of your project pro file using the include() command like so: include(../path/to/dir/modeltest.pri) 2) Then in your source include "modeltest.h" and instantiate ModelTest with your model so the test can live for the lifetime of your model. For example: #include QDirModel *model = new QDirModel(this); new ModelTest(model, this); 3) That is it. When the test finds a problem it will assert. modeltest.cpp contains some hints on how to fix problems that the test finds. qlix-0.2.6/modeltest/LICENSE.GPL0000644000175000017500000004324611050625206014224 0ustar aliali GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qlix-0.2.6/modeltest/modeltest.pri0000644000175000017500000000014511050625206015301 0ustar alialiINCLUDEPATH += $$PWD DEPENDPATH += $$PWD SOURCES += $$PWD/modeltest.cpp HEADERS += $$PWD/modeltest.h