diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 84da08d7b7fcda12c85caeb5a10b4903770a6f69 (patch) | |
tree | 2a6aea76f2dfffb4cc04bb907c4725af94f70e72 /noatun-plugins | |
download | tdeaddons-84da08d7b7fcda12c85caeb5a10b4903770a6f69.tar.gz tdeaddons-84da08d7b7fcda12c85caeb5a10b4903770a6f69.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeaddons@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'noatun-plugins')
199 files changed, 39226 insertions, 0 deletions
diff --git a/noatun-plugins/Makefile.am b/noatun-plugins/Makefile.am new file mode 100644 index 0000000..25f7198 --- /dev/null +++ b/noatun-plugins/Makefile.am @@ -0,0 +1,18 @@ +if include_SDL +SDL_SUBDIRS = blurscope synaescope tippercanoe tyler +endif + +if include_noatunplugin +NOATUN_SUBDIR = pitchablespeed wavecapture +endif + +if include_BERKELEY_DB +BDB_SUBDIRS = oblique +endif + +SUBDIRS = \ + alarm alsaplayer charlatan dub ffrs \ + luckytag lyrics noatunmadness $(NOATUN_SUBDIR) \ + $(BDB_SUBDIRS) $(SDL_SUBDIRS) + + diff --git a/noatun-plugins/alarm/Makefile.am b/noatun-plugins/alarm/Makefile.am new file mode 100644 index 0000000..8d2a928 --- /dev/null +++ b/noatun-plugins/alarm/Makefile.am @@ -0,0 +1,21 @@ +INCLUDES= -I$(kde_includes)/arts $(all_includes) +kde_module_LTLIBRARIES = noatunwakeup.la + +noatunwakeup_la_SOURCES = wakeup.cpp \ + kminutespinbox.cpp \ + kpercentspinbox.cpp + +noatunwakeup_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunwakeup_la_LIBADD = $(LIB_KFILE) -lnoatun -lm + +noatunwakeup_la_METASOURCES = AUTO + +noinst_HEADERS = wakeup.h \ + kminutespinbox.h \ + kpercentspinbox.h + +noatun_DATA = wakeup.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/wakeup.pot diff --git a/noatun-plugins/alarm/kminutespinbox.cpp b/noatun-plugins/alarm/kminutespinbox.cpp new file mode 100644 index 0000000..3eac84d --- /dev/null +++ b/noatun-plugins/alarm/kminutespinbox.cpp @@ -0,0 +1,41 @@ +// Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Except as contained in this notice, the name(s) of the author(s) shall not be +// used in advertising or otherwise to promote the sale, use or other dealings +// in this Software without prior written authorization from the author(s). + +#include "kminutespinbox.h" + +KMinuteSpinBox::KMinuteSpinBox(int _step, QWidget *_parent, const char *_name) + : QSpinBox(0, 59, _step, _parent, _name) +{ + setButtonSymbols(PlusMinus); + setWrapping(true); +} + +QString KMinuteSpinBox::mapValueToText(int v) +{ + if(v < 10) + return QString("0%1").arg(v); + else + return QString::number(v); +} + +#include "kminutespinbox.moc" diff --git a/noatun-plugins/alarm/kminutespinbox.h b/noatun-plugins/alarm/kminutespinbox.h new file mode 100644 index 0000000..14e2c4f --- /dev/null +++ b/noatun-plugins/alarm/kminutespinbox.h @@ -0,0 +1,38 @@ +// Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Except as contained in this notice, the name(s) of the author(s) shall not be +// used in advertising or otherwise to promote the sale, use or other dealings +// in this Software without prior written authorization from the author(s). + +#ifndef KMINUTESPINBOX_H +#define KMINUTESPINBOX_H + +#include <qspinbox.h> + +class KMinuteSpinBox : public QSpinBox +{ +Q_OBJECT +public: + KMinuteSpinBox(int _step = 1, QWidget *_parent = 0, const char *_name = 0); +protected: + virtual QString mapValueToText(int v); +}; + +#endif diff --git a/noatun-plugins/alarm/kpercentspinbox.cpp b/noatun-plugins/alarm/kpercentspinbox.cpp new file mode 100644 index 0000000..32b5820 --- /dev/null +++ b/noatun-plugins/alarm/kpercentspinbox.cpp @@ -0,0 +1,38 @@ +/*************************************************************************** + kpercentspinbox.cpp - QSpinbox with % + ------------------- + begin : Sun Apr 15 CEST 2001 + copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org> + + ***************************************************************************/ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "kpercentspinbox.h" + +KPercentSpinBox::KPercentSpinBox(int _step, QWidget *_parent, const char *_name) + : QSpinBox(0, 100, _step, _parent, _name) +{ + setButtonSymbols(PlusMinus); +} + +QString KPercentSpinBox::mapValueToText(int v) +{ + return QString::number(v)+'%'; +} +#if 0 +int KPercentSpinBox::mapTextToValue(bool *ok) +{ + QString mapText= text(); +// mapText.truncate(mapText.length()-1); + + return mapText.toInt(ok); +} +#endif +#include "kpercentspinbox.moc" diff --git a/noatun-plugins/alarm/kpercentspinbox.h b/noatun-plugins/alarm/kpercentspinbox.h new file mode 100644 index 0000000..abcdd49 --- /dev/null +++ b/noatun-plugins/alarm/kpercentspinbox.h @@ -0,0 +1,33 @@ +/*************************************************************************** + kpercentspinbox.h - QSpinbox with % + ------------------- + begin : Sun Apr 15 CEST 2001 + copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org> + + ***************************************************************************/ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KPERCENT_SPINBOX_H +#define KPERCENT_SPINBOX_H + +#include <qspinbox.h> + +class KPercentSpinBox : public QSpinBox +{ + Q_OBJECT + public: + KPercentSpinBox (int _step=1, QWidget *_parent=0, const char *name=0); + + protected: + virtual QString mapValueToText(int v); +// virtual int mapTextToValue(bool *ok); +}; + +#endif diff --git a/noatun-plugins/alarm/wakeup.cpp b/noatun-plugins/alarm/wakeup.cpp new file mode 100644 index 0000000..648d3e3 --- /dev/null +++ b/noatun-plugins/alarm/wakeup.cpp @@ -0,0 +1,373 @@ +/************************************************************************** + wakeup.cpp - alarm plugin for noatun + ------------------ + begin : Wed Apr 11 CEST 2001 + copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org> + + ***************************************************************************/ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include <noatun/engine.h> +#include <noatun/player.h> +#include <noatun/app.h> + +#include <klocale.h> +#include <qcheckbox.h> +#include <qlabel.h> +#include <qspinbox.h> +#include <qtimer.h> +#include <qdatetime.h> +#include <qlayout.h> +#include <qvbox.h> +#include <qhbox.h> +#include <qbuttongroup.h> +#include <qradiobutton.h> +#include <qwhatsthis.h> +#include <kiconloader.h> + +#include <kconfig.h> +#include <kglobal.h> +#include "wakeup.h" +#include "kminutespinbox.h" +#include "kpercentspinbox.h" + +extern "C" Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("wakeup"); + return new Wakeup(); +} + +Wakeup *Wakeup::wakeme = 0; + +Wakeup::Wakeup() : QObject(), Plugin() +{ + wakeme = this; + + NOATUNPLUGINC(Wakeup); + new WakeupPrefs(this); + + update(); + + QTimer *timer=new QTimer(this); + connect (timer,SIGNAL(timeout()),SLOT(slotCheckTime())); + timer->start(60000,false); +} + +Wakeup::~Wakeup() +{ +} + +void Wakeup::update() +{ + KConfig *config=KGlobal::config(); + config->setGroup("Noatun Alarm"); + + hour[0]=config->readNumEntry("Hour1",7); + minute[0]=config->readNumEntry("Minute1",0); + hour[1]=config->readNumEntry("Hour2",7); + minute[1]=config->readNumEntry("Minute2",0); + hour[2]=config->readNumEntry("Hour3",7); + minute[2]=config->readNumEntry("Minute3",0); + hour[3]=config->readNumEntry("Hour4",7); + minute[3]=config->readNumEntry("Minute4",0); + hour[4]=config->readNumEntry("Hour5",7); + minute[4]=config->readNumEntry("Minute5",0); + hour[5]=config->readNumEntry("Hour6",7); + minute[5]=config->readNumEntry("Minute6",0); + hour[6]=config->readNumEntry("Hour7",7); + minute[6]=config->readNumEntry("Minute7",0); + + days[0]=config->readBoolEntry("Monday",false); + days[1]=config->readBoolEntry("Tuesday",false); + days[2]=config->readBoolEntry("Wednesday",false); + days[3]=config->readBoolEntry("Thursday",false); + days[4]=config->readBoolEntry("Friday",false); + days[5]=config->readBoolEntry("Saturday",false); + days[6]=config->readBoolEntry("Sunday",false); + + volEndVal=config->readNumEntry("VolumeEnd",80); + modeAlarm=config->readNumEntry("ModeAlarm",0); +// songlist=config->readEntry("List",""); +} + +void Wakeup::slotCheckTime() +{ + QTime t; + QDate d; + + t=QTime::currentTime(); + d=QDate::currentDate(); + + if (t.minute()!=minute[d.dayOfWeek()-1] || t.hour()!=hour[d.dayOfWeek()-1]) return; + + if (days[d.dayOfWeek()-1]) + { + //napp->player()->play(); + PlayerAct(); + } +} + +void Wakeup::PlayerAct() +{ + if (modeAlarm==1 && !napp->player()->isPlaying()) + { + napp->player()->setVolume(0); + } + + if (!napp->player()->isPlaying() && modeAlarm!=2) napp->player()->play(); + + // timer for volume (up/down) according to prefs :-) + volTimer = new QTimer (this); + connect (volTimer,SIGNAL(timeout()), SLOT(slotVolumeChange())); + + volTimer->start(1000,false); // updates volume every seconds + +} + +void Wakeup::slotVolumeChange() +{ + int vol = napp->player()->volume(); + if ( vol >= volEndVal && modeAlarm==1) + { + volTimer->stop(); + return; + } + else if (vol <= 0 && modeAlarm==2) + { + volTimer->stop(); + napp->player()->stop(); + return; + } + else if (modeAlarm==0) + { + volTimer->stop(); + return; + } + + if (modeAlarm==1) + { + napp->player()->setVolume( vol + 1 ); + } + else if (modeAlarm==2) + { + napp->player()->setVolume( vol - 1 ); + } +} + +/////////////////////////////////////////////////////////////////// +// Prefs CModule +/////////////////////////////////////////////////////////////////// +WakeupPrefs::WakeupPrefs( QObject *parent ) : + CModule( i18n("Wakeup"), i18n("Alarm Configuration"), "date", parent ) +{ + QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); + QGridLayout *grid = new QGridLayout (layout,8,4); + + monday=new QCheckBox(i18n("Monday"),this); + tuesday=new QCheckBox(i18n("Tuesday"),this); + wednesday=new QCheckBox(i18n("Wednesday"),this); + thursday=new QCheckBox(i18n("Thursday"),this); + friday=new QCheckBox(i18n("Friday"),this); + saturday=new QCheckBox(i18n("Saturday"),this); + sunday=new QCheckBox(i18n("Sunday"),this); + hour1 = new QSpinBox(0, 23, 1, this , "Hour1"); + hour1->setButtonSymbols(QSpinBox::PlusMinus); + minute1 = new KMinuteSpinBox(1, this , "Minute1"); + hour2 = new QSpinBox(0, 23, 1, this, "Hour2"); + hour2->setButtonSymbols(QSpinBox::PlusMinus); + minute2 = new KMinuteSpinBox(1, this, "Minute2"); + hour3 = new QSpinBox(0, 23, 1, this, "Hour3"); + hour3->setButtonSymbols(QSpinBox::PlusMinus); + minute3 = new KMinuteSpinBox(1, this, "Minute3"); + hour4 = new QSpinBox(0, 23, 1, this, "Hour4"); + hour4->setButtonSymbols(QSpinBox::PlusMinus); + minute4 = new KMinuteSpinBox(1, this, "Minute4"); + hour5 = new QSpinBox(0, 23, 1, this, "Hour5"); + hour5->setButtonSymbols(QSpinBox::PlusMinus); + minute5 = new KMinuteSpinBox(1, this, "Minute5"); + hour6 = new QSpinBox(0, 23, 1, this, "Hour6"); + hour6->setButtonSymbols(QSpinBox::PlusMinus); + minute6 = new KMinuteSpinBox(1, this, "Minute6"); + hour7 = new QSpinBox(0, 23, 1, this, "Hour7"); + hour7->setButtonSymbols(QSpinBox::PlusMinus); + minute7 = new KMinuteSpinBox(1, this, "Minute7"); + + QLabel *selectday = new QLabel (i18n("Select days:"),this); + QLabel *choosehour = new QLabel (i18n("Hour"),this); + QLabel *choosemin = new QLabel (i18n("Minute"),this); + grid->addWidget (selectday,0,0,Qt::AlignLeft); + grid->addWidget (choosehour,0,1,Qt::AlignLeft); + grid->addWidget (choosemin,0,2,Qt::AlignLeft); + + applyall = new QPushButton (this,"applyall"); + applyall->setPixmap( BarIcon("down", KIcon::SizeSmall) ); + applyall->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, + QSizePolicy::Fixed, + applyall->sizePolicy().hasHeightForWidth()) ); + grid->addWidget (applyall,1,3,Qt::AlignLeft); + + grid->addWidget (monday,1,0,Qt::AlignLeft); + grid->addWidget (tuesday,2,0,Qt::AlignLeft); + grid->addWidget (wednesday,3,0,Qt::AlignLeft); + grid->addWidget (thursday,4,0,Qt::AlignLeft); + grid->addWidget (friday,5,0,Qt::AlignLeft); + grid->addWidget (saturday,6,0,Qt::AlignLeft); + grid->addWidget (sunday,7,0,Qt::AlignLeft); + grid->addWidget (hour1,1,1,Qt::AlignLeft); + grid->addWidget (hour2,2,1,Qt::AlignLeft); + grid->addWidget (hour3,3,1,Qt::AlignLeft); + grid->addWidget (hour4,4,1,Qt::AlignLeft); + grid->addWidget (hour5,5,1,Qt::AlignLeft); + grid->addWidget (hour6,6,1,Qt::AlignLeft); + grid->addWidget (hour7,7,1,Qt::AlignLeft); + grid->addWidget (minute1,1,2,Qt::AlignLeft); + grid->addWidget (minute2,2,2,Qt::AlignLeft); + grid->addWidget (minute3,3,2,Qt::AlignLeft); + grid->addWidget (minute4,4,2,Qt::AlignLeft); + grid->addWidget (minute5,5,2,Qt::AlignLeft); + grid->addWidget (minute6,6,2,Qt::AlignLeft); + grid->addWidget (minute7,7,2,Qt::AlignLeft); + grid->setColStretch (0,3); + + QButtonGroup *modeGroup = new QButtonGroup (3, Qt::Vertical, i18n ("Volume Control"),this); + alarmmode = new QRadioButton (i18n("No change to volume, just starts the player"),modeGroup); + nightmode = new QRadioButton (i18n("The volume decreases slowly and finally stops the player"),modeGroup); + morningmode = new QRadioButton (i18n("The player starts and the volume increases to the chosen value"),modeGroup); + modeGroup->setExclusive(true); + morningmode->setChecked(true); + + volFrame = new QFrame (this); + QLabel *volEndLabel = new QLabel (i18n("Volume increases to:"), volFrame); + volEndValue = new KPercentSpinBox (1 ,volFrame,"volendvalue"); + + layout->addWidget(modeGroup); + layout->addWidget(volFrame); + layout->addStretch(); + + QHBoxLayout *volLayout = new QHBoxLayout(volFrame, KDialog::marginHint(), KDialog::spacingHint()); + volLayout->addWidget(volEndLabel); + volLayout->addWidget(volEndValue); + volLayout->addStretch(); + + connect (morningmode,SIGNAL(stateChanged(int)),SLOT(slotViewFrame(int))); + connect (applyall,SIGNAL(clicked()),SLOT(slotApplyAll())); + + load(); +} + +void WakeupPrefs::slotApplyAll() +{ + hour2->setValue(hour1->text().toInt()); + hour3->setValue(hour1->text().toInt()); + hour4->setValue(hour1->text().toInt()); + hour5->setValue(hour1->text().toInt()); + hour6->setValue(hour1->text().toInt()); + hour7->setValue(hour1->text().toInt()); + minute2->setValue(minute1->text().toInt()); + minute3->setValue(minute1->text().toInt()); + minute4->setValue(minute1->text().toInt()); + minute5->setValue(minute1->text().toInt()); + minute6->setValue(minute1->text().toInt()); + minute7->setValue(minute1->text().toInt()); +} + +void WakeupPrefs::slotViewFrame(int state) +{ + if (state==2) volFrame->show(); + else volFrame->hide(); +} + +void WakeupPrefs::save() +{ + KConfig *config=KGlobal::config(); + config->setGroup("Noatun Alarm"); + config->writeEntry("Monday",monday->isChecked()); + config->writeEntry("Tuesday",tuesday->isChecked()); + config->writeEntry("Wednesday",wednesday->isChecked()); + config->writeEntry("Thursday",thursday->isChecked()); + config->writeEntry("Friday",friday->isChecked()); + config->writeEntry("Saturday",saturday->isChecked()); + config->writeEntry("Sunday",sunday->isChecked()); + config->writeEntry("Hour1",hour1->text()); + config->writeEntry("Minute1",minute1->text()); + config->writeEntry("Hour2",hour2->text()); + config->writeEntry("Minute2",minute2->text()); + config->writeEntry("Hour3",hour3->text()); + config->writeEntry("Minute3",minute3->text()); + config->writeEntry("Hour4",hour4->text()); + config->writeEntry("Minute4",minute4->text()); + config->writeEntry("Hour5",hour5->text()); + config->writeEntry("Minute5",minute5->text()); + config->writeEntry("Hour6",hour6->text()); + config->writeEntry("Minute6",minute6->text()); + config->writeEntry("Hour7",hour7->text()); + config->writeEntry("Minute7",minute7->text()); + QString val(volEndValue->text()); + config->writeEntry("VolumeEnd",val); + + if (nightmode->isChecked()) config->writeEntry("ModeAlarm",2); + else if (morningmode->isChecked()) config->writeEntry("ModeAlarm",1); + else config->writeEntry("ModeAlarm", 0); + + config->sync(); + + Wakeup *wake = Wakeup::wakeme; + if (wake) wake->update(); +} + +void WakeupPrefs::load() +{ + KGlobal::config()->setGroup("Noatun Alarm"); + monday->setChecked(KGlobal::config()->readBoolEntry("Monday",false)); + tuesday->setChecked(KGlobal::config()->readBoolEntry("Tuesday",false)); + wednesday->setChecked(KGlobal::config()->readBoolEntry("Wednesday",false)); + thursday->setChecked(KGlobal::config()->readBoolEntry("Thursday",false)); + friday->setChecked(KGlobal::config()->readBoolEntry("Friday",false)); + saturday->setChecked(KGlobal::config()->readBoolEntry("Saturday",false)); + sunday->setChecked(KGlobal::config()->readBoolEntry("Sunday",false)); + + hour1->setValue(KGlobal::config()->readNumEntry("Hour1",7)); + minute1->setValue(KGlobal::config()->readNumEntry("Minute1",0)); + hour2->setValue(KGlobal::config()->readNumEntry("Hour2",7)); + minute2->setValue(KGlobal::config()->readNumEntry("Minute2",0)); + hour3->setValue(KGlobal::config()->readNumEntry("Hour3",7)); + minute3->setValue(KGlobal::config()->readNumEntry("Minute3",0)); + hour4->setValue(KGlobal::config()->readNumEntry("Hour4",7)); + minute4->setValue(KGlobal::config()->readNumEntry("Minute4",0)); + hour5->setValue(KGlobal::config()->readNumEntry("Hour5",7)); + minute5->setValue(KGlobal::config()->readNumEntry("Minute5",0)); + hour6->setValue(KGlobal::config()->readNumEntry("Hour6",7)); + minute6->setValue(KGlobal::config()->readNumEntry("Minute6",0)); + hour7->setValue(KGlobal::config()->readNumEntry("Hour7",7)); + minute7->setValue(KGlobal::config()->readNumEntry("Minute7",0)); + + QString volend(KGlobal::config()->readEntry("VolumeEnd","80%")); + volend.truncate(volend.length()-1); + + volEndValue->setValue(volend.toInt()); + + switch (KGlobal::config()->readNumEntry("ModeAlarm",0)) + { + case 0: + alarmmode->setChecked(true); + break; + case 1: + morningmode->setChecked(true); + break; + case 2: + nightmode->setChecked(true); + break; + default: + alarmmode->setChecked(true); + } +} + +#include "wakeup.moc" diff --git a/noatun-plugins/alarm/wakeup.h b/noatun-plugins/alarm/wakeup.h new file mode 100644 index 0000000..e2992a8 --- /dev/null +++ b/noatun-plugins/alarm/wakeup.h @@ -0,0 +1,103 @@ +/*************************************************************************** + wakeup.h - alarm plugin for noatun + ------------------- + begin : Wed Apr 11 CEST 2000 + copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org> + + ***************************************************************************/ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#ifndef WAKEUP_H +#define WAKEUP_H + +#include <noatun/pref.h> +#include <noatun/plugin.h> +#include <qradiobutton.h> +#include <qbuttongroup.h> +#include <qpushbutton.h> + +class QSpinBox; +class QCheckBox; +class KMinuteSpinBox; +class KPercentSpinBox; + +class Wakeup : public QObject, public Plugin +{ + Q_OBJECT + NOATUNPLUGIND + +public: + Wakeup(); + ~Wakeup(); + static Wakeup *wakeme; + void PlayerAct(); + void update(); + +public slots: + void slotVolumeChange(); + void slotCheckTime(); + +private: + QStringList *day_list; +// QString songlist; + int hour[7]; + int minute[7]; + bool days[7]; + QTimer *volTimer; + int volEndVal; + int modeAlarm; +}; + + +class WakeupPrefs : public CModule +{ + Q_OBJECT + +public: + WakeupPrefs( QObject *parent ); + virtual void save(); + virtual void load(); +public slots: + void slotViewFrame(int); + void slotApplyAll(); + +private: + QCheckBox *monday; + QCheckBox *tuesday; + QCheckBox *wednesday; + QCheckBox *thursday; + QCheckBox *friday; + QCheckBox *saturday; + QCheckBox *sunday; + KMinuteSpinBox *minute1; + KMinuteSpinBox *minute2; + KMinuteSpinBox *minute3; + KMinuteSpinBox *minute4; + KMinuteSpinBox *minute5; + KMinuteSpinBox *minute6; + KMinuteSpinBox *minute7; + QSpinBox *hour1; + QSpinBox *hour2; + QSpinBox *hour3; + QSpinBox *hour4; + QSpinBox *hour5; + QSpinBox *hour6; + QSpinBox *hour7; + + KPercentSpinBox *volEndValue; + QRadioButton *alarmmode; + QRadioButton *morningmode; + QRadioButton *nightmode; + QFrame *volFrame; + QPushButton *applyall; +}; + +#endif // WAKEUP_H diff --git a/noatun-plugins/alarm/wakeup.plugin b/noatun-plugins/alarm/wakeup.plugin new file mode 100644 index 0000000..8a851c5 --- /dev/null +++ b/noatun-plugins/alarm/wakeup.plugin @@ -0,0 +1,115 @@ +Filename=noatunwakeup.la +Author=Mickael Marchand +Site=http://www.freenux.org/ +Email=mikmak@freenux.org +Type=other +License=GPL +Name=WakeUp +Name[af]=Word wakker +Name[ar]=استيقظ +Name[az]=Oyan +Name[cs]=Budíček +Name[cy]=Deffro +Name[da]=VågnOp +Name[de]=Wecker +Name[el]=Ξύπνησε +Name[eo]=Vekilo +Name[es]=Despertador +Name[et]=Ärataja +Name[fa]=بیدار شدن +Name[fi]=Herätys +Name[fr]=Réveil +Name[fy]=Wekker +Name[he]=התעורר +Name[hi]=वेक-अप +Name[hr]=Buđenje +Name[it]=Sveglia +Name[ka]=გაღვიძება +Name[kk]=Ояту +Name[km]=ភ្ញាក់ឡើង +Name[lt]=Žadintuvas +Name[mk]=РазбудиСе +Name[nb]=Våknopp +Name[nds]=Weckklock +Name[ne]=जगाउनु +Name[nl]=Wekker +Name[nn]=Vakn-opp +Name[nso]=Tsoga +Name[pa]=ਜਗਾਉ +Name[pl]=Budzenie +Name[ro]=Deşteptător +Name[ru]=Пробуждение +Name[sl]=Zbudi se +Name[sv]=Väckarklocka +Name[ta]=எழுந்திருத்தல் +Name[tg]=Бедоршавӣ +Name[tr]=Uyan +Name[uk]=Пробудження +Name[uz]=Uygʻotish +Name[uz@cyrillic]=Уйғотиш +Name[vi]=Dậy đi +Name[xh]=Vuka +Name[zh_CN]=醒来 +Comment=A simple, customizable alarm +Comment[af]='n eenvoudige, pakmaakbaar alarm +Comment[ar]=منبه بسيط قابل للتخصيص +Comment[az]=Bəsit bir alarm +Comment[bg]=Проста и лесна за настройване аларма за събуждане сутрин +Comment[bs]=Jednostavan, lagan za podešavanje alarm +Comment[ca]=Una alarma senzilla i personalitzable +Comment[cs]=Jednoduchý, přizpůsobitelný alarm +Comment[cy]=Alarwm syml addasadwy +Comment[da]=En simpel, brugerdefinérbar alarm +Comment[de]=Ein einfacher, anpassbarer Wecker +Comment[el]=Ένα απλό, ρυθμιζόμενο ξυπνητήρι +Comment[en_GB]=A simple, customisable alarm +Comment[eo]=Simpla, proprebla alarmilo +Comment[es]=Una alarma sencilla y personalizable +Comment[et]=Lihtne kohandatav ärataja +Comment[eu]=Alarma erraz eta pertsonalizatua +Comment[fa]=یک هشدار قابل سفارش و ساده +Comment[fi]=Yksinkertainen herätysohjelma +Comment[fr]=Une alarme simple personnalisable +Comment[fy]=In ienfâldich yn te stellen alaarm +Comment[ga]=Aláram simplí, in-saincheaptha +Comment[gl]=Unha alarma simples e configurábel +Comment[he]=תזכורת פשוטה הניתנת להתאמה אישית +Comment[hi]=एक साधारण, कस्टमाइजेबल अलार्म +Comment[hr]=Jednostavan i prilagodljiv alarm +Comment[hu]=Egyszerű, testreszabható emlékeztetés +Comment[is]=Einfaldur og stillanlegur vekjari +Comment[it]=Un allarme semplice e personalizzabile +Comment[ja]=シンプルでカスタマイズ可能なアラーム +Comment[ka]=მარტივი მორგებადი მაღვიძარა +Comment[kk]=Қарапайым, бапталатын оятқыш +Comment[km]=សំឡេងរោទ៍ដែលអាចប្ដូរតាមបំណងធម្មតាមួយ +Comment[lt]=Paprastas, derinamas, žadintuvas +Comment[mk]=Едноставен приспособлив аларм +Comment[ms]=Jam loceng mudah selenggara +Comment[nb]=En enkel vekkeklokke som kan tilpasses +Comment[nds]=En eenfache Weckklock mit mennige Instellen +Comment[ne]=एउटा सामान्य, अनुकूलनयोग्य संसूचक +Comment[nl]=Een eenvoudig in te stellen alarm +Comment[nn]=Ei enkel vekkjarklokke som kan tilpassast +Comment[nso]=Alamo ye bonolo, yago amanyega +Comment[pa]=ਛੋਟਾ ਜਿਹਾ, ਆਸਾਨ ਅਲਾਰਮ +Comment[pl]=Prosty budzik +Comment[pt]=Um alarme simples e configurável +Comment[pt_BR]=Um alarme simples e personalizável +Comment[ro]=O aplicaţie de alarmare simplă şi personalizabilă +Comment[ru]=Простой будильник с различными настройками +Comment[sk]=Jednoduchý, nastaviteľný alarm +Comment[sl]=Preprost prilagodljiv alarm +Comment[sr]=Једноставан, прилагодљив аларм +Comment[sr@Latn]=Jednostavan, prilagodljiv alarm +Comment[sv]=Enkel anpassningsbar väckarklocka +Comment[ta]=எளிய, தனிப்பயனாக்கு எச்சரிக்கை மணி +Comment[tg]=Огоҳкунаки оддӣ бо танзимотҳои гуногун +Comment[tr]=Basit, ayarlanabilir bir alarm +Comment[uk]=Простий будильник з різноманітними параметрами +Comment[uz]=Oddiy ogohlantirgich +Comment[uz@cyrillic]=Оддий огоҳлантиргич +Comment[vi]=Đồng hồ báo thức đơn giản có thể tùy chỉnh +Comment[xh]=I alamu elula, yokwenza into ngokwemfuneko +Comment[zh_CN]=一个简单的可定制的闹钟 +Comment[zh_TW]=一個簡單可調整的鬧鐘 diff --git a/noatun-plugins/alsaplayer/AlsaPlayer.ui b/noatun-plugins/alsaplayer/AlsaPlayer.ui new file mode 100644 index 0000000..772af81 --- /dev/null +++ b/noatun-plugins/alsaplayer/AlsaPlayer.ui @@ -0,0 +1,2640 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>APMainWindow</class> +<widget class="QWidget"> + <property name="name"> + <cstring>APMainWindow</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>385</width> + <height>118</height> + </rect> + </property> + <property name="caption"> + <string>Noaplayer</string> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="layoutMargin" stdset="0"> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>4</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QFrame"> + <property name="name"> + <cstring>Frame3</cstring> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>10</red> + <green>95</green> + <blue>137</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>10</red> + <green>95</green> + <blue>137</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>10</red> + <green>95</green> + <blue>137</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <property name="layoutMargin" stdset="0"> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <property name="spacing"> + <number>4</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>speedLabelLeft</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>Speed:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <widget class="QLabel" row="1" column="3"> + <property name="name"> + <cstring>timeLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>No time data</string> + </property> + </widget> + <widget class="QLabel" row="0" column="1"> + <property name="name"> + <cstring>speedLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>100%</string> + </property> + </widget> + <widget class="QLabel" row="0" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>titleLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>No stream</string> + </property> + </widget> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>volumeLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>100%</string> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>volumeLabelLeft</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>Volume:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <widget class="QLabel" row="1" column="2"> + <property name="name"> + <cstring>infoLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>241</red> + <green>241</green> + <blue>241</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </disabled> + <inactive> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>114</red> + <green>114</green> + <blue>114</blue> + </color> + <color> + <red>152</red> + <green>152</green> + <blue>152</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>8</red> + <green>93</green> + <blue>139</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + </inactive> + </palette> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </grid> + </widget> + <widget class="Seeker"> + <property name="name"> + <cstring>seeker</cstring> + </property> + <property name="minimumSize"> + <size> + <width>32</width> + <height>16</height> + </size> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout10</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>4</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout9</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout8</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QToolButton"> + <property name="name"> + <cstring>menuButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="popupDelay"> + <number>0</number> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Menu</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>previousButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Skip to previous track</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>playButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Play</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>nextButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image3</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Skip to next track</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>stopButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image4</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Stop</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>playlistButton</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image5</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Show playlist</string> + </property> + </widget> + </hbox> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout5</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout3</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QToolButton"> + <property name="name"> + <cstring>pauseButton</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image6</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Pause</string> + </property> + </widget> + <widget class="QToolButton"> + <property name="name"> + <cstring>forwardButton</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string></string> + </property> + <property name="pixmap"> + <pixmap>image7</pixmap> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Forwards, normal speed</string> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>speedSlider</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="maxValue"> + <number>233</number> + </property> + <property name="value"> + <number>66</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Playback speed and direction</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <property name="layoutSpacing" stdset="0"> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>2</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>PixmapLabel2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="pixmap"> + <pixmap>image8</pixmap> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Balance</string> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>balanceSlider</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="value"> + <number>50</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Balance</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>PixmapLabel1</cstring> + </property> + <property name="pixmap"> + <pixmap>image9</pixmap> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Volume</string> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>volumeSlider</cstring> + </property> + <property name="maxValue"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Volume</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>Seeker</class> + <header location="local">seeker.h</header> + <sizehint> + <width>64</width> + <height>22</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>5</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image10</pixmap> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="2716">789c8dd4c972db461006e0bb9e82a5bea952bf89958372e5a0c5a23652a256caa91c060b454924b5905a5379770fba7b60a62c25117cf93c3f67d0e806beacb58647bdd6da9795f9c22eae8b5631b68fadb5f2693a7dfbe3cfdfff5a590db256fd2fe8b4c2d5df5656078b56d1eadfcdaa1a74e9406dfeab0d52c7ea99388803364dd52630bc7e210efdef536f5d3ff20ee5f7dfd4715bd607deba7ea636ba5fdb3bccd877ea42f27869ccebd413476df5c43b0a38ffaa2ea41e84deba9ff18ee4bca1386e8b69e61df37ea4f5c7b15aef2736b165435d88712c4efcfd04de0937876ed5895acf4f83546cd5895afb9566a99c772e36a5c9d9fabcb2208bf9bcefea2c2bd8da0f1b58593f54276a9d0f5b59ced38d380f7359cfd4a9baafaef2922df3629afeca3c9834d0e775ef2df5a2a81d34fdc4b5b8e95f47adf38877b5ce23e5de7ade01db34f3b22b6efa5d8a7dff70af36ea37b5cff7c4852da4bebdda61d36fdca8b5dff42af6cf979ed959a4f34ca762d76ea9f7405c54b23f71fd511019a99fae1acbef47623f8fb06a3f6f9be2322c13cef3fb16074999c8fab6d8f703cfe2a67f5be23295df839f6f6cfdfc81e72d09fdfce244dcd17ed29bd8e8fc625fecebc393b8b4257f8fb0c17612139f9fbafd74de4fd47efeb7bd3b11fb589de979ebe2e6bcb9b80aab94f363b675fb49bf1ec4468d85d8e791d4ee449d40cec38e3ad3f3b99e4eeeccef1fbaea524c92cf4da0eb1371652ba997fb65ea7196fdfaea44cdefa7c97d7f88e7398bddfb2cefdf58dcf4eb513c0a4772fffc7dcd8ae6fbb01037df87486c13fd3e3c889be7c5fdb1b1cf5321b656bf1715bbf0f5e0565d697ddcffbccc43fd9eeca9add653aa7d7debe222d4791c8947ee8fd7f9bc2269f67b57a762c46abfdf5c5ca6badf95d8ef077e1fcb9ff9aed8cda7bc3ffc3ccbaad0f5c1e2ff5ccb49102cf2e62a3e4fba6c890a23775db96b8cebcf932e7b835bce8e3071d9e9a77bce70877b3ce011732cf08467bc7c789f33bce20def2ebb8e0d97dcc416bef9eccf24e7b6d1c50e76b1877d1ca087bebb0e71b49cc400c738c129ce5cf61c1718e29273f5f51d339f441b014244885d36714ad181d16c4640db2789c8524e059588a9a2115dd198ae61e8c65db734a169939cd11dddd383cb3dd29c4a5aa04b4ff48c21bdd0a43e7be93e0dbdd21bbdbbdc7a7d0fb4419bb445ae72c92dd74edbd4a51ddaa53db76749fbd8a103ead1f4a3e7497d3aa4231ad0319dd0299df9733fec9171f76b5dd50603ea2de77eedbbabeddc3d87095e68bafcffbf265df6c2ed3bfce77e1f27eb39a5cb7f9fe4ff98f9bfbfaefc00c86f7cfc</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="449">789c5dd0cf0a824010c7f1bb4fb1b837894a5048a247283a06d1e1b733b3d4a182fe1c227af766560b7510dcefc7c5456785db6dd7ae9865f7071e277274c4cd15fc3c9f5ffbc3ea9de565edf45ab8329f64f9d491db5c2f626baf6b3f4f63c99635eaa686252c9baa299bca522c4100c892ba9436a365e020812d83654c930ef53ad334b66809a1254ff4239644fa280c494f8a71401e08227d52a1382015dbd427483bfd5dcc0c19bd4b6d44661891d998f40efcc8a3fb46e63f0dfec467997d0195cb6726</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="591">789c6dd04d0b823018c0f1fb3ec570378974a898441fa1e8184487672fba0e16941d22faeef5cc692ef7e061ff1f43b625313decb7344ec8bd83ee2ca93470a3b17ab4edf378dabc48c45714bf94f26841a225957477bd685cc377cd523b9806b380a22a00b3c12cb3929719a6c2acf28a573926c3841c38d814362500484ced52f759630a25b4509812b3b6638f341bab2ca8002ca40220a052f9deab56ca73f707a93c778a9b27eeb4df3cfaa0a21e067dd4a61fe3ed9d9aafe6ff0c9efdd404ee6682efe09bd3f9abbfd7e403068c8c08</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="434">789c5dd04d0ac2301005e07d4e119a5d91d6428304f1088a4b415c4c6622baa882d6858877372fa5d274c862dec790bfbad487fd5697b57af6d45f59f3851eba9457d7bd8fa7cd47158dd571ad74532c545169d6bbfb2da037b137cb54888268c93a4b888ce85ad7b81691108989881103a2171fbc207ac473aa748a31a64a65d00d443498f13c92470b221929044a362122cfb08ce258b48c30c6262714e7c422329b82e47b3124a724536296f9ed879948fc7f76fe13dfb5fa01cc9062ba</data> + </image> + <image name="image4"> + <data format="XPM.GZ" length="419">789cc590bd0ac2301080f73cc5916c41aca16806f1112a8e8238dc5d2a3a54c1d641c477b7179bf8f7007e64b8ef1b02778585f5aa025ba8b6c3eec0c07b3c830d97a6b96eb68b9bd26e0afd9b81d323a5c7c0b03c1d6b994d3f9b494494457de99d2f4583283222b2288952a09a82288aee22f1db4f6232ef0c0929c129516afc4a149efc35f180c9893379a1df1dbf2e719fab0784606704</data> + </image> + <image name="image5"> + <data format="XPM.GZ" length="621">789c75d0414bc33014c0f17b3f45e8bb15d9da39c782ec23383c0ae2e1f525693298829b8731f6ddcdcb6b9ae9b4f490ffaf2149336fd4cbf3936ae6d5e188c7408a3c7eaac67cedf7a7d7b7cdb9aabbb5e277a1bafaaeaa678ad4f6e3ddf218e218daf470f69c9ada5613e78e1397d8e1929338c968ed1c274a124a7a4ebb5a3fc85296d3b9fb716527a9b5a4c9291b054942f93ae45c2dd2816f9e6b85bf14b0871b0524a4d127054466f1ac1929f9a88c136785fe076685e489cbba00c6422fe8cadc010c3b46b430ede69919d8a693c130b20f01ca797d64c7167c5981270710bafee33839d2eed7ed00948b9cfd73eb97c7ea1b79808d44</data> + </image> + <image name="image6"> + <data format="XPM.GZ" length="305">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345130345230563054d2e152d2534856f0cbcf4b05b195816c650330007113415c4b134b434b13b04a14804b4419086024542431511946d25c04c376026eaeb5e6020001a43bf5</data> + </image> + <image name="image7"> + <data format="XPM.GZ" length="305">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345130345230563054d2e152d2534856f0cbcf4b05b195816c650330007113415c4b134b434b13b04a1480534459194324112e0617498489218940c5f08aa0ebc23019c376fc6eaeb5e60200d5d93b89</data> + </image> + <image name="image8"> + <data format="XPM.GZ" length="358">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade652323253b05430563054d2e152d2534856f0cbcf4b05b195816c650b630b430b63103711c44d4d4d4d4c05cbeae9e929eb6100901044162aa90c033069b82c4844391102946122605965986e659824541a21ab0c93069b822e8b6431aa5eb834c264655457a1eb4592c5e9df5a6b2e00611245be</data> + </image> + <image name="image9"> + <data format="XPM.GZ" length="309">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345330345430563054d2e152d2534856f0cbcf4b05b195816c650b630b430b63103711c44d4d4d4d4c05cbeaa1018498b2329884892903f9ca89ca7a50418858a2b27222484c19452c112c0611441153c62286a60ed33c2cf662731fba3f6aadb900b64e3d13</data> + </image> + <image name="image10"> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </image> +</images> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/noatun-plugins/alsaplayer/Custom.cw b/noatun-plugins/alsaplayer/Custom.cw new file mode 100644 index 0000000..d2e037b --- /dev/null +++ b/noatun-plugins/alsaplayer/Custom.cw @@ -0,0 +1,20 @@ +<!DOCTYPE CW><CW> +<customwidgets> + <customwidget> + <class>Seeker</class> + <header location="local">seeker.h</header> + <sizehint> + <width>64</width> + <height>22</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>5</verdata> + </sizepolicy> + <pixmap> + <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> + </pixmap> + </customwidget> +</customwidgets> +</CW> diff --git a/noatun-plugins/alsaplayer/Makefile.am b/noatun-plugins/alsaplayer/Makefile.am new file mode 100644 index 0000000..3b149f6 --- /dev/null +++ b/noatun-plugins/alsaplayer/Makefile.am @@ -0,0 +1,24 @@ +INCLUDES= $(all_includes) + +kde_module_LTLIBRARIES = noatunalsaplayer.la + +noatunalsaplayer_la_SOURCES = \ + AlsaPlayer.ui \ + alsaplayerui.cpp \ + userinterface.cpp \ + configmodule.cpp \ + seeker.cpp + +noatunalsaplayer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module + +noatunalsaplayer_la_LIBADD = -lnoatuncontrols -lnoatun + +noatunalsaplayer_la_METASOURCES = AUTO + +noinst_HEADERS = userinterface.h configmodule.h seeker.h + +noatun_DATA = alsaplayerui.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/alsaplayerui.pot diff --git a/noatun-plugins/alsaplayer/alsaplayerui.cpp b/noatun-plugins/alsaplayer/alsaplayerui.cpp new file mode 100644 index 0000000..1620b78 --- /dev/null +++ b/noatun-plugins/alsaplayer/alsaplayerui.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "userinterface.h" +#include <klocale.h> + +extern "C" +{ + Plugin * create_plugin() + { + KGlobal::locale()->insertCatalogue("alsaplayerui"); + return new AlsaPlayer; + } +} + +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/alsaplayer/alsaplayerui.plugin b/noatun-plugins/alsaplayer/alsaplayerui.plugin new file mode 100644 index 0000000..49dce46 --- /dev/null +++ b/noatun-plugins/alsaplayer/alsaplayerui.plugin @@ -0,0 +1,84 @@ +Filename=noatunalsaplayer.la +Author=Rik Hemsley +Site=http://noatun.kde.org/plugins/alsaplayer/ +Email=rik@kde.org +Type=userinterface +License=Artistic +Name=AlsaPlayer +Name[af]=Alsa-speler +Name[ar]=مشغل Alsa +Name[cy]=ChwaraewrAlsa +Name[eo]=Alsaludilo +Name[fy]=Alsaspiler +Name[hi]=अल्सा-प्लेयर +Name[nb]=Alsaspiller +Name[ne]=एल्साप्लेएर +Name[nl]=Alsaspeler +Name[nn]=Alsaspelar +Name[nso]=Sbapadi sa Alsa +Name[ro]=Redare Alsa +Name[sv]=Alsaplayer +Name[ta]=Alsa இயக்கி +Name[tr]=Alsa Çalıcı +Name[uz]=Alsa pleyer +Name[uz@cyrillic]=Alsa плейер +Name[xh]=Umdlali weAlsa +Name[zh_CN]=Alsa 播放器 +Comment=AlsaPlayer UI clone +Comment[af]=Alsa-speler Ui kloon +Comment[az]=AlsaPlayer İA bənzəri +Comment[bg]=Версия на графичния интерфейс на плеъра AlsaPlayer +Comment[bs]=AlsaPlayer UI klon +Comment[ca]=Clon de la interfície d'usuari per a l'AlsaPlayer +Comment[cs]=Klon uživatelského rozhraní AlsaPlayer +Comment[cy]=Clôn UI ChwaraewrAlsa +Comment[da]=AlsaPlayer UI-klon +Comment[de]=Benutzeroberfläche für AlsaPlayer +Comment[el]=Κλώνος του περιβάλλοντος χρήσης AlsaPlayer +Comment[eo]=Klono de Alsaludilo +Comment[es]=Clon del reproductor AlsaPlayer +Comment[et]=AlsaPlayeri kasutajaliides +Comment[eu]=AlsaPlayer UI klona +Comment[fa]=بدل دقیق واسط کاربر AlsaPlayer +Comment[fi]=AlsaPlayer käyttöliittymäklooni +Comment[fr]=Clone de l'interface AlsaPlayer +Comment[fy]=Kloan fan AlsaSpiler UI +Comment[gl]=Clone da interface de AlsaPlayer +Comment[he]=תואם ממשק המשתמש של AlsaPlayer +Comment[hi]=अल्सा-प्लेयर यूआई क्लोन +Comment[hr]=AlsaPlayer UI klon +Comment[hu]=AlsaPlayer-változat +Comment[is]=AlsaPlayer eftirlíking +Comment[it]=Clone UI di AlsaPlayer +Comment[ja]=AlsaPlayer UI クローン +Comment[ka]=AlsaPlayer UI კლონი +Comment[kk]=AlsaPlayer интерфейсі +Comment[km]=AlsaPlayer ក្លូន UI +Comment[lt]=AlsaPlayer naudotojo sąsajos klonas +Comment[mk]=Клон на AlsaPlayer +Comment[ms]=Klon UI AlsaPlayer +Comment[nb]=UI-klon for Alsa-spiller +Comment[nds]=AlsaPlayer-Böversietkloon +Comment[ne]=एल्साप्लेएर यूआई क्लोन +Comment[nl]=Kloon van AlsaPlayer UI +Comment[nn]=UI-klon av AlsaPlayer +Comment[pl]=Klon interfejsu użytkownika dla AlsaPlayer +Comment[pt]=Clone da interface do AlsaPlayer +Comment[pt_BR]=Clone do AlsaPlayer +Comment[ro]=Clonă interfaţă grafică "Redare Alsa" +Comment[ru]=Интерфейс к AlsaPlayer +Comment[sk]=Klon AlsaPlayer UI +Comment[sl]=Klon uporabniškega vmensnika AlsaPlayer +Comment[sr]=UI клон AlsaPlayer-а +Comment[sr@Latn]=UI klon AlsaPlayer-a +Comment[sv]=Kopia av Alsaplayer-gränssnitt +Comment[ta]=Alsaஇயக்கி UI clone +Comment[tg]=Интерфейси дигар ба AlsaPlayer +Comment[tr]=AlsaPlayer arayüzü +Comment[uk]=Дублікат зовнішнього інтерфейсу AlsaPlayer +Comment[uz]=Alsa pleyer uchun grafik interfeys +Comment[uz@cyrillic]=Alsa плейер учун график интерфейс +Comment[vi]=Bộ nhái giao diện AlsaPlayer +Comment[xh]=Umdlali weAlsa Indlela yokwenza into efana nenye ye UI +Comment[zh_CN]=Alsa 播放器的界面复制品 +Comment[zh_TW]=AlsaPlayer 使用者介面 diff --git a/noatun-plugins/alsaplayer/configmodule.cpp b/noatun-plugins/alsaplayer/configmodule.cpp new file mode 100644 index 0000000..07c5cfd --- /dev/null +++ b/noatun-plugins/alsaplayer/configmodule.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <klocale.h> +#include <kglobal.h> +#include <kconfig.h> + +#include <qcheckbox.h> +#include <qlayout.h> + +#include "configmodule.h" + +AlsaPlayerConfigModule::AlsaPlayerConfigModule(QObject * parent) + : + CModule + ( + i18n("AlsaPlayer"), + i18n("AlsaPlayer Interface Settings"), + "appearance", + parent + ) +{ + scroll_ = new QCheckBox(i18n("Scroll song title"), this); + + QVBoxLayout * layout = new QVBoxLayout(this); + + layout->addWidget(scroll_); + + layout->addStretch(100); + + reopen(); +} + + void +AlsaPlayerConfigModule::save() +{ + KConfig * c(KGlobal::config()); + c->setGroup("AlsaPlayerInterface"); + c->writeEntry("ScrollTitle", scroll_->isChecked()); + c->sync(); + emit(saved()); +} + + void +AlsaPlayerConfigModule::reopen() +{ + KConfig * c(KGlobal::config()); + c->setGroup("AlsaPlayerInterface"); + scroll_->setChecked(c->readBoolEntry("ScrollTitle", true)); +} + +// vim:ts=2:sw=2:tw=78:noet +#include "configmodule.moc" diff --git a/noatun-plugins/alsaplayer/configmodule.h b/noatun-plugins/alsaplayer/configmodule.h new file mode 100644 index 0000000..2104fdf --- /dev/null +++ b/noatun-plugins/alsaplayer/configmodule.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef ALSAPLAYER_CONFIG_MODULE_H +#define ALSAPLAYER_CONFIG_MODULE_H + +#include <noatun/pref.h> + +class QCheckBox; + +class AlsaPlayerConfigModule : public CModule +{ + Q_OBJECT + + public: + + AlsaPlayerConfigModule(QObject *); + + signals: + + void saved(); + + public slots: + + virtual void save(); + virtual void reopen(); + + private: + + QCheckBox * scroll_; +}; + +#endif // ALSAPLAYER_CONFIG_MODULE_H +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/alsaplayer/seeker.cpp b/noatun-plugins/alsaplayer/seeker.cpp new file mode 100644 index 0000000..6ffac8c --- /dev/null +++ b/noatun-plugins/alsaplayer/seeker.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <qtimer.h> + +#include <noatun/app.h> +#include <noatun/player.h> +#include "seeker.h" + +Seeker::Seeker(QWidget * parent, const char * name) + : L33tSlider(0, 1000, 10, 0, Horizontal, parent, name) +{ + connect(this, SIGNAL(userChanged(int)), SLOT(slotValueChanged(int))); + + connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout())); +} + +Seeker::~Seeker() +{ +} + +void Seeker::slotValueChanged(int i) +{ + napp->player()->skipTo((int)(i*1000)); +} + +void Seeker::slotTimeout() +{ + if(!napp->player()->current()) return; + if(currentlyPressed()) return; + + setRange(0, (int)napp->player()->getLength() / 1000 ); + setValue((int)napp->player()->getTime() / 1000 ); +} + +void Seeker::wheelEvent(QWheelEvent *) +{ + // ignore +} + +// vim:ts=2:sw=2:tw=78:noet +#include "seeker.moc" diff --git a/noatun-plugins/alsaplayer/seeker.h b/noatun-plugins/alsaplayer/seeker.h new file mode 100644 index 0000000..ec5504e --- /dev/null +++ b/noatun-plugins/alsaplayer/seeker.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef SEEKER_H +#define SEEKER_H + +#include <noatun/controls.h> + +class Seeker : public L33tSlider +{ + Q_OBJECT + + public: + + Seeker(QWidget * parent, const char * name = 0); + virtual ~Seeker(); + + protected slots: + + void slotValueChanged(int i); + void slotTimeout(); + + protected: + + void wheelEvent(QWheelEvent *); + + private: +}; + +#endif +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/alsaplayer/userinterface.cpp b/noatun-plugins/alsaplayer/userinterface.cpp new file mode 100644 index 0000000..1071736 --- /dev/null +++ b/noatun-plugins/alsaplayer/userinterface.cpp @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "seeker.h" +#include "userinterface.h" +#include <noatun/app.h> +#include <noatun/player.h> +#include <noatun/controls.h> +#include <noatun/effects.h> +#include <noatun/engine.h> + +#include <qtoolbutton.h> +#include <qdragobject.h> +#include <qlayout.h> +#include <qtooltip.h> +#include <qframe.h> + +#include <kstatusbar.h> +#include <kpopupmenu.h> +#include <kurldrag.h> +#include <kglobal.h> +#include <kconfig.h> +#include <klocale.h> +#include <kiconloader.h> +#include <kurldrag.h> +#include <noatun/playlist.h> +#include <noatun/stdaction.h> + +#include <arts/artsmodules.h> +#include <arts/reference.h> +#include <arts/soundserver.h> +#include <arts/kmedia2.h> + +#include "configmodule.h" + +AlsaPlayer::AlsaPlayer() + : APMainWindow (0, "AlsaPlayer"), + UserInterface (), + speed_ (100) +{ + connect + ( + playlistButton, + SIGNAL(clicked()), + napp->player(), + SLOT(toggleListView()) + ); + + connect + ( + previousButton, + SIGNAL(clicked()), + napp->player(), + SLOT(back()) + ); + + connect + ( + nextButton, + SIGNAL(clicked()), + napp->player(), + SLOT(forward()) + ); + + connect + ( + stopButton, + SIGNAL(clicked()), + napp->player(), + SLOT(stop()) + ); + + connect + ( + playButton, + SIGNAL(clicked()), + napp->player(), + SLOT(playpause()) + ); + + connect(napp, SIGNAL(hideYourself()), SLOT(hide())); + connect(napp, SIGNAL(showYourself()), SLOT(show())); + + connect(napp->player(), SIGNAL(playlistShown()), SLOT(slotPlayListShown())); + connect(napp->player(), SIGNAL(playlistHidden()), SLOT(slotPlayListHidden())); + connect(napp->player(), SIGNAL(playing()), SLOT(slotPlaying())); + connect(napp->player(), SIGNAL(stopped()), SLOT(slotStopped())); + connect(napp->player(), SIGNAL(paused()), SLOT(slotPaused())); + + connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout())); + connect(napp->player(), SIGNAL(changed()), SLOT(slotTrackChanged())); + + connect + ( + napp->player(), + SIGNAL(volumeChanged(int)), + SLOT(slotVolumeChanged(int)) + ); + + connect + ( + new AlsaPlayerConfigModule(this), + SIGNAL(saved()), + SLOT(slotConfigChanged()) + ); + + connect + ( + volumeSlider, + SIGNAL(valueChanged(int)), + napp->player(), + SLOT(setVolume(int)) + ); + + connect + ( + forwardButton, + SIGNAL(clicked()), + SLOT(slotForward()) + ); + + connect + ( + pauseButton, + SIGNAL(clicked()), + SLOT(slotPause()) + ); + + connect(speedSlider, SIGNAL(valueChanged(int)), SLOT(slotSetSpeed(int))); + + menuButton->setPopup(NoatunStdAction::ContextMenu::contextMenu()); + + setIcon(BarIcon("noatun")); + + napp->player()->handleButtons(); + + loadConfig(); + + resize(sizeHint().width(), minimumSizeHint().height()); + + show(); +} + +AlsaPlayer::~AlsaPlayer() +{ + // Empty. +} + +void AlsaPlayer::closeEvent(QCloseEvent *) +{ + unload(); +} + +void AlsaPlayer::dragEnterEvent(QDragEnterEvent *event) +{ + event->accept(KURLDrag::canDecode(event)); +} + +void AlsaPlayer::dropEvent(QDropEvent *event) +{ + KURL::List uri; + if (KURLDrag::decode(event, uri)) + { + for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i) + napp->player()->openFile(*i, false); + } +} + +void AlsaPlayer::setTitleText(const QString & s) +{ + QString titleText + (s.isNull() ? napp->player()->current().title() : s); + + if (titleLabel->text() != titleText) + titleLabel->setText(titleText); +} + +void AlsaPlayer::slotPlaying() +{ + setTitleText(QString::null); + + playButton->setOn(true); + stopButton->setEnabled(true); +} + +void AlsaPlayer::slotStopped() +{ + setTitleText(i18n("No File Loaded")); + + stopButton->setEnabled(false); + playButton->setOn(false); +} + +void AlsaPlayer::slotPaused() +{ + setTitleText(QString::null); + + stopButton->setEnabled(true); + playButton->setOn(false); +} + +bool AlsaPlayer::eventFilter(QObject *o, QEvent *e) +{ + switch (e->type()) + { + case QEvent::MouseButtonPress: + mousePressEvent(static_cast<QMouseEvent *>(e)); + break; + + case QEvent::Wheel: + wheelEvent(static_cast<QWheelEvent*>(e)); + return true; + break; + + default: + break; + } + + return QWidget::eventFilter(o, e); +} + +void AlsaPlayer::slotPlayListShown() +{ + playlistButton->setOn(true); +} + +void AlsaPlayer::slotPlayListHidden() +{ + playlistButton->setOn(false); +} + +void AlsaPlayer::mousePressEvent(QMouseEvent * e) +{ + if (e->button() == RightButton) + { + NoatunStdAction::ContextMenu::showContextMenu(); + return; + } + + return QWidget::mousePressEvent(e); +} + +void AlsaPlayer::wheelEvent(QWheelEvent * e) +{ + int newVolume = napp->player()->volume() + (e->delta() / 120); + napp->player()->setVolume(newVolume); +} + +void AlsaPlayer::slotConfigChanged() +{ + loadConfig(); +} + +void AlsaPlayer::slotVolumeChanged(int i) +{ + QString text("%1%"); + volumeLabel->setText(text.arg(i)); + volumeSlider->setValue(i); +} + +void AlsaPlayer::slotTimeout() +{ + // noatun bug: napp->player()->lengthString() will crash if there's + // no 'current track'. + if (!napp->player()->current()) + return; + + setTitleText(QString::null); + + QString lengthText(napp->player()->lengthString()); + + if (timeLabel->text() != lengthText) + timeLabel->setText(lengthText); +} + +void AlsaPlayer::loadConfig() +{ + // Empty. +} + +void AlsaPlayer::slotRestart() +{ + napp->player()->skipTo(0); +} + +void AlsaPlayer::slotTrackChanged() +{ + slotSetSpeed(speed_); +} + +void AlsaPlayer::slotSetSpeed(int newSpeed) +{ + speed_ = newSpeed; + + pauseButton->setEnabled(0 != speed_); + speedLabel->setText(QString("%1%").arg(speed_)); + + Arts::PlayObject playobject(napp->player()->engine()->playObject()); + Arts::PitchablePlayObject pitchable = Arts::DynamicCast(playobject); + + if (!pitchable.isNull()) + { + float f = (float(speed_) / 100.f); + pitchable.speed(f); + } +} + +void AlsaPlayer::slotPause() +{ + speedSlider->setValue(0); + pauseButton->setEnabled(false); +} + +void AlsaPlayer::slotForward() +{ + speedSlider->setValue(100); +} + +#include "userinterface.moc" +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/alsaplayer/userinterface.h b/noatun-plugins/alsaplayer/userinterface.h new file mode 100644 index 0000000..2a97b86 --- /dev/null +++ b/noatun-plugins/alsaplayer/userinterface.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef USERINTERFACE_H +#define USERINTERFACE_H + +#include <noatun/plugin.h> + +#include "AlsaPlayer.h" + +class Seeker; + +/** + * @short Main window class + * @author Rik Hemsley <rik@kde.org> + * @version 1.0 + */ +class AlsaPlayer : public APMainWindow, public UserInterface +{ + Q_OBJECT + + public: + + AlsaPlayer(); + virtual ~AlsaPlayer(); + + void load(const QString & url); + + protected slots: + + virtual void slotConfigChanged(); + + virtual void slotVolumeChanged(int); + + virtual void slotPlaying(); + virtual void slotStopped(); + virtual void slotPaused(); + + virtual void slotPlayListShown(); + virtual void slotPlayListHidden(); + + virtual void slotTimeout(); + + virtual void slotRestart(); + + virtual void slotTrackChanged(); + virtual void slotSetSpeed(int); + + virtual void slotPause(); + virtual void slotForward(); + + protected: + + virtual void mousePressEvent (QMouseEvent *); + virtual void dragEnterEvent (QDragEnterEvent *); + virtual void dropEvent (QDropEvent *); + virtual void closeEvent (QCloseEvent *); + virtual bool eventFilter (QObject *, QEvent *); + virtual void wheelEvent (QWheelEvent *); + virtual void setTitleText (const QString &); + + void loadConfig(); + + private: + + Seeker * seeker_; + + int speed_; +}; + +#endif +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/blurscope/Makefile.am b/noatun-plugins/blurscope/Makefile.am new file mode 100644 index 0000000..6ac86b3 --- /dev/null +++ b/noatun-plugins/blurscope/Makefile.am @@ -0,0 +1,10 @@ +INCLUDES= $(all_includes) $(SDL_CFLAGS) + +kde_module_LTLIBRARIES = noatunblurscope.la +noatunblurscope_la_SOURCES = sdlscope.cpp scopedisplayer.cpp +noatunblurscope_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries) +noatunblurscope_la_LIBADD = $(LIB_KFILE) -lnoatun -lm $(SDL_LIBS) +noatunblurscope_la_METASOURCES = AUTO + +noatun_DATA = blurscope.plugin +noatundir = $(kde_datadir)/noatun diff --git a/noatun-plugins/blurscope/blurscope.plugin b/noatun-plugins/blurscope/blurscope.plugin new file mode 100644 index 0000000..9b50232 --- /dev/null +++ b/noatun-plugins/blurscope/blurscope.plugin @@ -0,0 +1,74 @@ +Filename=noatunblurscope.la +Author=Charles Samuels +Site=http://noatun.kde.org/ +Email=charles@kde.org +Type=visualization +License=BSD +Name=Blurscope +Name[da]=Blurskop +Name[de]=Blurskop +Name[eo]=Monoskopo +Name[hi]=ब्लरस्कोप +Name[ne]=ब्लरस्कोप +Name[nn]=Skoddeskop +Name[ru]=Зрительный образ Размытие +Name[sv]=Blurskop +Name[ta]=கறை செயற்பரப்பு +Name[tg]=Рахна кардан +Name[tr]=Buğulu Alan +Name[vi]=Xem mờ +Name[zh_CN]=模糊观测器 +Comment=A pretty, fading monoscope +Comment[af]='n redelik, uitdoof monoskoop +Comment[az]=Gözəl, feydləyən monoskop +Comment[bg]=Хубавичък и шарен визуализатор +Comment[bs]=Lijep fading monoscope +Comment[ca]=Un bonic monoscopi per a desdibuixar +Comment[cs]=Pěkný monoskop +Comment[cy]=Monosgop del, gwanllyd +Comment[da]=Et flot, henfaldende monoskop +Comment[de]=Ein schönes, ausblendendes Monoskop +Comment[el]=Ένα όμορφο, ομαλό καλειδοσκόπιο +Comment[eo]=Okulplaĉa, stompanta monoskopo +Comment[es]=Un bonito suavizado +Comment[et]=Kena ja hägune Monoscope'ile tuginev ostsilloskoop +Comment[eu]=Motelduz doan monoskopio polit bat +Comment[fa]=monoscope محوشوندۀ زیبای +Comment[fi]=Kaunis häviävä monoskooppi +Comment[fr]=Un joli scope de fondus +Comment[fy]=In fraaie, ferdizenjende monoskoop +Comment[gl]=Un osciloscópio bonito e que se desvanece +Comment[he]=מונוסקופ יפה שנמוג +Comment[hi]=एक सुन्दर, मन्द होता मोनोस्कोप +Comment[hr]=Lijep, pretapajući monoskop +Comment[hu]=Elhalványuló monoszkóp +Comment[is]=Falleg monoscope myndbrella +Comment[ja]=感じの良いフェードするモノスコープ +Comment[ka]=სიმპატიური ჩამოშლადი monoscope +Comment[kk]=Көркем эффект моноскопы +Comment[km]=ម៉ូណូស្កូបលិចបន្តិចម្ដងៗដ៏ស្អាតអាត +Comment[lt]=Gražus, lėtai išnykstantis monoskopas +Comment[mk]=Убав, избледувачки осцилоскоп +Comment[ms]=Monoskop luntur dan cantik +Comment[nb]=Et pent, hendøende monoskop +Comment[nds]=En smuck, utblennen Monoskop +Comment[ne]=एउटा राम्रो, फेडिङ मोनोस्कोप +Comment[nl]=Een fraaie, vervagende monoscoop +Comment[nn]=Eit pent, monoskop som tonar ut +Comment[pl]=Ładny, gasnący monoskop +Comment[pt]=Um osciloscópio bonito e que se desvanece +Comment[pt_BR]=Um monoscópio +Comment[ro]=Un monoscop cu estompare şi drăguţ +Comment[ru]=Зрительный образ с эффектом размытия +Comment[sk]=Pekný, blednucí monoskop +Comment[sl]=Prijeten, pojemajoč monoscope +Comment[sr]=Леп, бледећи моноскоп +Comment[sr@Latn]=Lep, bledeći monoskop +Comment[sv]=Snyggt, tonande monoskop +Comment[ta]=அழகான ஒரே வண்ண நிறமாற்றம் +Comment[tg]=Намуди тамошобин бо қувваи рахна +Comment[tr]=Güzel, yok olan Monoskop +Comment[uk]=Гарний, згасаючий моноскоп +Comment[vi]=Xem mờ dần đẹp +Comment[xh]=I monoscope ephelayo, entle +Comment[zh_CN]=一个美观的能够逐渐淡出的单管观测器 diff --git a/noatun-plugins/blurscope/scopedisplayer.cpp b/noatun-plugins/blurscope/scopedisplayer.cpp new file mode 100644 index 0000000..42b375a --- /dev/null +++ b/noatun-plugins/blurscope/scopedisplayer.cpp @@ -0,0 +1,291 @@ +/***************************************************************** + +Copyright (c) 2001 Charles Samuels <charles@kde.org> + 2001 Neil Stevens <multivac@fcmail.com> + With code stolen from Paul Harrison <pfh@yoyo.cc.monash.edu.au> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +******************************************************************/ + +#include "sdlscope.h" + +#if 0 +#define TEST() cout << "At line " << __LINE__ << endl +#else +#define TEST() if(0) +#endif + +#define output ((unsigned char*)data) +template <class Type> +inline void Bitmap<Type>::addPixel(int x, int y, int br1, int br2) +{ + if (x < 0 || x >= width || y < 0 || y >= height) return; + + register unsigned char *p = output+x*2+y*width*2; + if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; +} + +template <class Type> +void Bitmap<Type>::addVertLine(int x, int y1, int y2, int br1, int br2) +{ + if(y1 < y2) + { + for(int y = y1; y <= y2; y++) + addPixel(x,y, br1, br2); + } + else if(y2 < y1) + { + for(int y = y2; y <= y1; y++) + addPixel(x, y, br1, br2); + } + else + { + addPixel(x, y1, br1, br2); + } +} + +template <class Type> +void Bitmap<Type>::fadeStar() +{ + register unsigned long *ptr = (unsigned long*)output; + int i = width*height*2/4; + do + { + if (*ptr) + *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5); + ptr++; + } while(--i > 0); +} + +SDLView::SDLView(int in) : mFd(in), outputBmp(0), fullscreen(false) +{ + surface = 0; + width = 320; + height = width*6/8; + outputBmp.size(width, height); + TEST(); + + TEST(); + fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) & ~O_NONBLOCK); + TEST(); + + + float *data = new float[width]; + TEST(); + + startVideo(); + setupPalette(); + TEST(); + + while(true) + { + checkInput(); + + if(!surface) exit(0); + + int bytestoread = width * sizeof(float); + int pos = 0; + while(pos < bytestoread) + { + char *d = (char *)data; + int r = read(mFd, d + pos, bytestoread - pos); + if(r > 0) pos += r; + else if (r==0) exit(0); + } + + outputBmp.fadeStar(); + outputBmp.fadeStar(); + + float *d = data; + float *end = data + width; + float heightHalf = height / 4.0; + int y = height / 2; + int x=0; + int oldy=(int)(*d * heightHalf); + while(d <= end) + { + int amp = (int)(*d * heightHalf); + amp+=y; + + outputBmp.addVertLine(x, oldy, amp, 255, 255); + oldy=amp; + + d++; + x++; + } + repaint(); + } +} + +static SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) +{ + SDL_Surface *screen; + + // Set the video mode + screen = SDL_SetVideoMode(w, h, bpp, flags); + return screen; +} + +void SDLView::startVideo() +{ + if(surface) + { + SDL_FreeSurface(surface); + surface = 0; + } + + Uint32 videoflags; + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) + exit(0); + + SDL_WM_SetCaption("BlurScope","blurscope"); + + /* See if we try to get a hardware colormap */ + videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0); + + surface = CreateScreen(width, height, 8, videoflags); + if (!surface) + exit(0); + + SDL_ShowCursor(0); + + if(!surface) + SDL_Quit(); + + SDL_WM_SetCaption("BlurScope", 0); + SDL_ShowCursor(0); + +} + +void SDLView::setupPalette(double) +{ +#define BOUND(x) ((x) > 255 ? 255 : (x)) +#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + + int redMax=136; + int greenMax=136; + int blueMax=255; + + SDL_Color sdlPalette[256]; + + for(int i=0;i<256;i++) + { + // i + // 255 136 + sdlPalette[i].r = i*redMax/255; + sdlPalette[i].g = i*greenMax/255; + sdlPalette[i].b = i*blueMax/255; + } + + SDL_SetColors(surface, sdlPalette, 0, 256); + +#undef BOUND +#undef PEAKIFY +#undef MAX +} + +void SDLView::checkInput() +{ + SDL_Event myEvent; + + while(SDL_PollEvent(&myEvent)) + { + switch(myEvent.type) + { + case SDL_KEYDOWN: + switch(myEvent.key.keysym.sym) + { + case SDLK_SPACE: +// fullscreen ^= true; +// startVideo(); + break; + default: + break; + } + break; + + case SDL_QUIT: + exit(0); + break; + } + } +} + +#define output2 ((unsigned char*)outputBmp.data) + +void SDLView::repaint() +{ + SDL_LockSurface(surface); + TEST(); + + register unsigned long *ptr2 = (unsigned long*)output2; + unsigned long *ptr1 = (unsigned long*)( surface->pixels ); + int i = width*height/4; + TEST(); + + do { + // Asger Alstrup Nielsen's (alstrup@diku.dk) + // optimized 32 bit screen loop + register unsigned int const r1 = *(ptr2++); + register unsigned int const r2 = *(ptr2++); + + //if (r1 || r2) { +#ifdef LITTLEENDIAN + register unsigned int const v = + ((r1 & 0x000000f0ul) >> 4) + | ((r1 & 0x0000f000ul) >> 8) + | ((r1 & 0x00f00000ul) >> 12) + | ((r1 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r2 & 0x000000f0ul) << 12) + | ((r2 & 0x0000f000ul) << 8) + | ((r2 & 0x00f00000ul) << 4) + | ((r2 & 0xf0000000ul))); +#else + register unsigned int const v = + ((r2 & 0x000000f0ul) >> 4) + | ((r2 & 0x0000f000ul) >> 8) + | ((r2 & 0x00f00000ul) >> 12) + | ((r2 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r1 & 0x000000f0ul) << 12) + | ((r1 & 0x0000f000ul) << 8) + | ((r1 & 0x00f00000ul) << 4) + | ((r1 & 0xf0000000ul))); +#endif + //} else ptr1++; + } while (--i); + TEST(); + + SDL_UnlockSurface(surface); + SDL_UpdateRect(surface, 0, 0, 0, 0); + TEST(); + +} + +SDLView::~SDLView() +{ + ::close(mFd); +} + + diff --git a/noatun-plugins/blurscope/sdlscope.cpp b/noatun-plugins/blurscope/sdlscope.cpp new file mode 100644 index 0000000..9485c1f --- /dev/null +++ b/noatun-plugins/blurscope/sdlscope.cpp @@ -0,0 +1,78 @@ +/***************************************************************** + +Copyright (c) 2001 Charles Samuels <charles@kde.org> + 2001 Neil Stevens <multivac@fcmail.com> + With code stolen from Paul Harrison <pfh@yoyo.cc.monash.edu.au> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************/ + +#include <sys/wait.h> +#include <sys/types.h> + +#include "sdlscope.h" + +extern "C" +{ +Plugin *create_plugin() +{ + return new SDLScope(); +} +} + +SDLScope::SDLScope() + : MonoScope(50) + , Plugin() +{ + setSamples(320); +} + +SDLScope::~SDLScope() +{ + ::close(mOutFd); + wait(0); +} + +void SDLScope::init() +{ + int pipes[2]; + ::pipe(pipes); + mOutFd=pipes[1]; + if (!fork()) + { + ::close(pipes[1]); + new SDLView(pipes[0]); + exit(0); + } + else + { + fcntl(mOutFd, F_SETFL, fcntl(mOutFd, F_GETFL) & ~O_NONBLOCK); + ::close(pipes[0]); + MonoScope::start(); + } +} + +void SDLScope::scopeEvent(float *d, int size) +{ + if (::write(mOutFd, (char *)d, size * sizeof(float))==-1) + { + MonoScope::stop(); + unload(); + } +} + diff --git a/noatun-plugins/blurscope/sdlscope.h b/noatun-plugins/blurscope/sdlscope.h new file mode 100644 index 0000000..45c734c --- /dev/null +++ b/noatun-plugins/blurscope/sdlscope.h @@ -0,0 +1,110 @@ +/***************************************************************** + +Copyright (c) 2000-2001 the noatun authors. See file AUTHORS. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +******************************************************************/ + +#ifndef SDLSCOPE_H +#define SDLSCOPE_H + +#include <noatun/plugin.h> +#include <string.h> + +extern "C" +{ +#include <SDL.h> +#include <fcntl.h> +#include <unistd.h> +} + +class SDLScope : public MonoScope, public Plugin +{ +NOATUNPLUGIND + +public: + SDLScope(); + virtual ~SDLScope(); + + void init(); + +protected: + virtual void scopeEvent(float *data, int bands); + +private: + int mOutFd; +}; + +struct SDL_Surface; + +template<class Pixel> class Bitmap +{ +public: + int width, height, extra; + Pixel *data; + + Bitmap(int e=0) : extra(e), data(0) { } + ~Bitmap() { delete[] data; } + + inline void addPixel(int x, int y, int bright1, int bright2); + void addVertLine(int x, int y, int y2, int br1, int br2); + + void fadeStar(); + + void size(int w,int h) + { + delete[] data; + width = w; + height = h; + data = new Pixel[w*h+extra]; + clear(); + } + + void clear() + { + memset(data,0,sizeof(Pixel)*(width*height+extra)); + } +}; + + +class SDLView +{ +public: + SDLView(int in); + ~SDLView(); + +protected: + void startVideo(); + void checkInput(); + void setupPalette(double dummy=0.0); + + void repaint(); + +private: + int mFd; + + SDL_Surface *surface; + Bitmap<unsigned short> outputBmp; + + bool fullscreen; + int width; + int height; +}; + +#endif diff --git a/noatun-plugins/charlatan/Makefile.am b/noatun-plugins/charlatan/Makefile.am new file mode 100644 index 0000000..0603703 --- /dev/null +++ b/noatun-plugins/charlatan/Makefile.am @@ -0,0 +1,23 @@ +INCLUDES= $(all_includes) + +kde_module_LTLIBRARIES = noatuncharlatan.la + +noatuncharlatan_la_SOURCES = \ + charlatanui.cpp \ + seeker.cpp \ + userinterface.cpp \ + configmodule.cpp + +noatuncharlatan_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module + +noatuncharlatan_la_LIBADD = -lnoatuncontrols -lnoatun + +noatuncharlatan_la_METASOURCES = AUTO + +noinst_HEADERS = userinterface.h configmodule.h seeker.h + +noatun_DATA = charlatanui.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/charlatanui.pot diff --git a/noatun-plugins/charlatan/charlatanui.cpp b/noatun-plugins/charlatan/charlatanui.cpp new file mode 100644 index 0000000..a2a9bec --- /dev/null +++ b/noatun-plugins/charlatan/charlatanui.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include "userinterface.h" +#include <klocale.h> + +extern "C" +{ + Plugin * create_plugin() + { + KGlobal::locale()->insertCatalogue("charlatanui"); + return new Charlatan; + } +} + +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/charlatanui.plugin b/noatun-plugins/charlatan/charlatanui.plugin new file mode 100644 index 0000000..254074d --- /dev/null +++ b/noatun-plugins/charlatan/charlatanui.plugin @@ -0,0 +1,77 @@ +Filename=noatuncharlatan.la +Author=Rik Hemsley +Site=http://noatun.kde.org/plugins/charlatan/ +Email=rik@kde.org +Type=userinterface +License=Artistic +Name=Charlatan +Name[af]=Voorgewer +Name[az]=Şarlatan +Name[cs]=Šarlatán +Name[eo]=Ĉarlatano +Name[hi]=चार्लटन +Name[hr]=Šarlatan +Name[ne]=नक्कली +Name[nn]=Sjarlatan +Name[pl]=Szarlatan +Name[pt_BR]=Charlatão +Name[ro]=Şarlatan +Name[ru]=Обманщик +Name[ta]=சர்லதான் +Name[tg]=Шарлатан +Name[tr]=Şarlatan +Name[uk]=Шарлатан +Comment=The dead man's interface +Comment[az]=Ölü adamın ara üzü +Comment[bg]=Интерфейс за плеъра Noatun +Comment[bs]=Interfejs mrtvog čovjeka +Comment[ca]=Interfície per al penjat +Comment[cs]=Rozhraní "mrtvého muže" +Comment[cy]=Rhyngwyneb y marw +Comment[da]=Den døde mands grænseflade +Comment[de]=Schnittstelle eines toten Mannes +Comment[el]=Το γραφικό περιβάλλον dead man +Comment[eo]=La interfaco de la mortinta homo +Comment[es]=La interfaz del ahorcado +Comment[et]=Surnud mehe pale +Comment[eu]=Hilda dagoen gizonaren interfazea +Comment[fi]=Kuolleen miehen liittymä +Comment[fr]=L'interface de l'homme mort +Comment[fy]=Interface fan in deade man +Comment[ga]=Comhéadan na marbh +Comment[gl]=A interface do home morto +Comment[hi]=द डीड मैन्स इंटरफेस +Comment[hr]=Sučelje mrtve straže +Comment[hu]=Egy haláli vizualizációs modul +Comment[is]=Viðmót dauða mannsins +Comment[it]=L'interfaccia per l'uomo duro +Comment[ja]=dead man のインターフェース +Comment[ka]=მკვდრის ინტერფეისი +Comment[kk]=Charlatan интерфейсі +Comment[km]=ចំណុចប្រទាក់របស់ man ស្លាប់ +Comment[lt]=Mirusio žmogaus sąsaja +Comment[mk]=Интерфејсот на мртвиот човек +Comment[ms]=Antaramuka lelaki mati +Comment[nb]=Død manns grensesnitt +Comment[nds]=Koppelsteed vun den doden Mann +Comment[ne]=मृत मानिसको इन्टरफेस +Comment[nl]=Interface van een dode man +Comment[nn]=Daudmannsgrensesnitt +Comment[pl]=Motyw ascetyczny +Comment[pt]=A interface do homem morto +Comment[pt_BR]=Uma interface para homens sem saída +Comment[ro]=Interfaţa "dead man" +Comment[ru]=Интерфейс Обманщик +Comment[sk]=Rozhranie dead man +Comment[sl]=Vmesnik mrtvega človeka +Comment[sr]=Интерфејс мртвог човека +Comment[sr@Latn]=Interfejs mrtvog čoveka +Comment[sv]=Död mans gränssnitt +Comment[ta]=இறந்த மனிதனின் இடைமுகம் +Comment[tg]=Интерфейси шарлатан +Comment[tr]=Ölü adamın arabirimi +Comment[uk]=Інтерфейс обманка +Comment[vi]=Giao diện của người chết +Comment[xh]=Ubuso bendoda ubujongeneyo +Comment[zh_CN]=死人界面 +Comment[zh_TW]=The dead man 介面 diff --git a/noatun-plugins/charlatan/configmodule.cpp b/noatun-plugins/charlatan/configmodule.cpp new file mode 100644 index 0000000..0b2e178 --- /dev/null +++ b/noatun-plugins/charlatan/configmodule.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <klocale.h> +#include <kglobal.h> +#include <kconfig.h> + +#include <qcheckbox.h> +#include <qlayout.h> + +#include "configmodule.h" +#include "configmodule.moc" +CharlatanConfigModule::CharlatanConfigModule(QObject * parent) + : + CModule + ( + i18n("Charlatan"), + i18n("Charlatan Interface Settings"), + "appearance", + parent + ) +{ + scroll_ = new QCheckBox(i18n("Scroll song title"), this); + + QVBoxLayout * layout = new QVBoxLayout(this); + + layout->addWidget(scroll_); + + layout->addStretch(100); + + reopen(); +} + + void +CharlatanConfigModule::save() +{ + KConfig * c(KGlobal::config()); + c->setGroup("CharlatanInterface"); + c->writeEntry("ScrollTitle", scroll_->isChecked()); + c->sync(); + emit(saved()); +} + + void +CharlatanConfigModule::reopen() +{ + KConfig * c(KGlobal::config()); + c->setGroup("CharlatanInterface"); + scroll_->setChecked(c->readBoolEntry("ScrollTitle", true)); +} + +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/configmodule.h b/noatun-plugins/charlatan/configmodule.h new file mode 100644 index 0000000..92b0bf7 --- /dev/null +++ b/noatun-plugins/charlatan/configmodule.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef CHARLATAN_CONFIG_MODULE_H +#define CHARLATAN_CONFIG_MODULE_H + +#include <noatun/pref.h> + +class QCheckBox; + +class CharlatanConfigModule : public CModule +{ + Q_OBJECT + + public: + + CharlatanConfigModule(QObject *); + + signals: + + void saved(); + + public slots: + + virtual void save(); + virtual void reopen(); + + private: + + QCheckBox * scroll_; +}; + +#endif // CHARLATAN_CONFIG_MODULE_H +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/pixmaps.h b/noatun-plugins/charlatan/pixmaps.h new file mode 100644 index 0000000..9235f9b --- /dev/null +++ b/noatun-plugins/charlatan/pixmaps.h @@ -0,0 +1,612 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef __PIXMAP_H__ +#define __PIXMAP_H__ + +static const char * const px_close[] = { +"16 16 4 1", +"o c black", +"x c Gray50", +". c white", +" c None", +" ", +" oo oo ", +" o.xo ox.o ", +" ox.xo ox.xo ", +" ox.xo ox.xo ", +" ox.xoox.xo ", +" ox.xx.xo ", +" ox..xo ", +" ox..xo ", +" ox.xx.xo ", +" ox.xoox.xo ", +" ox.xo ox.xo ", +" ox.xo ox.xo ", +" o.xo ox.o ", +" oo oo ", +" " +}; + +static const char * const px_playlist[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" ooo ", +" o . o ", +" o . . o ", +" o . . . o ", +" o. . . .o ", +" o . . . o ", +" o . . o ", +" o . ooo ", +" ooo ooo ", +" ooo ", +" ooo ", +" o ", +" ", +" " +}; + +static const char * const px_album[] = { +"16 16 4 1", +"o c black", +"x c Gray50", +". c White", +" c None", +" ", +" ", +" ", +" oooooo ", +" oo......oo ", +" o..x....xxxo ", +" o....xooxx...o ", +"o.....o o.....o", +"o.....o o.....o", +" o...xxoox....o ", +" oxxx....x..o ", +" oo......oo ", +" oooooo ", +" ", +" ", +" " +}; + +static const char * const px_artist[] = { +"16 16 4 1", +"o c black", +"x c Gray50", +". c White", +" c None", +" oxxo ", +" oxxo ", +" oxxo ", +" oxxo ", +" oxxo ", +" oxxo ", +" oxxo ", +" oxxo ", +" oooo ", +" oxxoo ", +" o..xoo ", +" o.xxoo ", +" o.xxoo ", +" oxxoo ", +" o.xoo ", +" oooo " +}; + +static const char * const px_track[] = { +"16 16 4 1", +"o c black", +"x c Gray50", +". c white", +" c None", +" ", +" oo ", +" ooxoo ", +" oo..xoo ", +" oox...xoo ", +" oooox...oo ", +" oo oox.oo ", +" ooooo oooo ", +" oo.xoo oo ", +" oxoooo oo ", +" ooooo ooooo ", +" ooo oo.xoo ", +" oxoooo ", +" ooooo ", +" ooo ", +" " +}; + +static const char * const px_next[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" 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 ", +" ", +" " +}; + +static const char * const px_pause[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" oo oo ", +" 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 ", +" oo oo ", +" ", +" " +}; + +static const char * const px_play1[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" oo ", +" o .oo ", +" o. . oo ", +" o . . .oo ", +" o. . . . oo ", +" o . . . . .o ", +" o. . . . . o ", +" o . . . .oo ", +" o. . . oo ", +" o . .oo ", +" o. oo ", +" oo ", +" ", +" " +}; + +static const char * const px_play2[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" ", +" oo ", +" o .oo ", +" o. . oo ", +" o . . .oo ", +" o. . . . o ", +" o . . . .o ", +" o. . . oo ", +" o . .oo ", +" o. oo ", +" oo ", +" ", +" ", +" " +}; + +static const char * const px_play3[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" ", +" ", +" oo ", +" o .oo ", +" o. . oo ", +" o . . .o ", +" o. . . o ", +" o . .oo ", +" o. oo ", +" oo ", +" ", +" ", +" ", +" " +}; + +static const char * const px_restart[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" o o ", +" o.o o.o ", +" o. o o. o ", +" o. .oo. .o ", +" o. . o. . o ", +" o. . o. . .o ", +" o . .o . . o ", +" o . .o . .o ", +" o . oo . o ", +" o .o o .o ", +" o o o o ", +" o o ", +" ", +" " +}; + +static const char * const px_previous[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" 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 ", +" ", +" " +}; + +static const char * const px_stop[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ", +" oooooooooo ", +" o . . . . .o ", +" o. . . . . o ", +" o . . . . .o ", +" o. . . . . o ", +" o . . . . .o ", +" o. . . . . o ", +" o . . . . .o ", +" o. . . . . o ", +" o . . . . .o ", +" o. . . . . o ", +" oooooooooo ", +" ", +" " +}; + +static const char * const px_config[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" ", +" ooo ", +" o. o ", +" o. o ", +" oo o .o ", +" o.oo . o ", +" o . . . o ", +" o . . . ooo ", +" ooo . . . o ", +" o . . . o ", +" o . oo.o ", +" o. o oo ", +" o .o ", +" o .o ", +" ooo ", +" " +}; + +static const char * const px_x[] = { +"12 12 2 1", +"o c black", +" c None", +" ", +" o ", +" ooo ", +" ooooo ", +" ooooo ", +" ooooo ", +" ooooo ", +" ooooo ", +" o oo ", +" oo o ", +" ooo ", +" " +}; + +static const char * const px_plus[] = { +"12 12 2 1", +"o c black", +" c None", +" ", +" oo ", +" oo ", +" oo ", +" oo ", +" oooooooooo ", +" oooooooooo ", +" oo ", +" oo ", +" oo ", +" oo ", +" " +}; + +static const char * const px_minus[] = { +"12 12 2 1", +"o c black", +" c None", +" ", +" ", +" ", +" ", +" ", +" oooooooooo ", +" oooooooooo ", +" ", +" ", +" ", +" ", +" " +}; + +static const char * const px_none[] = { +"16 16 1 1", +" c None", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; + +static const char * const px_squelch[] = { +"16 16 3 1", +"o c black", +". c white", +" c None", +" oo ", +" 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 ", +" oo o. .o ", +" o. .o ", +" o. .o ", +" o .o ", +" oo " +}; + + +static const char * const px_squelch_large[] = { +"32 32 124 2", +" c None", +". c #090D11", +"+ c #000000", +"@ c #151B21", +"# c #9AB9DD", +"$ c #688BB5", +"% c #0D1319", +"& c #9DBCDE", +"* c #CDE4FF", +"= c #739CCA", +"- c #06080B", +"; c #20262B", +"> c #A5C1E1", +", c #AED3FF", +"' c #789FCC", +") c #181E23", +"! c #C8D9EC", +"~ c #C7E0FF", +"{ c #6D98C8", +"] c #10161C", +"^ c #A3C0E0", +"/ c #C7E1FF", +"( c #6F99C8", +"_ c #171D22", +": c #95B6DB", +"< c #A1CDFF", +"[ c #6A96C7", +"} c #191F24", +"| c #B4CBE6", +"1 c #BBDAFF", +"2 c #B3CBE5", +"3 c #719AC9", +"4 c #C4DFFF", +"5 c #79A0CC", +"6 c #0F151B", +"7 c #98B8DC", +"8 c #759DCB", +"9 c #111821", +"0 c #05080A", +"a c #0E1216", +"b c #A6C2E1", +"c c #D7E9FF", +"d c #9AB9DC", +"e c #131A23", +"f c #BBD3EF", +"g c #9AB6D5", +"h c #06090C", +"i c #111315", +"j c #ACC3DD", +"k c #C2DEFF", +"l c #82ABDA", +"m c #10171E", +"n c #0E141A", +"o c #B9CFE9", +"p c #B5D7FF", +"q c #6B94C2", +"r c #0D1013", +"s c #7DA1CA", +"t c #9DCAFF", +"u c #75A1D4", +"v c #192026", +"w c #92B5DD", +"x c #81A4CB", +"y c #9AC9FF", +"z c #7BA5D5", +"A c #8FB3DC", +"B c #A5CEFF", +"C c #6690C0", +"D c #111417", +"E c #80A4CB", +"F c #77A2D4", +"G c #7FA8D7", +"H c #92C4FF", +"I c #6590C0", +"J c #101316", +"K c #7EA2CA", +"L c #9FCBFF", +"M c #6F9DD2", +"N c #161D24", +"O c #A3C0E2", +"P c #070A0D", +"Q c #7299C5", +"R c #86BEFF", +"S c #040608", +"T c #5F6469", +"U c #A5CAF3", +"V c #5E85B2", +"W c #010202", +"X c #27384B", +"Y c #171717", +"Z c #90A8C4", +"` c #90C3FF", +" . c #7DB1ED", +".. c #1E2A39", +"+. c #020203", +"@. c #101010", +"#. c #9EB3CC", +"$. c #C0DDFF", +"%. c #7FB2ED", +"&. c #111111", +"*. c #9FB3CC", +"=. c #C3DFFF", +"-. c #8DBAEF", +";. c #262626", +">. c #A3B7CE", +",. c #A8D0FF", +"'. c #81B3ED", +"). c #1E1E1E", +"!. c #A6B9D0", +"~. c #A7D0FF", +"{. c #010101", +"]. c #96ACC7", +"^. c #8BA4C1", +"/. c #ABD1FF", +"(. c #80B3ED", +"_. c #070707", +":. c #829DBD", +"<. c #ADD3FF", +"[. c #141414", +"}. c #A5B9D0", +"|. c #ABD2FF", +"1. c #7EB1ED", +"2. c #63788F", +"3. c #5679A2", +" . + ", +" @ # $ + ", +" % & * = - ", +" ; > , ' . ", +" ) ! ~ { . ", +" ] ^ / ( . ", +" _ : < [ . ", +" } | 1 ( . ", +" ] 2 * 3 . ", +" ] > 4 5 . ", +" 6 7 1 8 . 9 0 ", +" a b c d . e f g h ", +" i j k l m n o p q h ", +" r s t u m v w , q h ", +" r x y z m m A B C h ", +" D E t F m m G H I h ", +" J K L M m N O H I h ", +" P Q R M S + T U R V W ", +" h I X + Y Z ` ...+ ", +" +.+ @.#.$.%...+ ", +" &.*.=.-...+ ", +" ;.>.,.'...+ ", +" ).!.~. ...+ ", +" {.].p ...+ ", +" + ^./.(...+ ", +" _.:.<.'...+ ", +" [.}.|.1...+ ", +" + 2.|. ...+ ", +" + 3...+ ", +" + + ", +" ", +" " +}; + +#endif + diff --git a/noatun-plugins/charlatan/seeker.cpp b/noatun-plugins/charlatan/seeker.cpp new file mode 100644 index 0000000..4c07411 --- /dev/null +++ b/noatun-plugins/charlatan/seeker.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <qtimer.h> + +#include <noatun/app.h> +#include <noatun/player.h> +#include "seeker.h" +#include "seeker.moc" + +Seeker::Seeker(QWidget * parent) + : QSlider(0, 60, 10, 0, Horizontal, parent), + adjusting_(false) +{ + delayedUpdateTimer_ = new QTimer(this); + + connect(this, SIGNAL(sliderPressed()), SLOT(slotSliderPressed())); + connect(this, SIGNAL(sliderReleased()), SLOT(slotSliderReleased())); + connect(this, SIGNAL(valueChanged(int)), SLOT(slotValueChanged(int))); + + connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout())); + connect(delayedUpdateTimer_, SIGNAL(timeout()), SLOT(slotDelayedUpdate())); +} + +Seeker::~Seeker() +{ +} + + void +Seeker::slotSliderPressed() +{ + adjusting_ = true; +} + + void +Seeker::slotValueChanged(int) +{ + if (adjusting_) + delayedUpdateTimer_->start(100, true); +} + + void +Seeker::slotDelayedUpdate() +{ + napp->player()->skipTo(value()); +} + + void +Seeker::slotSliderReleased() +{ + delayedUpdateTimer_->stop(); + adjusting_ = false; + napp->player()->skipTo(value()); +} + + void +Seeker::wheelEvent(QWheelEvent *) +{ + // Ignore. +} + + void +Seeker::slotTimeout() +{ + blockSignals(true); + { + delayedUpdateTimer_->stop(); + + int currentLength = int(napp->player()->getLength()); + int currentTime = int(napp->player()->getTime()); + + if (currentLength != maxValue()) + setMaxValue(currentLength); + + if (!adjusting_) + { + if (currentTime != value()) + setValue(currentTime); + } + } + blockSignals(false); + update(); +} + +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/seeker.h b/noatun-plugins/charlatan/seeker.h new file mode 100644 index 0000000..ff7af93 --- /dev/null +++ b/noatun-plugins/charlatan/seeker.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef SEEKER_H +#define SEEKER_H + +#include <qslider.h> + +class QTimer; + +class Seeker : public QSlider +{ + Q_OBJECT + + public: + + Seeker(QWidget * parent); + virtual ~Seeker(); + + protected slots: + + void slotValueChanged(int i); + void slotSliderPressed(); + void slotSliderReleased(); + void slotDelayedUpdate(); + void slotTimeout(); + + protected: + + void wheelEvent(QWheelEvent *); + + private: + + bool adjusting_; + QTimer * delayedUpdateTimer_; +}; + +#endif +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/userinterface.cpp b/noatun-plugins/charlatan/userinterface.cpp new file mode 100644 index 0000000..e15a686 --- /dev/null +++ b/noatun-plugins/charlatan/userinterface.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <noatun/scrollinglabel.h> +#include "userinterface.h" +#include <noatun/app.h> +#include <noatun/player.h> +#include <noatun/controls.h> +#include <noatun/effects.h> + +#include <qaccel.h> +#include <qtoolbutton.h> +#include <qdragobject.h> +#include <qlayout.h> +#include <qtooltip.h> +#include <qframe.h> +#include <kurldrag.h> +#include <kstatusbar.h> +#include <kglobal.h> +#include <kconfig.h> +#include <klocale.h> +#include <kurldrag.h> +#include <kiconloader.h> +#include <noatun/playlist.h> +#include <noatun/stdaction.h> + +#include "configmodule.h" +#include "pixmaps.h" +#include "seeker.h" + +Charlatan::Charlatan() + : QWidget (0, "Charlatan"), + UserInterface (), + previousButton_ (0L), + stopButton_ (0L), + playButton_ (0L), + nextButton_ (0L), + playListToggleButton_ (0L), + restartButton_ (0L), + seekSlider_ (0L), + titleLabel_ (0L), + positionLabel_ (0L), + showingVolumeTimer_ (0L), + title_ ("c.h.a.r.l.a.t.a.n") +{ + setAcceptDrops(true); + + showingVolumeTimer_ = new QTimer(this); + + connect + ( + showingVolumeTimer_, + SIGNAL(timeout()), + SLOT(slotStopShowingVolume()) + ); + + playListToggleButton_ = new QToolButton(this); + previousButton_ = new QToolButton(this); + nextButton_ = new QToolButton(this); + stopButton_ = new QToolButton(this); + restartButton_ = new QToolButton(this); + playButton_ = new QToolButton(this); + + seekSlider_ = new Seeker(this); + positionLabel_ = new QLabel(this); + + titleLabel_ = new ScrollingLabel(i18n("No File Loaded"), this); + + playListToggleButton_ ->setPixmap(QPixmap((const char **)px_playlist)); + previousButton_ ->setPixmap(QPixmap((const char **)px_previous)); + nextButton_ ->setPixmap(QPixmap((const char **)px_next)); + stopButton_ ->setPixmap(QPixmap((const char **)px_stop)); + restartButton_ ->setPixmap(QPixmap((const char **)px_restart)); + playButton_ ->setPixmap(QPixmap((const char **)px_play1)); + + playListToggleButton_ ->setToggleButton(true); + + QVBoxLayout * mainLayout = new QVBoxLayout(this); + + mainLayout->addWidget(titleLabel_); + + mainLayout->addSpacing(2); + + QHBoxLayout * positionLayout = new QHBoxLayout(mainLayout); + + positionLayout->addWidget(seekSlider_); + positionLayout->addSpacing(2); + positionLayout->addWidget(positionLabel_); + + mainLayout->addSpacing(2); + + QHBoxLayout * buttonLayout = new QHBoxLayout(mainLayout); + + buttonLayout->addWidget(playListToggleButton_); + buttonLayout->addWidget(previousButton_); + buttonLayout->addWidget(nextButton_); + buttonLayout->addWidget(stopButton_); + buttonLayout->addWidget(restartButton_); + buttonLayout->addWidget(playButton_); + + playListToggleButton_ ->installEventFilter(this); + previousButton_ ->installEventFilter(this); + nextButton_ ->installEventFilter(this); + stopButton_ ->installEventFilter(this); + restartButton_ ->installEventFilter(this); + playButton_ ->installEventFilter(this); + seekSlider_ ->installEventFilter(this); + positionLabel_ ->installEventFilter(this); + titleLabel_ ->installEventFilter(this); + + connect + ( + playListToggleButton_, + SIGNAL(clicked()), + napp->player(), + SLOT(toggleListView()) + ); + + connect + ( + previousButton_, + SIGNAL(clicked()), + napp->player(), + SLOT(back()) + ); + + connect + ( + nextButton_, + SIGNAL(clicked()), + napp->player(), + SLOT(forward()) + ); + + connect + ( + stopButton_, + SIGNAL(clicked()), + napp->player(), + SLOT(stop()) + ); + + connect(restartButton_, SIGNAL(clicked()), SLOT(slotRestart())); + + connect + ( + playButton_, + SIGNAL(clicked()), + napp->player(), + SLOT(playpause()) + ); + + connect(napp, SIGNAL(hideYourself()), SLOT(hide())); + connect(napp, SIGNAL(showYourself()), SLOT(show())); + + connect(napp->player(), SIGNAL(playlistShown()), SLOT(slotPlayListShown())); + connect(napp->player(), SIGNAL(playlistHidden()), SLOT(slotPlayListHidden())); + connect(napp->player(), SIGNAL(playing()), SLOT(slotPlaying())); + connect(napp->player(), SIGNAL(stopped()), SLOT(slotStopped())); + connect(napp->player(), SIGNAL(paused()), SLOT(slotPaused())); + + connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout())); + + connect + ( + napp->player(), + SIGNAL(volumeChanged(int)), + SLOT(slotVolumeChanged(int)) + ); + + connect + ( + new CharlatanConfigModule(this), + SIGNAL(saved()), + SLOT(slotConfigChanged()) + ); + + setCaption(i18n("Noatun")); + setIcon(BarIcon("noatun")); + + napp->player()->handleButtons(); + + loadConfig(); + + // Using QAccel, because I don't want any strings associated or + // configurability. + + QAccel * a = new QAccel(this, "Accelerators"); + + int accelPlay = a->insertItem(Key_Space); + int accelNext = a->insertItem(Key_H); + int accelPrev = a->insertItem(Key_L); + int accelStop = a->insertItem(Key_Escape); + int accelRstt = a->insertItem(Key_Return); + int accelQuit = a->insertItem(Key_Q); + + a->connectItem(accelPlay, napp->player(), SLOT(playpause())); + a->connectItem(accelNext, napp->player(), SLOT(forward())); + a->connectItem(accelPrev, napp->player(), SLOT(back())); + a->connectItem(accelStop, napp->player(), SLOT(stop())); + a->connectItem(accelRstt, this, SLOT(slotRestart())); + a->connectItem(accelQuit, napp, SLOT(quit())); + + show(); + + setTitleText(); +} + +Charlatan::~Charlatan() +{ + // Empty. +} + +void Charlatan::closeEvent(QCloseEvent *) +{ + unload(); +} + +void Charlatan::dragEnterEvent(QDragEnterEvent *event) +{ + event->accept(KURLDrag::canDecode(event)); +} + +void Charlatan::dropEvent(QDropEvent *event) +{ + KURL::List uri; + if (KURLDrag::decode(event, uri)) + { + for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i) + napp->player()->openFile(*i, false); + } + +} + +void Charlatan::setTitleText(const QString & s) +{ + QString titleText; + + if (!s.isNull()) + { + titleText = s; + } + else + { + Player * player = napp->player(); + + if (0 == player) + { + qWarning("Noatun's player is null. WTF ?"); + return; + } + else + { + PlaylistItem currentItem = player->current(); + + if (!!currentItem) + { + titleText = currentItem.title(); + } + } + } + + if (title_ != titleText) + { + showingVolumeTimer_->stop(); + title_ = titleText; + + if (!showingVolumeTimer_->isActive()) + titleLabel_->setText(title_); + } +} + +void Charlatan::slotPlaying() +{ + setTitleText(); + + playButton_->setOn(true); + stopButton_->setEnabled(true); + playButton_->setPixmap(QPixmap((const char **)px_pause)); +} + +void Charlatan::slotStopped() +{ + setTitleText(i18n("No File Loaded")); + + stopButton_->setEnabled(false); + playButton_->setOn(false); + playButton_->setPixmap(QPixmap((const char **)px_play1)); +} + +void Charlatan::slotPaused() +{ + setTitleText(); + + stopButton_->setEnabled(true); + playButton_->setOn(false); + playButton_->setPixmap(QPixmap((const char **)px_play1)); +} + +bool Charlatan::eventFilter(QObject *o, QEvent *e) +{ + switch (e->type()) + { + case QEvent::Wheel: + wheelEvent(static_cast<QWheelEvent*>(e)); + return true; + break; + + default: + break; + } + + return QWidget::eventFilter(o, e); +} + +void Charlatan::slotPlayListShown() +{ + playListToggleButton_->setOn(true); +} + +void Charlatan::slotPlayListHidden() +{ + playListToggleButton_->setOn(false); +} + +void Charlatan::mousePressEvent(QMouseEvent * e) +{ + if (e->button() == RightButton) + { + NoatunStdAction::ContextMenu::showContextMenu(); + return; + } + + return QWidget::mousePressEvent(e); +} + +void Charlatan::wheelEvent(QWheelEvent * e) +{ + int newVolume = napp->player()->volume() + (e->delta() / 120) * 4; + napp->player()->setVolume(newVolume); +} + +void Charlatan::slotConfigChanged() +{ + loadConfig(); +} + +void Charlatan::slotVolumeChanged(int i) +{ + QString message(i18n("Volume: %1").arg(i)); + + showingVolumeTimer_->start(2000, true); + titleLabel_->setText(message); +} + +void Charlatan::slotStopShowingVolume() +{ + titleLabel_->setText(title_); +} + +void Charlatan::slotTimeout() +{ + // noatun bug: napp->player()->lengthString() will crash if there's + // no 'current track'. + if (!napp->player()->current()) + return; + + setTitleText(); + + QString lengthText(napp->player()->lengthString()); + + if (positionLabel_->text() != lengthText) + positionLabel_->setText(lengthText); +} + +void Charlatan::loadConfig() +{ + KConfig * c(KGlobal::config()); + c->setGroup("CharlatanInterface"); + titleLabel_->setScroll(c->readBoolEntry("ScrollTitle", true)); +} + +void Charlatan::slotRestart() +{ + napp->player()->skipTo(0); +} + +#include "userinterface.moc" +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/charlatan/userinterface.h b/noatun-plugins/charlatan/userinterface.h new file mode 100644 index 0000000..c6a4e06 --- /dev/null +++ b/noatun-plugins/charlatan/userinterface.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef USERINTERFACE_H +#define USERINTERFACE_H + +#include <noatun/plugin.h> + +class QToolButton; +class ScrollingLabel; +class Seeker; +class QLabel; + +/** + * @short Main window class + * @author Rik Hemsley <rik@kde.org> + * @version 1.0 + */ +class Charlatan : public QWidget, public UserInterface +{ + Q_OBJECT + + public: + + Charlatan(); + virtual ~Charlatan(); + + void load(const QString & url); + + protected slots: + + virtual void slotConfigChanged(); + + virtual void slotVolumeChanged(int); + + virtual void slotPlaying(); + virtual void slotStopped(); + virtual void slotPaused(); + + virtual void slotPlayListShown(); + virtual void slotPlayListHidden(); + + virtual void slotTimeout(); + + virtual void slotRestart(); + + virtual void slotStopShowingVolume(); + + protected: + + virtual void mousePressEvent (QMouseEvent *); + virtual void dragEnterEvent (QDragEnterEvent *); + virtual void dropEvent (QDropEvent *); + virtual void closeEvent (QCloseEvent *); + virtual bool eventFilter (QObject *, QEvent *); + virtual void wheelEvent (QWheelEvent *); + virtual void setTitleText (const QString & = QString::null); + + void loadConfig(); + + private: + + QToolButton * previousButton_; + QToolButton * stopButton_; + QToolButton * playButton_; + QToolButton * nextButton_; + QToolButton * playListToggleButton_; + QToolButton * restartButton_; + + Seeker * seekSlider_; + ScrollingLabel * titleLabel_; + + QLabel * positionLabel_; + + QTimer * showingVolumeTimer_; + QString title_; +}; + +#endif +// vim:ts=2:sw=2:tw=78:noet diff --git a/noatun-plugins/configure.in.bot b/noatun-plugins/configure.in.bot new file mode 100644 index 0000000..891f2f2 --- /dev/null +++ b/noatun-plugins/configure.in.bot @@ -0,0 +1,10 @@ +if test "x$NOATUN_SUBDIR" = "x"; then + echo "" + echo "You're missing the noatun header files, therefore" + echo "the noatun plugins cannot be compiled. If you want them," + echo "you should install kdemultimedia first." + echo "" + all_tests=bad +fi + + diff --git a/noatun-plugins/configure.in.in b/noatun-plugins/configure.in.in new file mode 100644 index 0000000..3043714 --- /dev/null +++ b/noatun-plugins/configure.in.in @@ -0,0 +1,203 @@ +# taken from SDL.m4 +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +AM_CONDITIONAL(include_noatunplugin, test x$build_arts = xyes) + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([NOATUN_PATH_SDL], +[ +dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[AC_HELP_STRING([--with-sdl-prefix=PFX], + [Prefix where SDL is installed (optional)])], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[AC_HELP_STRING([--with-sdl-exec-prefix=PFX], + [Exec prefix where SDL is installed (optional)])], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [AC_HELP_STRING([--disable-sdltest], + [Do not try to compile and run a test SDL program])], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_PATH_PROG(SDL_CONFIG, sdl-config, no) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs | sed 's/[[^ ]]*-rpath[[^ ]]*//'` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include <stdio.h> +#include "SDL.h" +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) + +noatun_sdl=no +dnl Check for SDL +dnl require SDL 1.2 just because it's the new stable version, and it's what I have + +AC_ARG_WITH(sdl, + [AC_HELP_STRING([--with-sdl],[enable SDL Noatun plugins @<:@default=check@:>@])], + [], with_sdl=check) + +if test "x$with_sdl" != xno; then + NOATUN_PATH_SDL([1.2.0], [noatun_sdl=yes], []) + + if test "x$with_sdl" != xcheck && test "x$noatun_sdl" != xyes; then + AC_MSG_ERROR([--with-sdl was given, but test for SDL failed]) + fi +fi + +AM_CONDITIONAL(include_SDL, test "$noatun_sdl" = yes) + +AC_CHECK_HEADERS(endian.h) + +NOATUN_SUBDIR= +KDE_CHECK_HEADER(noatun/app.h, NOATUN_SUBDIR=noatun-plugins) + +if test -z "$NOATUN_SUBDIR"; then + dnl dir will only be compiled conditionally + DO_NOT_COMPILE="$DO_NOT_COMPILE noatun-plugins" +fi + diff --git a/noatun-plugins/dub/AUTHORS b/noatun-plugins/dub/AUTHORS new file mode 100644 index 0000000..debb2b3 --- /dev/null +++ b/noatun-plugins/dub/AUTHORS @@ -0,0 +1 @@ +Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> diff --git a/noatun-plugins/dub/BUGS b/noatun-plugins/dub/BUGS new file mode 100644 index 0000000..345c920 --- /dev/null +++ b/noatun-plugins/dub/BUGS @@ -0,0 +1,8 @@ +open bugs: +---------- +* closing dub window quits noatun +* same crash from changing from SPL -> dub + +fixed: +------ +* <mETz> changing from dub -> spl does not close the window diff --git a/noatun-plugins/dub/COPYING b/noatun-plugins/dub/COPYING new file mode 100644 index 0000000..37ba36f --- /dev/null +++ b/noatun-plugins/dub/COPYING @@ -0,0 +1,340 @@ + 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 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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + 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) 19yy 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. + + <signature of Ty Coon>, 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. diff --git a/noatun-plugins/dub/ChangeLog b/noatun-plugins/dub/ChangeLog new file mode 100644 index 0000000..452cb3a --- /dev/null +++ b/noatun-plugins/dub/ChangeLog @@ -0,0 +1,38 @@ +2003-03-02 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> + * fix: use a local copy of KFileItem taken from list view + Can't trust KDirOperator not to destruct it. + +2003-02-26 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> + * implement shuffle/linear sequencer + - use libc random number generator, and init seed with time() + * implement shuffle/recursive sequencer + - use a simple minded selection-randomizer in dir tree + * add a wrapper for libc random functions + +2003-02-24 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> + * implement Linear_Recursive sequencer + * disable unimplemented play options + * fix: open debugging early termination in playlist getFirst + * Recursive_Seq: + - code stabilized + - greatly simplify traversal code + - iterators suck (see DubInfo::past_begin) + - restart preorder traversal if finished + - add prev_preorder traversal + - fix: preorder traversal, there were a quite a few obscure bugs + - fix: remove code to skip from basic traversal class + - verbose debug logging + +2003-02-23 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> + * Recursive_Seq: + - fix: compare recursion root change too with canonical dirs + - fix: avoid reading parent directories. I incidentally had this + backwards, reading only parent dirs. + - implement preorder traversal (next only) + - debugging output + - partially fix iteration of dirs and files in recursive sequencer + - start writing preorder traversal + * fix: read config module options + * fix: show media home on startup / when changed + * remove obsolete file traversal functions + * comment out debug output in playlistitem diff --git a/noatun-plugins/dub/INSTALL b/noatun-plugins/dub/INSTALL new file mode 100644 index 0000000..02a4a07 --- /dev/null +++ b/noatun-plugins/dub/INSTALL @@ -0,0 +1,167 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes a while. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Type `make install' to install the programs and any data files and + documentation. + + 4. You can remove the program binaries and object files from the + source code directory by typing `make clean'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/noatun-plugins/dub/Makefile.am b/noatun-plugins/dub/Makefile.am new file mode 100644 index 0000000..e7268ab --- /dev/null +++ b/noatun-plugins/dub/Makefile.am @@ -0,0 +1,11 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +SUBDIRS = dub + +EXTRA_DIST = dub.kdevprj AUTHORS COPYING ChangeLog INSTALL README TODO BUGS + +####### kdevelop will overwrite this part!!! (end)############ +# not a GNU package. You can remove this line, if +# have all needed files, that a GNU package needs +AUTOMAKE_OPTIONS = foreign + diff --git a/noatun-plugins/dub/NEWS b/noatun-plugins/dub/NEWS new file mode 100644 index 0000000..500795c --- /dev/null +++ b/noatun-plugins/dub/NEWS @@ -0,0 +1,35 @@ +dub-0.5 +------- + +Beta release. Two play modes: all files, single directory. Normal and +shuffle play orders. Enjoy! + + +dub-0.4 +------- + +Alpha release of dub. It includes two play modes: all files and single +directory. Currently only normal (linear) ordering of files is supported. + + +dub-0.3 +------- + + Break DubApp into two classes + Read UI options + Fix: it's no use to return to first item in linear sequencer + if no next is found + + +dub-0.2 +------- + + Clean up cruft, remove unused doc class + Implement a noatun config module + Write some text docs + + +dub-0.1 +------- + + Play and Next working to some extent, eh :) diff --git a/noatun-plugins/dub/README b/noatun-plugins/dub/README new file mode 100644 index 0000000..f4cd6b4 --- /dev/null +++ b/noatun-plugins/dub/README @@ -0,0 +1,22 @@ +Dub Playlist +------------ + +A directory based playlist that's meant to be fast, simple and with the +kind of functionality you'd expect from a digital player. + +Dub name was inspired from the continuous automated mix of digital music +in Neuromancer. I'm not a Rasta but I still like that idea. As a tribute to +William Gibson I decided to actually write such a program. That's where this +code should be going! Read design.txt also. + +Author's note: Those who turn tail-recursive functions into iterations will +be shot! GCC has tail-recursion optimization. + +Author's second note: Yes, I know other people have done things that an +automated dj program could be based on. I'm still more interested in playing +with a few clustering algorithms to get the result I want, I think deriving +the features isn't the hard part. Any ideas welcome. + +__ +Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr> + diff --git a/noatun-plugins/dub/TODO b/noatun-plugins/dub/TODO new file mode 100644 index 0000000..bb9cee1 --- /dev/null +++ b/noatun-plugins/dub/TODO @@ -0,0 +1,20 @@ +ToDo List for dub playlist ++-+-+-++-+-+-++-+-+-++-+-+ + +Any help welcome! +Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr + + +For v1.0 +=-=-=-=- + +- Repeat +- Single +- UI/playlist order consistency +- implement missing playlist APIs (only getAfter significant) + +Misc. +=-=-= + +- Make sure the view has finished loading when querying a file +- Drag'n'drop support for files and directories. diff --git a/noatun-plugins/dub/configure.in.in b/noatun-plugins/dub/configure.in.in new file mode 100644 index 0000000..d4179d6 --- /dev/null +++ b/noatun-plugins/dub/configure.in.in @@ -0,0 +1,4 @@ +#MIN_CONFIG + +AM_INIT_AUTOMAKE(dub,0.2) + diff --git a/noatun-plugins/dub/design.txt b/noatun-plugins/dub/design.txt new file mode 100644 index 0000000..618c849 --- /dev/null +++ b/noatun-plugins/dub/design.txt @@ -0,0 +1,43 @@ +Design +------ + +Dub Playlist +------------ + +Dub considers the filesystem as its database. User specifies one or more +directories as the directories in which dub will scan for all or particular +media types. + +The scanning is initiated on demand, so that dub does not perform redundant +disk access which is expensive. + +Design Goals +------------ + +v1.0 +---- + +User interface: + + * settings: select directories that contain media files. + + * list/tree view to browse files: this should scan directories like a file +manager would, consider re-using code from elsewhere + + * add file: symlink to a directory as Njaard suggests + +v2.0 +---- + +implement filters: directory-wise filtering of media types. + +implement database: for storing properties of media files, such as tags in +mp3s so that alternative queries can be made. + +user interface: improved tree view that accesses the db to fetch info +about files + +v3.0 +---- + +music playing: implement an automated dj process. diff --git a/noatun-plugins/dub/dub.kdevprj b/noatun-plugins/dub/dub.kdevprj new file mode 100644 index 0000000..1f1d8b6 --- /dev/null +++ b/noatun-plugins/dub/dub.kdevprj @@ -0,0 +1,198 @@ +[AUTHORS] +dist=true +install=false +install_location= +type=DATA + +[BUGS] +dist=true +install=false +install_location= +type=DATA + +[COPYING] +dist=true +install=false +install_location= +type=DATA + +[ChangeLog] +dist=true +install=false +install_location= +type=DATA + +[Config for BinMakefileAm] +addcxxflags= +bin_program=dub +cflags= +cppflags= +cxxflags=\s-O0 -g3 -Wall +ldadd=\s-lkfile -lkdeui -lkdecore -lqt +ldflags=\s \s + +[General] +AMChanged=false +author=Eray Ozkural (exa) +configure_args=\s--build=i386-linux --host=i386-linux --target=i386-linux --prefix=/usr/local/kde3 --with-qt-dir=/usr/local/qt --enable-debug --disable-fast-perl --disable-rpath +email=erayo@cs.bilkent.edu.tr +kdevprj_version=1.3 +lfv_open_groups=Headers,Sources,User Interface +make_options=\s-j1 +makefiles=Makefile.am,dub/Makefile.am +modifyMakefiles=true +project_name=Dub +project_type=kde2_normal +sgml_file=/home/exa/code/projects/kde/dub/doc/en/index.docbook +short_info=Dub is a playlist plugin for noatun +sub_dir=dub/ +version=0.1 +version_control=CVS +workspace=1 + +[INSTALL] +dist=true +install=false +install_location= +type=DATA + +[LFV Groups] +GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS +Headers=*.h,*.hh,*.hxx,*.hpp,*.H +Others=* +Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l +Translations=*.po +User Interface=*.kdevdlg,*.ui,*.rc +groups=Headers,Sources,User Interface,Translations,GNU,Others + +[Makefile.am] +files=dub.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,BUGS +sub_dirs=dub +type=normal + +[README] +dist=true +install=false +install_location= +type=DATA + +[TODO] +dist=true +install=false +install_location= +type=DATA + +[dub.kdevprj] +dist=true +install=false +install_location= +type=DATA + +[dub/BUGS] +dist=true +install=false +install_location= +type=DATA + +[dub/Makefile.am] +files=dub/main.cpp,dub/dub.cpp,dub/dub.h,dub/dubdoc.cpp,dub/dubdoc.h,dub/dubview.cpp,dub/dubview.h,dub/dubui.rc,dub/dub.plugin,dub/fileselectorwidget.cpp,dub/fileselectorwidget.h,dub/dubplaylist.cpp,dub/dubplaylist.h,dub/dubplaylistitem.cpp,dub/dubplaylistitem.h,dub/BUGS,dub/dubprefs.ui +sharedlib_LDFLAGS= +sharedlib_rootname=noatundub +sub_dirs= +type=shared_library + +[dub/dub.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dub.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/dub.plugin] +dist=true +install=false +install_location= +type=DATA + +[dub/dubdoc.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dubdoc.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/dubplaylist.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dubplaylist.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/dubplaylistitem.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dubplaylistitem.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/dubprefs.ui] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dubui.rc] +dist=true +install=false +install_location= +type=DATA + +[dub/dubview.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/dubview.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/fileselectorwidget.cpp] +dist=true +install=false +install_location= +type=SOURCE + +[dub/fileselectorwidget.h] +dist=true +install=false +install_location= +type=HEADER + +[dub/main.cpp] +dist=true +install=false +install_location= +type=SOURCE diff --git a/noatun-plugins/dub/dub/Makefile.am b/noatun-plugins/dub/dub/Makefile.am new file mode 100644 index 0000000..f49684c --- /dev/null +++ b/noatun-plugins/dub/dub/Makefile.am @@ -0,0 +1,20 @@ +kde_module_LTLIBRARIES = noatundub.la + +INCLUDES = $(all_includes) + +noatundub_la_SOURCES = dubprefs.ui dubplaylistitem.cpp dubplaylist.cpp \ +fileselectorwidget.cpp dubview.cpp dubapp.cpp dub.cpp dubconfigmodule.cpp + +EXTRA_DIST = dubui.rc dub.plugin BUGS \ + dub.h dubdoc.h dubview.h fileselectorwidget.h dubplaylist.h dubplaylistitem.h + +noatundub_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatundub_la_LIBADD = $(LIB_KIO) -lnoatun + +noatun_DATA = dub.plugin +noatundir = $(kde_datadir)/noatun + +METASOURCES = AUTO + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/dub.pot diff --git a/noatun-plugins/dub/dub/dub.cpp b/noatun-plugins/dub/dub/dub.cpp new file mode 100644 index 0000000..4faf221 --- /dev/null +++ b/noatun-plugins/dub/dub/dub.cpp @@ -0,0 +1,641 @@ +/*************************************************************************** + dub.cpp - description + ------------------- + begin : Tue Oct 23 01:44:51 EEST 2001 + copyright : (C) 2001 by Eray Ozkural (exa) + email : erayo@cs.bilkent.edu.tr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +// include files for QT +#include <qdir.h> +#include <qprinter.h> +#include <qpainter.h> + +// include files for KDE +#include <kiconloader.h> +#include <kdebug.h> +#include <kfiledialog.h> +#include <kmenubar.h> +#include <kstatusbar.h> +#include <klocale.h> +#include <kconfig.h> +#include <kstdaction.h> +#include <kurl.h> +#include <kurlrequester.h> +#include <noatun/playlist.h> + +#include <vector> +#include <algorithm> +using std::vector; +using std::iterator; + +// application specific includes +#include "dub.h" +#include "dub.moc" +#include "dubview.h" +#include "dubplaylist.h" +#include "dubprefs.h" +#include "dubconfigmodule.h" + +#include "random.h" +int Random::seed; + +#define ID_STATUS_MSG 1 + +Dub::Dub(DubPlaylist* plist) + : DubApp(0) + , playlist(*plist) + , dubconfig(*plist->dubconfig) + , activeFile(0) + , linear_onedir(this) + , linear_recursive(this) + , shuffle_onedir(this) + , shuffle_recursive(this) +{ + connect( view->dirOperator(), + SIGNAL(fileSelected(const KFileItem*)), + this, + SLOT(fileSelected(const KFileItem*)) ); + connect( dubconfig.prefs->mediaDirectory, + SIGNAL( urlSelected (const QString &) ), + this, + SLOT( mediaHomeSelected (const QString &) ) ); + connect( this, + SIGNAL(setMediaHome(KURL)), + view, + SLOT(setDir(KURL)) ); + configure_sequencing(); + emit setMediaHome(dubconfig.mediaDirectory); +} + +/** File selected */ +void Dub::fileSelected(const KFileItem * file) { + kdDebug(90010) << "dub: file selected " << file << endl; + activeFile = const_cast<KFileItem *>(file); + playlist.setCurrent(file, true); +} + +void Dub::mediaHomeSelected(const QString& url) { + kdDebug(90010) << "media home selected:" << endl; + emit setMediaHome( KURL(url) ); +} + +/** changes the active file to the next item + */ +void Dub::selectNextFile() { + configure_sequencing(); + sequencer->next(); +} + +/** No descriptions */ +KFileItem* Dub::queryRoot() { + return view->dirLister()->rootItem(); +} + +/** First file in the directory */ +const KFileItem* Dub::queryFirstFile() { + return sequencer->first(); +} + +/** Select previous file */ +void Dub::selectPreviousFile() { + configure_sequencing(); + sequencer->prev(); +} + +void Dub::configure_sequencing() +{ + switch (dubconfig.playMode) { + case DubConfigModule::allFiles: + if (dubconfig.playOrder==DubConfigModule::normal) { + linear_recursive.init(dubconfig.mediaDirectory); + sequencer = &linear_recursive; + } + else if (dubconfig.playOrder==DubConfigModule::shuffle) { + shuffle_recursive.init(dubconfig.mediaDirectory); + sequencer = &shuffle_recursive; + } + break; + case DubConfigModule::recursiveDir: + linear_recursive.init(view->currentDirectory().path()); + sequencer = &linear_recursive; + break; + case DubConfigModule::oneDir: + if (dubconfig.playOrder==DubConfigModule::normal) + sequencer = &linear_onedir; + else if (dubconfig.playOrder==DubConfigModule::shuffle) { + shuffle_onedir.init(view->currentDirectory().path()); + sequencer = &shuffle_onedir; + } + break; + } +} + +void Dub::Sequencer::set_file(KFileItem** file, KFileItem* val) { + assert(val); + if (*file) + delete *file; + *file = new KFileItem(*val); + kdDebug(90010) << "set_file to " << val->url() << endl; +} + +KFileItem* Dub::Linear_Seq::first(QPtrList<KFileItem> & items) +{ + // find first file + KFileItem* firstFile = 0; + for (KFileItem* item = items.first(); item; item = items.next() ) { + if (item->isFile()) { + firstFile = item; + break; + } + } + return firstFile; +} + +KFileItem* Dub::Linear_Seq::last(QPtrList<KFileItem> & items) +{ + // find last file + KFileItem* lastFile = 0; + for (KFileItem* item = items.last(); item; item = items.prev() ) { + if (item->isFile()) { + lastFile = item; + break; + } + } + return lastFile; +} + +bool Dub::Linear_Seq::find(QPtrList<KFileItem> & items, KFileItem* a_file) +{ + // find file + for (KFileItem *file=items.first(); file; file=items.next() ) + if (file->isFile() && file->cmp(*a_file)) { + kdDebug(90010) << " found " << (file->url()) << endl; + return true; + } + return false; +} + +KFileItem* Dub::Linear_Seq::next(QPtrList<KFileItem> & items, + KFileItem** active_file) +{ + KFileItem* ret = 0; + assert(active_file); + bool found = false; + if (*active_file) { + if (find(items, *active_file)) { + KFileItem* next = items.next(); + for (; next && !next->isFile(); next = items.next()) ; // find next file + if (next && next->isFile()) + set_file(active_file, next); + found = true; + ret = next; + } + } + if (!found) { // try to get the first one then + KFileItem *fst = first(items); + if (fst) { + set_file(active_file, fst); + ret = fst; + } + } + return ret; +} + +KFileItem* Dub::Linear_Seq::prev(QPtrList<KFileItem> & items, + KFileItem** active_file) +{ + KFileItem* ret = 0; + assert(active_file); + bool found = false; + if (*active_file) { + // locate current item + if (find(items, *active_file)) { + KFileItem* prev = items.prev(); + for (; prev && !prev->isFile(); prev = items.prev()) ; // find prev file + if (prev && prev->isFile()) { + set_file(active_file, prev); + found = true; + ret = prev; + } + } + } + if (!found) { // try to get the last one then + KFileItem *lst = last(items); + if (lst) { + set_file(active_file, lst); + ret = lst; + } + } + return ret; +} + +KFileItem* Dub::Linear_OneDir::first() +{ + KFileItem* first = Linear_Seq::first(dub.view->items()); + if (first) + set_file(&first_file, first); + else { + if (first_file) { // invalidate first + delete first_file; + first_file = 0; + } + } + return first_file; +} + +//KFileItem* Dub::Linear_OneDir::getAfter(KFileItem* item) +//{ + +//} + +void Dub::Linear_OneDir::next() +{ + KFileItem *f = Linear_Seq::next(dub.view->items(), &dub.activeFile); + if (f) { + dub.view->selectFile(f); + } +} + +void Dub::Linear_OneDir::prev() +{ + KFileItem *f = Linear_Seq::prev(dub.view->items(), &dub.activeFile); + if (f) { + dub.view->selectFile(f); + } +} + +Dub::Dir_Node::Dir_Node(QString d, bool forward) + : dir(d), past_begin(false) +{ + kdDebug(90010) << "cons dir node " << d << endl; + // process entry list, form a list of subdirs and normal files + file_items.setAutoDelete(true); + QDir dir_obj(dir); + QFileInfoList* entries = + const_cast<QFileInfoList*>(dir_obj.entryInfoList()); + for ( QFileInfo *file = entries->first(); file; file = entries->next() ) { + if (file->isDir() && file->absFilePath().length()>d.length()) { + kdDebug(90010) << "dub: dir " << file->absFilePath() << endl; + subdirs.append(file->absFilePath()); + } + if (file->isFile()) { + // price for portability + kdDebug(90010) << "dub: file " << file->absFilePath() << endl; + KFileItem* item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, + file->absFilePath(), true); + file_items.append(item); + } + } // for + + init_traversal(forward); + + kdDebug(90010) << "dir node cons end" << endl; +} + +void Dub::Dir_Node::init_traversal(bool forward) +{ + kdDebug(90010) << "init traversal" << endl; + // initialize traversal information + if (forward) { + current_subdir = subdirs.begin(); + file_items.first(); + } + else { + current_subdir = subdirs.end(); + if (current_subdir!=subdirs.begin()) + current_subdir--; // last item + else + past_begin=true; + file_items.last(); + } + current_file = file_items.current(); + kdDebug(90010) << "current subdir " << *current_subdir << endl; + kdDebug(90010) << "current file " << current_file << endl; +} + +Dub::Recursive_Seq::Recursive_Seq() +{ + play_stack.setAutoDelete(true); +} + +void Dub::Recursive_Seq::init(const KURL & root) +{ + QString new_root = canonical_path(root.path()); + if (recursion_root != new_root) { + // change recursion stack + recursion_root = new_root; + kdDebug(90010) << "rec: new root is " << recursion_root << endl; + play_stack.clear(); + push_dir(recursion_root); // start pre-order traversal + } +} + +// get canonical path, we need this +QString Dub::Recursive_Seq::canonical_path(QString dir) +{ +// kdDebug(90010) << "canonical_path " << dir << endl; + //assert(dir.isLocalFile()); + QDir path(dir); + return path.canonicalPath(); +} + +// check if dir is contained in the stack +bool Dub::Recursive_Seq::check_dir(QString dir) +{ + kdDebug(90010) << "check_dir " << dir << endl; + bool found = false; + for ( Dir_Node *cur_dir = play_stack.first(); + !found && cur_dir; cur_dir = play_stack.next() ) { + if (cur_dir->dir==dir) + found = true; + } + return found; +} + +bool Dub::Recursive_Seq::push_dir(QString dir, bool forward) +{ + kdDebug(90010) << "push_dir " << dir << ", forward?" << forward << endl; + QString cpath = canonical_path(dir); + if (check_dir(cpath)) // is it in stack? + return false; // avoid infinite recursion + else { + Dir_Node* node = new Dir_Node(cpath, forward); + play_stack.append(node); + kdDebug(90010) << "stack after push:" << endl; + print_stack(); + return true; + } +} + +bool Dub::Recursive_Seq::pop_dir() +{ + assert(!play_stack.isEmpty()); + kdDebug(90010) << "pop_dir" << endl; + play_stack.removeLast(); + return !play_stack.isEmpty(); +} + +bool Dub::Recursive_Seq::advance(bool forward) +{ + Dir_Node* top = play_stack.getLast(); + kdDebug(90010) << "first child " << top->subdirs.first() << endl; + kdDebug(90010) << "current child " << *top->current_subdir << endl; + kdDebug(90010) << "last child " << top->subdirs.last() << endl; + if (forward) { + top->current_subdir++; // advance dir + return top->current_subdir!=top->subdirs.end(); + } + else + if (top->current_subdir!=top->subdirs.begin()) { + top->current_subdir--; + return true; + } + else { + top->past_begin=true; + return false; + } +} + +void Dub::Recursive_Seq::pop_preorder(bool forward) +{ + if (pop_dir()) { // pop visited + advance(forward); // advance to next node + Dir_Node* top = play_stack.getLast(); + kdDebug(90010) << "new child " << *top->current_subdir << endl; + if (forward) + next_preorder(); // continue processing + else + prev_preorder(); // continue processing + } + else { + kdDebug(90010) << "push root" << endl; + push_dir(recursion_root, forward); // back to the beginning if at end + } +} + +void Dub::Recursive_Seq::next_preorder() +{ + assert(!play_stack.isEmpty()); // recursion stack cannot be empty + kdDebug(90010) << "next_preorder, stack:" << endl; + print_stack(); + Dir_Node* top = play_stack.getLast(); + if (top->subdirs.isEmpty() || top->current_subdir==top->subdirs.end()) { + kdDebug(90010) << "rec: subtrees done" << endl; + pop_preorder(true); // pop if subtrees done + } + else { + QString subdir = *top->current_subdir; // we have a subdir + push_dir(subdir, true); // push directory w/ forward iterators + } +} + +void Dub::Recursive_Seq::prev_preorder() +{ + assert(!play_stack.isEmpty()); // recursion stack cannot be empty + kdDebug(90010) << "prev_preorder, stack:" << endl; + print_stack(); + Dir_Node* top = play_stack.getLast(); + if (top->subdirs.isEmpty() || top->past_begin) { // subtrees done? + kdDebug(90010) << "rec: subtrees done" << endl; + pop_preorder(false); + } + else { + QString subdir = *top->current_subdir; + kdDebug(90010) << "we have children, pushing now " << subdir << endl; + push_dir(subdir, false); // push directory w/ backward iterators + } +} + +void Dub::Recursive_Seq::print_stack() { + for ( Dir_Node *cur_dir = play_stack.first(); + cur_dir; cur_dir = play_stack.next() ) { + kdDebug(90010) << cur_dir->dir << endl; + } +} + +Dub::Linear_Recursive::Linear_Recursive(Dub* d) + : Sequencer(d) { + kdDebug(90010) << "cons linear/recursive" << endl; +} + +KFileItem* Dub::Linear_Recursive::first() +{ + KFileItem* first = bottom_dir()->file_items.getFirst(); + return first; +} + +void Dub::Linear_Recursive::next() +{ + assert(!play_stack.isEmpty()); + Dir_Node* top = top_dir(); + QString dir = top->dir; + top->current_file = top->file_items.next(); + kdDebug(90010) << "dub current dir: " << dir << endl; + kdDebug(90010) << "dub current file: " << top->current_file << endl; + bool cycle = false; + while (!top_dir()->current_file && !cycle) { + next_preorder(); // traverse until a non-empty dir or cycle + if (top_dir()->dir==dir) { + kdDebug(90010) << "we got a cycle" << endl; + cycle = true; + top_dir()->init_traversal(true); + } + } + top = play_stack.getLast(); + kdDebug(90010) << "dub new dir: " << *top->current_subdir << endl; + kdDebug(90010) << "dub new file: " << top->current_file << endl; + if (top->current_file) { + kdDebug(90010) << "dub new file: " << top->current_file->url() << endl; + dub.activeFile = top->current_file; + dub.fileSelected(dub.activeFile); + } +} + +void Dub::Linear_Recursive::prev() +{ + assert(!play_stack.isEmpty()); + Dir_Node* top = top_dir(); + QString dir = top->dir; + top->current_file = top->file_items.prev(); + kdDebug(90010) << "dub current dir: " << dir << endl; + kdDebug(90010) << "dub current file: " << top->current_file << endl; + bool cycle = false; + while (!top_dir()->current_file && !cycle) { + prev_preorder(); // traverse until a non-empty dir or cycle + if (top_dir()->dir==dir) { + kdDebug(90010) << "we got a cycle" << endl; + cycle = true; + top_dir()->init_traversal(false); + } + } + top = play_stack.getLast(); + kdDebug(90010) << "dub new dir: " << *top->current_subdir << endl; + kdDebug(90010) << "dub new file: " << top->current_file << endl; + if (top->current_file) { + kdDebug(90010) << "dub new file: " << top->current_file->url() << endl; + dub.activeFile = top->current_file; + dub.fileSelected(dub.activeFile); + } +} + +void Dub::Shuffle_OneDir::init(const QString& dir) +{ + if (shuffle_dir != dir) { + kdDebug(90010) << "shuffle/onedir init" << endl; + shuffle_dir = dir; + play_index = 0; + + // make a deep copy + items.clear(); + QPtrList<KFileItem> & view_items = dub.view->items(); // + for (KFileItem *file=view_items.first(); file; file=view_items.next() ) + if (file->isFile()) // add only files + items.append(new KFileItem(*file)); + + int num_items = items.count(); + play_order.resize(num_items); + if (num_items) { // generate shuffled order + kdDebug(90010) << num_items << " file items" << endl; + for (int i=0; i<num_items; i++) + play_order[i] = i; + Random random; + Random::init(); + std::random_shuffle(play_order.begin(), play_order.end(), random); + } + } +} + +KFileItem* Dub::Shuffle_OneDir::first() +{ + return 0; +} + +void Dub::Shuffle_OneDir::next() +{ + kdDebug(90010) << "shuffle/onedir next" << endl; + if (!items.isEmpty()) { + play_index = ++play_index % play_order.size(); + dub.activeFile = items.at(play_order[play_index]); + if (dub.activeFile) + dub.fileSelected(dub.activeFile); + } +} + +void Dub::Shuffle_OneDir::prev() +{ + kdDebug(90010) << "shuffle/onedir prev" << endl; + if (!items.isEmpty()) { + play_index = --play_index % play_order.size(); + dub.activeFile = items.at(play_order[play_index]); + if (dub.activeFile) + dub.fileSelected(dub.activeFile); + } +} + +KFileItem* Dub::Shuffle_Recursive::random_file() +{ + assert(!play_stack.isEmpty()); + play_stack.clear(); + push_dir(recursion_root); // start pre-order traversal + KFileItem* selected = 0; + double file_probability = 0.3; + Random::init(); + while (!top_dir()->subdirs.isEmpty() && !selected) { + if (top_dir()->file_items.isEmpty()) { + int ix = Random::random_int(top_dir()->subdirs.count()); + push_dir(top_dir()->subdirs[ix]); + } + else { + if (Random::random_double(1.0)<file_probability) { + int ix = Random::random_int(top_dir()->file_items.count()); + selected = top_dir()->file_items.at(ix); + } + else { + int ix = Random::random_int(top_dir()->subdirs.count()); + push_dir(top_dir()->subdirs[ix]); + } + } + } + if (!selected) { + if (!top_dir()->file_items.isEmpty()) { + int ix = Random::random_int(top_dir()->file_items.count()); + selected = top_dir()->file_items.at(ix); + } + } + return selected; +} + +KFileItem* Dub::Shuffle_Recursive::first() +{ + return random_file(); +} + +void Dub::Shuffle_Recursive::next() +{ + KFileItem* file = random_file(); + if (file) { + kdDebug(90010) << "shuffle/rec: new file: " << file->url() << endl; + dub.activeFile = file; + dub.fileSelected(file); + } +} + +void Dub::Shuffle_Recursive::prev() +{ + KFileItem* file = random_file(); + if (file) { + kdDebug(90010) << "shuffle/rec: new file: " << file->url() << endl; + dub.activeFile = file; + dub.fileSelected(file); + } +} diff --git a/noatun-plugins/dub/dub/dub.h b/noatun-plugins/dub/dub/dub.h new file mode 100644 index 0000000..5317f86 --- /dev/null +++ b/noatun-plugins/dub/dub/dub.h @@ -0,0 +1,207 @@ +// -*-c++-*- +/*************************************************************************** + dub.h - description + ------------------- + begin : Tue Oct 23 01:44:51 EEST 2001 + copyright : (C) 2001 by Eray Ozkural (exa) + email : erayo@cs.bilkent.edu.tr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef Dub_Interface +#define Dub_Interface + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +// KDE includes +#include <kapplication.h> +#include <kmainwindow.h> +#include <kurl.h> +#include <noatun/plugin.h> +#include <noatun/playlist.h> + +// sys includes +#include <vector> +#include <list> + +// forward decl +class KFileItem; +class KDirLister; +class DubPlaylist; + +// application specific includes +#include "dubapp.h" +#include "dubconfigmodule.h" + +// dub specific application code +class Dub : public DubApp +{ + Q_OBJECT + +public: + + Dub(DubPlaylist* plist); + +public slots: + /** A file selected */ + void fileSelected(const KFileItem*); + void mediaHomeSelected(const QString& url); + + signals: +void setMediaHome(KURL); + // xemacs rules + +public: + + /** playlist object to interface noatun + */ + DubPlaylist& playlist; + /** noatun configuration object + */ + DubConfigModule& dubconfig; + + KFileItem* getActiveFile() { return activeFile; } + /** find root */ + KFileItem* queryRoot(); + /** First file in the sequence */ + const KFileItem* queryFirstFile(); + /** Select next file in order */ + void selectNextFile(); + /** Select previous file in order */ + void selectPreviousFile(); + +public: + + /* The chosen file */ + KFileItem* activeFile; + +private: + + void configure_sequencing(); + + // expansion slot :P + struct Sequencer { + Sequencer(Dub* d) : dub(*d) {} + virtual KFileItem* first() = 0; + virtual void next() = 0; + virtual void prev() = 0; + Dub& dub; + void set_file(KFileItem** file, KFileItem* val); + }; + Sequencer* sequencer; + + // possible sequencers are linear/oneDir, linear/recursive, + // shuffle/oneDir, shuffle/recursive, repeat, single + + // linear sequencing subsystem + struct Linear_Seq : public Sequencer { + Linear_Seq(Dub* d) : Sequencer(d) {} + KFileItem* first(QPtrList<KFileItem> & items); + KFileItem* last(QPtrList<KFileItem> & items); + KFileItem* next(QPtrList<KFileItem> & items, KFileItem** active_file); + KFileItem* prev(QPtrList<KFileItem> & items, KFileItem** active_file); + bool find(QPtrList<KFileItem> & items, KFileItem* a_file); + }; + + // sequencer that traverses current directory in view order + struct Linear_OneDir : public Linear_Seq { + Linear_OneDir(Dub* d) : Linear_Seq(d), first_file(0) {} + virtual ~Linear_OneDir() {} + KFileItem* first(); + void next(); + void prev(); + KFileItem* first_file; + }; + Linear_OneDir linear_onedir; + + // directory node for recursive play + struct Dir_Node + { + Dir_Node(QString dir, bool forward = true); + QString dir; + QStringList subdirs; + QStringList::iterator current_subdir; + QPtrList<KFileItem> file_items; + KFileItem* current_file; + void init_traversal(bool forward); + bool past_begin; // stupid iterators + }; + + // recursive play sequencing subsystem + struct Recursive_Seq { + Recursive_Seq(); + void init(const KURL & root); + QString canonical_path(QString dir); + bool check_dir(QString dir); + Dir_Node* top_dir() { return play_stack.getLast(); } + Dir_Node* bottom_dir() { return play_stack.getFirst(); } + bool push_dir(QString dir, bool forward = true); + bool pop_dir(); + bool advance(bool forward = true); + void pop_preorder(bool forward = true); + void next_preorder(); + void prev_preorder(); + void print_stack(); + + QString recursion_root; + QPtrList<Dir_Node> play_stack; + }; + + // sequencer to make a preorder walk of the directory tree + struct Linear_Recursive + : public Sequencer, public Recursive_Seq { + Linear_Recursive(Dub* d); + virtual ~Linear_Recursive() {}; + KFileItem* first(); + void next(); + void prev(); + }; + Linear_Recursive linear_recursive; + + // shuffle/onedir sequencer + struct Shuffle_OneDir + : public Sequencer { + Shuffle_OneDir(Dub* d) : Sequencer(d) { + items.setAutoDelete(true); + } + virtual ~Shuffle_OneDir() {}; + void init(const QString& dir); + KFileItem* first(); + void next(); + void prev(); + void init(); + + int play_index; + std::vector<int> play_order; + KURL shuffle_dir; + QPtrList<KFileItem> items; + }; + Shuffle_OneDir shuffle_onedir; + + // shuffle/recursive sequencer + struct Shuffle_Recursive + : public Sequencer, public Recursive_Seq { + Shuffle_Recursive(Dub* d) : Sequencer(d) {} + virtual ~Shuffle_Recursive() {} + KFileItem* random_file(); + KFileItem* first(); + void next(); + void prev(); + + QString shuffle_root; + }; + Shuffle_Recursive shuffle_recursive; + +}; + +#endif // DUB_H diff --git a/noatun-plugins/dub/dub/dub.plugin b/noatun-plugins/dub/dub/dub.plugin new file mode 100644 index 0000000..c844c01 --- /dev/null +++ b/noatun-plugins/dub/dub/dub.plugin @@ -0,0 +1,69 @@ +Filename=noatundub.la +Author=Eray (exa) Ozkural +Site=http://www.cs.bilkent.edu.tr/~erayo +Type=playlist +License=GPL +Name=Dub +Name[af]=Hersien +Name[eo]=Nomilo +Name[hi]=डब +Name[km]=ដាក់ឈ្មោះ +Name[ne]=डब +Name[ta]=பதிவு +Name[tr]=Ünvan +Name[xh]=Nika igama lesiteketiso +Comment=Dub playlist plugin +Comment[bg]=Приставка за списък за изпълнение, базирана на директории +Comment[bs]=Dub dodatak za playlistu +Comment[ca]=Connector de la llista de reproducció Dub +Comment[cs]=Modul seznamu skladeb "Dub" +Comment[da]=Dub-spilleliste-plugin +Comment[de]=Dub Wiedergabelisten-Modul +Comment[el]=Πρόσθετο λίστας αναπαραγωγής Dub +Comment[eo]=Kromaĵo por nomi ludlistojn +Comment[es]=Complemento de doblaje de la lista de reproducción +Comment[et]=Dubi esitusnimekirja plugin +Comment[eu]=Dut erreprodukzio-zerrendaren plugina +Comment[fa]=وصلۀ فهرست پخش Dub +Comment[fi]=Dub soittolistasovelma +Comment[fr]=Module de liste de doublage +Comment[fy]=Dub Ofspyllistplugin +Comment[ga]=Breiseán seinmliosta Dub +Comment[gl]=Plugin de lista de reproduición de Dub +Comment[he]=תוסף רשימת הניגון Dub +Comment[hi]=डब प्लेलिस्ट प्लगइन +Comment[hr]=Dodatak albuma za Dub +Comment[hu]=Dub lejátszási lista modulként +Comment[is]=Tól til að spila Dub lagalista +Comment[it]=Plugin per le Playlist di Dub +Comment[ja]=Dub プレイリスト プラグイン +Comment[ka]=Dub სიმღერათა სიის მოდული +Comment[kk]=Dub орындау тізімінің плагин модулі +Comment[km]=ដាក់ឈ្មោះកម្មវិធីជំនួយបញ្ជីចាក់ +Comment[lt]=Dub gaidaraščio priedas +Comment[mk]=Приклучок за листа со нумери Dub +Comment[ms]=Plugin senarai main Dub +Comment[nb]=Dub programtillegg for spilleliste +Comment[nds]=Dub-Afspeellistmoduul +Comment[ne]=डब प्लेसूची प्लगइन +Comment[nl]=Dub Afspeellijstplugin +Comment[nn]=Dub-programtillegg for speleliste +Comment[pl]=Lista odtwarzania pozwalająca wybierać wprost z systemu plików +Comment[pt]='Plugin' da lista Dub +Comment[pt_BR]=Plug-in de Lista de reprodução do Dub +Comment[ru]=Модуль списка произведений Dub +Comment[sk]=Modul pre Dub playlist +Comment[sl]=Vstavek predvajalnega seznama za Dub +Comment[sr]=Прикључак за Dub-ову листу нумера +Comment[sr@Latn]=Priključak za Dub-ovu listu numera +Comment[sv]=Spellistan Dub +Comment[ta]= இயங்குபட்டியல் சொருகுப்பொருளை பதிவு செய் +Comment[tg]=Модули рӯйхати баровардҳои Dub +Comment[tr]=Dub çalma listesi eklentisi +Comment[uk]=Втулок списку композицій Dub +Comment[uz]=Dub oʻynash roʻyxati plagini +Comment[uz@cyrillic]=Dub ўйнаш рўйхати плагини +Comment[vi]=Bổ sung danh mục nhạc Dub +Comment[zh_CN]=Dub 播放列表插件 +Comment[zh_TW]=Dub 播放清單外掛程式 + diff --git a/noatun-plugins/dub/dub/dubapp.cpp b/noatun-plugins/dub/dub/dubapp.cpp new file mode 100644 index 0000000..7097940 --- /dev/null +++ b/noatun-plugins/dub/dub/dubapp.cpp @@ -0,0 +1,98 @@ +// +// +// C++ Implementation for module: DubApp +// +// Description: +// +// +// Author: Eray (exa) Ozkural, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +// include files for QT +#include <qdir.h> +#include <qprinter.h> +#include <qpainter.h> + +// include files for KDE +#include <kiconloader.h> +#include <kdebug.h> +#include <kfiledialog.h> +#include <kmenubar.h> +#include <kstatusbar.h> +#include <klocale.h> +#include <kconfig.h> +#include <kstdaction.h> +#include <noatun/playlist.h> + +// application specific includes +#include "dubapp.h" +#include "dubapp.moc" +#include "dubview.h" + +#define ID_STATUS_MSG 1 + +DubApp::DubApp(QWidget* parent, const char* name) + : KMainWindow(parent, name) +{ + kdDebug(90010) << "cons dubapp" << endl; + config=kapp->config(); + + // call inits to invoke all other construction parts + initStatusBar(); + initActions(); + initView(); + setAutoSaveSettings(); +} + +DubApp::~DubApp() +{ + kdDebug(90010) << "destruct dubapp" << endl; +} + +void DubApp::initActions() +{ + fileClose = KStdAction::close(this, SLOT(close()), actionCollection()); + setStandardToolBarMenuEnabled(true); + createStandardStatusBarAction(); + + fileClose->setStatusText(i18n("Close playlist window")); + + // use the absolute path to your dubui.rc file for testing purpose in createGUI(); + createGUI(); +} + + +void DubApp::initStatusBar() +{ + // status bar + statusBar()->insertItem(i18n("Ready."), ID_STATUS_MSG); +} + +void DubApp::initView() +{ + // create the main widget here that is managed by KTMainWindow's view-region and + // connect the widget to your document to display document contents. + + view = new DubView(this); + setCentralWidget(view); + setCaption("Dub Playlist",false); +} + +// slots + +void DubApp::slotStatusMsg(const QString &text) +{ + // change status message permanently + statusBar()->clear(); + statusBar()->changeItem(text, ID_STATUS_MSG); +} + +// events + +void DubApp::closeEvent(QCloseEvent*) +{ + hide(); +} diff --git a/noatun-plugins/dub/dub/dubapp.h b/noatun-plugins/dub/dub/dubapp.h new file mode 100644 index 0000000..e06a2fe --- /dev/null +++ b/noatun-plugins/dub/dub/dubapp.h @@ -0,0 +1,83 @@ +// -*-c++-*- +// +// C++ Interface for module: DubApp +// +// Description: KDE application entry point for dub playlist +// Stripped down main window code from kapptemplate +// +// Author: Eray (exa) Ozkural, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef DubApp_Interface +#define DubApp_Interface + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +// include files for KDE +#include <kapplication.h> +#include <kmainwindow.h> +#include <kaccel.h> +#include <kaction.h> + +// forward declaration of the Dub classes +class DubView; + +// Application stuff +class DubApp : public KMainWindow +{ + Q_OBJECT + + friend class DubView; + +public: + /** construtor of DubApp, calls all init functions to create the application. + */ + DubApp(QWidget* parent, const char* name="Dub Playlist"); + ~DubApp(); + + void initActions(); + /** sets up the statusbar for the main window by initialzing a statuslabel. + */ + void initStatusBar(); + /** initializes the document object of the main window that is connected to the view in initView(). + * @see initView(); + */ + void initView(); + + DubView *view; + DubView* getView() { + return view; + } + +protected: + virtual void closeEvent(QCloseEvent*e); + +private: + KConfig *config; + /** view is the main widget which represents your working area. The View + * class should handle all events of the view widget. It is kept empty so + * you can create your view according to your application's needs by + * changing the view class. + */ + + // KAction pointers to enable/disable actions + //KAction* fileQuit; + KAction* fileClose; + + // signals and slots + +public slots: + /** changes the statusbar contents for the standard label permanently, used to indicate current actions. + * @param text the text that is displayed in the statusbar + */ + void slotStatusMsg(const QString &text); + /** get a pointer to view object */ + +}; + +#endif diff --git a/noatun-plugins/dub/dub/dubconfigmodule.cpp b/noatun-plugins/dub/dub/dubconfigmodule.cpp new file mode 100644 index 0000000..ff1f3dd --- /dev/null +++ b/noatun-plugins/dub/dub/dubconfigmodule.cpp @@ -0,0 +1,125 @@ +// +// +// C++ Implementation: cpp +// +// Description: +// +// +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2003 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include <kconfig.h> +#include <kdialog.h> +#include <kglobal.h> +#include <klocale.h> +#include <kurlrequester.h> +#include <kdebug.h> + +#include <qbuttongroup.h> +#include <qcheckbox.h> +#include <qlayout.h> +#include <qradiobutton.h> + +#include "dubconfigmodule.h" + +DubConfigModule::DubConfigModule(QObject* parent) + : CModule(i18n("Dub"), i18n("Folder-Based Playlist"), "noatun", parent) + , playMode(oneDir) + , playOrder(normal) +{ + QVBoxLayout *vbox = new QVBoxLayout(this); + vbox->setAutoAdd(true); + vbox->setSpacing( 0 ); + vbox->setMargin( 0 ); + + prefs = new DubPrefs(this); + prefs->mediaDirectory->setMode(KFile::Directory); + + reopen(); +} + +DubConfigModule::~DubConfigModule() +{ +} + +void DubConfigModule::save(void) +{ + KConfig* config(KGlobal::config()); + config->setGroup("DubPlaylist"); + + mediaDirectory = prefs->mediaDirectory->url(); + + QButton* selectedMode = prefs->playMode->selected(); + if (selectedMode==prefs->allFiles) + playMode = DubConfigModule::allFiles; + else + if (selectedMode==prefs->recursiveDir) + playMode = DubConfigModule::recursiveDir; + else + playMode = DubConfigModule::oneDir; + + QButton* selectedOrder = prefs->playOrder->selected(); + if (selectedOrder==prefs->shuffle) + playOrder = DubConfigModule::shuffle; + else + if (selectedOrder==prefs->repeat) + playOrder = DubConfigModule::repeat; + else + if (selectedOrder==prefs->single) + playOrder = DubConfigModule::single; + else + playOrder = DubConfigModule::normal; + + config->writePathEntry("MediaDirectory", mediaDirectory); + config->writeEntry("PlayMode", (int) playMode); + config->writeEntry("PlayOrder", (int) playOrder); +} + +void DubConfigModule::reopen(void) +{ + kdDebug(90010) << "dubconfig: reopen" << endl; + KConfig* config(KGlobal::config()); + config->setGroup("DubPlaylist"); + mediaDirectory = config->readPathEntry("MediaDirectory", "~/"); + kdDebug(90010) << "dub: media home is " << mediaDirectory << endl; + playMode = (PlayMode) config->readNumEntry("PlayMode", DubConfigModule::oneDir); + playOrder = (PlayOrder) config->readNumEntry("PlayOrder", DubConfigModule::normal); + apply(); +} + +void DubConfigModule::apply() +{ + prefs->mediaDirectory->setURL(mediaDirectory); + // what a horrible repetition, but it's not worthwhile doing any better ;) + switch (playMode) { + case allFiles: + prefs->playMode->setButton(prefs->playMode->id(prefs->allFiles)); + break; + case oneDir: + prefs->playMode->setButton(prefs->playMode->id(prefs->oneDir)); + break; + case recursiveDir: + prefs->playMode->setButton(prefs->playMode->id(prefs->recursiveDir)); + break; + } + switch (playOrder) { + case normal: + prefs->playOrder->setButton(prefs->playOrder->id(prefs->normal)); + break; + case shuffle: + prefs->playOrder->setButton(prefs->playOrder->id(prefs->shuffle)); + break; + case repeat: + prefs->playOrder->setButton(prefs->playOrder->id(prefs->repeat)); + break; + case single: + prefs->playOrder->setButton(prefs->playOrder->id(prefs->single)); + break; + } +} + + +#include "dubconfigmodule.moc" diff --git a/noatun-plugins/dub/dub/dubconfigmodule.h b/noatun-plugins/dub/dub/dubconfigmodule.h new file mode 100644 index 0000000..cfb662b --- /dev/null +++ b/noatun-plugins/dub/dub/dubconfigmodule.h @@ -0,0 +1,40 @@ +// -*-c++-*- +#ifndef DUBCONFIGMODULE_H +#define DUBCONFIGMODULE_H + + +#include <noatun/pref.h> +#include "dubprefs.h" + +/** + * Noatun configuration module for dub + + * Eray Ozkural (exa) + **/ +class DubConfigModule : public CModule +{ +Q_OBJECT +public: + enum PlayOrder { normal, shuffle, repeat, single }; + enum PlayMode { allFiles, oneDir, recursiveDir }; + + DubConfigModule(QObject *parent); + + ~DubConfigModule(); + + virtual void save(void); + virtual void reopen(void); + + void apply(); + + /** The directory in which media files are stored */ + QString mediaDirectory; + PlayMode playMode; + PlayOrder playOrder; + + const DubPrefs* getPrefs() { return prefs; } + //private: + DubPrefs* prefs; +}; + +#endif diff --git a/noatun-plugins/dub/dub/dubplaylist.cpp b/noatun-plugins/dub/dub/dubplaylist.cpp new file mode 100644 index 0000000..6803214 --- /dev/null +++ b/noatun-plugins/dub/dub/dubplaylist.cpp @@ -0,0 +1,158 @@ +// +// +// C++ Implementation: dubplaylist.cpp +// +// Description: +// +// +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2001 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +//#include dubplaylist.cpp + +#include <kmessagebox.h> +#include <kdebug.h> +#include <noatun/playlist.h> +#include <klocale.h> + +#include "dub.h" +#include "dubconfigmodule.h" + +#include "dubplaylist.h" + +// plugin interface +extern "C" Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("dub"); + DubPlaylist* dub = new DubPlaylist; + return dub; +} + +/** Construct playlist object */ +DubPlaylist::DubPlaylist() + : Playlist(0, "Dub Playlist") + , dub(0) + , visible(false) +{ + kdDebug(90010) << "dub: cons playlist" << endl; +} + +DubPlaylist::~DubPlaylist(){ + kdDebug(90010) << "dub: destruct playlist " << endl; + // destroy app + delete dub; +} + +void DubPlaylist::reset() { + kdDebug(90010) << "dub: reset" << endl; +} + +void DubPlaylist::clear() { + kdDebug(90010) << "dub: clear" << endl; +} + +void DubPlaylist::addFile(const KURL&, bool play) { + KMessageBox::information(0, i18n("Adding files not supported yet, see configuration")); +} + +PlaylistItem DubPlaylist::next() { + kdDebug(90010) << "dub: next" << endl; + dub->selectNextFile(); + updateCurrent(); + return currentItem; +} + +PlaylistItem DubPlaylist::current() { + if (!currentItem.isNull()) + kdDebug(90010) << "dub: current item:" << currentItem.data()->url().prettyURL() << endl; + return currentItem; +} + +PlaylistItem DubPlaylist::previous() { + kdDebug(90010) << "dub: previous" << endl; + dub->selectPreviousFile(); + updateCurrent(); + return currentItem; +} + +PlaylistItem DubPlaylist::getFirst() const { + kdDebug(90010) << "dub: getFirst" << endl; + const KFileItem* first = dub->queryFirstFile(); + if (first) { + kdDebug(90010) << "dub: first " << first->url() << endl; + DubPlaylistItem* firstData = new DubPlaylistItem(*first); + return PlaylistItem(firstData); + } + else + return 0; +} + +PlaylistItem DubPlaylist::getAfter(const PlaylistItem &item) const { + kdDebug(90010) << "dub: getAfter" << endl; + return 0; +} + +bool DubPlaylist::listVisible() const { + kdDebug(90010) << "dub: listVisible" << endl; + return visible; +} + +void DubPlaylist::init() { + kdDebug(90010) << "dub: init" << endl; + dubconfig = new DubConfigModule(this); // we pass this around to dub app + dub = new Dub(this); + kdDebug(90010) << "dub: init: test playlist() " << endl; + playlist(); +} + +void DubPlaylist::showList() { + kdDebug(90010) << "dub: showList" << endl; + visible = true; + Q_ASSERT(dub); + dub->show(); +} + +void DubPlaylist::hideList() { + kdDebug(90010) << "dub: hideList" << endl; + visible = false; + Q_ASSERT(dub); + dub->hide(); +} + +//void DubPlaylist::remove(const PlaylistItem&) { +// KMessageBox::information(0, "Removing files not supported yet, see configuration"); +//} + +//void DubPlaylist::sort() { +// kdDebug(90010) << "sort" << endl; +//} + +Playlist* DubPlaylist::playlist() { + kdDebug(90010) << "dub: playlist pointer " << this << endl; + return static_cast<Playlist*>(this); +} + +void DubPlaylist::setCurrent(const KFileItem* file, bool play) { + Q_ASSERT(file); + currentItem = new DubPlaylistItem(*file); + if (play) + emit playCurrent(); +} + +void DubPlaylist::setCurrent(const PlaylistItem &play) +{ + currentItem=play; + emit playCurrent(); +} + +/** No descriptions */ +void DubPlaylist::updateCurrent() { + KFileItem* active = dub->getActiveFile(); + if ( active ) { + currentItem = new DubPlaylistItem(*active); + emit playCurrent(); + } +} diff --git a/noatun-plugins/dub/dub/dubplaylist.h b/noatun-plugins/dub/dub/dubplaylist.h new file mode 100644 index 0000000..d250926 --- /dev/null +++ b/noatun-plugins/dub/dub/dubplaylist.h @@ -0,0 +1,77 @@ +// -*-c++-*- +// +// C++ Interface dubplaylist.h +// +// Description: +// +// +// Author: Eray Ozkural (exa), (C) 2001 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef DUBPLAYLIST_H +#define DUBPLAYLIST_H + +class Dub; +class DubConfigModule; + +#include <kfileitem.h> +#include <noatun/playlist.h> +#include <noatun/plugin.h> + +#include "dubplaylistitem.h" + +/**Playlist class. Implements the noatun playlist interface + *@author Eray Ozkural (exa) + */ + +class DubPlaylist : public Playlist, public Plugin { +public: + + DubPlaylist(); + ~DubPlaylist(); + + virtual void reset(); + + virtual void clear(); + virtual void addFile(const KURL&, bool play=false); + /** + * Cycle everthing through forward + **/ + virtual PlaylistItem next(); + /** + * return the one that might/should be playing now + **/ + virtual PlaylistItem current(); + /** + * Cycle through backwards + **/ + virtual PlaylistItem previous(); + virtual PlaylistItem getFirst() const; + virtual PlaylistItem getAfter(const PlaylistItem &item) const; + + virtual bool listVisible() const; + virtual void init(); + virtual Playlist* playlist(); + + virtual void setCurrent(const PlaylistItem &play); + +public slots: + virtual void showList(); + virtual void hideList(); + virtual void setCurrent(const KFileItem* file, bool play = false); + void updateCurrent(); +// virtual void remove(const PlaylistItem&); +// virtual void sort(); + + DubConfigModule *dubconfig; + +private: + Dub *dub; + PlaylistItem currentItem; + bool visible; +}; + +#endif diff --git a/noatun-plugins/dub/dub/dubplaylistitem.cpp b/noatun-plugins/dub/dub/dubplaylistitem.cpp new file mode 100644 index 0000000..d38eb24 --- /dev/null +++ b/noatun-plugins/dub/dub/dubplaylistitem.cpp @@ -0,0 +1,83 @@ +// +// +// C++ Implementation: dubplaylistitem.cpp +// +// Description: +// +// +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2001 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +//#include dubplaylistitem.cpp + + +#include "dubplaylistitem.h" +#include <kfile.h> +#include <kfileitem.h> +#include <kdebug.h> +#include <kmessagebox.h> +#include <klocale.h> + +DubPlaylistItem::DubPlaylistItem(const KFileItem& fItem) + : fileItem(fItem) +{ +// kdDebug(90010) << "construct playlist item " << fItem.url().prettyURL() << endl; + +// PlaylistItemData::addRef(); + PlaylistItemData::added(); +} + +DubPlaylistItem::~DubPlaylistItem(){ +// kdDebug(90010) << "destruct playlist item " << fileItem.url().prettyURL() << endl; + +// PlaylistItemData::removed(); + PlaylistItemData::removeRef(); +} + +QString DubPlaylistItem::property(const QString &key, const QString &def) const { +// kdDebug(90010) << "property " << key << endl; + if (isProperty(key)) { + kdDebug(90010) << key << " -> " << property_map.find(key).data() << endl; + return property_map.find(key).data(); + } + else + return def; +} + +void DubPlaylistItem::setProperty(const QString &key, const QString &val) { +// kdDebug(90010) << "set property" << endl; + property_map[key] = val; +} + +void DubPlaylistItem::clearProperty(const QString &key) { +// kdDebug(90010) << "clear property" << endl; + property_map.remove(key); +} + +QStringList DubPlaylistItem::properties() const { +// kdDebug(90010) << "properties" << endl; + QStringList list; + for (Properties::const_iterator i=property_map.begin(); + i!=property_map.end(); i++) { + list.append(i.data()); + } + return list; +} + +bool DubPlaylistItem::isProperty(const QString &key) const { +// kdDebug(90010) << "is property? " << key << endl; + return (property_map.find(key) != property_map.end()); +} + +KURL DubPlaylistItem::url() const { +// kdDebug(90010) << "item url" << endl; + + return fileItem.url(); +} +/** No descriptions */ +void DubPlaylistItem::remove() { + KMessageBox::information(0, i18n("Do you really want to delete this file?")); +} diff --git a/noatun-plugins/dub/dub/dubplaylistitem.h b/noatun-plugins/dub/dub/dubplaylistitem.h new file mode 100644 index 0000000..6f7a96d --- /dev/null +++ b/noatun-plugins/dub/dub/dubplaylistitem.h @@ -0,0 +1,55 @@ +// +// +// C++ Interface dubplaylistitem.h +// +// Description: +// +// +// Author: Eray Ozkural (exa), (C) 2001 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#ifndef DUBPLAYLISTITEM_H +#define DUBPLAYLISTITEM_H + +#include <kfileitem.h> +#include <dubplaylistitem.h> + +#include <noatun/playlist.h> + +/**noatun playlistitem implementation + *@author Eray Ozkural (exa) + */ + +class KFileItem; + +class DubPlaylistItem : public PlaylistItemData { +public: + DubPlaylistItem(const KFileItem&); + virtual ~DubPlaylistItem(); + + virtual QString property(const QString &, const QString & = 0) const; + virtual void setProperty(const QString &, const QString &); + virtual void clearProperty(const QString &); + virtual QStringList properties() const; + virtual bool isProperty(const QString &) const; + virtual KURL url() const; + KFileItem& getFileItem() { + return fileItem; + } + /** No descriptions */ + virtual void remove(); + +private: + KFileItem fileItem; + typedef QMap<QString,QString> Properties; + Properties property_map; + +// virtual QString file() const; + +}; + +#endif diff --git a/noatun-plugins/dub/dub/dubprefs.ui b/noatun-plugins/dub/dub/dubprefs.ui new file mode 100644 index 0000000..6b27195 --- /dev/null +++ b/noatun-plugins/dub/dub/dubprefs.ui @@ -0,0 +1,187 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>DubPrefs</class> +<widget class="QWidget"> + <property name="name"> + <cstring>DubPrefs</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>451</width> + <height>349</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>Dub Preferences</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Media home:</string> + </property> + </widget> + <widget class="KURLRequester"> + <property name="name"> + <cstring>mediaDirectory</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Top-level folder where my media files are stored</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>playMode</cstring> + </property> + <property name="title"> + <string>Play Mode</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>allFiles</cstring> + </property> + <property name="text"> + <string>All media files</string> + </property> + <property name="toolTip" stdset="0"> + <string>All media files found under Media Home</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>oneDir</cstring> + </property> + <property name="text"> + <string>Selected folder</string> + </property> + <property name="toolTip" stdset="0"> + <string>Play current folder only</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>recursiveDir</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>All files under selected folder</string> + </property> + <property name="toolTip" stdset="0"> + <string>Choose media files from current folder and all its subfolders</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>playOrder</cstring> + </property> + <property name="title"> + <string>Play Order</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>normal</cstring> + </property> + <property name="text"> + <string>Normal</string> + </property> + <property name="toolTip" stdset="0"> + <string>Play files in normal order</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>shuffle</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Shuffle</string> + </property> + <property name="toolTip" stdset="0"> + <string>Randomized order</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>repeat</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Repeat</string> + </property> + <property name="toolTip" stdset="0"> + <string>Repeat the same file forever</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>single</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Single</string> + </property> + <property name="toolTip" stdset="0"> + <string>Play a single file and stop</string> + </property> + </widget> + </vbox> + </widget> + </vbox> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> diff --git a/noatun-plugins/dub/dub/dubui.rc b/noatun-plugins/dub/dub/dubui.rc new file mode 100644 index 0000000..1b735ef --- /dev/null +++ b/noatun-plugins/dub/dub/dubui.rc @@ -0,0 +1,8 @@ +<!DOCTYPE kpartgui> +<kpartgui name="dub" version="1"> +<MenuBar> + <Menu name="file"><text>&File</text> + <Action name="file_new_window"/> + </Menu> +</MenuBar> +</kpartgui> diff --git a/noatun-plugins/dub/dub/dubview.cpp b/noatun-plugins/dub/dub/dubview.cpp new file mode 100644 index 0000000..e1e4713 --- /dev/null +++ b/noatun-plugins/dub/dub/dubview.cpp @@ -0,0 +1,63 @@ +/*************************************************************************** + dubview.cpp - description + ------------------- + begin : Tue Oct 23 01:44:51 EEST 2001 + copyright : (C) 2001 by Eray Ozkural (exa) + email : erayo@cs.bilkent.edu.tr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +// include files for Qt +#include <qprinter.h> +#include <qpainter.h> +#include <kdebug.h> + +// application specific includes +#include "dubview.h" +#include "dubview.moc" +#include "dub.h" +#include "fileselectorwidget.h" + +//DubView::DubView(QWidget *parent, const char *name) : QWidget(parent, name) +//{ +// setBackgroundMode(PaletteBase); +//} + +DubView::DubView(QWidget *parent) : FileSelectorWidget(parent) +{ + kdDebug(90010) << "dub view cons" << endl; + setBackgroundMode(PaletteBase); +} + +DubView::~DubView() +{ +} + +void DubView::print(QPrinter *pPrinter) +{ + QPainter printpainter; + printpainter.begin(pPrinter); + + // TODO: add your printing code here + + printpainter.end(); +} +/** Return item list of view */ +QPtrList<KFileItem>& DubView::items() +{ + return const_cast<QPtrList<KFileItem>&>( *dirOperator()->view()->items() ); +} + +/** Select a file */ +void DubView::selectFile(KFileItem* file){ + dirOperator()->view()->setCurrentItem( file ); + dirOperator()->view()->ensureItemVisible( file ); +} diff --git a/noatun-plugins/dub/dub/dubview.h b/noatun-plugins/dub/dub/dubview.h new file mode 100644 index 0000000..c768ca6 --- /dev/null +++ b/noatun-plugins/dub/dub/dubview.h @@ -0,0 +1,52 @@ +/*************************************************************************** + dubview.h - description + ------------------- + begin : Tue Oct 23 01:44:51 EEST 2001 + copyright : (C) 2001 by Eray Ozkural (exa) + email : erayo@cs.bilkent.edu.tr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DUBVIEW_H +#define DUBVIEW_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +// include files for Qt +#include <qwidget.h> + +#include <fileselectorwidget.h> + +// the viewing widget for the playlist +class DubView : public FileSelectorWidget +{ + Q_OBJECT + public: + /** Constructor for the main view */ + DubView(QWidget *parent = 0); + /** Destructor for the main view */ + ~DubView(); + + + /** contains the implementation for printing functionality */ + void print(QPrinter *pPrinter); + /** Return item list of view */ + QPtrList<KFileItem>& items(); + /** select a particular file */ + void selectFile(KFileItem* file); + + private: + +}; + +#endif // DUBVIEW_H diff --git a/noatun-plugins/dub/dub/fileselectorwidget.cpp b/noatun-plugins/dub/dub/fileselectorwidget.cpp new file mode 100644 index 0000000..153af20 --- /dev/null +++ b/noatun-plugins/dub/dub/fileselectorwidget.cpp @@ -0,0 +1,183 @@ +/**************************************************************************** + * Copyright (C) 2001 by Hugo Varotto * + * hugo@varotto-usa.com * + * * + * Based on Kate's fileselector widget by * + * Matt Newell * + * (C) 2001 by Matt Newell * + * newellm@proaxis.com * + * * + * 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 * + * * + ***************************************************************************/ + +#include <qlayout.h> +#include <qpushbutton.h> +#include <qhbox.h> +#include <qlabel.h> +#include <qstrlist.h> +#include <qtooltip.h> + +#include <kiconloader.h> +#include <kurlcombobox.h> +#include <kurlcompletion.h> +#include <kprotocolinfo.h> +#include <kdiroperator.h> +#include <kconfig.h> +#include <klocale.h> +#include <kcombobox.h> + +#include <kdebug.h> + +//#include "fileselector_part.h" +#include "fileselectorwidget.h" + + +FileSelectorWidget::FileSelectorWidget(QWidget *parent) + : QWidget(parent, "file selector widget") +{ + + // widgets and layout + + QVBoxLayout* lo = new QVBoxLayout(this); + + QHBox *hlow = new QHBox (this); + lo->addWidget(hlow); + + home = new QPushButton( hlow ); + home->setPixmap(SmallIcon("gohome")); + QToolTip::add(home, i18n("Home folder")); + up = new QPushButton( /*i18n("&Up"),*/ hlow ); + up->setPixmap(SmallIcon("up")); + QToolTip::add(up, i18n("Up one level")); + back = new QPushButton( /*i18n("&Back"),*/ hlow ); + back->setPixmap(SmallIcon("back")); + QToolTip::add(back, i18n("Previous folder")); + forward = new QPushButton( /*i18n("&Next"),*/ hlow ); + forward->setPixmap(SmallIcon("forward")); + QToolTip::add(forward, i18n("Next folder")); + + // HACK + QWidget* spacer = new QWidget(hlow); + hlow->setStretchFactor(spacer, 1); + hlow->setMaximumHeight(up->height()); + + cmbPath = new KURLComboBox( KURLComboBox::Directories, true, this, "path combo" ); + cmbPath->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed )); + KURLCompletion* cmpl = new KURLCompletion(); + cmbPath->setCompletionObject( cmpl ); + lo->addWidget(cmbPath); + + dir = new KDirOperator(QString::null, this, "operator"); + dir->setView(KFile::Detail); + lo->addWidget(dir); + lo->setStretchFactor(dir, 2); + + QHBox* filterBox = new QHBox(this); + filterIcon = new QLabel(filterBox); + filterIcon->setPixmap( BarIcon("filter") ); + filter = new KHistoryCombo(filterBox, "filter"); + filter->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed )); + filterBox->setStretchFactor(filter, 2); + lo->addWidget(filterBox); + + // slots and signals + + connect( filter, SIGNAL( activated(const QString&) ), SLOT( slotFilterChange(const QString&) ) ); + connect( filter, SIGNAL( returnPressed(const QString&) ),filter, SLOT( addToHistory(const QString&) ) ); + + connect( home, SIGNAL( clicked() ), dir, SLOT( home() ) ); + connect( up, SIGNAL( clicked() ), dir, SLOT( cdUp() ) ); + connect( back, SIGNAL( clicked() ), dir, SLOT( back() ) ); + connect( forward, SIGNAL( clicked() ), dir, SLOT( forward() ) ); + + connect( cmbPath, SIGNAL( urlActivated( const KURL& )), + this, SLOT( cmbPathActivated( const KURL& ) )); + connect( cmbPath, SIGNAL( returnPressed( const QString& )), + this, SLOT( cmbPathReturnPressed( const QString& ) )); + connect(dir, SIGNAL(urlEntered(const KURL&)), + this, SLOT(dirUrlEntered(const KURL&)) ); + + connect(dir, SIGNAL(finishedLoading()), + this, SLOT(dirFinishedLoading()) ); + + + connect(dir, SIGNAL(fileHighlighted(const KFileItem *)), + SLOT(fileHighlighted(const KFileItem *))); + connect(dir, SIGNAL(fileSelected(const KFileItem *)), + SLOT(fileSelected(const KFileItem *))); + + kdDebug(90010) << "connected stuff!" << endl; +} + + +FileSelectorWidget::~FileSelectorWidget() +{} + +KURL FileSelectorWidget::currentDirectory() +{ + return dirLister()->url(); +} + +void FileSelectorWidget::slotFilterChange( const QString & nf ) +{ + dir->setNameFilter( nf ); + dir->rereadDir(); +} + +void FileSelectorWidget::cmbPathActivated( const KURL& u ) +{ + dir->setURL( u, true ); +} + +void FileSelectorWidget::cmbPathReturnPressed( const QString& u ) +{ + dir->setFocus(); + dir->setURL( KURL(u), true ); +} + + +void FileSelectorWidget::dirUrlEntered( const KURL& u ) +{ + cmbPath->removeURL( u ); + QStringList urls = cmbPath->urls(); + urls.prepend( u.url() ); + while ( urls.count() >= (uint)cmbPath->maxItems() ) + urls.remove( urls.last() ); + cmbPath->setURLs( urls ); +} + + +void FileSelectorWidget::dirFinishedLoading() +{ + // HACK - enable the nav buttons + // have to wait for diroperator... + up->setEnabled( dir->actionCollection()->action( "up" )->isEnabled() ); + back->setEnabled( dir->actionCollection()->action( "back" )->isEnabled() ); + forward->setEnabled( dir->actionCollection()->action( "forward" )->isEnabled() ); + home->setEnabled( dir->actionCollection()->action( "home" )->isEnabled() ); +} + + +void FileSelectorWidget::focusInEvent(QFocusEvent*) +{ + dir->setFocus(); +} + +void FileSelectorWidget::setDir( KURL u ) +{ + dir->setURL(u, true); +} + +void FileSelectorWidget::fileHighlighted(const KFileItem *) { + kdDebug(90010) << "file highlighted!" << endl; +} + +void FileSelectorWidget::fileSelected(const KFileItem * ) { + kdDebug(90010) << "file selected!" << endl; +} +#include "fileselectorwidget.moc" + diff --git a/noatun-plugins/dub/dub/fileselectorwidget.h b/noatun-plugins/dub/dub/fileselectorwidget.h new file mode 100644 index 0000000..724173a --- /dev/null +++ b/noatun-plugins/dub/dub/fileselectorwidget.h @@ -0,0 +1,74 @@ +/*-*-c++-*-***************************************************************** + * Copyright (C) 2001 by Bernd Gehrmann bernd@kdevelop.org * + * Copyright (C) 2002 by Eray Ozkural erayo@cs.bilkent.edu.tr * + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FILESELECTORWIDGET_H_ +#define _FILESELECTORWIDGET_H_ + +#include <qlayout.h> +#include <qpushbutton.h> +#include <qhbox.h> +#include <qlabel.h> +#include <qstrlist.h> +#include <qtooltip.h> + +#include <klistview.h> +#include <qvbox.h> +#include <qwidget.h> +#include <kfile.h> +#include <kurlcombobox.h> +#include <kurlcompletion.h> +#include <kcombobox.h> +#include <kprotocolinfo.h> +#include <kdiroperator.h> + +class DubPlayListItem; + +class FileSelectorWidget : public QWidget +{ + Q_OBJECT + + friend class DubPlayListItem; + +public: + FileSelectorWidget(QWidget *parent); + ~FileSelectorWidget(); + + KDirOperator* dirOperator() {return dir;} + KDirLister* dirLister() { return dir->dirLister(); } + KURL currentDirectory(); + +public slots: + void slotFilterChange(const QString&); + void setDir(KURL); + +private slots: + void cmbPathActivated( const KURL& u ); + void cmbPathReturnPressed( const QString& u ); + void dirUrlEntered( const KURL& u ); + void dirFinishedLoading(); + void fileHighlighted(const KFileItem *); + void fileSelected(const KFileItem *); +// void setCurrentDocDir(); + +protected: + void focusInEvent(QFocusEvent*); + +private: + + KURLComboBox *cmbPath; + KHistoryCombo * filter; + QLabel* filterIcon; + KDirOperator * dir; + QPushButton *home, *up, *back, *forward, *cfdir; + +}; + +#endif diff --git a/noatun-plugins/dub/dub/random.h b/noatun-plugins/dub/dub/random.h new file mode 100644 index 0000000..cf2a970 --- /dev/null +++ b/noatun-plugins/dub/dub/random.h @@ -0,0 +1,43 @@ +// +// +// C++ Interface for module: Random +// +// Description: +// +// +// Author: exa +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef Random_Interface +#define Random_Interface + +#include <cstdlib> +#include <time.h> + +// wrapper for random functions +class Random { +public: + int operator() (int N) { + return random_int (N); + } + + static void init() { + seed += time(0); + srandom(seed); + } + static double random_double (double upper_bound) { + return double(random()) * upper_bound / RAND_MAX; + } + + static int random_int (int upper_bound) { + return random() % upper_bound; + } +private: + static int seed; +}; + +#endif + diff --git a/noatun-plugins/dub/dub/templates/cpp_template b/noatun-plugins/dub/dub/templates/cpp_template new file mode 100644 index 0000000..9973050 --- /dev/null +++ b/noatun-plugins/dub/dub/templates/cpp_template @@ -0,0 +1,15 @@ +// +// +// C++ Implementation: |FILENAME| +// +// Description: +// +// +// Author: |AUTHOR| <|EMAIL|>, (C) |YEAR| +// +// Copyright: See COPYING file that comes with this distribution +// +// + +//#include |FILENAME| + diff --git a/noatun-plugins/dub/dub/templates/header_template b/noatun-plugins/dub/dub/templates/header_template new file mode 100644 index 0000000..9ec0a73 --- /dev/null +++ b/noatun-plugins/dub/dub/templates/header_template @@ -0,0 +1,21 @@ +// +// +// C++ Interface |FILENAME| +// +// Description: +// +// +// Author: |AUTHOR|, (C) |YEAR| +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifndef |FILENAME|_Interface +#define |FILENAME|_Interface + +#include "General.hxx" + + + +#endif diff --git a/noatun-plugins/ffrs/Makefile.am b/noatun-plugins/ffrs/Makefile.am new file mode 100644 index 0000000..96eae2d --- /dev/null +++ b/noatun-plugins/ffrs/Makefile.am @@ -0,0 +1,17 @@ +INCLUDES= -I$(kde_includes)/arts $(all_includes) +kde_module_LTLIBRARIES = noatun_ffrs.la + +noatun_ffrs_la_SOURCES = ffrs.cpp + +noatun_ffrs_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatun_ffrs_la_LIBADD = $(LIB_KFILE) -lnoatun -lm + +noatun_ffrs_la_METASOURCES = AUTO + +noinst_HEADERS = ffrs.h + +noatun_DATA = ffrs.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/ffrs.pot diff --git a/noatun-plugins/ffrs/ffrs.cpp b/noatun-plugins/ffrs/ffrs.cpp new file mode 100644 index 0000000..5c4282a --- /dev/null +++ b/noatun-plugins/ffrs/ffrs.cpp @@ -0,0 +1,305 @@ +#include <noatun/engine.h> +#include <noatun/player.h> +#include <noatun/app.h> + +#include <math.h> +#include <qpainter.h> +#include <qbitmap.h> +#include <klocale.h> +#include <kconfig.h> +#include <qcursor.h> +#include <qtooltip.h> +#include <kwin.h> + + +#include "ffrs.h" + +extern "C" Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("ffrs"); + return new FFRS(); +} + + +View::View(int width, int height, int block, int unblock, QColor front, QColor back, int channel) + : QWidget(0,0, Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_StaysOnTop | Qt::WType_TopLevel), mChannel(channel) +{ + fg = front; + bg = back; + resize(width, height); + setPaletteBackgroundColor(back); + KWin::setState(handle(), NET::SkipTaskbar); + + KConfig *c = napp->config(); + c->setGroup("FFRS"); + + QSize size = napp->desktop()->size(); + QRect desktop(0,0, size.width(), size.height()); + + QPoint at; + if (channel==0) + { + at = QPoint(size.width()-width*4, size.height()-height-32); + QToolTip::add(this, i18n("Left")); + } + else // if (channel==1) + { + at = QPoint(size.width()-width*2, size.height()-height-32); + QToolTip::add(this, i18n("Right")); + } + + move(c->readPointEntry("at"+QString::number(mChannel), &at)); + + // make sure we're on the desktop + if ( + !desktop.contains(rect().topLeft()) + || !desktop.contains(rect().bottomRight()) + ) + { + move(at); + } + + + QBitmap mask(width, height); + QPainter p(&mask); + +// Qt::color0 = transparent +// Qt::color1 = opaque + p.fillRect(0, 0, width, height, Qt::color0); + for (int i=0; i < height; ) + { + p.fillRect(0, height-i-block, width, block, Qt::color1); + i += block + unblock; + } + setMask(mask); + units = block+unblock; + show(); + + moving=false; +} + +View::~View() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + c->writeEntry("at"+QString::number(mChannel), pos()); +} + +void View::mouseMoveEvent(QMouseEvent *) +{ + if (moving) + { + move ( QCursor::pos()-mMousePoint ); + } +} + +void View::mousePressEvent(QMouseEvent *) +{ + moving = true; + mMousePoint = mapFromGlobal(QCursor::pos()); +} + +void View::mouseReleaseEvent(QMouseEvent *) +{ + moving = false; +} + +void View::draw(float level) +{ + int w = width(); + int h = height(); + + // now convert level to pixels + + static const float LEVEL_MIN = 1.0/(1<<20); + if (level < LEVEL_MIN) level = LEVEL_MIN; + level = (2.0/log(2.0))*log(level+1.0); + + float fpix = level * (float)h; + fpix = fabs(fpix); + if (fpix - (int)fpix > .5) fpix += .5; + + int pix = (int)(fpix / units) * units; + + // and draw it (it updates too quickly for it to + // need a paintEvent) + QPainter p(this); + p.fillRect(0, 0, w, h-pix, bg); + p.fillRect(0, h-pix, w, h - (h-pix), fg); +} + + + +FFRS::FFRS() : QObject(), Plugin() +{ + dpyleft = dpyright = 0; + changed(); + prefs = new FFRSPrefs(this); + connect(prefs, SIGNAL(changed()), SLOT(changed())); + + setSamples(256); + + start(); +} + +FFRS::~FFRS() +{ + delete dpyleft; + delete dpyright; +} + +void FFRS::scopeEvent(float *left, float *right, int len) +{ + float avl=0; + float avr=0; + + for (int i=0; i < len; i++) + { + avl += fabs(left[i]); + avr += fabs(right[i]); + } + avl /= len; + avr /= len; + + dpyleft->draw(avl); + if (dpyright) + dpyright->draw(avr); +} + +void FFRS::changed() +{ + delete dpyleft; + delete dpyright; + + dpyleft = new View(prefs->width(), prefs->height(), prefs->fgblock(), prefs->bgblock(), prefs->fgcolor(), prefs->bgcolor(), 0); + dpyright = new View(prefs->width(), prefs->height(), prefs->fgblock(), prefs->bgblock(), prefs->fgcolor(), prefs->bgcolor(), 1); + + setInterval(prefs->rate()); +} + + +#include <knuminput.h> +#include <kcolorbutton.h> +#include <qlayout.h> +#include <qhbox.h> +#include <qlabel.h> + +FFRSPrefs::FFRSPrefs( QObject *parent ) + : CModule(i18n("Foreign Region"), i18n("French Foreign Region"),"",parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + QHBox *box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Width:"), box); + mWidth = new KIntNumInput(width(), box); + mWidth->setMinValue(0); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Height:"), box); + mHeight = new KIntNumInput(height(), box); + mHeight->setMinValue(0); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Visible block size:"), box); + mFgblock = new KIntNumInput(fgblock(), box); + mFgblock->setMinValue(0); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Transparent block size:"), box); + mBgblock = new KIntNumInput(bgblock(), box); + mBgblock->setMinValue(0); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Update interval:"), box); + mRate = new KIntNumInput(rate(), box); + mRate->setMinValue(0); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Foreground color:"), box); + mFgcolor = new KColorButton(fgcolor(), box); + + box = new QHBox(this); + layout->addWidget(box); + new QLabel(i18n("Background color:"), box); + mBgcolor = new KColorButton(bgcolor(), box); + + layout->addStretch(); +} + +void FFRSPrefs::save() +{ + KConfig *c = napp->config(); + + c->setGroup("FFRS"); + c->writeEntry("width", mWidth->value()); + c->writeEntry("height", mHeight->value()); + c->writeEntry("fgblock", mFgblock->value()); + c->writeEntry("bgblock", mBgblock->value()); + c->writeEntry("rate", mRate->value()); + + c->writeEntry("bgcolor", mBgcolor->color()); + c->writeEntry("fgcolor", mFgcolor->color()); + + emit changed(); +} + +int FFRSPrefs::width() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + return c->readNumEntry("width", 22); +} + +int FFRSPrefs::height() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + return c->readNumEntry("height", 162); +} + +int FFRSPrefs::fgblock() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + return c->readNumEntry("fgblock", 27-12); +} + +int FFRSPrefs::bgblock() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + return c->readNumEntry("bgblock", 12); +} + +int FFRSPrefs::rate() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + return c->readNumEntry("rate", 110); +} + + +QColor FFRSPrefs::bgcolor() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + QColor dumbass(0, 64, 0); + return c->readColorEntry("bgcolor", &dumbass); +} + +QColor FFRSPrefs::fgcolor() +{ + KConfig *c = napp->config(); + c->setGroup("FFRS"); + QColor dumbass(0, 255, 0); + return c->readColorEntry("fgcolor", &dumbass); +} + +#include "ffrs.moc" + diff --git a/noatun-plugins/ffrs/ffrs.h b/noatun-plugins/ffrs/ffrs.h new file mode 100644 index 0000000..b97c576 --- /dev/null +++ b/noatun-plugins/ffrs/ffrs.h @@ -0,0 +1,80 @@ +#ifndef FFRS_H +#define FFRS_H + +#include <noatun/pref.h> +#include <noatun/plugin.h> + + +class View : public QWidget +{ +Q_OBJECT +public: + View(int width, int height, int block, int unblock, QColor front, QColor back, int channel); + ~View(); + + void draw(float intensity); + + virtual void mouseMoveEvent(QMouseEvent *e); + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + +private: + int units; + QColor fg, bg; + bool moving; + QPoint mMousePoint; + int mChannel; +}; + +class FFRSPrefs; + +class FFRS : public QObject, public Plugin, public StereoScope +{ +Q_OBJECT + +public: + FFRS(); + ~FFRS(); + + virtual void scopeEvent(float *left, float *right, int len); + +public slots: + void changed(); + +private: + View *dpyleft, *dpyright; + FFRSPrefs *prefs; +}; + + +class KIntNumInput; +class KColorButton; + +class FFRSPrefs : public CModule +{ +Q_OBJECT + +public: + FFRSPrefs( QObject *parent ); + virtual void save(); + + int width(); + int height(); + int fgblock(); + int bgblock(); + int rate(); + + QColor bgcolor(); + QColor fgcolor(); + +signals: + void changed(); + +private: + KIntNumInput *mWidth, *mHeight, *mFgblock, *mBgblock, *mRate; + KColorButton *mBgcolor, *mFgcolor; +}; + + +#endif + diff --git a/noatun-plugins/ffrs/ffrs.plugin b/noatun-plugins/ffrs/ffrs.plugin new file mode 100644 index 0000000..2213169 --- /dev/null +++ b/noatun-plugins/ffrs/ffrs.plugin @@ -0,0 +1,108 @@ +Filename=noatun_ffrs.la +Author=Charles Samuels +Site=http://noatun.kde.org +Email=charles@kde.org +Type=visualization +License=BSD with Advertising Clause +Name=French Foreign Region +Name[af]=Franse Buiteland Streek +Name[az]=Fransız Xarici Bölgə +Name[bg]=Френски регион +Name[bs]=Francuski strani region +Name[ca]=Comarca estrangera francesa +Name[cs]=Cizí francouzský region +Name[cy]=Ardal Estron Ffrengig +Name[da]=Fransk udlandsområde +Name[de]=Ausländische Regionen (franz.) +Name[eo]=Franca eksterlanda regio +Name[es]=Región externa francesa +Name[et]=Prantsuse välisalad +Name[eu]=Frantziaren atzerriko lurraldea +Name[fa]=منطقۀ بیگانۀ فرانسوی +Name[fr]=Région étrangère française +Name[fy]=Bûtenlânske gebieten (Frânsktalich) +Name[ga]=Réigiún Coigríochach na Fraince +Name[gl]=Rexión Estranxeira da Franza +Name[hi]=फ्रांसीसी विदेशी क्षेत्र +Name[hr]=Francuska Legija stranaca +Name[is]=Franska útlendingasveitin +Name[it]=Legione Straniera Francese +Name[ka]=ფრანგული საზღვარგარეთ რეგიონი +Name[kk]=Францияның шетел өлкесі +Name[km]=តំបន់ខាងក្រៅ ភាសាបារាំង +Name[lt]=Prancūzų užsieniečių regionas +Name[mk]=Француски странски регион +Name[ms]=Rantau Asing Perancis +Name[nb]=Franske fremmedlegion +Name[nds]=Franzöösch frömd Regioon +Name[ne]=फ्रेन्च विदेशी क्षेत्र +Name[nl]=Buitenlandse gebieden (Franstalig) +Name[nn]=Den franske framandregionen +Name[pa]=ਫਰੈਂਚ ਵਿਦੇਸ਼ੀ ਖੇਤਰ +Name[pl]=Natężenie dźwięku +Name[pt]=Região Estrangeira da França +Name[pt_BR]=Legião Estrangeira Francesa +Name[ro]=Regiunea străină franceză +Name[ru]=Зрительный образ Плавающие кривые +Name[sk]=Francúzske zahraničné regióny +Name[sl]=Francosko tuje področje +Name[sr]=Француски страни регион +Name[sr@Latn]=Francuski strani region +Name[sv]=Franska främlingslegionen +Name[ta]=பிரான்சு வெளியிடம் +Name[tg]=Намуди тамошобини мавҷҳои каҷ +Name[tr]=Fransız Yabancı Bölge +Name[uk]=Французький іноземний регіон +Name[vi]=Miền ngoài Pháp +Name[xh]=Ummandla welizwe langaphandle lwesiFrentshi +Name[zh_CN]=法国外籍兵团 +Name[zh_TW]=法國國外區域 +Comment=Floating scopes +Comment[bg]=Хвърчащи сфери +Comment[bs]=Plutajući scopes +Comment[ca]=Camps flotants +Comment[cs]=Plovoucí sloupce +Comment[da]=Svævende skoper +Comment[de]=Gleitendes Oszilloskop +Comment[el]=Επιπλέοντα καλειδοσκόπια +Comment[eo]=Flosantaj borderoj +Comment[es]=Alcance variable +Comment[et]=Hõljuv ostsilloskoop +Comment[eu]=Eremu flotatzaileak +Comment[fa]=دامنههای شناور +Comment[fi]=Kelluvat oskiloskoopit +Comment[fr]=Scopes flottants +Comment[fy]=Driuwende Ossillioskopen +Comment[gl]=Osciloscópios flutuantes +Comment[he]=תחומים צפים +Comment[hi]=फ्लोटिंग स्कोप्स +Comment[hr]=Plivajući oscilograf +Comment[hu]=Lebegő monoszkópok +Comment[is]=Fljótandi mælar +Comment[it]=Floating Scopes +Comment[ka]=მოტივტივე მრუდები +Comment[kk]=Қалқымалы көрінісі +Comment[km]=វិសាលភាពអណ្ដែត +Comment[lt]=Plaukiojančios kreivės +Comment[mk]=Лебдечки осцилоскопи +Comment[ms]=Skop Apung +Comment[nb]=Flytende skop +Comment[nds]=Sweven Frequenzkieker +Comment[ne]=उत्प्लावन क्षेत्र +Comment[nl]=Drijvende Oscillioscopen +Comment[nn]=Flytande skop +Comment[pl]=Przesuwany wskaźnik natężenia dźwięku +Comment[pt]=Osciloscópios flutuantes +Comment[pt_BR]=Escopos Flutuantes +Comment[ru]=Плавающие кривые +Comment[sk]=Plávajúce rámce +Comment[sl]=Plavajoči analizatorji +Comment[sr]=Плутајући опсези +Comment[sr@Latn]=Plutajući opsezi +Comment[sv]=Flytande oscilloskop +Comment[ta]=மிதவு வரையெல்லைகள் +Comment[tg]=Мавҷҳои каҷ +Comment[tr]=Yüzen alanlar +Comment[uk]=Плаваючі криві +Comment[vi]=Xem nổi +Comment[zh_CN]=浮动观测器 diff --git a/noatun-plugins/luckytag/Makefile.am b/noatun-plugins/luckytag/Makefile.am new file mode 100644 index 0000000..4e02899 --- /dev/null +++ b/noatun-plugins/luckytag/Makefile.am @@ -0,0 +1,11 @@ +INCLUDES= $(all_includes) +kde_module_LTLIBRARIES = noatunluckytag.la + +noatunluckytag_la_SOURCES = luckytag.cpp parsedmp3filename.cpp +noatunluckytag_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunluckytag_la_LIBADD = $(LIB_KFILE) -lnoatun -lnoatuntags + +noatunluckytag_la_METASOURCES = AUTO + +noatun_DATA = luckytag.plugin +noatundir = $(kde_datadir)/noatun diff --git a/noatun-plugins/luckytag/luckytag.cpp b/noatun-plugins/luckytag/luckytag.cpp new file mode 100644 index 0000000..d040659 --- /dev/null +++ b/noatun-plugins/luckytag/luckytag.cpp @@ -0,0 +1,49 @@ +// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include <noatun/app.h> +#include <noatun/playlist.h> +#include <noatun/player.h> +#include "luckytag.h" +#include "parsedmp3filename.h" + +extern "C" Plugin *create_plugin() +{ + return new LuckyTagger; +} + +LuckyTagger::LuckyTagger(void) : Tags(-10) +{ +} + +bool LuckyTagger::update(PlaylistItem &item) +{ + ParsedMP3FileName parsed(item.file()); + + if(parsed.title().length()) + item.setProperty("title", parsed.title()); + if(parsed.artist().length()) + item.setProperty("author", parsed.artist()); + if(parsed.album().length()) + item.setProperty("album", parsed.album()); + if(parsed.comment().length()) + item.setProperty("comment", parsed.comment()); + return true; +} + diff --git a/noatun-plugins/luckytag/luckytag.h b/noatun-plugins/luckytag/luckytag.h new file mode 100644 index 0000000..964cd8d --- /dev/null +++ b/noatun-plugins/luckytag/luckytag.h @@ -0,0 +1,35 @@ +// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef LUCKYTAG_H +#define LUCKYTAG_H + +#include <noatun/plugin.h> +#include <noatun/tags.h> +#include <qobject.h> + +class LuckyTagger : public Tags, public Plugin +{ +public: + LuckyTagger(void); + + virtual bool update(PlaylistItem &item); +}; + +#endif diff --git a/noatun-plugins/luckytag/luckytag.plugin b/noatun-plugins/luckytag/luckytag.plugin new file mode 100644 index 0000000..1ed44ac --- /dev/null +++ b/noatun-plugins/luckytag/luckytag.plugin @@ -0,0 +1,121 @@ +Filename=noatunluckytag.la +Author=Frerich Raabe +Site=http://noatun.kde.org/ +Type=other +License=BSD +Name=Lucky Tag Reader +Name[af]=Gelukkig Etiket Leser +Name[ar]=قارئ العلامات المحظوظ +Name[az]=Lucky Taq Oxuyucusu +Name[bs]=Sretni čitač tagova +Name[ca]=Lector d'etiquetes Lucky +Name[cs]=Chytré čtení tagů +Name[cy]=Darllenydd Tag Lwcus +Name[da]=Heldig mærkelæser +Name[de]=Metainfo-Leser +Name[el]=Τυχερός αναγνώστης ετικετών +Name[eo]=Feliĉa etikedlegilo +Name[es]=Un bonito lector de etiquetas +Name[et]=Palainfo äraarvaja +Name[eu]=Lucky etiketa irakurgailua +Name[fa]=خوانندۀ برچسب خوششانس +Name[fi]=Onnekas tagien lukija +Name[fr]=Lecteur de balise +Name[fy]=Lokkige notysjelêzer +Name[gl]=Leitor de Marcas Lucky +Name[he]=קורא תגיות בר־מזל +Name[hi]=लकी टैग रीडर +Name[hr]=Lucky čitač oznaka +Name[is]=Heppni merkingalesarinn +Name[it]=Lettore Tag Lucky +Name[ja]=Lucky タグリーダー +Name[ka]=ბედნიერი ჭდის მკითხველი +Name[kk]=Мультимедиа файлының сипаттамаларын табу +Name[km]=កម្មវិធីអានស្លាក Lucky +Name[lt]=Sėkminga etikečių skaityklė +Name[mk]=Читач на ознаки на среќа +Name[ms]=Pembaca tag Bertuah +Name[nb]=Tagleser med flaks +Name[nds]=Metainfo-Leser +Name[ne]=भाग्यमानी ट्याग पाठक +Name[nl]=Gelukkige notitielezer +Name[nn]=Taglesar med lukke +Name[pl]=Zgadywacz oznaczeń plików +Name[pt]=Leitor de Marcas Lucky +Name[pt_BR]=Leitor de símbolos +Name[ro]=Cititor de taguri prin ghicire +Name[ru]=Теги из файла мультимедиа +Name[sk]=Lucky Tag čítačka +Name[sl]=Bralnik oznak Lucky Tag +Name[sr]=Читач срећних ознака +Name[sr@Latn]=Čitač srećnih oznaka +Name[sv]=Tursam taggläsare +Name[ta]=லக்கி ஒட்டு வாசிப்பாளர் +Name[tg]=Тег аз файли мултимедиа +Name[tr]=Luck Etiket Okuyucu +Name[uk]=Читач міток Lucky +Name[uz]=Laki teg oʻquvchi +Name[uz@cyrillic]=Лаки тэг ўқувчи +Name[vi]=Bộ đọc thẻ may +Name[xh]=Umfundi onentlahla weTag +Name[zh_CN]=幸运标签读取器 +Name[zh_TW]=幸運標籤閱讀器 +Comment=Guesses tag information from the filename +Comment[af]=Raaiskote etiket informasie van die lêernaam +Comment[ar]=يحزر معلومات العلامات من اسم الملف +Comment[az]=Fay adından taq mə'lumatını tapmağa çalışır +Comment[bg]=Отгатване на информацията за песните от името на файла +Comment[bs]=Pogađa informacije za tag iz imena datoteke +Comment[ca]=Intenta endevinar el contingut de l'etiqueta a partir del nom del fitxer +Comment[cs]=Odhaduje informace o značkách z názvu souboru +Comment[cy]=Dyfalu gwybodaeth tag o enw'r ffeil +Comment[da]=Gætter mærkeinformation fra filnavn +Comment[de]=Errät "auf gut Glück" Metainformationen aus dem Dateinamen +Comment[el]=Μαντεύει τις πληροφορίες ετικέτας από το όνομα του αρχείου +Comment[eo]=Divenas etikedan informon el la dosiernomo +Comment[es]=Obtiene información para la etiqueta a partir del nombre del archivo +Comment[et]=Oletab mängitava loo infot failinime põhjal +Comment[eu]=Etiketen informazioa fitxategi izenetik abiatuta igarten du +Comment[fa]=اطلاعات برچسب را از نام پرونده حدس میزند +Comment[fi]=Arvaa tagitiedot suoraan tiedostonimestä +Comment[fr]=Devine les informations de balises à partir du nom de fichier +Comment[fy]=Riedt de notysje-ynformaasje út de triemnamme +Comment[gl]=Adiviña a información das marcas a partir do nome do ficheiro +Comment[he]=ניחוש מידע התגיות מתוך שם הקובץ +Comment[hi]=फ़ाइल-नामों से टैग जानकारी का अंदाजा लगाता है +Comment[hr]=Nagađa podatke u oznaci iz naziva datoteke +Comment[hu]=Tag-információ a fájlnév alapján +Comment[is]=Giskar á lagamerkingar útfrá skráarheitum +Comment[it]=Indovina le informazioni dei tag dal nome del file +Comment[ja]=ファイル名からタグ情報を推測 +Comment[ka]=ჭდის ინფორმაციას ფაილის სახელიდან ხვდება +Comment[kk]=Мультимедиа файлының атауына жүгініп сипаттамаларын табу +Comment[km]=ព័ត៌មានស្លាក Guesses ពីឈ្មោះឯកសារ +Comment[lt]=Atspėja etiketės informaciją tiesiog iš bylos pavadinimo +Comment[mk]=Ги погодува информациите за ознаката од името на датотеката +Comment[ms]=Meneka maklumat tag dari nama fail +Comment[nb]=Gjetter tag-informasjon fra filnavnen +Comment[nds]=Raadt Betekerinformatschonen ut den Dateinaam +Comment[ne]=फाइलनामबाट ट्याग सूचना अनुमान गर्छ +Comment[nl]=Raadt de notitie-informatie uit de bestandsnaam +Comment[nn]=Gissar tag-informasjon frå filnamnet +Comment[pl]=Zgaduje oznaczenia dla pliku z jego nazwy +Comment[pt]=Adivinha a informação das marcas a partir do nome do ficheiro +Comment[pt_BR]=Informações de símbolos do nome do arquivo +Comment[ro]=Ghiceşte informaţiile de tag din numele de fişier +Comment[ru]=Получение тегов из файла +Comment[sk]=Háda tag informácie z názvu súborov +Comment[sl]=Informacije o značkah, uganjenih iz imena datoteke +Comment[sr]=Погађа информације о ознакама из имена фајла +Comment[sr@Latn]=Pogađa informacije o oznakama iz imena fajla +Comment[sv]=Gissar tagginformation från filnamnet +Comment[ta]=கோப்பு பெயரில் இருந்து கட்டளை தகவலை கண்டுபிடிக்கிறது +Comment[tg]=Гирифтани тегҳои аз файл +Comment[tr]=Dosya isminden etiketi bilgisini tahmin etmeye çalışır +Comment[uk]=Вгадує інформацію про мітку з назви файла +Comment[uz]=Teg maʼlumotini faylning nomidan taxmin qilish +Comment[uz@cyrillic]=Тэг маълумотини файлнинг номидан тахмин қилиш +Comment[vi]=Đoán thông tin thẻ từ tên tập tin +Comment[xh]=Iqikelela ulwazi lwe tag ukusuka kwi gama lefayile +Comment[zh_CN]=从文件名中猜测标签信息 +Comment[zh_TW]=從檔名猜測標籤 diff --git a/noatun-plugins/luckytag/parsedmp3filename.cpp b/noatun-plugins/luckytag/parsedmp3filename.cpp new file mode 100644 index 0000000..a3006bd --- /dev/null +++ b/noatun-plugins/luckytag/parsedmp3filename.cpp @@ -0,0 +1,98 @@ +// Copyright (c) 2001 Frerich Raabe <raabe@kde.org> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include "parsedmp3filename.h" + +#include <qstring.h> +#include <qstringlist.h> + +#include <kurl.h> + +ParsedMP3FileName::ParsedMP3FileName(const QString &path) +{ + KURL url = path; + + QString fileName = url.fileName(false); + m_directories = QStringList::split("/", url.directory()); + + if (fileName.startsWith("(") && fileName.contains(")")) + { + m_artist = fileName.mid(1, fileName.find(")") - 1); + m_title = fileName.right(fileName.length() - fileName.find(")") - 1); + validateArtist(); + } + else if (fileName.startsWith("[") && fileName.contains("]")) + { + m_artist = fileName.mid(1, fileName.find("]") - 1); + m_title = fileName.right(fileName.length() - fileName.find("]") - 1); + validateArtist(); + } + else if (fileName.contains("-")) + { + m_artist = fileName.left(fileName.find("-") - 1); + m_title = fileName.right(fileName.length() - fileName.find("-") - 1); + validateArtist(); + } + else + { + m_title = fileName; + m_album = m_directories.last(); + m_artist = m_directories[m_directories.count() - 2]; + } + + if (m_title.contains("(") && m_title.find(")", m_title.find("("))) + { + unsigned int start = m_title.find("("); + unsigned int end = m_title.find(")"); + m_comment = m_title.mid(start + 1, end - start - 1); + m_title.truncate(start); + } + + m_title = beautifyString(m_title); + if (m_title.right(4) == ".mp3") + m_title.truncate(m_title.length() - 4); + m_artist = beautifyString(m_artist); + m_album = beautifyString(m_album); + m_comment = beautifyString(m_comment); +} + +void ParsedMP3FileName::validateArtist() +{ + bool couldConvert; + if (m_artist.toUShort(&couldConvert) < 30 && couldConvert) + m_artist = m_directories[m_directories.count() - 2]; + m_album = m_directories.last(); +} + +QString ParsedMP3FileName::beautifyString(const QString &s) +{ + QString temp = s.lower().simplifyWhiteSpace(); + + temp[0] = temp[0].upper(); + + unsigned int numSpaces = temp.contains(" "); + unsigned int spacePos = 0; + while (numSpaces > 0) { + spacePos = temp.find(" ", spacePos == 0? 0 : spacePos + 1); + temp[spacePos + 1] = temp[spacePos + 1].upper(); + numSpaces--; + } + + return temp; +} diff --git a/noatun-plugins/luckytag/parsedmp3filename.h b/noatun-plugins/luckytag/parsedmp3filename.h new file mode 100644 index 0000000..5dc2809 --- /dev/null +++ b/noatun-plugins/luckytag/parsedmp3filename.h @@ -0,0 +1,49 @@ +// Copyright (c) 2001 Frerich Raabe <raabe@kde.org> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef PARSEDMP3FILENAME_H +#define PARSEDMP3FILENAME_H + +#include <qstringlist.h> + +class ParsedMP3FileName +{ +public: + ParsedMP3FileName(const QString &); + ~ParsedMP3FileName() {} + + QString title() const { return m_title; } + QString artist() const { return m_artist; } + QString album() const { return m_album; } + QString comment() const { return m_comment; } + +protected: + QString m_title; + QString m_artist; + QString m_album; + QString m_comment; + +private: + void validateArtist(); + QString beautifyString(const QString &); + + QStringList m_directories; +}; + +#endif diff --git a/noatun-plugins/lyrics/Makefile.am b/noatun-plugins/lyrics/Makefile.am new file mode 100644 index 0000000..ac34a17 --- /dev/null +++ b/noatun-plugins/lyrics/Makefile.am @@ -0,0 +1,17 @@ +INCLUDES= $(all_includes) +kde_module_LTLIBRARIES = noatunlyrics.la + +noatunlyrics_la_SOURCES = lyrics.cpp historymanager.cpp cmodule.cpp + +noatunlyrics_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunlyrics_la_LIBADD = $(LIB_KHTML) $(LIB_KFILE) -lnoatun + +noatunlyrics_la_METASOURCES = AUTO + +noinst_HEADERS = lyrics.h + +noatun_DATA = lyrics.plugin lyricsui.rc +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/lyrics.pot diff --git a/noatun-plugins/lyrics/TODO b/noatun-plugins/lyrics/TODO new file mode 100644 index 0000000..0b0c503 --- /dev/null +++ b/noatun-plugins/lyrics/TODO @@ -0,0 +1,17 @@ +*** TODO for the Lyrics plugin + any contribution is welcomed! *** + +- Save scroll position (in a per search engine basis, probably) + - To account for tables (like in SM) +- Save Lyrics to file: + - As a URL + - As a HTML file + - As Selected text +- Automatically searchs at all the places + (configurable "no result" regexp) +- Ideas for the interface: + - Save as (URL|HTML|SELECTED TEXT) + - Auto save songs (at ~ or global) + - Remove (.*) ie, stuff like (live), (cover), etc + - Remove non alphabetic stuff +- Max search size diff --git a/noatun-plugins/lyrics/cmodule.cpp b/noatun-plugins/lyrics/cmodule.cpp new file mode 100644 index 0000000..2501ebb --- /dev/null +++ b/noatun-plugins/lyrics/cmodule.cpp @@ -0,0 +1,218 @@ +#include "cmodule.h" +#include "lyrics.h" +#include <qlayout.h> +#include <qstringlist.h> +#include <qlabel.h> +#include <kmessagebox.h> +#include <qvgroupbox.h> +#include <qgrid.h> +#include <klistbox.h> +#include <klineedit.h> +#include <kbuttonbox.h> +#include <klocale.h> +#include <kconfig.h> +#include <kdebug.h> + +extern Lyrics *lyrics; + +const char *const DEFAULT_NAME = + "Google," + "Pure Lyrics," + "Sing365," + "Lyrics Planet," + "Lyrics World," + "Get Lyrics," + "AZLyrics," + "Astraweb," + "SongMeanings," + "Google (Feeling Lucky)," + "Everything2," + "Everything2 (author info)"; + +const char *const DEFAULT_QUERY = + "http://www.google.com/search?q=lyrics+$(title)+$(author)+$(album)," + "http://www.purelyrics.com/index.php?search_artist=$(author)&search_album=$(album)&search_title=$(title)&search_lyrics=&search_advsubmit2=Search," + "http://search.sing365.com/search.php?searchstr=$(title)&submit=search&category=song," + "http://www.lyricsplanet.com/index.php3?style=searchtitle&fix=1&searchstring=$(title)," + "http://www.lyricsworld.com/cgi-bin/search.cgi?q=$(title)+$(author)," + "http://www.getlyrics.com/search.php?Song=$(title)," + "http://www.azlyrics.com/cgi-bin/s.cgi?q=$(title)+$(author)," + "http://search.lyrics.astraweb.com?word=$(title)+$(author)+$(album)," + "http://www.songmeanings.net/search.php?type=titles&query=$(title)," + "http://www.google.com/search?q=lyrics+%22$(title)%22+%22$(author)%22+%22$(album)%22&btnI=I%27m+Feeling+Lucky," + "http://everything2.com/index.pl?node=$(title)," + "http://everything2.com/index.pl?node=$(author)," + "http://www.letssingit.com/cgi-exe/am.cgi?a=search&p=1&s=$(title)&l=song"; + +LyricsCModule::LyricsCModule(QObject *_parent) : CModule(i18n("Lyrics"), i18n("Configure Lyrics Plugin"), "document", _parent) { + /* Thanks to the kde-usability guys for the help designing this dialog! + * help to simon edwards of KGuardGod, for a big help designing it */ + QVBoxLayout *vlayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); + QHBoxLayout *hlayout = new QHBoxLayout(vlayout, KDialog::spacingHint()); + vlayout->setStretchFactor( hlayout, 1 ); + + // Search box + QVBoxLayout *boxlayout = new QVBoxLayout( hlayout, KDialog::spacingHint() ); + boxlayout->addWidget( new QLabel( i18n("Search providers:" ), this ) ); + providersBox = new KListBox( this, "providersBox" ); + boxlayout->addWidget(providersBox); + + boxButtons = new KButtonBox( this, Vertical ); + boxButtons->addButton( i18n( "New Search Provider" ), this, SLOT( newSearch() ) ); + boxButtons->addButton( i18n( "Delete Search Provider" ), this, SLOT( delSearch() ) ); + boxButtons->addButton( i18n( "Move Up" ), this, SLOT( moveUpSearch() ) ); + boxButtons->addButton( i18n( "Move Down" ), this, SLOT( moveDownSearch() ) ); + boxButtons->layout(); + boxlayout->addWidget( boxButtons ); + + // Edit box + QGroupBox *propBox = new QVGroupBox( i18n("Search Provider Properties" ), this ); + QGrid *editGrid = new QGrid(2, propBox ); + editGrid->setSpacing( propBox->insideSpacing() ); + new QLabel( i18n( "Name:" ), editGrid ); + nameEdit = new KLineEdit( editGrid ); + new QLabel( i18n( "Query:" ), editGrid ); + queryEdit = new KLineEdit( editGrid ); + /* ATTENTION to translators: + * The property names can't be translated. This means that $(author) must be kept as $(author), $(title) as $(title), etc, or it won't work.*/ + QLabel *textLabel = new QLabel(i18n("For your query, you can use any property of your multimedia item, just enclosing it with a $(property).\n\nSome common properties used are $(title), $(author) and $(album). For example, to search in Google for the author, title and track, just use:\nhttp://www.google.com/search?q=$(author)+$(title)+$(track)"), propBox, "textLabel"); + textLabel->setAlignment(Qt::WordBreak); + hlayout->addWidget( propBox, 1 ); + + /* Signal/slots */ + nameEdit->setEnabled( false ); + queryEdit->setEnabled( false ); + connect( providersBox, SIGNAL( highlighted( QListBoxItem * ) ), this, SLOT( selected( QListBoxItem * ) ) ); + connect( nameEdit, SIGNAL( textChanged( const QString &) ), this, SLOT( nameChanged( const QString & ) ) ); + connect( queryEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( queryChanged( const QString & ) ) ); + + + + vlayout->addStretch(); + reopen(); + save(); +} + +void LyricsCModule::newSearch(QString name, QString query) { + kdDebug(90020) << "New search" << endl; + SearchProvider s = { name, query }; + mProviders.push_back( s ); + providersBox->insertItem( name ); + providersBox->setCurrentItem( providersBox->count()-1 ); + nameEdit->setEnabled( true ); + queryEdit->setEnabled( true ); +//X if ( providersBox->count() == 1 ) +//X providersBox->setCurrentItem( 0 ); +} + +void LyricsCModule::selected( QListBoxItem *i ) { + kdDebug(90020) << "selected" << endl; + int index = providersBox->index( i ); + if ( index < 0 ) + return; + if ( nameEdit->text() != mProviders[ index ].name ) + nameEdit->setText( mProviders[ index ].name ); + if ( queryEdit->text() != mProviders[ index ].url ) + queryEdit->setText( mProviders[ index ].url ); +} + + +void LyricsCModule::delSearch() { + if ( mProviders.size() == 1 ) { + KMessageBox::sorry( this, i18n( "You must have at least one search provider. The current one will not be removed." ) ); + return; + } + int index = providersBox->currentItem(); + QValueVector<SearchProvider>::iterator it; + for ( it = mProviders.begin(); ( *it ).name != mProviders[ index ].name || ( *it ).url != mProviders[ index ].url; ++it ); + mProviders.erase( it ); + providersBox->removeItem( index ); + providersBox->setSelected( providersBox->currentItem(), true ); +} + +void LyricsCModule::moveUpSearch() { + if ( providersBox->currentItem() <= 0 ) + return; + int index = providersBox->currentItem(); + QString name = mProviders[ index ].name; + QString url = mProviders[ index ].url; + mProviders[ index ].name = mProviders[ index-1 ].name; + mProviders[ index ].url = mProviders[ index-1 ].url; + mProviders[ index-1 ].name = name; + mProviders[ index-1 ].url = url; + providersBox->changeItem( mProviders[ index-1 ].name, index-1 ); + providersBox->changeItem( mProviders[ index ].name, index ); + providersBox->setSelected( index-1, true ); +} + +void LyricsCModule::moveDownSearch() { + if ( static_cast<unsigned int>( providersBox->currentItem() ) >= providersBox->count()-1 ) + return; + int index = providersBox->currentItem(); + QString name = mProviders[ index ].name; + QString url = mProviders[ index ].url; + mProviders[ index ].name = mProviders[ index+1 ].name; + mProviders[ index ].url = mProviders[ index+1 ].url; + mProviders[ index+1 ].name = name; + mProviders[ index+1 ].url = url; + providersBox->changeItem( mProviders[ index+1 ].name, index+1 ); + providersBox->changeItem( mProviders[ index ].name, index ); + providersBox->setSelected( index+1, true ); +} + +void LyricsCModule::nameChanged( const QString &name ) { + kdDebug(90020) << "name changed" << endl; + if ( providersBox->currentItem() < 0 ) + return; + mProviders[ providersBox->currentItem() ].name = name; + if ( name != providersBox->text( providersBox->currentItem() ) ) + providersBox->changeItem( name, providersBox->currentItem() ); +} + +void LyricsCModule::queryChanged( const QString &query ) { + kdDebug(90020) << "query changed" << endl; + if ( providersBox->currentItem() < 0 ) + return; + mProviders[ providersBox->currentItem() ].url = query; +} + + +void LyricsCModule::save() { + KConfig *conf = KGlobal::config(); + conf->setGroup( "Lyrics" ); + QStringList queryList, nameList; + QValueVector<SearchProvider>::iterator it; + for ( it = mProviders.begin(); it != mProviders.end(); ++it ) { + kdDebug(90020) << "query:" << ( *it ).url << endl; + queryList += ( *it ).url; + nameList += ( *it ).name; + } + conf->writeEntry( "queryList", queryList ); + conf->writeEntry( "nameList", nameList ); + /* TODO */ + // APPLY settings + if ( lyrics ) + lyrics->setProviders( mProviders ); +} + +void LyricsCModule::reopen() { + QStringList queryList, nameList; + KConfig *conf = KGlobal::config(); + mProviders.clear(); + providersBox->clear(); + kdDebug(90020) << "config read" << endl; + conf->setGroup( "Lyrics" ); + queryList = conf->readListEntry( "queryList" ); + nameList = conf->readListEntry( "nameList" ); + if ( queryList.count() == 0 && nameList.count() == 0 ) { + queryList = QStringList::split( ",", DEFAULT_QUERY ); + nameList = QStringList::split( ",", DEFAULT_NAME ); + } + QStringList::Iterator queryIt, nameIt; + for ( queryIt = queryList.begin(), nameIt = nameList.begin(); queryIt != queryList.end() && nameIt != nameList.end(); ++queryIt, ++nameIt ) { + kdDebug(90020) << "Read:" << *queryIt << " and " << *nameIt << endl; + newSearch( *nameIt, *queryIt ); + } +} + +#include "cmodule.moc" diff --git a/noatun-plugins/lyrics/cmodule.h b/noatun-plugins/lyrics/cmodule.h new file mode 100644 index 0000000..dbb2da7 --- /dev/null +++ b/noatun-plugins/lyrics/cmodule.h @@ -0,0 +1,43 @@ +#ifndef _LYRICSCMODULE_H_ +#define _LYRICSCMODULE_H_ + +#include <noatun/pref.h> +#include <qvaluevector.h> +#include <klocale.h> + +class KLineEdit; +class KListBox; +class KButtonBox; + +struct SearchProvider { + QString name; + QString url; +}; + +class LyricsCModule : public CModule { + Q_OBJECT + public: + LyricsCModule(QObject *_parent); + public slots: + virtual void save(void); + virtual void reopen(void); + void newSearch(QString name = i18n( "New Search Provider" ), QString query = ""); + void delSearch(); + void moveUpSearch(); + void moveDownSearch(); + void selected( QListBoxItem *i ); + void nameChanged( const QString &name ); + void queryChanged( const QString &query ); + protected: + KListBox *providersBox; + KButtonBox *boxButtons; + KLineEdit *nameEdit; + KLineEdit *queryEdit; + QValueVector<SearchProvider> mProviders; +}; + + + + + +#endif diff --git a/noatun-plugins/lyrics/historymanager.cpp b/noatun-plugins/lyrics/historymanager.cpp new file mode 100644 index 0000000..1524d7b --- /dev/null +++ b/noatun-plugins/lyrics/historymanager.cpp @@ -0,0 +1,56 @@ +#include "historymanager.h" + +/** HISTORY MANAGER *** +*** TODO: Add more complex support (like in Konqueror) + Maybe use Konqueror's History Manager */ + +HistoryManager::HistoryManager(QObject *parent) : QObject(parent) { +} + +HistoryManager::~HistoryManager() { +} + +void HistoryManager::addURL(const KURL &url) { + /* push current URL to the back */ + if (!currentURL.isEmpty()) { + if (back_stack.count() == 0) + emit uiChanged( Back, true ); + back_stack.push(currentURL); + } + /* Make a copy of the new URL */ + currentURL = url; + /* Clear the forward stack */ + if (forward_stack.count() > 0) + emit uiChanged( Forward, false ); + forward_stack.clear(); +} + +KURL HistoryManager::back() { + if (back_stack.count() <= 0) + return KURL(); + /* The currentURL is now pushed in the forward_stack */ + if (forward_stack.count() == 0) + emit uiChanged( Forward, true ); + forward_stack.push(currentURL); + /* The last URL is the back stack is now popped as the current one */ + if (back_stack.count() == 1) + emit uiChanged( Back, false ); + currentURL = back_stack.pop(); + return currentURL; +} + +KURL HistoryManager::forward() { + if (forward_stack.count() <= 0) + return KURL(); + /* Push the currentURL into the back_stack */ + if (back_stack.count() == 0) + emit uiChanged( Back, true ); + back_stack.push(currentURL); + /* Pop from the forward_stack into the currentURL */ + if (forward_stack.count() == 1) + emit uiChanged( Forward, false ); + currentURL = forward_stack.pop(); + return currentURL; +} + +#include "historymanager.moc" diff --git a/noatun-plugins/lyrics/historymanager.h b/noatun-plugins/lyrics/historymanager.h new file mode 100644 index 0000000..d2fdb29 --- /dev/null +++ b/noatun-plugins/lyrics/historymanager.h @@ -0,0 +1,28 @@ +#ifndef _HISTORY_MANAGER_H +#define _HISTORY_MANAGER_H + +#include <kurl.h> +#include <qvaluestack.h> +#include <qobject.h> + +class HistoryManager : public QObject { + Q_OBJECT + public: + HistoryManager(QObject *parent = NULL); + ~HistoryManager(); + KURL back(); + KURL forward(); + void addURL(const KURL &); + enum Buttons { + Back, + Forward + }; + signals: + void uiChanged(int, bool); + protected: + QValueStack<KURL> back_stack; + QValueStack<KURL> forward_stack; + KURL currentURL; +}; + +#endif diff --git a/noatun-plugins/lyrics/lyrics.cpp b/noatun-plugins/lyrics/lyrics.cpp new file mode 100644 index 0000000..611db9c --- /dev/null +++ b/noatun-plugins/lyrics/lyrics.cpp @@ -0,0 +1,268 @@ +#include <klocale.h> +#include <klineeditdlg.h> +#include <kconfig.h> +#include <kmessagebox.h> +#include <khtmlview.h> +#include <kstdaction.h> +#include <kstatusbar.h> +#include <qregexp.h> +#include "lyrics.h" +#include <noatun/player.h> +#include <kdebug.h> +#include "historymanager.h" + + +extern "C" +{ + Plugin *create_plugin() + { + KGlobal::locale()->insertCatalogue("lyrics"); + return new Lyrics(); + } +} + +Lyrics *lyrics; + +Lyrics::Lyrics() : KMainWindow(), Plugin(), active(false) +{ + lyrics = this; + /* Create default actions */ + (void)KStdAction::close(this, SLOT(close()), actionCollection()); + ( void )KStdAction::goTo( this, SLOT( goTo() ), actionCollection(), "go_web_goTo" ); + //(void)KStdAction::print(this, SLOT(print()), actionCollection()); + //(void)KStdAction::printPreview(this, SLOT(printPreview()), actionCollection()); + //(void)KStdAction::mail(this, SLOT(mail()), actionCollection()); + //(void)KStdAction::find(this, SLOT(find()), actionCollection()); + follow_act = new KToggleAction(i18n("&Follow Noatun Playlist"), "goto", 0, actionCollection(), "follow"); + KStdAction::redisplay(this, SLOT(viewLyrics()), actionCollection()); + attach_act = new KToggleAction(i18n("&Link URL to File"), "attach", KShortcut("CTRL+ALT+A"), actionCollection(), "attach_url"); + connect(attach_act, SIGNAL(toggled(bool)), this, SLOT(attach(bool))); + back_act = KStdAction::back(this, SLOT(back()), actionCollection()); + back_act->setEnabled(false); + forward_act = KStdAction::forward(this, SLOT(forward()), actionCollection()); + forward_act->setEnabled(false); + new KWidgetAction( new QLabel(i18n("Search provider:"), this, "kde toolbar widget"), i18n("Search Provider"), 0, 0, 0, actionCollection(), "search_label"); + site_act = new KSelectAction(i18n("&Search Provider"), 0, this, SLOT(viewLyrics()), actionCollection(), "search_provider"); + + /* Add entry to menu */ + menuID = napp->pluginMenuAdd(i18n("&View Lyrics"), this, SLOT(viewLyrics())); + + /* Create history manager and htmlpart */ + history = new HistoryManager(this); + htmlpart = new KHTMLPart(this); + //htmlpart->view()->setMinimumSize(350, 420); + + /* Connect signals/slots */ + connect( htmlpart->browserExtension(), SIGNAL(openURLRequestDelayed( const KURL &, const KParts::URLArgs & )), this, SLOT(openURLRequest( const KURL &, const KParts::URLArgs & ))); + connect( htmlpart, SIGNAL(started(KIO::Job *)), this, SLOT(loadingURL(KIO::Job *)) ); + connect( htmlpart, SIGNAL(completed()), this, SLOT(loadedURL()) ); + connect( history, SIGNAL(uiChanged(int, bool)), this, SLOT(changeUI(int, bool)) ); + connect( napp->player(), SIGNAL(newSong()), this, SLOT(newSong()) ); + + /* Status bar */ + statusBar()->insertItem(i18n("Ready"), 0, 1); + statusBar()->setItemAlignment(0, Qt::AlignLeft); + + /* Finalize the GUI */ + setCentralWidget(htmlpart->view()); + createGUI("lyricsui.rc"); + setAutoSaveSettings("Lyrics"); + + /* Load configuration */ + KConfig *config = KGlobal::config(); + config->setGroup("Lyrics"); + follow_act->setChecked(config->readBoolEntry("follow", true)); + /* Create config object */ + new LyricsCModule(this); + +} + +void Lyrics::goTo() { + bool sel = false; + QString url = KLineEditDlg::getText( i18n( "Please enter the URL you want to go to:" ), htmlpart->url().prettyURL(), &sel, this ); + if ( !url.isEmpty() && sel ) + go( KURL( url ) ); +} + +void Lyrics::setProviders( QValueVector<SearchProvider> &sites ) { + mSites = sites; + QStringList sitesName; + for (unsigned int i = 0; i < mSites.size(); ++i) { + sitesName += mSites[i].name; + } + site_act->setItems(sitesName); + site_act->setCurrentItem(0); +} + +void Lyrics::attach(bool a) { + if ( !napp->player()->current() ) + return; + if (a) { + KMessageBox::information(this, i18n("Choosing this option, the current URL will be attached to the current file. This way, if you try to view the lyrics of this file later, you won't have to search for it again. This information can be stored between sessions, as long as your playlist stores metadata about the multimedia items (almost all the playlists do). If you want to be able to search for other lyrics for this music, you must select this option again to clear the stored URL."), QString::null, "lyrics::attach_info"); + kdDebug(90020) << "Setting URL for (attach)" << napp->player()->current().title() << endl; + napp->player()->current().setProperty("Lyrics::URL", htmlpart->url().url()); + site_act->setEnabled(false); + actionCollection()->action("search_label")->setEnabled(false); + } + else { + kdDebug(90020) << "Clearing URL for " << napp->player()->current().title() << endl; + napp->player()->current().clearProperty("Lyrics::URL"); + site_act->setEnabled(true); + actionCollection()->action("search_label")->setEnabled(true); + } +} + +void Lyrics::loadingURL(KIO::Job *) +{ + statusBar()->changeItem(i18n("Loading..."), 0); +} + +void Lyrics::loadedURL() +{ + if ( !napp->player()->current() ) + return; + statusBar()->changeItem(i18n("Loaded"), 0); + setCaption(i18n("Lyrics: %1").arg(napp->player()->current().property("title"))); + if (!htmlpart->url().url().isEmpty() && napp->player()->current() && !napp->player()->current().property("Lyrics::URL").isEmpty()) { + kdDebug(90020) << "Setting URL for (loaded)" << napp->player()->current().title() << endl; + napp->player()->current().setProperty("Lyrics::URL", htmlpart->url().url()); + } +} + +void Lyrics::back() +{ + KURL url = history->back(); + if (url.isEmpty()) + return; + kdDebug(90020) << "Going to " << url.url() << endl; + htmlpart->openURL(url); +} + +void Lyrics::forward() +{ + KURL url = history->forward(); + if (url.isEmpty()) + return; + kdDebug(90020) << "Going to " << url.url() << endl; + htmlpart->openURL(url); +} + +void Lyrics::changeUI(int button, bool enable) +{ + if (button == HistoryManager::Back) + back_act->setEnabled( enable ); + else if (button == HistoryManager::Forward) + forward_act->setEnabled( enable ); +} + +void Lyrics::go(const KURL &url) +{ + history->addURL(url); + kdDebug(90020) << "Going to " << url.url() << endl; + htmlpart->openURL(url); +} + +void Lyrics::newSong() { + kdDebug(90020) << "New song!" << endl; + // If I'm not following, just forget about it + if (!follow_act->isChecked()) + return; + if (active) + viewLyrics(); + // TODO: If not visible, maybe it would be a good idea + // to load the lyrics on advance +} + + +void Lyrics::viewLyrics(int index) +{ + if (!napp->player()->current()) { + KMessageBox::sorry(this, i18n("You can only view the lyrics of the current song, and currently there is none.")); + return; + } +//X <small>(if the above information is incorrect, the search may not find the correct music. If that's the case, use a tag editor to fix it. Hint: Use the luckytag plugin from the kdeaddons module to try to guess title, author and album from the song filename)</small><br> + QString url, name; + if (index < 0) + index = site_act->currentItem(); + if ( index < 0 ) + return; + url = mSites[index].url; + name = mSites[index].name; + QRegExp props_regexp("\\$\\((\\w+)\\)"); + int pos = props_regexp.search(url); + while (pos >= 0) { + QString property = props_regexp.cap(1); + url.replace(pos, props_regexp.matchedLength(), napp->player()->current().property(property)); + pos = props_regexp.search(url); + } + QString title(napp->player()->current().property("title")); + setCaption(i18n("Loading Lyrics for %1").arg(title)); + // Check if we have a music playing + if (napp->player()->current()) { + htmlpart->begin(); + htmlpart->write(i18n("<HTML>" + "<BODY>" + "<p><strong>Please wait! Searching for...</strong></p>" + "<TABLE BORDER=1 WIDTH=\"100%\">" + "<TR><TD BGCOLOR=\"#707671\"><strong>Title</strong></TD><TD>%1</TD></TR>" + "<TR><TD BGCOLOR=\"#707671\"><strong>Author</strong></TD><TD>%2</TD></TR>" + "<TR><TD BGCOLOR=\"#707671\"><strong>Album</strong></TD><TD>%3</TD></TR>" + "</TABLE>").arg( napp->player()->current().property( "title" ) ).arg( napp->player()->current().property( "author" ) ).arg( napp->player()->current().property( "album" ) ) ); + KURL _url; + /* Check if we should use the store url or the query one */ + if (napp->player()->current().property("Lyrics::URL").isEmpty()) { + /* Use the query one */ + _url = url; + _url.setQuery(_url.query().replace(QRegExp("%20"), "+")); + kdDebug(90020) << "I'm using the query url" << endl; + attach_act->setChecked(false); + site_act->setEnabled(true); + actionCollection()->action("search_label")->setEnabled(true); + htmlpart->write( i18n( "<hr><p><strong>Searching at %1</strong><br><small>(<a href=\"%3\">%2</a></small>)</p>" ).arg( name ).arg( _url.prettyURL() ).arg( _url.url() ) ); + } else { + _url = napp->player()->current().property("Lyrics::URL"); + _url.setQuery(_url.query().replace(QRegExp("%20"), "+")); + kdDebug(90020) << "I'm using the stored url" << endl; + attach_act->setChecked(true); + site_act->setEnabled(false); + actionCollection()->action("search_label")->setEnabled(false); + htmlpart->write( i18n( "<hr><p><strong>Using the stored URL</strong><br><small>(<a href=\"%2\">%1</a></small>)</p>" ).arg( _url.prettyURL() ).arg( _url.url() ) ); + } + htmlpart->write( "</BODY></HTML>" ); + htmlpart->end(); + go(_url); + this->show(); + KMessageBox::information( this, i18n( "In order to find the lyrics for the current song, this plugin uses the properties stored with each song, such as its title, author and album. These properties are usually retrieved by a tag reader, but in some cases they may not be present or be incorrect. In that case, the Lyrics plugin will not be able to find the lyrics until these properties are fixed (you can fix them using the tag editor).\nHint: The lucky tag plugin, present in the kdeaddons module, can try to guess properties such as title and author from the filename of a song. Enabling it may increase the probability of finding lyrics." ), QString::null, "Lyrics::usage_info" ); + active = true; + } +} + +void Lyrics::openURLRequest( const KURL &url, const KParts::URLArgs & ) +{ + go(url); +} + +Lyrics::~Lyrics() +{ + /* Save configurations */ + KConfig *config = KGlobal::config(); + config->setGroup("Lyrics"); + config->writeEntry("follow", follow_act->isChecked()); + // Force saving, as closeEvent is probably never called + saveMainWindowSettings(config, "Lyrics"); + napp->pluginMenuRemove(menuID); +} + +bool Lyrics::queryClose() +{ + if( kapp->sessionSaving()) + return true; + hide(); + htmlpart->closeURL(); + htmlpart->begin(); + htmlpart->end(); + active = false; + return false; +} + +#include "lyrics.moc" diff --git a/noatun-plugins/lyrics/lyrics.h b/noatun-plugins/lyrics/lyrics.h new file mode 100644 index 0000000..9454604 --- /dev/null +++ b/noatun-plugins/lyrics/lyrics.h @@ -0,0 +1,55 @@ +#ifndef LYRICS_H +#define LYRICS_H + +#include <noatun/plugin.h> +#include <noatun/player.h> +#include <noatun/app.h> +#include <kmainwindow.h> +#include <qvaluevector.h> +#include <khtml_part.h> +#include <kaction.h> +#include "cmodule.h" + +class HistoryManager; + +class Lyrics : public KMainWindow, public Plugin { +Q_OBJECT + +public: + Lyrics(); + ~Lyrics(); + void go(const KURL &); + void setProviders( QValueVector<SearchProvider> &sites ); + +public slots: + void viewLyrics(int index = -1); + void back(); + void forward(); + +protected: + bool queryClose(); + +protected slots: + void changeUI(int, bool); + void openURLRequest( const KURL &, const KParts::URLArgs & ); + void loadingURL(KIO::Job *); + void loadedURL(); + void attach(bool); + void newSong(); + void goTo(); + +private: + int menuID; + KAction *back_act, *forward_act; + KToggleAction *follow_act; + KToggleAction *attach_act; + KSelectAction *site_act; + KHTMLPart *htmlpart; + QValueVector<SearchProvider> mSites; + HistoryManager *history; + bool active; + +}; + + +#endif diff --git a/noatun-plugins/lyrics/lyrics.plugin b/noatun-plugins/lyrics/lyrics.plugin new file mode 100644 index 0000000..cc9b3ad --- /dev/null +++ b/noatun-plugins/lyrics/lyrics.plugin @@ -0,0 +1,117 @@ +Filename=noatunlyrics.la +Author=Ismael Orenstein +Site=http://noatun.derkarl.org/ +Email=perdig@linuxbr.com.br +Type=other +License=BSD +Name=Lyrics +Name[af]=Lirieke +Name[ar]=الكلمات +Name[az]=Mahnı Sözləri +Name[bg]=Текстове +Name[bs]=Tekstovi +Name[cs]=Text skladby +Name[cy]=Geiriau cân +Name[da]=Sangtekst +Name[de]=Liedtext +Name[el]=Στίχοι +Name[eo]=Kantoteksto +Name[es]=Letras +Name[et]=Laulusõnad +Name[fa]=آهنگ +Name[fi]=Sanat +Name[fr]=Paroles +Name[fy]=Liettekst +Name[gl]=Letras +Name[he]=מילים +Name[hi]=लिरिक्स +Name[hr]=Tekstovi pjesama +Name[it]=Testi +Name[ka]=სიმღერის ტექსტები +Name[km]=អត្ថបទចម្រៀង +Name[lt]=Lyrika +Name[mk]=Стихови +Name[nb]=Tekst +Name[nds]=Leedtexten +Name[ne]=रचना +Name[nl]=Liedtekst +Name[nn]=Tekst +Name[pa]=ਬੋਲ +Name[pl]=Słowa piosenek +Name[pt]=Letras +Name[ro]=Versuri +Name[ru]=Текст песни +Name[sk]=Texty +Name[sl]=Besedila pesmi +Name[sr]=Текст песме +Name[sr@Latn]=Tekst pesme +Name[sv]=Sångtext +Name[ta]= பாடல்வரிகள் +Name[tg]=Матни сурудҳо +Name[tr]=Şarkı Sözleri +Name[uk]=Текст пісні +Name[uz]=Qoʻshiqning soʻzlari +Name[uz@cyrillic]=Қўшиқнинг сўзлари +Name[vi]=Lời nhạc +Name[xh]=Amazwi +Name[zh_CN]=歌词 +Comment=Display the lyrics for the current song +Comment[af]=Vertoon die lirieke vir die huidige liedjie +Comment[ar]=يعرض كلمات الأغنية الحالية +Comment[az]=Hazırkı mahnının sözlərini göstər +Comment[bg]=Показване текста на текущата песента (лириката) +Comment[bs]=Prikazuje tekst trenutne pjesme +Comment[ca]=Mostra la lletra de la cançó actual +Comment[cs]=Zobrazuje slova k současné skladbě +Comment[cy]=Arddangos y geiriau am y gân gyfredol +Comment[da]=Vis sangteksten for den aktuelle sang +Comment[de]=Zeigt den Liedtext für das aktuelle Stück +Comment[el]=Εμφανίζει τους στίχους για το τρέχον τραγούδι +Comment[eo]=Montras la tekston de la nuna kantaĵo +Comment[es]=Muestra las letras para la canción actual +Comment[et]=Näitab aktiivse laulu sõnu +Comment[eu]=Uneko kantaren letra bistaratzen du +Comment[fa]=نمایش آهنگ برای ترانۀ جاری +Comment[fi]=Näyttää kappaleen sanat +Comment[fr]=Afficheur des paroles de la chanson en cours +Comment[fy]=Toant de teksten fan it besteande nûmer +Comment[ga]=Taispeáin liricí an amhráin reatha +Comment[gl]=Mostra as letras da peza actual +Comment[he]=הצגת מילות השיר הנוכחי +Comment[hi]=मौज़ूदा गीत का काव्य दिखाता है +Comment[hr]=Prikazivanje teksta trenutne pjesme +Comment[hu]=Megjeleníti az aktuális szám szövegét +Comment[is]=Sýnir texta lagsins +Comment[it]=Mostra il testo della canzone corrente +Comment[ja]=現在の曲の歌詞を表示 +Comment[ka]=მიმდინარე სიმღერის ტექსტს აჩვენებს +Comment[kk]=Орындалып жатқан әннің сөздерін көрсету +Comment[km]=បង្ហាញអត្ថបទចម្រៀងសម្រាប់បទចម្រៀងបច្ចុប្បន្ន +Comment[lt]=Rodo esamos dainos lyriką +Comment[mk]=Ги прикажува стиховите на тековната песна +Comment[ms]=Memaparkan lirik lagu semasa +Comment[nb]=Vis teksten til den gjeldende sangen +Comment[nds]=Wiest den Text vun dat aktuelle Leed +Comment[ne]=हालको गीतका लागि रचना प्रदर्शन गर्नुहोस् +Comment[nl]=Toont de teksten van het huidige nummer +Comment[nn]=Visar teksten til den gjeldande songen +Comment[pl]=Wyświetla słowa do aktualnej piosenki +Comment[pt]=Mostra as letras da música actual +Comment[pt_BR]=Exibe a letra da música para a canção atual +Comment[ro]=Afişează versurile pentru cîntecul curent +Comment[ru]=Показ текста песни произведения при его проигрывании +Comment[sk]=Zobrazí text aktuálnej skladby +Comment[sl]=Prikaže besedilo trenutne pesmi +Comment[sr]=Приказује текст за текућу песму +Comment[sr@Latn]=Prikazuje tekst za tekuću pesmu +Comment[sv]=Visar texten för den aktuella sången +Comment[ta]=இப்போதைய பாடலின் வரிகளை காட்டு +Comment[tg]=Нишон додани матни суруд дар вақти ба кор андохтани ӯ +Comment[tr]=Geçerli şarkı için sözleri gösterir +Comment[uk]=Відображення тексту поточної пісні +Comment[uz]=Joriy qoʻshiqning soʻzlarini koʻrsatish +Comment[uz@cyrillic]=Жорий қўшиқнинг сўзларини кўрсатиш +Comment[vi]=Hiển thị lời bài hát hiện thời +Comment[xh]=Bonisa amazwi engoma ekhoyo +Comment[zh_CN]=显示当前歌曲的歌词 +Comment[zh_TW]=顯示目前歌曲的歌詞 diff --git a/noatun-plugins/lyrics/lyricsui.rc b/noatun-plugins/lyrics/lyricsui.rc new file mode 100644 index 0000000..09b72e3 --- /dev/null +++ b/noatun-plugins/lyrics/lyricsui.rc @@ -0,0 +1,24 @@ +<!DOCTYPE kpartgui> +<kpartgui name="noatunlyrics"> +<MenuBar> + <Menu name="go_web"> + <Action name="go_web_goTo"/> + </Menu> + <Menu name="settings"> + <Action name="follow"/> + <Action name="attach_url"/> + <Action name="search_provider"/> + </Menu> +</MenuBar> +<ToolBar name="mainToolBar"> + <Action name="go_back"/> + <Action name="go_forward"/> + <Action name="view_redisplay"/> + <Separator/> + <Action name="follow"/> + <Separator/> + <Action name="attach_url"/> + <Action name="search_label"/> + <Action name="search_provider"/> +</ToolBar> +</kpartgui> diff --git a/noatun-plugins/nexscope/Makefile.am b/noatun-plugins/nexscope/Makefile.am new file mode 100644 index 0000000..d182ff1 --- /dev/null +++ b/noatun-plugins/nexscope/Makefile.am @@ -0,0 +1,22 @@ +INCLUDES= $(all_includes) $(SDL_CFLAGS) + +METASOURCES = AUTO + +kde_module_LTLIBRARIES = noatunnexscope.la + +noatunnexscope_la_SOURCES = noatunplugin.cpp +noatunnexscope_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunnexscope_la_LIBADD = $(LIB_KFILE) -lnoatun + +bin_PROGRAMS = nexscope.bin + +#renderers.cpp must be first for enable-final +nexscope_bin_SOURCES = renderers.cpp bitmappool.cpp nex.cpp output.cpp input.cpp gui.cpp regionwidget.cpp convolve.c +nexscope_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(SDL_LIBS) +nexscope_bin_LDADD = $(LIB_KDEUI) -lm -lnoatun $(SDL_LIBS) + +noatun_DATA = nexscope.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/nexscope.pot diff --git a/noatun-plugins/nexscope/bitmappool.cpp b/noatun-plugins/nexscope/bitmappool.cpp new file mode 100644 index 0000000..0a0ad78 --- /dev/null +++ b/noatun-plugins/nexscope/bitmappool.cpp @@ -0,0 +1,54 @@ +#include "nex.h" + +struct BitmapPool::PoolItem +{ + PoolItem() : used(false) {} + + bool used; + Bitmap bitmap; +}; + +BitmapPool::BitmapPool() +{ + +} + +BitmapPool::~BitmapPool() +{ + +} + +Bitmap *BitmapPool::get(bool clear) +{ + mMutex.lock(); + BitmapPool::PoolItem *p=0; + for (QPtrListIterator<BitmapPool::PoolItem> i(mBitmaps); i.current(); ++i) + { + if (!(*i)->used) + p=*i; + } + if (!p) + { + p=new BitmapPool::PoolItem; + p->bitmap.resize(width, height); + } + + p->used=true; + + if (clear) p->bitmap.clear(); + + mMutex.unlock(); + return &(p->bitmap); +} + +void BitmapPool::release(Bitmap *bitmap) +{ + mMutex.lock(); + for (QPtrListIterator<BitmapPool::PoolItem> i(mBitmaps); i.current(); ++i) + { + if (&((*i)->bitmap)==bitmap) + (*i)->used=false; + } + mMutex.unlock(); +} + diff --git a/noatun-plugins/nexscope/convolve.c b/noatun-plugins/nexscope/convolve.c new file mode 100644 index 0000000..03509eb --- /dev/null +++ b/noatun-plugins/nexscope/convolve.c @@ -0,0 +1,297 @@ +/* Karatsuba convolution + * + * Copyright (C) 1999 Ralph Loader <suckfish@ihug.co.nz> + * + * 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. */ + +/* The algorithm is based on the following. For the convolution of a pair + * of pairs, (a,b) * (c,d) = (0, a.c, a.d+b.c, b.d), we can reduce the four + * multiplications to three, by the formulae a.d+b.c = (a+b).(c+d) - a.c - + * b.d. A similar relation enables us to compute a 2n by 2n convolution + * using 3 n by n convolutions, and thus a 2^n by 2^n convolution using 3^n + * multiplications (as opposed to the 4^n that the quadratic algorithm + * takes. */ + +/* For large n, this is slower than the O(n log n) that the FFT method + * takes, but we avoid using complex numbers, and we only have to compute + * one convolution, as opposed to 3 FFTs. We have good locality-of- + * reference as well, which will help on CPUs with tiny caches. */ + +/* E.g., for a 512 x 512 convolution, the FFT method takes 55 * 512 = 28160 + * (real) multiplications, as opposed to 3^9 = 19683 for the Karatsuba + * algorithm. We actually want 257 outputs of a 256 x 512 convolution; + * that doesn't appear to give an easy advantage for the FFT algorithm, but + * for the Karatsuba algorithm, it's easy to use two 256 x 256 + * convolutions, taking 2 x 3^8 = 12312 multiplications. [This difference + * is that the FFT method "wraps" the arrays, doing a 2^n x 2^n -> 2^n, + * while the Karatsuba algorithm pads with zeros, doing 2^n x 2^n -> 2.2^n + * - 1]. */ + +/* There's a big lie above, actually... for a 4x4 convolution, it's quicker + * to do it using 16 multiplications than the more complex Karatsuba + * algorithm... So the recursion bottoms out at 4x4s. This increases the + * number of multiplications by a factor of 16/9, but reduces the overheads + * dramatically. */ + +/* The convolution algorithm is implemented as a stack machine. We have a + * stack of commands, each in one of the forms "do a 2^n x 2^n + * convolution", or "combine these three length 2^n outputs into one + * 2^{n+1} output." */ + +#include <stdlib.h> +#include "convolve.h" + +/* + * Initialisation routine - sets up tables and space to work in. + * Returns a pointer to internal state, to be used when performing calls. + * On error, returns NULL. + * The pointer should be freed when it is finished with, by convolve_close(). + */ +convolve_state *convolve_init(void) +{ + return (convolve_state *) malloc (sizeof(convolve_state)); +} + +/* + * Free the state allocated with convolve_init(). + */ +void convolve_close(convolve_state *state) +{ + if (state) + free(state); +} + +static void convolve_4 (double * out, const double * left, const double * right) +/* This does a 4x4 -> 7 convolution. For what it's worth, the slightly odd + * ordering gives about a 1% speed up on my Pentium II. */ +{ + double l0, l1, l2, l3, r0, r1, r2, r3; + double a; + l0 = left[0]; + r0 = right[0]; + a = l0 * r0; + l1 = left[1]; + r1 = right[1]; + out[0] = a; + a = (l0 * r1) + (l1 * r0); + l2 = left[2]; + r2 = right[2]; + out[1] = a; + a = (l0 * r2) + (l1 * r1) + (l2 * r0); + l3 = left[3]; + r3 = right[3]; + out[2] = a; + + out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0); + out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1); + out[5] = (l2 * r3) + (l3 * r2); + out[6] = l3 * r3; +} + +static void convolve_run (stack_entry * top, unsigned size, double * scratch) +/* Interpret a stack of commands. The stack starts with two entries; the + * convolution to do, and an illegal entry used to mark the stack top. The + * size is the number of entries in each input, and must be a power of 2, + * and at least 8. It is OK to have out equal to left and/or right. + * scratch must have length 3*size. The number of stack entries needed is + * 3n-4 where size=2^n. */ +{ + do { + const double * left; + const double * right; + double * out; + + /* When we get here, the stack top is always a convolve, + * with size > 4. So we will split it. We repeatedly split + * the top entry until we get to size = 4. */ + + left = top->v.left; + right = top->v.right; + out = top->v.out; + top++; + + do { + double * s_left, * s_right; + int i; + + /* Halve the size. */ + size >>= 1; + + /* Allocate the scratch areas. */ + s_left = scratch + size * 3; + /* s_right is a length 2*size buffer also used for + * intermediate output. */ + s_right = scratch + size * 4; + + /* Create the intermediate factors. */ + for (i = 0; i < size; i++) { + double l = left[i] + left[i + size]; + double r = right[i] + right[i + size]; + s_left[i + size] = r; + s_left[i] = l; + } + + /* Push the combine entry onto the stack. */ + top -= 3; + top[2].b.main = out; + top[2].b.null = NULL; + + /* Push the low entry onto the stack. This must be + * the last of the three sub-convolutions, because + * it may overwrite the arguments. */ + top[1].v.left = left; + top[1].v.right = right; + top[1].v.out = out; + + /* Push the mid entry onto the stack. */ + top[0].v.left = s_left; + top[0].v.right = s_right; + top[0].v.out = s_right; + + /* Leave the high entry in variables. */ + left += size; + right += size; + out += size * 2; + + } while (size > 4); + + /* When we get here, the stack top is a group of 3 + * convolves, with size = 4, followed by some combines. */ + convolve_4 (out, left, right); + convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right); + convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right); + top += 2; + + /* Now process combines. */ + do { + /* b.main is the output buffer, mid is the middle + * part which needs to be adjusted in place, and + * then folded back into the output. We do this in + * a slightly strange way, so as to avoid having + * two loops. */ + double * out = top->b.main; + double * mid = scratch + size * 4; + unsigned int i; + top++; + out[size * 2 - 1] = 0; + for (i = 0; i < size-1; i++) { + double lo; + double hi; + lo = mid[0] - (out[0] + out[2 * size]) + out[size]; + hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size]; + out[size] = lo; + out[2 * size] = hi; + out++; + mid++; + } + size <<= 1; + } while (top->b.null == NULL); + } while (top->b.main != NULL); +} + +int convolve_match (float * lastchoice, + float * input, + convolve_state * state) +/* lastchoice is a 256 sized array. input is a 512 array. We find the + * contiguous length 256 sub-array of input that best matches lastchoice. + * A measure of how good a sub-array is compared with the lastchoice is + * given by the sum of the products of each pair of entries. We maximise + * that, by taking an appropriate convolution, and then finding the maximum + * entry in the convolutions. state is a (non-NULL) pointer returned by + * convolve_init. */ +{ + double avg; + double best; + int p; + int i; + double * left = state->left; + double * right = state->right; + double * scratch = state->scratch; + stack_entry * top = state->stack + STACK_SIZE - 1; + + for (i=0; i<512; i++) + left[i]=input[i]; + + avg = 0; + for (i = 0; i < 256; i++) + { + double a = lastchoice[255 - i]; + right[i] = a; + avg += a; + } + + /* We adjust the smaller of the two input arrays to have average + * value 0. This makes the eventual result insensitive to both + * constant offsets and positive multipliers of the inputs. */ + avg /= 256; + for (i = 0; i < 256; i++) + right[i] -= avg; + + /* End-of-stack marker. */ + top[1].b.null = scratch; + top[1].b.main = NULL; + + /* The low 256x256, of which we want the high 256 outputs. */ + top->v.left = left; + top->v.right = right; + top->v.out = right + 256; + convolve_run (top, 256, scratch); + + /* The high 256x256, of which we want the low 256 outputs. */ + top->v.left = left + 256; + top->v.right = right; + top->v.out = right; + convolve_run (top, 256, scratch); + + /* Now find the best position amoungs this. Apart from the first + * and last, the required convolution outputs are formed by adding + * outputs from the two convolutions above. */ + best = right[511]; + right[767] = 0; + p = -1; + for (i = 0; i < 256; i++) { + double a = right[i] + right[i + 512]; + if (a > best) { + best = a; + p = i; + } + } + p++; + +#if 0 + { + /* This is some debugging code... */ + int bad = 0; + best = 0; + for (i = 0; i < 256; i++) + best += ((double) input[i+p]) * ((double) lastchoice[i] - avg); + + for (i = 0; i < 257; i++) { + double tot = 0; + unsigned int j; + for (j = 0; j < 256; j++) + tot += ((double) input[i+j]) * ((double) lastchoice[j] - avg); + if (tot > best) + printf ("(%i)", i); + if (tot != left[i + 255]) + printf ("!"); + } + + printf ("%i\n", p); + } +#endif + + return p; +} diff --git a/noatun-plugins/nexscope/convolve.h b/noatun-plugins/nexscope/convolve.h new file mode 100644 index 0000000..4940c62 --- /dev/null +++ b/noatun-plugins/nexscope/convolve.h @@ -0,0 +1,61 @@ +/* convolve.h: Header for convolutions. + * + * Copyright (C) 1999 Ralph Loader <suckfish@ihug.co.nz> + * + * 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. + */ + +#ifndef CONVOLVE_H +#define CONVOLVE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* convolve_match takes two blocks, one twice the size of the other. The + * sizes of these are CONVOLVE_BIG and CONVOLVE_SMALL respectively. */ +#define CONVOLVE_DEPTH 8 +#define CONVOLVE_SMALL (1 << CONVOLVE_DEPTH) +#define CONVOLVE_BIG (CONVOLVE_SMALL * 2) + +typedef union stack_entry_s +{ + struct {const double * left, * right; double * out;} v; + struct {double * main, * null;} b; + +} stack_entry; + +#define STACK_SIZE (CONVOLVE_DEPTH * 3) + +typedef struct convolve_state { + double left [CONVOLVE_BIG]; + double right [CONVOLVE_SMALL * 3]; + double scratch [CONVOLVE_SMALL * 3]; + stack_entry stack[STACK_SIZE]; +} convolve_state; + + +convolve_state *convolve_init (void); +void convolve_close (convolve_state * state); + +int convolve_match (float * lastchoice, + float * input, + convolve_state * state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/noatun-plugins/nexscope/gui.cpp b/noatun-plugins/nexscope/gui.cpp new file mode 100644 index 0000000..912d8ea --- /dev/null +++ b/noatun-plugins/nexscope/gui.cpp @@ -0,0 +1,197 @@ +#include <klocale.h> +#include <qheader.h> +#include <qlayout.h> +#include <qdragobject.h> +#include <kfiledialog.h> +#include <kstdaction.h> +#include <kaction.h> + +#include "gui.h" +#include "renderers.h" +#include "nex.h" + +class CreatorItem : public QListViewItem +{ +public: + CreatorItem(QListView *parent, const QString &title) + : QListViewItem(parent, title) + {} +}; + +class TreeItem : public QListViewItem +{ +public: + TreeItem(TreeItem *parent, TreeItem *after, CreatorItem *creator) + : QListViewItem(parent, after, creator->text(0)) + { + RendererList *list; + if (parent) + list=static_cast<RendererList*>(parent->mRenderer); + else + list=nex->rendererList(); + + Renderer *afterRenderer=0; + if (after) + afterRenderer=after->mRenderer; + + list->lock(); + int pos=list->renderers().findRef(afterRenderer); + if (pos==-1) pos=list->renderers().count(); + + list->renderers().insert((uint)pos, mRenderer=nex->renderer(creator->text(0))); + list->unlock(); + } + + TreeItem(QListView *parent, TreeItem *after, const QString &title) + : QListViewItem(parent, after, title) + { + mRenderer=nex->rendererList(); + setExpandable(true); + } + + ~TreeItem() + { + RendererList *list; + if (parent()) + list=static_cast<RendererList*>(static_cast<TreeItem*>(parent())->mRenderer); + else + return; + + list->lock(); + list->renderers().removeRef(mRenderer); + list->unlock(); + delete mRenderer; + } + + Renderer *renderer() { return mRenderer; } +private: + Renderer *mRenderer; +}; + +Control::Control() : mConfigurator(0) +{ + { + KToolBar *tools=toolBar(); + KStdAction::save(this, SLOT(save()), actionCollection())->plug(tools); + KStdAction::saveAs(this, SLOT(saveAs()), actionCollection())->plug(tools); + KStdAction::open(this, SLOT(open()), actionCollection())->plug(tools); + + } + + setCaption(i18n("Nex Configuration")); + QSplitter *mainSplitter=new QSplitter(this); + setCentralWidget(mainSplitter); + QSplitter *left=new QSplitter(Qt::Vertical, mainSplitter); + { + mTree=new RendererListView(left); + mTree->setItemsMovable(true); + mTree->setSorting(-1); + mTree->setRootIsDecorated(true); + + connect(mTree, SIGNAL(dropped(QDropEvent*, QListViewItem*, QListViewItem*)), + SLOT(dropEvent(QDropEvent*, QListViewItem*, QListViewItem*))); + + connect(mTree, SIGNAL(currentChanged(QListViewItem*)), + SLOT(currentChanged(QListViewItem*))); + + mCreatorsList=new RendererListView(left); + mCreatorsList->addColumn(i18n("Name")); + mCreatorsList->header()->hide(); + mCreatorsList->setDropVisualizer(false); + } + + mRight=new QWidget(mainSplitter); + (new QHBoxLayout(mRight))->setAutoAdd(true); + + QStringList list=nex->renderers(); + for (QStringList::Iterator i=list.begin(); i!=list.end(); ++i) + addCreator(*i); + + new TreeItem(mTree, 0, i18n("Main")); +} + +void Control::save(const KURL &file) +{ +// TODO +} + +void Control::save() +{ + if (mCurrentURL.isEmpty()) + saveAs(); + else + save(mCurrentURL); +} + +void Control::saveAs() +{ + KURL url; + url=KFileDialog::getSaveURL(0, "application/x-nexscope", this); + if (!url.isEmpty()) + save(mCurrentURL=url); +} + +void Control::open() +{ + KURL url=KFileDialog::getOpenURL(0, "application/x-nexscope"); + if (!url.isEmpty()) + open(mCurrentURL=url); +} + +void Control::open(const KURL &file) +{ +// TODO +} + + +void Control::addCreator(const QString &title) +{ + new CreatorItem(mCreatorsList, title); +} + +void Control::dropEvent(QDropEvent *e, QListViewItem *parent, QListViewItem *pafter) +{ +// if ((e->source() == mCreatorsList) && parent) + { + CreatorItem *i=static_cast<CreatorItem*>(mCreatorsList->currentItem()); + if (!i) + { + std::cerr << "no creatoritem" << std::endl; + + } + new TreeItem(static_cast<TreeItem*>(parent), static_cast<TreeItem*>(pafter), i); + } +} + +void Control::currentChanged(QListViewItem *item) +{ + TreeItem *treeItem=static_cast<TreeItem*>(item); + delete mConfigurator; + mConfigurator=treeItem->renderer()->configure(mRight); + if (mConfigurator) + mConfigurator->show(); +} + + +RendererListView::RendererListView(QWidget *p) : KListView(p) +{ + addColumn(i18n("Name")); + header()->hide(); + setDragEnabled(true); + setAcceptDrops(true); + setSelectionMode(QListView::Single); +} + +bool RendererListView::acceptDrag(QDropEvent *event) const +{ + return true; //QCString(event->format()) == "application/x-nex-rendererdrag"; +} + +QDragObject *RendererListView::dragObject() const +{ + if (!currentItem()) return 0; + return new QStoredDrag("application/x-nex-rendererdrag", (QWidget*)this); +} + + +#include "gui.moc" diff --git a/noatun-plugins/nexscope/gui.h b/noatun-plugins/nexscope/gui.h new file mode 100644 index 0000000..84fd2bf --- /dev/null +++ b/noatun-plugins/nexscope/gui.h @@ -0,0 +1,54 @@ +#ifndef GUI_H +#define GUI_H + +#include <kmainwindow.h> +#include <klistview.h> +#include <qsplitter.h> +#include <qdict.h> +#include <dcopobject.h> +#include <kurl.h> + +class Renderer; + +class Control : public KMainWindow +{ +Q_OBJECT + +public: + Control(); + + void addCreator(const QString &title); + +public slots: + void save(const KURL &file); + void save(); + void saveAs(); + + void open(); + void open(const KURL &file); + +protected slots: + void dropEvent(QDropEvent *e, QListViewItem *parent, QListViewItem *pafter); + void currentChanged(QListViewItem *item); + +private: + QWidget *mRight; + KListView *mTree, *mCreatorsList; + QWidget *mConfigurator; + + KURL mCurrentURL; +}; + +class RendererListView : public KListView +{ +Q_OBJECT +public: + RendererListView(QWidget *p); + +protected: + virtual bool acceptDrag(QDropEvent *event) const; + virtual QDragObject *dragObject() const; +}; + + +#endif diff --git a/noatun-plugins/nexscope/input.cpp b/noatun-plugins/nexscope/input.cpp new file mode 100644 index 0000000..4c787e7 --- /dev/null +++ b/noatun-plugins/nexscope/input.cpp @@ -0,0 +1,238 @@ + +#include "nex.h" +#include "convolve.h" + +#include <stdlib.h> +#include <unistd.h> +#include <math.h> +#include <noatun/plugin.h> + +Input::Input() +{ + memset(haystack, 0, sizeof(float)*512); + state=new convolve_state; + + float d, *costab, *sintab; + long ul, ndiv2 = 512 / 2; + + for (costab = fhtTab, sintab = fhtTab + 512 / 2 + 1, ul = 0; ul < 512; ul++) + { + d = PI * ul / ndiv2; + *costab = *sintab = ::cos(d); + + costab += 2, sintab += 2; + if (sintab > fhtTab + 512 * 2) + sintab = fhtTab + 1; + } + + notifier=0; + mScope=0; + + connect(); +} + +Input::~Input() +{ + delete mScope; + std::cerr<< "Scope gone"<< std::endl; + delete notifier; +// delete [] audio[2]; +// delete [] audio[3]; +// delete [] audio[4]; +// delete [] audio[5]; +} + +void Input::setConvolve(bool on) +{ + mConvolve=on; +} + +void Input::connect() +{ + do + { + delete notifier; + delete mScope; + ok=true; + mScope=new StereoScope(10, Visualization::noatunPid()); + mScope->setSamples(samples>(512+256) ? samples : samples+256); + + notifier=new QObject; + new BoolNotifier(&ok, new ExitNotifier(Visualization::noatunPid(), notifier), notifier); + } while (!mScope->connected()); +} + +// [0] pcm left +// [1] pcm right +// [2] pcm center +// [3] FFT (FHT) left +// [4] FFT right +// [5] FFT center + +void Input::getAudio(float **audio) +{ + static bool first=true; + if (first) + { + audio[2]=new float[samples]; + audio[3]=new float[fhtsamples]; + audio[4]=new float[fhtsamples]; + audio[5]=new float[fhtsamples]; + first=false; + } + + if (!ok || !mScope->connected()) + { + std::cerr << "reconnect" <<std::endl; + connect(); + return; +// delete mScope; +// ::sleep(7); +// mScope=new StereoScope(10, Visualization::noatunPid()); +// mScope->setSamples(samples); + } + std::vector<float> *left, *right; + mScope->scopeData(left, right); + + register float *inleft=&*left->begin(); + register float *inright=&*right->begin(); + + + int offset=0; + if (mConvolve) + { // find the offset + for (register int i=0; i<512+256; ++i) + temp[i]=inleft[i]+inright[i]; + offset=::convolve_match(haystack, temp, state); + if (offset==-1) offset=0; + inleft+=offset; + inright+=offset; + + for (register int i=0; i<512; ++i) + { + haystack[i]*=.5; + haystack[i]+=temp[i+offset]; + } + } + + memcpy(outleft, inleft, samples*sizeof(float)); + memcpy(outright, inright, samples*sizeof(float)); + + audio[0]=outleft; + audio[1]=outright; + + // center channel + for (int i=0; i<samples; ++i) + audio[2][i]=(audio[0][i]+audio[1][i])*.5; + + // perform the FFT (FHT in this case) + memcpy(audio[3], audio[0], fhtsamples); + memcpy(audio[4], audio[1], fhtsamples); + + fht(audio[3]); + fht(audio[4]); + + for (int i=0; i<fhtsamples; ++i) + { + audio[5][i]=(audio[3][i]+audio[4][i])*.5; + } + + + delete left; + delete right; +} + +void Input::fht(float *p) +{ + long i; + float *q; + transform(p, fhtsamples, 0); + + *p = (*p * *p), *p += *p, p++; + + for (i = 1, q = p + fhtsamples - 2; i < (fhtsamples / 2); i++, --q) + *p++ = (*p * *p) + (*q * *q); + + for (long i = 0; i < (fhtsamples / 2); i++) + *p++ *= .5; +} + +void Input::transform(float *p, long n, long k) +{ + if (n == 8) + { + transform8(p + k); + return; + } + + long i, j, ndiv2 = n / 2; + float a, *t1, *t2, *t3, *t4, *ptab, *pp; + + for (i = 0, t1 = fhtBuf, t2 = fhtBuf + ndiv2, pp = &p[k]; i < ndiv2; i++) + *t1++ = *pp++, *t2++ = *pp++; + + memcpy(p + k, fhtBuf, sizeof(float) * n); + + transform(p, ndiv2, k); + transform(p, ndiv2, k + ndiv2); + + j = 512 / ndiv2 - 1; + t1 = fhtBuf; + t2 = t1 + ndiv2; + t3 = p + k + ndiv2; + ptab = fhtTab; + pp = p + k; + + a = *ptab++ * *t3++; + a += *ptab * *pp; + ptab += j; + + *t1++ = *pp + a; + *t2++ = *pp++ - a; + + for (i = 1, t4 = p + k + n; i < ndiv2; i++, ptab += j) + { + a = *ptab++ * *t3++; + a += *ptab * *--t4; + + *t1++ = *pp + a; + *t2++ = *pp++ - a; + } + + memcpy(p + k, fhtBuf, sizeof(float) * n); + +} + +void Input::transform8(float *p) +{ + float a, b, c, d, e, f, g, h, + b_f2, d_h2, sqrt2 = M_SQRT2, + a_c_eg, a_ce_g, ac_e_g, aceg, + b_df_h, bdfh; + + a = *p++, b = *p++, c = *p++, d = *p++; + e = *p++, f = *p++, g = *p++, h = *p; + b_f2 = (b - f) * sqrt2; + d_h2 = (d - h) * sqrt2; + + a_c_eg = a - c - e + g; + a_ce_g = a - c + e - g; + ac_e_g = a + c - e - g; + aceg = a + c + e + g; + + b_df_h = b - d + f - h; + bdfh = b + d + f + h; + + *p = a_c_eg - d_h2; + *--p = a_ce_g - b_df_h; + *--p = ac_e_g - b_f2; + *--p = aceg - bdfh; + *--p = a_c_eg + d_h2; + *--p = a_ce_g + b_df_h; + *--p = ac_e_g + b_f2; + *--p = aceg + bdfh; +} + + + + diff --git a/noatun-plugins/nexscope/nex.cpp b/noatun-plugins/nexscope/nex.cpp new file mode 100644 index 0000000..af19409 --- /dev/null +++ b/noatun-plugins/nexscope/nex.cpp @@ -0,0 +1,597 @@ +#include "nex.h" +#include "gui.h" + +#include <unistd.h> + +#include <kapplication.h> +#include <kaboutdata.h> +#include <kcmdlineargs.h> +#include <klocale.h> + +#include <qlayout.h> +#include <qlabel.h> +#include <qcheckbox.h> +#include <qmultilineedit.h> + +#include "renderers.h" + +Mutex runLock; +Nex *Nex::sNex=0; +QTime timer; + +Renderer::Renderer() {} +Renderer::~Renderer() {} + +Thread::Thread() : mThread(0) +{ + +} + +Thread::~Thread() +{ + if (mThread) + kill(); +} + +void Thread::start() +{ + mThread=SDL_CreateThread(&threadRun, (void*)this); +} + +void Thread::kill() +{ + SDL_KillThread(mThread); +} + +int Thread::wait() +{ + int val; + SDL_WaitThread(mThread, &val); + return val; +} + +int Thread::threadRun(void *v) +{ + Thread *t=(Thread*)v; + return t->run(); +} + +NexCheckBox::NexCheckBox(QWidget *parent, + const QString &name, bool *v) + : QCheckBox(name, parent) +{ + value=v; + setChecked(*v); + connect(this, SIGNAL(toggled(bool)), SLOT(change(bool))); +} +void NexCheckBox::change(bool b) +{ + *value=b; +} + + + +NexColorButton::NexColorButton(QWidget *parent, Pixel *color) + : KColorButton(parent) +{ + c=color; + QColor temp( (*c >> 16) & 0xFF, (*c >> 8) & 0xFF, *c & 0xFF); + setColor(temp); + connect(this, SIGNAL(changed(const QColor&)), SLOT(change(const QColor&))); +} + +void NexColorButton::change(const QColor &co) +{ + *c= COLOR(qRed(co.rgb()), qGreen(co.rgb()), qBlue(co.rgb())); +} + +void Bitmap::resize(int w, int h) +{ + delete [] mData; + mData=new Pixel[w*h]; +} + +void Bitmap::clear() +{ + memset(mData, 0, bytes()); +} + +void Bitmap::drawCircle(int x, int y, int r, Pixel color) +{ + int16_t cx = 0; + int16_t cy = r; + int16_t ocx = -1; + int16_t ocy = -1; + int16_t df = 1 - r; + int16_t d_e = 3; + int16_t d_se = -2 * r + 5; + int16_t xpcx, xmcx, xpcy, xmcy; + int16_t ypcy, ymcy, ypcx, ymcx; + + do + { // Draw + if ((ocy!=cy) || (ocx!=cx)) + { + xpcx=x+cx; + xmcx=x-cx; + if (cy>0) + { + ypcy=y+cy; + ymcy=y-cy; + setPixel(xmcx,ypcy,color); + setPixel(xpcx,ypcy,color); + setPixel(xmcx,ymcy,color); + setPixel(xpcx,ymcy,color); + } + else + { + setPixel(xmcx,y,color); + setPixel(xpcx,y,color); + } + + ocy=cy; + xpcy=x+cy; + xmcy=x-cy; + if (cx>0) + { + ypcx=y+cx; + ymcx=y-cx; + setPixel(xmcy,ypcx,color); + setPixel(xpcy,ypcx,color); + setPixel(xmcy,ymcx,color); + setPixel(xpcy,ymcx,color); + } + else + { + setPixel(xmcy,y,color); + setPixel(xpcy,y,color); + } + ocx=cx; + } + // Update + if (df < 0) + { + df += d_e; + d_e += 2; + d_se += 2; + } + else + { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while(cx <= cy); +} + + +void Bitmap::fillCircle(int x, int y, int r, Pixel color) +{ + int16_t cx = 0; + int16_t cy = r; + int16_t ocx = -1; + int16_t ocy = -1; + int16_t df = 1 - r; + int16_t d_e = 3; + int16_t d_se = -2 * r + 5; + int16_t xpcx, xmcx, xpcy, xmcy; + int16_t ypcy, ymcy, ypcx, ymcx; + + do + { // Draw + if ((ocy!=cy) || (ocx!=cx)) + { + xpcx=x+cx; + xmcx=x-cx; + if (cy>0) + { + ypcy=y+cy; + ymcy=y-cy; + setPixel(xmcx,ypcy,color); + setPixel(xpcx,ypcy,color); + setPixel(xmcx,ymcy,color); + setPixel(xpcx,ymcy,color); + for (int h=xmcx; h<xpcx; h++) + setPixel(h, ypcy, color); + + for (int h=xmcx; h<xpcx; h++) + setPixel(h, ymcy, color); + } + else + { + setPixel(xmcx,y,color); + setPixel(xpcx,y,color); + for (int h=xmcx; h<xpcx; h++) + setPixel(h, y, color); + } + + + ocy=cy; + xpcy=x+cy; + xmcy=x-cy; + if (cx>0) + { + ypcx=y+cx; + ymcx=y-cx; + setPixel(xmcy,ypcx,color); + setPixel(xpcy,ypcx,color); + setPixel(xmcy,ymcx,color); + setPixel(xpcy,ymcx,color); + for (int h=xmcy; h<xpcy; h++) + setPixel(h, ypcx, color); + + for (int h=xmcy; h<xpcy; h++) + setPixel(h, ymcx, color); + } + else + { + setPixel(xmcy,y,color); + setPixel(xpcy,y,color); + for (int h=xmcy; h<xpcy; h++) + setPixel(h, y, color); + } + ocx=cx; + } + // Update + if (df < 0) + { + df += d_e; + d_e += 2; + d_se += 2; + } + else + { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while(cx <= cy); +} + + +void Bitmap::drawLine(int x1, int y1, int x2, int y2, Pixel color) +{ + // Variable setup + int dx = x2 - x1; + int sx = (dx >= 0) ? 1 : -1; + dx = sx * dx + 1; + + int dy = y2 - y1; + int sy = (dy >= 0) ? 1 : -1; + dy = sy * dy + 1; + + + int pixx = sizeof(Pixel); + int pixy = width*sizeof(Pixel); + uint8_t *pixel = (uint8_t*)pixels() + pixx * x1 + pixy * y1; + pixx *= sx; + pixy *= sy; + + if (dx < dy) + { + int swaptmp = dx; + dx = dy; + dy = swaptmp; + swaptmp = pixx; + pixx = pixy; + pixy = swaptmp; + } + + + // Draw + int y=0; + + for(int x=0; x < dx; x++, pixel += pixx) + { + *(Pixel*)pixel=color; + y += dy; + if (y >= dx) + { + y -= dx; + pixel += pixy; + } + } + +} + +RendererList::RendererList() : mClearAfter(false) +{ + mFrame=nex->bitmapPool()->get(true); +} + +RendererList::~RendererList() +{ + nex->bitmapPool()->release(mFrame); +} + +Bitmap *RendererList::render(float *pcm[4], Bitmap *source) +{ + if (mClearAfter) mFrame->clear(); + + lock(); + for (QPtrListIterator<Renderer> i(mRendererList); i.current(); ++i) + { + Bitmap *newframe=(*i)->render(pcm, mFrame); + + if (newframe!=mFrame) + { + nex->bitmapPool()->release(mFrame); + mFrame=newframe; + } + } + + unlock(); + + // add source+=source; return source; + + uint8_t *d=(uint8_t*)source->pixels(); + uint8_t *end=(uint8_t*)((uint8_t*)d+source->bytes()); + uint8_t *s=(uint8_t*)mFrame->pixels(); + + while (d<end) + { + register int dest=*d; + if (dest && ((dest | *s) & 128)) + { + // there's danger of going past 0xFF + dest+=*s; + if (dest & 256) + *d=0xFF; // oops, we did! + else + *d=dest; + } + else + { + // if neither touch the 128th bit, then the sum + // can't possibly be more than 0xFF + *d=dest+*s; + } + + + ++s; + ++d; + } + + return source; +} + +void RendererList::save(QDomElement &e) +{ + lock(); + e.setTagName("List"); + + for (QPtrListIterator<Renderer> i(mRendererList); *i; ++i) + { + QDomElement item; + (*i)->save(item); + e.appendChild(item); + } + + unlock(); +} + +void RendererList::load(const QDomElement &e) +{ + lock(); + + for (QDomNode n=e.firstChild(); !n.isNull(); n=n.nextSibling()) + { + if (!n.isElement()) continue; + QDomElement child=n.toElement(); + + Renderer *r=0; + + if (e.tagName()=="List") + r=new RendererList; + else + r=nex->renderer(e.tagName()); + + if (!r) continue; + + r->load(child); + mRendererList.append(r); + } + + unlock(); +} + + + +QWidget *RendererList::configure(QWidget *parent) +{ + return new RendererListConfigurator(this, parent); +} + +RendererListConfigurator::RendererListConfigurator(RendererList *l, QWidget *parent) + : QWidget(parent), mList(l) +{ + (new QVBoxLayout(this))->setAutoAdd(true); + mErase=new QCheckBox(i18n("&Erase between frames"), this); + connect(mErase, SIGNAL(toggled(bool)), SLOT(eraseOn(bool))); + mErase->setChecked(mList->mClearAfter); + + if (nex->rendererList()==l) + { + QCheckBox *mConvolve=new QCheckBox(i18n("&Convolve audio"), this); + connect(mConvolve, SIGNAL(toggled(bool)), SLOT(convolve(bool))); + mConvolve->setChecked(nex->input()->convolve()); + } + + new QLabel(i18n("Comments"), this); + + mComments=new QMultiLineEdit(this); + mComments->setText(l->mComments); + mComments->setWordWrap(QMultiLineEdit::WidgetWidth); +} + +RendererListConfigurator::~RendererListConfigurator() +{ + mList->mComments=mComments->text(); +} + +void RendererListConfigurator::eraseOn(bool state) +{ + mList->mClearAfter=state; +} + +void RendererListConfigurator::convolve(bool state) +{ + nex->input()->setConvolve(state); +} + + + +#define INSERT(name, func) mCreators.insert(name, new CreatorSig*(&func)) + +Nex::Nex() +{ + sNex=this; + mBitmapPool=0; + mRendererList=0; + + setupSize(width, height); + + INSERT("Fade", Creators::fade); + INSERT("Doubler", Creators::doubler); + INSERT("Waveform", Creators::waveform); + INSERT("Hartley", Creators::hartley); +} +#undef INSERT + +void Nex::setupSize(int , int ) +{ + mInput=new Input; + delete mBitmapPool; + delete mRendererList; + mBitmapPool=new BitmapPool(); + mRendererList=new RendererList; +} + +Nex::~Nex() +{ + delete mRendererList; + delete mBitmapPool; +} + +#define NOTHREAD + +void Nex::go() +{ + runLock.unlock(); + float *audio[6]; + + Bitmap *frame; + frame=mBitmapPool->get(true); + + int frames=0; + QTime start(QTime::currentTime()); + + while (1) + { + mInput->getAudio(audio); + mRendererList->render(audio, frame); + int result=mOutput.display(frame); + + frames++; + + switch (result) + { + case OutputSDL::Exit: + std::cerr << "Trying" << std::endl; + delete mInput; + std::cerr << "Deleted" << std::endl; + + std::cout << "Frames per Second: " + << frames/start.secsTo(QTime::currentTime()) << std::endl; + return; + case OutputSDL::Resize: +// setupSize(width, height); + break; + } +#ifdef NOTHREAD + kapp->processEvents(); +#endif + frame->clear(); + } +} + + +Renderer *Nex::renderer(const QString &name) +{ + CreatorSig **sig=mCreators[name]; + if (sig) + return (**sig)(); + else + return 0; +} + +QStringList Nex::renderers() const +{ + QDictIterator<CreatorSig*> i(mCreators); + QStringList list; + + for (;i.current(); ++i) + list += i.currentKey(); + + return list; +} + + +#ifndef NOTHREAD +class VisThread : public Thread +{ +public: + virtual int run() + { + Nex::sNex->go(); + exit(0); + return 0; + } +}; +#endif + +int main(int argc, char **argv) +{ + Nex theNex; + Nex::sNex=&theNex; + +#ifndef NOTHREAD + runLock.lock(); + + VisThread vis; + vis.start(); + + runLock.lock(); +#endif + + KAboutData aboutData("nex", I18N_NOOP("Nex"), "0.0.1", + I18N_NOOP("The awesome customizable scope"), + KAboutData::License_LGPL, "(C) 2001 Charles Samuels", 0, + "http://noatun.kde.org"); + + aboutData.addAuthor("Charles Samuels", I18N_NOOP("Nex Author"), + "charles@kde.org"); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KApplication app; + + + (new Control)->show(); +#ifdef NOTHREAD + theNex.go(); + +#else + app.exec(); + + vis.wait(); +#endif + exit(0); //prevent segfault on exit, for some reason + return 0; +} + +#include "nex.moc" + diff --git a/noatun-plugins/nexscope/nex.h b/noatun-plugins/nexscope/nex.h new file mode 100644 index 0000000..05c7f81 --- /dev/null +++ b/noatun-plugins/nexscope/nex.h @@ -0,0 +1,352 @@ +#ifndef NEX_H +#define NEX_H + +#include <qwidget.h> +#include <qptrlist.h> +#include <stdint.h> +#include <vector> +#include <qdict.h> + +#include <qdatetime.h> +#include <iostream> + +#include <qdom.h> + +#include "SDL.h" +#include "SDL_thread.h" + +typedef uint32_t Pixel; +typedef uint8_t Byte; + +#define COLOR(r,g,b) ((r<<16) | (g<<8) | (b)) +#define COLORSTR(pixel) \ + QString("#%1%2%3").arg(QString::number((pixel>>16) & 8, 16)) \ + .arg(QString::number((pixel>>8) & 8, 16)).arg(QString::number(pixel& 8, 16)) + +#define STRCOLOR(pixel) \ + Pixel(((pixel.mid(1,2).toInt(0, 16)) <<16) \ + | ((pixel.mid(3,2).toInt(0, 16)) <<8) \ + | (pixel.mid(5,2).toInt(0, 16))) + + +const int samples=512+256; +const int fhtsamples=512; +const int width=320*2; +const int height=240*2; + +#define PI 3.141592654 + +class Mutex +{ +public: + Mutex() { mMutex=::SDL_CreateMutex(); } + ~Mutex() { ::SDL_DestroyMutex(mMutex); } + + inline bool lock() { return !::SDL_mutexP(mMutex); } + inline bool unlock() { return !::SDL_mutexV(mMutex); } + +private: + SDL_mutex *mMutex; +}; + +class Thread +{ +public: + Thread(); + + /** + * kill() the thread + **/ + virtual ~Thread(); + + void start(); + void kill(); + int wait(); + +protected: + virtual int run()=0; + +private: + static int threadRun(void *); + + SDL_Thread *mThread; +}; + +class Spacer : public QWidget +{ +Q_OBJECT +public: + Spacer(QWidget *parent) : QWidget(parent) + { + setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, + QSizePolicy::MinimumExpanding)); + } +}; + +class Bitmap +{ +public: + Bitmap() : mData(0) + { } + ~Bitmap() { delete [] mData; } + + void resize(int w, int h); + + inline void setPixel(int x, int y, Pixel c) + { mData[y*width+x] = c; } + + inline void drawVerticalLine(int x, int yBottom, int yTop, Pixel c) + { + register int w=width; + Pixel *d=mData+x+yTop*w; + yBottom-=yTop; + do + { + *d=c; + d+=width; + } while (yBottom--); + } + + inline void drawHorizontalLine(int left, int right, int y, Pixel c) + { + Pixel *d=mData+y*width+left; + right-=left; + do + { + *(d++)=c; + } while (right--); + } + + void drawCircle(int x, int y, int radius, Pixel color); + void fillCircle(int x, int y, int radius, Pixel color); + void drawLine(int x1, int y1, int x2, int y2, Pixel color); + + inline int bytes() const { return width*height*sizeof(Pixel); } + inline Pixel *pixels(int x, int y) { return &(mData[y*width+x]); } + inline Pixel *pixels() const { return mData; } + inline Pixel pixel(int x, int y) { return mData[y*width+x]; } + inline Pixel *lastPixel() { return pixels(width-1, height-1); } + + void clear(); + +private: + Pixel *mData; +}; + + + + +/** + * maintains a list of bitmaps, so you + * can recycle allocated segments + * + * Thread safe + **/ +class BitmapPool +{ +public: + BitmapPool(); + ~BitmapPool(); + + Bitmap *get(bool clear=false); + void release(Bitmap *bitmap); + +private: + struct PoolItem; + QPtrList<BitmapPool::PoolItem> mBitmaps; + Mutex mMutex; +}; + +class StereoScope; + +struct convolve_state; + +class Input +{ +public: + Input(); + ~Input(); + + /** + * audio is a pair of pointers to the buffers, + * one for each channel + * + * get the amount stated in the const global + * samples + **/ + void getAudio(float **audio); + + void setConvolve(bool state); + + bool convolve() { return state; } + +private: + void fht(float *p); + void transform(float *p, long n, long k); + void transform8(float *p); + void connect(); + +private: + StereoScope *mScope; + float outleft[samples], outright[samples]; + float haystack[512]; + float temp[samples+256]; + convolve_state *state; + volatile bool mConvolve; + + float fhtBuf[samples-256]; + float fhtTab[(samples-256)*2]; + + bool ok; + QObject *notifier; +}; + +class OutputSDL +{ +public: + enum Event + { None=0, Resize, Exit }; + + OutputSDL(); + ~OutputSDL(); + + int display(Bitmap *source); + +private: + // static for speed, since there can be only one anyway because SDL sucks + static SDL_Surface *surface; +}; + +#include <qcheckbox.h> +#include <kcolorbutton.h> + +class NexCheckBox : public QCheckBox +{ +Q_OBJECT +public: + NexCheckBox(QWidget *parent, const QString &, bool *v); + +private slots: + void change(bool b); + +private: + bool *value; + +}; + +class NexColorButton : public KColorButton +{ +Q_OBJECT +public: + NexColorButton(QWidget *parent, Pixel *color); + +private slots: + void change(const QColor &c); + +private: + Pixel *c; +}; + +class Renderer +{ +public: + Renderer(); + virtual ~Renderer(); + + virtual Bitmap *render(float *pcm[4], Bitmap *source) = 0; + + virtual QWidget *configure(QWidget*) { return 0; } + + virtual void save(QDomElement &) {} + + virtual void load(const QDomElement &) {} +}; + +class QCheckBox; +class QMultiLineEdit; +class RendererList; + +class RendererListConfigurator : public QWidget +{ +Q_OBJECT +public: + RendererListConfigurator(RendererList *l, QWidget *parent); + ~RendererListConfigurator(); + +public slots: + void eraseOn(bool state); + void convolve(bool state); + +private: + QCheckBox *mErase; + QMultiLineEdit *mComments; + + RendererList *mList; +}; + +class RendererList : public Renderer, public Mutex +{ + friend class RendererListConfigurator; + +public: + RendererList(); + virtual ~RendererList(); + virtual Bitmap *render(float *pcm[4], Bitmap *source); + + QPtrList<Renderer> &renderers() { return mRendererList; } + const QPtrList<Renderer> &renderers() const { return mRendererList; } + + bool clearAfter() const { return mClearAfter; } + void setClearAfter(bool b) { mClearAfter=b; } + + virtual QWidget *configure(QWidget *parent); + + virtual void save(QDomElement &e); + + virtual void load(const QDomElement &e); + +private: + QPtrList<Renderer> mRendererList; + volatile bool mClearAfter; + QString mComments; + + Bitmap *mFrame; +}; + +typedef Renderer* (CreatorSig)(); + +class Nex +{ +public: + Nex(); + ~Nex(); + + void go(); + void setupSize(int w, int h); + + static Nex *nex() { return sNex; } + BitmapPool *bitmapPool() { return mBitmapPool; } + + RendererList *rendererList() { return mRendererList; } + + Input *input() { return mInput; } + + Renderer *renderer(const QString &name); + + QStringList renderers() const; + +public: + static Nex *sNex; + +private: + Input *mInput; + OutputSDL mOutput; + BitmapPool *mBitmapPool; + RendererList *mRendererList; + QDict<CreatorSig*> mCreators; +}; + +#define nex Nex::nex() + + +#endif diff --git a/noatun-plugins/nexscope/nexscope.plugin b/noatun-plugins/nexscope/nexscope.plugin new file mode 100644 index 0000000..ccd8ce2 --- /dev/null +++ b/noatun-plugins/nexscope/nexscope.plugin @@ -0,0 +1,72 @@ +Filename=noatunnexscope.la +Author=Charles Samuels +Site=http://noatun.kde.org/ +Email=charles@kde.org +Type=visualization +License=LGPL +Name=NexScope +Name[eo]=NeksoSkopo +Name[es]=Siguiente Búsqueda +Name[hi]=नेक्स्कोप +Name[ru]=Зрительный образ Nex +Name[sv]=Nexskop +Name[ta]=Nex வரையெல்லை +Name[tg]=Намуди тамошобини Nex +Name[tr]=Nekskop +Name[xh]=Iscope esilandelayo +Comment=The ultra-customizable visualization +Comment[az]=Ultra-ə'la əyani efektlər +Comment[bg]=Визуализация, която може да се настройва лесно +Comment[bs]=Ultra-prilagodljiva vizualizacija +Comment[ca]=La visualització ultra-personalitzable +Comment[cs]=Ultra přizpůsobitelná vizualizace +Comment[cy]=Y dychmygydd tra-addasadwy +Comment[da]=Den ultra-brugerdefinérbare visualisering +Comment[de]=Sehr anpassbare Visualisierung +Comment[el]=Η απόλυτα-ρυθμιζόμενη οπτικοποίηση +Comment[en_GB]=The ultra-customisable visualisation +Comment[es]=La visualización totalmente personalizable +Comment[et]=Äärmiselt kohandatav ostsilloskoop +Comment[eu]=Bisualizazio ultra pertsonalizagarria +Comment[fa]=تجسم بسیار قابل سفارشی +Comment[fi]=Erittäin säädettävä visualisaatio +Comment[fr]=L'affichage ultra-configurable +Comment[fy]=Tige goed oan te passen fisualisaasje +Comment[ga]=An t-amharcléiriú fíor-in-saincheaptha +Comment[gl]=A visualización ultra-configurábel +Comment[he]=המחשה הניתנת להתאמה אישית מרבית +Comment[hi]=एक अल्ट्रा-कस्टमाइजेबल विज़ुअलाइज़ेशन +Comment[hr]=Totalno prilagodiva vizualizacija +Comment[hu]=Százféle módon variálható vizualizációs modul +Comment[is]=Sjónræm myndbrella sem er mjög stillanleg +Comment[it]=Un visualizzatore ultra personalizzabile +Comment[ja]=超カスタマイズ可能な視覚効果 +Comment[ka]=ულტრა მორგებადი ვიზუალიზაცია +Comment[kk]=Баптауы бай көрінісі +Comment[km]=រូបភាពមើលឃើញដែលអាចប្ដូរតាមបំណងបានច្រើនហួសពេក +Comment[lt]=Ypač derinama vizualizacija +Comment[mk]=Ултра-приспособлива визуелизација +Comment[ms]=Visualisasi ultra boleh selenggara +Comment[nb]=Den ekstremt tilpasningsdyktige visualiseringen +Comment[nds]=Filmmaker mit bannig vele Instellen +Comment[ne]=अति-अनुकूलनयोग्य दृश्टीकरण +Comment[nl]=Zeer goed aan te passen visualisatie +Comment[nn]=Den ekstremt tiplasningsdyktige visualiseringa +Comment[pl]=Wizualizacja z bardzo wieloma możliwościami dostosowania +Comment[pt]=A visualização ultra-configurável +Comment[pt_BR]=Uma visualização ultra-personalizável +Comment[ro]=O vizualizare sunet extrem de configurabilă +Comment[ru]=Тонко настраиваемый зрительный образ +Comment[sk]=Veľmi dobre nastaviteľná vizualizácia +Comment[sl]=Ultra prilagodljiva vizualizacija +Comment[sr]=Ултраприлагодљива визуелизација +Comment[sr@Latn]=Ultraprilagodljiva vizuelizacija +Comment[sv]=Den extremt anpassningsbara visualiseringen +Comment[ta]=அல்ட்ரா-தனிப்பயனாக்கு காட்சியமைப்புகள் +Comment[tg]=Мизроби борики намуди тамошобин +Comment[tr]=Ultra-özelleştirilebilir görsellik +Comment[uk]=Гнучкий втулок представлення +Comment[vi]=Ô xem có thể tùy chỉnh suốt +Comment[xh]=Okubonakalayo okungaphezulu kwemfuneko +Comment[zh_CN]=极可定制的视觉化显示 +Comment[zh_TW]=可調整視覺化 diff --git a/noatun-plugins/nexscope/noatunplugin.cpp b/noatun-plugins/nexscope/noatunplugin.cpp new file mode 100644 index 0000000..8bbc860 --- /dev/null +++ b/noatun-plugins/nexscope/noatunplugin.cpp @@ -0,0 +1,49 @@ +#include "nex.h" +#include "noatunplugin.h" + +#include <kprocess.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kstandarddirs.h> + +extern "C" +{ +Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("nexscope"); + return new NexPlugin(); +} +} + + +NexPlugin::NexPlugin() +{ + connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *))); +} + +NexPlugin::~NexPlugin() +{ + process.kill(); +} + +void NexPlugin::init() +{ + process << KStandardDirs::findExe("nexscope.bin"); + + // Note that process.start() will fail if findExe fails, so there's no real need + // for two separate checks. + if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout))) + { + KMessageBox::error(0, i18n("Unable to start noatunNex. Check your installation.")); + unload(); + } + +} + +void NexPlugin::processExited(KProcess *) +{ + unload(); +} + +#include "noatunplugin.moc" + diff --git a/noatun-plugins/nexscope/noatunplugin.h b/noatun-plugins/nexscope/noatunplugin.h new file mode 100644 index 0000000..8f8abb2 --- /dev/null +++ b/noatun-plugins/nexscope/noatunplugin.h @@ -0,0 +1,25 @@ +#ifndef NEXPLUG_H +#define NEXPLUG_H + +#include <kprocess.h> +#include <noatun/plugin.h> + +class NexPlugin : public QObject, public Plugin +{ +Q_OBJECT + +public: + NexPlugin(); + virtual ~NexPlugin(); + + void init(); + +private slots: + void processExited(KProcess *); + +private: + KProcess process; +}; + + +#endif diff --git a/noatun-plugins/nexscope/output.cpp b/noatun-plugins/nexscope/output.cpp new file mode 100644 index 0000000..84885e2 --- /dev/null +++ b/noatun-plugins/nexscope/output.cpp @@ -0,0 +1,48 @@ +#include "nex.h" +#include <stdlib.h> + +SDL_Surface *OutputSDL::surface=0; + +OutputSDL::OutputSDL() +{ + SDL_Init(SDL_INIT_VIDEO); + + SDL_WM_SetCaption("Nex","noatun"); + + bool fullscreen=false; + Uint32 flags = SDL_SWSURFACE | (fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE); + + surface = SDL_SetVideoMode(width, height, 32, flags); + + SDL_ShowCursor(1); + +} + + +OutputSDL::~OutputSDL() +{ + SDL_FreeSurface(surface); +} + + +int OutputSDL::display(Bitmap *source) +{ + memcpy(surface->pixels, source->pixels(), source->bytes()); + SDL_UpdateRect(surface, 0, 0, 0, 0); + + SDL_Event event; + + while ( SDL_PollEvent(&event) > 0 ) + { + switch (event.type) + { + case SDL_QUIT: + return Exit; + default: + break; + } + } + return None; +} + + diff --git a/noatun-plugins/nexscope/regionwidget.cpp b/noatun-plugins/nexscope/regionwidget.cpp new file mode 100644 index 0000000..32e9987 --- /dev/null +++ b/noatun-plugins/nexscope/regionwidget.cpp @@ -0,0 +1,77 @@ + +#include "regionwidget.h" + +RegionWidget::RegionWidget(QWidget *parent) +{ + +} + +RegionWidget::RegionWidget(const QSize &viewsize, QWidget *parent) +{ + +} +RegionWidget::RegionWidget(int x, int y, int w, int h, const QSize &viewsize, + QWidget *parent) +{ + +} + +RegionWidget::RegionWidget(const QRect ®ion, const QSize &viewsize, + QWidget *parent) +{ + +} + +RegionWidget::~RegionWidget() +{ + +} + + +QRect RegionWidget::region() const +{ + return QRect(0,0,0,0); +} + +void RegionWidget::setX(int x) +{ + +} + +void RegionWidget::setY(int y) +{ + +} + +void RegionWidget::setWidth(int w) +{ + +} + +void RegionWidget::setHeight(int h) +{ + +} + +void RegionWidget::setRegion(const QRect ®ion) +{ + +} + +void RegionWidget::setViewSize(const QSize &size) +{ + +} + +void RegionWidget::moved(int x, int y) +{ + +} + +void RegionWidget::resized(int w, int h) +{ + +} + +#include "regionwidget.moc" + diff --git a/noatun-plugins/nexscope/regionwidget.h b/noatun-plugins/nexscope/regionwidget.h new file mode 100644 index 0000000..eeac8b4 --- /dev/null +++ b/noatun-plugins/nexscope/regionwidget.h @@ -0,0 +1,47 @@ +#ifndef REGIONWIDGET_H +#define REGIONWIDGET_H + +#include <qframe.h> + +/** + * show a widget with a field rectangle, and a mini-region inside + * + * text boxes allow the region to be resized and moved, along with + * click-n-drag + **/ +class RegionWidget : public QFrame +{ +Q_OBJECT +public: + RegionWidget(QWidget *parent); + RegionWidget(const QSize &viewsize, QWidget *parent); + RegionWidget(int x, int y, int w, int h, const QSize &viewsize, + QWidget *parent); + RegionWidget(const QRect ®ion, const QSize &viewsize, QWidget *parent); + + ~RegionWidget(); + + QRect region() const; + +public slots: + void setX(int x); + void setY(int y); + void setWidth(int w); + void setHeight(int h); + + void setRegion(const QRect ®ion); + + void setViewSize(const QSize &size); + +signals: + void changed(); + void changed(int x, int y, int w, int h); + void changed(const QRect ®ion); + +protected: + virtual void moved(int x, int y); + virtual void resized(int w, int h); +}; + + +#endif diff --git a/noatun-plugins/nexscope/renderers.cpp b/noatun-plugins/nexscope/renderers.cpp new file mode 100644 index 0000000..830024b --- /dev/null +++ b/noatun-plugins/nexscope/renderers.cpp @@ -0,0 +1,369 @@ +#include "nex.h" +#include <stdlib.h> +#include <time.h> +#include <math.h> +#include <iostream> +#include <qlayout.h> +#include <klocale.h> + +struct HorizontalPair : public Renderer +{ + HorizontalPair() : color(0x578cd8) + { + // 0x578cd8 0x3cff3f 0x10FFFF + horizontal=false; + pair=true; + } + + QWidget *configure(QWidget *parent) + { + QWidget *config=new QWidget(parent); + (new QVBoxLayout(config))->setAutoAdd(true); + + new NexColorButton(config, &color); + new NexCheckBox(config, i18n("Horizontal"), &horizontal); + new NexCheckBox(config, i18n("Pair"), &pair); + new NexCheckBox(config, i18n("Solid"), &solid); + new Spacer(config); + + return config; + } + + static inline void processV(int h, int start, int end, Bitmap *d, + float *ch, Pixel c, register bool solid) + { + int oldx=(start+end)/2; + int mid=oldx; + float quarter=(end-start)/2.0; + for (int y=0; y<h; ++y) + { + int newx=mid+(int)(ch[y]*quarter); + if (newx<start) newx=start; + if (newx>end) newx=end; + if (newx>oldx) + d->drawHorizontalLine(oldx, newx, y, c); + else + d->drawHorizontalLine(newx, oldx, y, c); + if (!solid) + oldx=newx; + } + } + + static inline void processH(int h, int start, int end, Bitmap *d, + float *ch, Pixel c, register bool solid) + { + int oldx=(start+end)/2; + int mid=oldx; + float quarter=(end-start)/2.0; + for (int y=0; y<h; ++y) + { + int newx=mid+(int)(ch[y]*quarter); + if (newx<start) newx=start; + if (newx>end) newx=end; + if (newx>oldx) + d->drawVerticalLine(y, newx, oldx, c); + else + d->drawVerticalLine(y, oldx, newx, c); + if (!solid) + oldx=newx; + } + } + + virtual Bitmap *render(float **pcm, Bitmap *src) + { + if (horizontal) + { + if (pair) + { + processH(width, 0, height/2, src, pcm[0], color, solid); + processH(width, height/2, height, src, pcm[1], color, solid); + } + else + { + processH(width, 0, height, src, pcm[0], color, solid); + } + } + else + { + if (pair) + { + processV(height, 0, width/2, src, pcm[0], color, solid); + processV(height, width/2, width, src, pcm[1], color, solid); + } + else + { + processV(height, 0, width, src, pcm[0], color, solid); + } + } + + return src; + } + + virtual void save(QDomElement &e) + { + e.setTagName("Waveform"); + e.setAttribute("horizontal", (int)horizontal); + e.setAttribute("pair", (int)pair); + e.setAttribute("solid", (int)solid); + e.setAttribute("color", COLORSTR(color)); + } + + virtual void load(const QDomElement &e) + { + horizontal=(bool)e.attribute("horizontal", 0).toInt(); + pair=(bool)e.attribute("pair", 0).toInt(); + solid=(bool)e.attribute("solid", 0).toInt(); + color=STRCOLOR(e.attribute("color", "#FFFFFF")); + } + + Pixel color; + bool horizontal; + bool pair; + bool solid; +}; + +struct Hartley : public Renderer +{ + virtual Bitmap *render(float **pcm, Bitmap *src) + { + float mult=height/2.0; + for (int i=0; i<width; i++) + { + int h=pcm[3][i]*mult; + if (h>height) h=height; + + src->drawVerticalLine(i, height, height-h,0xFFFFFF); + } + return src; + } +}; + +class Fade : public Renderer +{ +public: + virtual Bitmap *render(float *[2], Bitmap *src) + { + register int i=src->bytes()/sizeof(Pixel); + + register Pixel *d=src->pixels(); + do + { + *d -= ((*d & 0xf0f0f0f0) >> 4) + + ((*d & 0xe0e0e0e0) >> 5); + ++d; + } while (--i > 0); + return src; + } +}; + + +struct Doubler : public Renderer +{ + Doubler() + { + srcX=20; + srcY=100; + destX=240; + destY=160; + srcWidth=40; + srcHeight=40; + + } + + inline static void copyAndDouble(Pixel *src, Pixel *dest1, + Pixel *dest2, int w) + { + while (w--) + { + *dest1=*dest2=*src; + dest1++; + dest2++; + *dest1=*dest2=*src; + dest1++; + dest2++; + src++; + } + } + + virtual Bitmap *render(float *[2], Bitmap *src) + { + for (int y=0; y<srcHeight; y++) + { + copyAndDouble(src->pixels(srcX, y+srcY), + src->pixels(destX, destY+y*2), + src->pixels(destX, destY+y*2+1), + srcWidth); + } + return src; + } + + int srcX, srcY; + int destX, destY; + int srcWidth, srcHeight; +}; + +struct Blur : public Renderer +{ + virtual Bitmap *render(float *[2], Bitmap *src) + { + Bitmap *b=nex->bitmapPool()->get(); + + register Byte *buffer=(Byte*)b->pixels(); + register unsigned short pitch=width*sizeof(Pixel); + + // skip the first row + buffer+=pitch; + + // skip the first pixel on the second row; + buffer+=sizeof(Pixel); + + // we also don't want to do the last row + register Pixel *end=b->lastPixel(); + end-=pitch; + // and the last pixel on the second-to-last row + end-=sizeof(Pixel); + + while (buffer<(Byte*)end) + { + + + } + return b; + } +}; + +#ifdef cow +struct FadeHeat : public Renderer +{ + inline void fadePixelHeat(Bitmap *out, int x, int y) + { + Pixel up = lastOutput->pixel(x, y-1); + Pixel down = lastOutput->pixel(x, y+1); + Pixel left = lastOutput->pixel(x-1, y); + Pixel right = lastOutput->pixel(x+1, y); + + // assuming Pixel AARRGGBB + Pixel r, g, b, pixel; + const int rMask = 0xFFFF0000; + const int gMask = 0x00FFFF00; + const int bMask = 0x0000FFFF; + + // average the up down left right for each component + r = up & rMask + + right & rMask + + left & rMask + + bottom & rMask; + r >>= 2; + r &= rMask; + + g = up & gMask + + right & gMask + + left & gMask + + bottom & gMask; + g >>= 2; + g &= gMask; + + b = up & bMask + + right & bMask + + left & bMask + + bottom & bMask; + b >>= 2; + b &= bMask; + + Pixel all=r|g|b; + if(!all) + { + out->pixel(x, y, 0); + return; + } + + // some more input + Pixel c=lastLastOutput->getPixel(x, y); + c+=0x00010101; + + + + all -= c; + + // bounds check +/* slow: if (all & 0xFF000000) all=0; + else if (all & 0x7F000000) all = 0x00FFFFFF; + out->setPixel(x, y, all); */ + + // everything is normal + if(!(all & 0xFF000000)) out->setPixel(x,y, all); + // wraparound occured (0x80==0b10000000) + else if(all & 0x80000000) out->setPixel(x,y, 0); + else out->setPixel(x,y, 0x00FFFFFF); + } + + virtual Bitmap *render(float *[2], Bitmap *src) + { + Bitmap *lastLastTemp = lastLastOutput; + lastLastOutput = lastOutput; + lastOutputBmp.data = src; + src = lastLastTemp; + + int x,y,i,j,start,end; + int step = outWidth*2; + for(x=i=0, j=outWidth*(outHeight-1)*2; + x<outWidth; + x++, i+=2, j+=2) + { + fadePixelHeat(src, x,0,i); + fadePixelHeat(src, x,0,i+1); + fadePixelHeat(src, x,outHeight-1,j); + fadePixelHeat(src, x,outHeight-1,j+1); + } + + for(y=1, i=outWidth*2, j=outWidth*4-2; + y<outHeight; + y++, i+=step, j+=step) + { + fadePixelHeat(src, 0, y,i); + fadePixelHeat(src, 0, y,i+1); + fadePixelHeat(src, outWidth-1,y,j); + fadePixelHeat(src, outWidth-1,y,j+1); + } + + + for(y=1,start=outWidth*2+2, + end=outWidth*4-2; y<outHeight-1; + y++,start+=step,end+=step) + { + int i = start; + do + { + short j = + ( short(Dlo[i-2])+ + Dlo[i+2]+ + +Dlo[i-step] + +Dlo[i+step] + >> 2) + +Dlo[i]; + if (!j) + { + Do[i] = 0; + } + else + { + j = j-Dllo[i]+(Dllo[i] -Dlo[i]>>2)-1; + if (j < 0) Do[i] = 0; + else if (j & (255*256)) Do[i] = 255; + else Do[i] = j; + } + } while(++i < end); + } + + return src; + } + + Bitmap *lastOutput, Bitmap *lastLastOutput; +}; +#endif + +#define RENDERERS_CPP +#include "renderers.h" +#undef RENDERERS_CPP + + diff --git a/noatun-plugins/nexscope/renderers.h b/noatun-plugins/nexscope/renderers.h new file mode 100644 index 0000000..3105849 --- /dev/null +++ b/noatun-plugins/nexscope/renderers.h @@ -0,0 +1,34 @@ +#ifndef RENDERERS_H +#define RENDERERS_H + +#include <qstring.h> + +class Renderer; + +namespace Creators +{ + + + +#ifdef RENDERERS_CPP +#define REGISTER(function, cl) \ +Renderer *function() \ +{ \ + return new cl; \ +} +#else +#define REGISTER(function, cl) \ +Renderer *function(); +#endif + +REGISTER(fade, Fade) +REGISTER(doubler, Doubler) +REGISTER(waveform, HorizontalPair); +REGISTER(hartley, Hartley); + +#undef REGISTER +}; + + +#endif + diff --git a/noatun-plugins/noatunmadness/Makefile.am b/noatun-plugins/noatunmadness/Makefile.am new file mode 100644 index 0000000..973ae51 --- /dev/null +++ b/noatun-plugins/noatunmadness/Makefile.am @@ -0,0 +1,10 @@ +INCLUDES= $(all_includes) + +kde_module_LTLIBRARIES = noatunmadness.la +noatunmadness_la_SOURCES = madness.cpp +noatunmadness_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunmadness_la_LIBADD = $(LIB_KFILE) -lnoatun -lm +noatunmadness_la_METASOURCES = AUTO + +noatun_DATA = madness.plugin +noatundir = $(kde_datadir)/noatun diff --git a/noatun-plugins/noatunmadness/madness.cpp b/noatun-plugins/noatunmadness/madness.cpp new file mode 100644 index 0000000..0b0d086 --- /dev/null +++ b/noatun-plugins/noatunmadness/madness.cpp @@ -0,0 +1,123 @@ +/***************************************************************** + +Copyright (c) 2001 Charles Samuels <charles@kde.org> + 2000 Rik Hemsley <rik@kde.org> + +This code is released under the GNU General Public License 2.0, or any +later version, at your option. I mean, you know the drill, just read +RMS's novel that I'm supposed to put at the top of every story. He's insane. +******************************************************************/ + +#include "madness.h" + +#include <kwin.h> +#include <kwinmodule.h> +#include <kiconloader.h> +#include <math.h> +#include <iostream> + +#include <X11/Xlib.h> + + +extern "C" +{ +Plugin *create_plugin() +{ + return new Madness(); +} +} + +Madness::Madness() + : MonoFFTScope(100), Plugin(), mWm(this) +{ + connect(&mWm, SIGNAL(currentDesktopChanged(int)), SLOT(update())); + connect(&mWm, SIGNAL(windowAdded(WId)), SLOT(update())); + connect(&mWm, SIGNAL(windowRemoved(WId)), SLOT(update())); + connect(&mWm, SIGNAL(strutChanged()), SLOT(update())); + +} + +Madness::~Madness() +{ + QMap<WId, QPoint>::ConstIterator it(mOriginalPositions.begin()); + + for (; it != mOriginalPositions.end(); ++it) + XMoveWindow(qt_xdisplay(), it.key(), (*it).x(), (*it).y()); +} + +void Madness::update() +{ + mWindowList = mWm.windows(); + mWorkArea = mWm.workArea(); + + QValueList<WId>::ConstIterator it(mWindowList.begin()); + + for (; it != mWindowList.end(); ++it) + { + QRect area=KWin::info(*it).frameGeometry; + if (!mOriginalPositions.contains(*it)) + mOriginalPositions.insert(*it, area.topLeft()); + } +} + +void Madness::init() +{ + update(); + MonoFFTScope::start(); +} + +void Madness::scopeEvent(float *d, int size) +{ + int delta=0; // in pixels + for (int count=0; count<size; count++) + { + delta+=(int)((log10(d[count]+1)/log(2))*(size-count))/2; + } + +// cout << "delta: " << delta << endl; + + QValueList<WId>::ConstIterator it(mWindowList.begin()); + + for (; it != mWindowList.end(); ++it) + { + KWin::Info i(KWin::info(*it)); + + if ((NET::Visible != i.mappingState) || + ((NET::Unknown != i.windowType) && + (NET::Normal != i.windowType) && + (NET::Tool != i.windowType) && + (NET::Menu != i.windowType) && + (NET::Dialog != i.windowType)) || (NET::Max & i.state) + || (NET::Shaded & i.state) + || (mWm.currentDesktop() != i.desktop)) + continue; + + QRect area=i.frameGeometry; + float lightness=100000.0/(area.width()*area.height()); + + int x=area.x(); + int y=area.y(); + + + int dx=(int)((delta*lightness*(area.height()/10)/100))*(KApplication::random()%2 ? -1 : 1); + int dy=(int)((delta*lightness*(area.width()/10)/100))*(KApplication::random()%2 ? -1 : 1); + + if (dx < 0 && (x - dx < mWorkArea.left())) + dx = -dx; + + else if (dx > 0 && (x + dx + area.width() > mWorkArea.right())) + dx = -dx; + + if (dy < 0 && (y - dy < mWorkArea.top())) + dy = -dy; + + else if (dy > 0 && (y + dy + area.height() > mWorkArea.bottom())) + dy = -dy; + + + XMoveWindow(qt_xdisplay(), i.win, x + dx, y + dy); + } + +} + +#include "madness.moc" diff --git a/noatun-plugins/noatunmadness/madness.h b/noatun-plugins/noatunmadness/madness.h new file mode 100644 index 0000000..b36c468 --- /dev/null +++ b/noatun-plugins/noatunmadness/madness.h @@ -0,0 +1,32 @@ +#ifndef MADNESS_H +#define MADNESS_H + +#include <noatun/plugin.h> +#include <string.h> +#include <qmap.h> +#include <qvaluelist.h> +#include <kwinmodule.h> + +class Madness : public QObject, public MonoFFTScope, public Plugin +{ +Q_OBJECT +public: + Madness(); + virtual ~Madness(); + + void init(); + +private slots: + void update(); + +protected: + virtual void scopeEvent(float *data, int bands); + +private: + KWinModule mWm; + QValueList<WId> mWindowList; + QRect mWorkArea; + QMap<WId, QPoint> mOriginalPositions; +}; + +#endif diff --git a/noatun-plugins/noatunmadness/madness.plugin b/noatun-plugins/noatunmadness/madness.plugin new file mode 100644 index 0000000..ddfd136 --- /dev/null +++ b/noatun-plugins/noatunmadness/madness.plugin @@ -0,0 +1,105 @@ +Filename=noatunmadness.la +Author=Charles Samuels +Site=http://noatun.kde.org/ +Email=charles@kde.org +Type=visualization +License=GPL +Name=Madness +Name[ar]=جنون +Name[az]=Dəlilik +Name[br]=Fallentez +Name[bs]=Ludilo +Name[cs]=Šílenost +Name[cy]=Gwallgofrwydd +Name[da]=Galskab +Name[de]=Verrücktheit +Name[el]=Τρέλα +Name[eo]=Delireco +Name[es]=Locura +Name[et]=Hullumeelsus +Name[fa]=دیوانگی +Name[fi]=Hulluus +Name[fy]=Gekheid +Name[gl]=Loucura +Name[hi]=मेडनेस +Name[hr]=Ludilo +Name[ka]=სიგიჟე +Name[km]=ភាពឆ្កួត +Name[lt]=Beprotybė +Name[mk]=Беснило +Name[nds]=Mallheit +Name[ne]=पागलपन +Name[nl]=Gekheid +Name[nn]=Galskap +Name[nso]=Bogafa +Name[pl]=Szaleństwo +Name[pt]=Loucura +Name[pt_BR]=Maldade +Name[ro]=Nebunie +Name[ru]=Безумие +Name[sl]=Norost +Name[sv]=Galenskap +Name[ta]= முட்டாள்தனம் +Name[tg]=Беандешагӣ +Name[tr]=Çılgınlık +Name[uk]=Божевілля +Name[vi]=Chứng điên +Name[xh]=Impambano +Name[zh_CN]=疯狂 +Comment=A weird and annoying scope that moves your windows +Comment[af]='n weird en irriterend skoop wat skuiwe jou vensters +Comment[ar]=ملحق غريب و مزعج يقوم بتحريك نوافذك +Comment[az]=Pəncərələrinizi daşıyan dəlicə və narahat edən dairə +Comment[bg]=Досадна приставка за преместване на прозореца +Comment[bs]=Čudan i neugodan scope koji pomjera rvaše prozore +Comment[ca]=Un estrany i molest calidoscopi que mou les finestres +Comment[cs]=Otravná vizualizace, který hýbe s vašimi okny +Comment[cy]=Sgop annifyr a diflas sy'n symud eich ffenestri +Comment[da]=Et underligt og irriterende virkefelt der flytter dine vinduer +Comment[de]=Ein verrücktes und nervendes Oszilloskop, das Fenster verschiebt +Comment[el]=Ένα περίεργο και ενοχλητικό καλειδοσκόπιο που μετακινεί τα παράθυρά σας +Comment[eo]=Bizara kaj incita vidilo kiu movas viajn fenestrojn +Comment[es]=Algo extraño y fastidioso se mueve por su pantalla +Comment[et]=Veider ja ärritav ostsilloskoop, mis paneb aknad lendlema +Comment[eu]=Zure leihoak mugitzen dituen esparru bitxi eta harrigarria +Comment[fa]=دامنۀ رنجشآور و مرموزی که پنجرههای شما را حرکت میدهد +Comment[fi]=Outo ja rasittava oskiloskooppi, joka liikuttelee ikkunoitasi +Comment[fr]=Un aperçu magique et ennuyeux qui déplace votre fenêtre +Comment[fy]=In maffe en nerveuze Ossilloskoop dy't jo finsters ferpleatst +Comment[ga]=Scóp corr ciapach a bhogann do chuid fuinneog +Comment[gl]=Un osciloscópio estraño e irritante que move as suas fiestras +Comment[he]=תחום מוזר ומעצבן שמזיז את החלונות שלך +Comment[hi]=एक सनकी और चिढ़ाकू स्कोप जो आपके विंडो को खिसकाता है +Comment[hr]=Neobičan i živcirajući osciloskop koji pomiče vaše prozore +Comment[hu]=Egy különleges ablakmozgató vizualizációs modul +Comment[is]=Undarlegur og pirrandi mælir sem færir gluggana þína +Comment[it]=Uno strano e scocciante "scope" che muove le tue finestre +Comment[ja]=奇妙で鬱しくあなたのウィンドウを動かすスコープ +Comment[ka]=უცნაური გამოსახულებები, რომლებიც თქვენს ფანჯრებს გადააადგილებს +Comment[kk]=Терезлеріңізді жылжытатын біртүрлі көрініс +Comment[km]= វិសាលដែលរំខាន និងចំឡែកដែលផ្លាស់ទីបង្អួចរបស់អ្នក +Comment[lt]=Keista ir erzinantis vaizdas, judinantis Jūsų langus +Comment[mk]=Чуден и досаден осцилоскоп што Ви ги движи прозорците +Comment[ms]=Skop yang pelik untuk memerhati pergerakan pada tetingkap anda +Comment[nb]=En rar og irriterende ting som flytter vinduene dine +Comment[nds]=En snaaksch un piesacken Frequenzkieker, de Finster verschufft +Comment[ne]=तपाईँको सञ्झ्याल चलाउने एउटा भाग्य र कष्टप्रद क्षेत्र +Comment[nl]=Een maffe en nerveuze Oscilloscoop die uw vensters verplaatst +Comment[nn]=Ein rar og irriterande ting som flyttar vindauga dine +Comment[pl]=Przesuwa twoje okna w rytm muzyki +Comment[pt]=Um osciloscópio estranho e irritante que move as suas janelas +Comment[pt_BR]= Um escopo estranho que move suas janelas +Comment[ro]=Un modul de vizualizare care mişcă ferestrele +Comment[ru]=Странный зрительный образ, перемещающий ваши окна +Comment[sk]=Šialený a protivný rámec ktorý hýbe vašími oknami. +Comment[sl]=Čudno in nadležno območje, ki premika vaša okna +Comment[sr]=Чудан и иритирајући нишан који помера ваше прозоре +Comment[sr@Latn]=Čudan i iritirajući nišan koji pomera vaše prozore +Comment[sv]=Konstigt och påfrestande oscilloskop som flyttar fönster +Comment[ta]=ஒரு புதிரான வரையெல்லை உங்கள் சாளரத்தை நகர்த்துகிறது +Comment[tg]=Намуди тамошобини аҷиб, ки тирезаҳои шуморо бетартиб мекунад +Comment[tr]=Pencerelerinizi taşıyan garip ve sinir bozucu bir alan +Comment[uk]=Дивний та набридливий моноскоп, що пересуває ваші вікна +Comment[vi]=Ô xem lạ di chuyển các cửa sổ +Comment[xh]=Isibuko esingaqhelekanga nesidikayo sesibuko esi hambisa iiwindow zakho +Comment[zh_CN]=一个会移动您的窗口的奇怪而有讨厌的观测器 diff --git a/noatun-plugins/oblique/COPYING b/noatun-plugins/oblique/COPYING new file mode 100644 index 0000000..34364e3 --- /dev/null +++ b/noatun-plugins/oblique/COPYING @@ -0,0 +1,35 @@ + + This file is hereby licensed under the GNU General Public License version + 2 or later at your option. + + This file is licensed under the Qt Public License version 1 with the + condition that the licensed will be governed under the Laws of California + (USA) instead of Norway. Disputes will be settled in Santa Clara county + courts. + + This file is licensed under the following additional license. Be aware + that it is identical to the BSD license, except for the added clause 3: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. By integrating this software into any other software codebase, you waive + all rights to any patents associated with the stated codebase. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/noatun-plugins/oblique/Makefile.am b/noatun-plugins/oblique/Makefile.am new file mode 100644 index 0000000..09b200c --- /dev/null +++ b/noatun-plugins/oblique/Makefile.am @@ -0,0 +1,18 @@ +SUBDIRS = . schemas + +INCLUDES= -I$(top_srcdir)/noatun/library $(all_includes) +kde_module_LTLIBRARIES = noatun_oblique.la + +noatun_oblique_la_SOURCES = base.cpp kbuffer.cpp query.cpp oblique.cpp tree.cpp file.cpp selector.cpp menu.cpp cmodule.cpp kdatacollection.cpp view.cpp + +noatun_oblique_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatun_oblique_la_LIBADD = $(LIB_KIO) -lnoatun $(BERKELEY_DB_LIBS) + +noatun_oblique_la_METASOURCES = AUTO + +noatundata_DATA = oblique.plugin +noatundatadir = $(kde_datadir)/noatun + +rc_DATA = obliqueui.rc +rcdir = $(kde_datadir)/noatun + diff --git a/noatun-plugins/oblique/base.cpp b/noatun-plugins/oblique/base.cpp new file mode 100644 index 0000000..60bb272 --- /dev/null +++ b/noatun-plugins/oblique/base.cpp @@ -0,0 +1,435 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "base.h" +#include "file.h" + +#include "kdbt.h" +#include "kbuffer.h" + +#include <qstringlist.h> +#include <qmap.h> +#include <qfile.h> +#include <qdom.h> + +#include <cstdlib> +#include <assert.h> +#include <db_cxx.h> + + + +struct Base::Private +{ + Private() : db(0, DB_CXX_NO_EXCEPTIONS) { } + Db db; + typedef KDbt<FileId> Key; + typedef KDbt<QStringList> Data; + + FileId high; + + FileId cachedId; + mutable QMap<QString,QString> cachedProperties; + + QPtrList<Slice> slices; + int sliceHigh; +}; + + +Base::Base(const QString &file) +{ + d = new Private; + d->cachedId = 0; + + QCString filename = QFile::encodeName(file); + + bool create = true; + if (d->db.open( +#if DB_VERSION_MINOR > 0 && DB_VERSION_MAJOR >= 4 + NULL, +#endif + filename, + 0, DB_BTREE, DB_NOMMAP, 0 + )==0) + { // success + Private::Data data; + Private::Key key(0); + if (d->db.get(0, &key, &data, 0)==0) + { + QStringList strs; + data.get(strs); + + mFormatVersion = strs[0].toUInt(0, 16); // TODO + d->high = strs[1].toUInt(); + + if (strs.count() == 3) + loadMetaXML(strs[2]); + else + loadMetaXML(""); + + create=false; + } + } + if (create) + { // failure + QFile(filename).remove(); + d->db.open( +#if DB_VERSION_MINOR > 0 && DB_VERSION_MAJOR >= 4 + NULL, +#endif + filename,0, DB_BTREE, DB_NOMMAP|DB_CREATE,0 + ); + + d->high=0; + QStringList strs; + strs << "00010002" << "0" << ""; + resetFormatVersion(); + loadMetaXML(""); + Private::Data data(strs); + Private::Key key(0); + // in the stringlist for Key(0), we have the following list: + // { "version of the file", + // "the high extreme (auto-increment counter in SQL terminology)", + // "the metaxml" + // } + d->db.put(0, &key, &data, 0); + } +} + +void Base::resetFormatVersion() +{ + mFormatVersion = 0x00010002; +} + +Base::~Base() +{ + QStringList strs; + strs << QString::number(mFormatVersion, 16) << QString::number(d->high); + strs << saveMetaXML(); + + Private::Data data(strs); + Private::Key key(0); + d->db.put(0, &key, &data, 0); + d->db.sync(0); + d->db.close(0); + delete d; +} + +File Base::add(const QString &file) +{ + Private::Key key(++d->high); + QStringList properties; + properties << "file" << file; + Private::Data data(properties); + + unless (d->db.put(0, &key, &data, 0)) + { + // success ! + File f(this, d->high); + f.makeCache(); + emit added(f); + return f; + } + + return File(); +} + +File Base::find(FileId id) +{ + if (id == 0) return File(); + + Private::Key key(id); + Private::Data data; + + unless (d->db.get(0, &key, &data, 0)) + { + // exists + return File(this, id); + } + else + { + return File(); // null item + } +} + +void Base::clear() +{ + for (FileId id = high(); id >= 1; id--) + { + File f = find(id); + if (f) + f.remove(); + } +} + + +FileId Base::high() const +{ + return d->high; +} + +File Base::first(FileId first) +{ + if (first > high()) return File(); + + while (!find(first)) + { + ++first; + if (first > high()) + return File(); + } + return File(this, first); +} + +QString Base::property(FileId id, const QString &property) const +{ + loadIntoCache(id); + if (!d->cachedProperties.contains(property)) return QString::null; + QMap<QString,QString>::Iterator i = d->cachedProperties.find(property); + return i.data(); +} + +void Base::setProperty(FileId id, const QString &key, const QString &value) +{ + loadIntoCache(id); + d->cachedProperties.insert(key, value); + // reinsert it into the DB + + QStringList props; + for ( + QMap<QString,QString>::Iterator i(d->cachedProperties.begin()); + i != d->cachedProperties.end(); ++i + ) + { + props << i.key() << i.data(); + } + + Private::Data data(props); + Private::Key dbkey(id); + d->db.put(0, &dbkey, &data, 0); + d->db.sync(0); + + emit modified(File(this, id)); +} + +QStringList Base::properties(FileId id) const +{ + loadIntoCache(id); + QStringList props; + for ( + QMap<QString,QString>::Iterator i(d->cachedProperties.begin()); + i != d->cachedProperties.end(); ++i + ) + { + props << i.key(); + } + return props; +} + +void Base::clearProperty(FileId id, const QString &key) +{ + loadIntoCache(id); + d->cachedProperties.remove(key); + // reinsert it into the DB + + QStringList props; + for ( + QMap<QString,QString>::Iterator i(d->cachedProperties.begin()); + i != d->cachedProperties.end(); ++i + ) + { + if (i.key() != key) + props << i.key() << i.data(); + } + + Private::Data data(props); + Private::Key dbkey(id); + d->db.put(0, &dbkey, &data, 0); + d->db.sync(0); + + emit modified(File(this, id)); +} + +void Base::remove(File file) +{ + Private::Key key(file.id()); + + unless (d->db.del(0, &key, 0)) + { + emit removed(file); + if (file.id() == d->high) + { + d->high--; // optimization + } + } + d->db.sync(0); +} + +void Base::loadIntoCache(FileId id) const +{ + if (d->cachedId == id) return; + + d->cachedId = id; + d->cachedProperties.clear(); + + Private::Key key(id); + Private::Data data; + unless (d->db.get(0, &key, &data, 0)) + { + QStringList props; + data.get(props); + + if (props.count() % 2) + { // corrupt? + const_cast<Base*>(this)->remove(File(const_cast<Base*>(this), id)); + return; + } + + for (QStringList::Iterator i(props.begin()); i != props.end(); ++i) + { + QString &key = *i; + QString &value = *++i; + d->cachedProperties.insert(key, value); + } + } +} + +QString Base::saveMetaXML() +{ + QDomDocument doc; + doc.setContent(QString("<meta />")); + QDomElement doce = doc.documentElement(); + + QDomElement e = doc.createElement("slices"); + e.setAttribute("highslice", QString::number(d->sliceHigh)); + doce.appendChild(e); + + for (QPtrListIterator<Slice> i(d->slices); *i; ++i) + { + QDomElement slice = doc.createElement("slice"); + slice.setAttribute("id", (*i)->id()); + slice.setAttribute("name", (*i)->name()); + e.appendChild(slice); + } + return doc.toString(); +} + +void Base::move(FileId oldid, FileId newid) +{ + Private::Key key(oldid); + Private::Data data; + unless (d->db.get(0, &key, &data, 0)) + { + QStringList props; + data.get(props); + d->db.del(0, &key, 0); + + Private::Key key2(newid); + d->db.put(0, &key2, &data, 0); + } +} + +void Base::dump() +{ + for (FileId id=1; id <= high(); id++) + { + QStringList props = properties(id); + std::cerr << id << '.'; + for (QStringList::Iterator i(props.begin()); i != props.end(); ++i) + { + QString prop = *i; + std::cerr << ' ' << prop.latin1() << '=' << property(id, prop).latin1(); + } + std::cerr << std::endl; + } +} + +void Base::notifyChanged(const File &file) +{ + emit modified(file); +} + + +QPtrList<Slice> Base::slices() +{ + return d->slices; +} + +Slice *Base::addSlice(const QString &name) +{ + Slice *sl = new Slice(this, d->sliceHigh++, name); + d->slices.append(sl); + slicesModified(); + return sl; +} + +Slice *Base::defaultSlice() +{ + for (QPtrListIterator<Slice> i(d->slices); *i; ++i) + { + if ((*i)->id() == 0) return *i; + } + + abort(); + return 0; +} + +void Base::removeSlice(Slice *slice) +{ + assert(slice->id() > 0); + d->slices.removeRef(slice); + delete slice; +} + +Slice *Base::sliceById(int id) +{ + for (QPtrListIterator<Slice> i(d->slices); *i; ++i) + { + if ((*i)->id() == id) return *i; + } + return 0; +} + + +void Base::loadMetaXML(const QString &xml) +{ + d->slices.setAutoDelete(true); + d->slices.clear(); + d->slices.setAutoDelete(false); + + QDomDocument doc; + doc.setContent(xml); + QDomElement doce = doc.documentElement(); + bool loadedId0=false; + + for (QDomNode n = doce.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement e = n.toElement(); + if (e.isNull()) continue; + + if (e.tagName().lower() == "slices") + { + d->sliceHigh = e.attribute("highslice", "1").toInt(); + for (QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) + { + QDomElement e = n.toElement(); + if (e.isNull()) continue; + if (e.tagName().lower() == "slice") + { + int id = e.attribute("id").toInt(); + if (id==0 && loadedId0) break; + loadedId0=true; + QString name = e.attribute("name"); + d->slices.append(new Slice(this, id, name)); + } + } + } + } + + if (d->slices.count() == 0) + { + // we must have a default + d->slices.append(new Slice(this, 0, "")); + } +} + +#include "base.moc" diff --git a/noatun-plugins/oblique/base.h b/noatun-plugins/oblique/base.h new file mode 100644 index 0000000..c9cb8d4 --- /dev/null +++ b/noatun-plugins/oblique/base.h @@ -0,0 +1,105 @@ +// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. +#ifndef BASE_H +#define BASE_H + +// ;) +#define unless(e) if(!(e)) + +#include <qstring.h> +#include <qobject.h> +#include <qptrlist.h> + +class File; +class Slice; + +typedef unsigned int FileId; + +class Base : public QObject +{ +Q_OBJECT + + struct Private; + Private *d; // not for BC, but for compile times :) + friend class Slice; + friend class File; + unsigned int mFormatVersion; + +public: + Base(const QString &file); + ~Base(); + + File add(const QString &file); + + File find(FileId id); + + void clear(); + + /** + * get the highest FileID + **/ + FileId high() const; + + /** + * @return first item after the given id (inclusive) + **/ + File first(FileId id=1); + + QString property(FileId id, const QString &property) const; + void setProperty(FileId id, const QString &key, const QString &value); + QStringList properties(FileId id) const; + void clearProperty(FileId, const QString &key); + + /** + * same as File::remove + **/ + void remove(File f); + + /** + * change the id of a file + **/ + void move(FileId oldid, FileId newid); + + void dump(); + + QPtrList<Slice> slices(); + Slice *addSlice(const QString &name); + Slice *defaultSlice(); + Slice *sliceById(int id); + + unsigned int formatVersion() const { return mFormatVersion; } + void resetFormatVersion(); + +public slots: + void notifyChanged(const File &file); + +signals: + void added(File file); + void removed(File file); + void modified(File file); + + void addedTo(Slice *slice, File file); + void removedFrom(Slice *slice, File file); + + /** + * emitted when something of the slices gets modified + * @ref Slice calls this itself via a friendship + **/ + void slicesModified(); + +private: + void loadIntoCache(FileId id) const; + +private: // friends for Slice + void removeSlice(Slice *slice); + +private: + /** + * load the xml that lives at the head of the db and contains + * potentially lots of structured data + **/ + void loadMetaXML(const QString &xml); + QString saveMetaXML(); +}; + +#endif diff --git a/noatun-plugins/oblique/cmodule.cpp b/noatun-plugins/oblique/cmodule.cpp new file mode 100644 index 0000000..93b4069 --- /dev/null +++ b/noatun-plugins/oblique/cmodule.cpp @@ -0,0 +1,663 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "cmodule.h" +#include "oblique.h" +#include "file.h" + +#include <kregexpeditorinterface.h> +#include <kparts/componentfactory.h> +#include <klocale.h> +#include <klistview.h> +#include <klineedit.h> +#include <kiconloader.h> +#include <kinputdialog.h> +#include <kconfig.h> + +#include <qgroupbox.h> +#include <qcheckbox.h> +#include <qlabel.h> +#include <qvbox.h> +#include <qhbox.h> +#include <qfileinfo.h> +#include <qtooltip.h> +#include <qpushbutton.h> +#include <qlayout.h> +#include <qcombobox.h> +#include <qwhatsthis.h> +#include <qtabwidget.h> +#include <qheader.h> + +SchemaConfig::SchemaConfig(QWidget *parent, Oblique *oblique) + : QWidget(parent) +{ + mOblique = oblique; + mIgnore = true; + mRegexpEditor=0; + + { + QVBoxLayout *layout = new QVBoxLayout(this, 11, 7); + layout->setAutoAdd(true); + layout->setSpacing(7); + } + + + { + QHBox *box = new QHBox(this); + box->setSpacing(7); + mSchemaList = new QComboBox(box); + connect( + mSchemaList, SIGNAL(activated(const QString&)), + SLOT(selectSchema(const QString&)) + ); + + mAdd = new QPushButton(BarIconSet("filenew"), 0, box); + mAdd->setFixedWidth(mAdd->height()); + QToolTip::add(mAdd, i18n("Create new schema")); + connect(mAdd, SIGNAL(clicked()), SLOT(newSchema())); + + mRemove = new QPushButton(BarIconSet("editdelete"), 0, box); + mRemove->setFixedWidth(mRemove->height()); + QToolTip::add(mRemove, i18n("Remove this schema")); + connect(mRemove, SIGNAL(clicked()), SLOT(removeSchema())); + + mCopy = new QPushButton(BarIconSet("editcopy"), 0, box); + mCopy->setFixedWidth(mCopy->height()); + QToolTip::add(mCopy, i18n("Copy this schema")); + connect(mCopy, SIGNAL(clicked()), SLOT(copySchema())); + } + + + { + QHBox *middle = new QHBox(this); + middle->setSpacing(7); + + mSchemaTree = new KListView(middle); + connect( + mSchemaTree, SIGNAL(currentChanged(QListViewItem*)), + SLOT(setCurrent(QListViewItem*)) + ); + connect( + mSchemaTree, SIGNAL(moved(QListViewItem *, QListViewItem *, QListViewItem *)), + SLOT(move(QListViewItem *, QListViewItem *, QListViewItem *)) + ); + + mSchemaTree->setAcceptDrops(true); + mSchemaTree->setSorting(-1); + mSchemaTree->setDropVisualizer(true); + mSchemaTree->setDragEnabled(true); + mSchemaTree->setItemsMovable(true); + + mSchemaTree->addColumn(i18n("Property")); + mSchemaTree->addColumn(i18n("Value")); + mSchemaTree->addColumn(i18n("Presentation")); + + QVBox *buttons = new QVBox(middle); + + mAddSibling = new QPushButton(BarIconSet("1rightarrow", KIcon::SizeSmall), "",buttons); + mAddSibling->setFixedWidth(mAddSibling->height()); + connect(mAddSibling, SIGNAL(clicked()), SLOT(addSibling())); + QToolTip::add(mAddSibling, i18n("Create a new item after the selected one")); + + mAddChild = new QPushButton(BarIconSet("2rightarrow", KIcon::SizeSmall), "", buttons); + mAddChild->setFixedWidth(mAddChild->height()); + connect(mAddChild, SIGNAL(clicked()), SLOT(addChild())); + QToolTip::add(mAddChild, i18n("Create a new child item under the selected one")); + + mRemoveSelf = new QPushButton(BarIconSet("filenew", KIcon::SizeSmall), "", buttons); + mRemoveSelf->setFixedWidth(mRemoveSelf->height()); + connect(mRemoveSelf, SIGNAL(clicked()), SLOT(removeSelf())); + QToolTip::add(mRemoveSelf, i18n("Remove the selected item")); + + new QWidget(buttons); + } + + + { + QVBox *side = new QVBox(this); + side->setSpacing(7); + // the controllers + { + QWidget *topSide = new QWidget(side); + QGridLayout *grid = new QGridLayout(topSide); + + QLabel *label; + + label = new QLabel(i18n("&Property:"), topSide); + mPropertyEdit = new KLineEdit(topSide); + label->setBuddy(mPropertyEdit); + grid->addWidget(label, 0, 0); + grid->addMultiCellWidget(mPropertyEdit, 0, 0, 1, 2); + connect(mPropertyEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent())); + + label = new QLabel(i18n("&Value:"), topSide); + mValueEdit = new KLineEdit(topSide); + label->setBuddy(mPropertyEdit); + grid->addWidget(label, 1, 0); + grid->addMultiCellWidget(mValueEdit, 1, 1, 1, 1); + connect(mValueEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent())); + + QPushButton *editRe = new QPushButton(i18n("&Edit..."), topSide); + grid->addWidget(editRe, 1, 2); + connect(editRe, SIGNAL(clicked()), SLOT(editValueRegexp())); + + label = new QLabel(i18n("Pre&sentation:"), topSide); + mPresentationEdit = new KLineEdit(topSide); + label->setBuddy(mPropertyEdit); + grid->addWidget(label, 2, 0); + grid->addMultiCellWidget(mPresentationEdit, 2, 2, 1, 2); + connect(mPresentationEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent())); + } + + { + QGroupBox *groupbox = new QGroupBox( + 3, Qt::Horizontal, i18n("Options"), side + ); + + mOptionPlayable = new QCheckBox(i18n("Play&able"), groupbox); + QWhatsThis::add(mOptionPlayable, i18n("This branch represents an individual file. If two items' presentation match, two items are created.")); + connect(mOptionPlayable, SIGNAL(toggled(bool)), SLOT(updateCurrent())); + + mOptionChildrenVisible = new QCheckBox(i18n("&Children visible"), groupbox); + QWhatsThis::add(mOptionChildrenVisible, i18n("Don't create this node, this nodes children become direct children of this node's parent")); + connect(mOptionChildrenVisible, SIGNAL(toggled(bool)), SLOT(updateCurrent())); + + mOptionAutoOpen = new QCheckBox(i18n("Auto &open"), groupbox); + QWhatsThis::add(mOptionAutoOpen, i18n("This branch is marked as open immediately.")); + connect(mOptionAutoOpen, SIGNAL(toggled(bool)), SLOT(updateCurrent())); + } + + } + +} + +class QueryGroupItem : public KListViewItem +{ + QueryGroup *mItem; + +public: + QueryGroupItem(QueryGroupItem *parent, QueryGroup *group, QueryGroupItem *after=0) + : KListViewItem(parent, after) + { + init(group); + } + + QueryGroupItem(KListView *parent, QueryGroup *group, QueryGroupItem *after=0) + : KListViewItem(parent, after) + { + init(group); + } + + QueryGroup *item() { return mItem; } + const QueryGroup *item() const { return mItem; } + + void redisplay() + { + setText(0, item()->propertyName()); + setText(1, item()->value().pattern()); + setText(2, item()->presentation()); + } + + QueryGroupItem *parent() + { return static_cast<QueryGroupItem*>(KListViewItem::parent()); } + + KListView *listView() + { return static_cast<KListView*>(KListViewItem::listView()); } + +private: + void init(QueryGroup *group) + { + mItem = group; + redisplay(); + + if (group->firstChild()) + new QueryGroupItem(this, group->firstChild(), this); + + // do siblings now iff I don't already have them + if (!nextSibling()) + { + if (QueryGroup *after = group->nextSibling()) + { + if (parent()) + new QueryGroupItem(parent(), after, this); + else + new QueryGroupItem(listView(), after, this); + } + } + + setOpen(true); + } +}; + + +void SchemaConfig::reopen() +{ + mSchemaList->clear(); + mQueries.clear(); + mSchemaTree->clear(); + + QStringList names = oblique()->schemaNames(); + QString firstTitle; + + for (QStringList::Iterator i(names.begin()); i != names.end(); ++i) + { + QueryItem qi; + qi.title = oblique()->loadSchema(qi.query, *i); + qi.changed = false; + mQueries.insert(*i, qi); + + if (!mSchemaList->count()) + firstTitle = qi.title; + mSchemaList->insertItem(qi.title); + } + selectSchema(firstTitle); + +} + +void SchemaConfig::save() +{ + for (QMap<QString,QueryItem>::Iterator i(mQueries.begin()); i != mQueries.end(); ++i) + { + QString name = i.key(); + name = QFileInfo(name).fileName(); + if (i.data().changed) + { + oblique()->saveSchema(i.data().query, name, i.data().title); + // TODO update the trees. + } + } +} + + +QString SchemaConfig::nameToFilename(const QString &_name) +{ + QString name = _name; + name = name.replace(QRegExp("[^a-zA-Z0-9]"), "_"); + return name; +} + +void SchemaConfig::newSchema() +{ + bool ok; + QString str=KInputDialog::getText( + i18n("Name of Schema"), + i18n("Please enter the name of the new schema:"), + "", &ok, this + ); + if (!ok) return; + + QString filename = nameToFilename(str); + + if (mQueries.contains(nameToFilename(filename))) return; + + QueryItem queryitem; + queryitem.query = Query(); + queryitem.title = str; + queryitem.changed=true; + mSchemaList->insertItem(str); + mQueries.insert(filename, queryitem); + + selectSchema(str); +} + +void SchemaConfig::copySchema() +{ + bool ok; + QString str=KInputDialog::getText( + i18n("Name of Schema"), + i18n("Please enter the name of the new schema:"), + "", &ok, this + ); + if (!ok) return; + + QString filename = nameToFilename(str); + + if (mQueries.contains(nameToFilename(filename))) return; + + QueryItem queryitem; + queryitem.query = currentQuery()->query; + queryitem.title = str; + queryitem.changed=true; + mSchemaList->insertItem(str); + mQueries.insert(filename, queryitem); + + selectSchema(str); +} + +void SchemaConfig::removeSchema() +{ + QueryItem *item = currentQuery(); + mSchemaList->removeItem(mSchemaList->currentItem()); + oblique()->removeSchema(nameToFilename(item->title)); + selectSchema(mSchemaList->currentText()); +} + +void SchemaConfig::selectSchema(const QString &title) +{ + mSchemaTree->clear(); + mSchemaList->setCurrentText(title); + + mIgnore = true; + if (QueryItem *grp = currentQuery()) + { + if (QueryGroup *g = grp->query.firstChild()) + new QueryGroupItem(mSchemaTree, g); + } + mSchemaTree->setCurrentItem(mSchemaTree->firstChild()); + setCurrent(mSchemaTree->firstChild()); + mSchemaTree->setSelected(mSchemaTree->firstChild(), true); + mIgnore=false; +} + +void SchemaConfig::editValueRegexp() +{ + unless (mRegexpEditor) + { + mRegexpEditor = + KParts::ComponentFactory::createInstanceFromQuery<QDialog>( + "KRegExpEditor/KRegExpEditor", QString::null, this + ); + } + + if ( mRegexpEditor ) + { + KRegExpEditorInterface *iface = + static_cast<KRegExpEditorInterface*>( + mRegexpEditor->qt_cast( "KRegExpEditorInterface") + ); + + iface->setRegExp(mValueEdit->text()); + if (mRegexpEditor->exec() == QDialog::Accepted) + mValueEdit->setText(iface->regExp()); + } +} + +void SchemaConfig::setCurrent(QListViewItem *_item) +{ + if (!_item) return; + QueryGroupItem *item = static_cast<QueryGroupItem*>(_item); + mIgnore = true; + mPropertyEdit->setText(item->item()->propertyName()); + mValueEdit->setText(item->item()->value().pattern()); + mPresentationEdit->setText(item->item()->presentation()); + + mOptionPlayable->setChecked(item->item()->option(QueryGroup::Playable)); + mOptionAutoOpen->setChecked(item->item()->option(QueryGroup::AutoOpen)); + mOptionChildrenVisible->setChecked(item->item()->option(QueryGroup::ChildrenVisible)); + mIgnore = false; +} + + +void SchemaConfig::updateCurrent() +{ + QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem()); + if (mIgnore || !item) return; + setCurrentModified(); + + QueryGroup *mod = item->item(); + + mod->setPropertyName(mPropertyEdit->text()); + mod->setPresentation(mPresentationEdit->text()); + mod->setValue(QRegExp(mValueEdit->text())); + + mod->setOption(QueryGroup::AutoOpen, mOptionAutoOpen->isChecked()); + mod->setOption(QueryGroup::Playable, mOptionPlayable->isChecked()); + mod->setOption(QueryGroup::ChildrenVisible, mOptionChildrenVisible->isChecked()); + item->redisplay(); +} + +void SchemaConfig::move(QListViewItem *_item, QListViewItem *, QListViewItem *_afterNow) +{ + setCurrentModified(); + QueryGroupItem *item = static_cast<QueryGroupItem*>(_item); + QueryGroupItem *afterNow = static_cast<QueryGroupItem*>(_afterNow); + + QueryGroup *after, *under; + under = item->parent() ? item->parent()->item() : 0; + after = afterNow ? afterNow->item() : 0; + + item->item()->move(¤tQuery()->query, under, after); +} + + +void SchemaConfig::addSibling() +{ + QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem()); + unless (item) + { + addChild(); + return; + } + setCurrentModified(); + + // add it + QueryGroup * g = new QueryGroup; + item->item()->insertAfter(g); + + // now match the action in the tree + QueryGroupItem *created; + if (item->parent()) + created = new QueryGroupItem(item->parent(), g, item); + else + created = new QueryGroupItem(item->listView(), g, item); + + // select it so the user can edit it now + item->listView()->setCurrentItem(created); + item->listView()->setSelected(created, true); +} + + +void SchemaConfig::addChild() +{ + QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem()); + setCurrentModified(); + + // add it + QueryGroup * g = new QueryGroup; + if (item) + item->item()->insertUnder(g); + else + currentQuery()->query.setFirstChild(g); + + // now match the action in the tree + QueryGroupItem *created; + if (item) + created = new QueryGroupItem(item, g); + else + created = new QueryGroupItem(mSchemaTree, g); + + // select it so the user can edit it now + mSchemaTree->setCurrentItem(created); + mSchemaTree->setSelected(created, true); +} + +void SchemaConfig::removeSelf() +{ + setCurrentModified(); + QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem()); + unless (item) return; + QueryGroup *grp = item->item(); + delete item; + currentQuery()->query.take(grp); + delete grp; +} + +void SchemaConfig::setCurrentModified() +{ + if (QueryItem *grp = currentQuery()) + grp->changed = true; +} + +SchemaConfig::QueryItem *SchemaConfig::currentQuery() +{ + QString title = mSchemaList->currentText(); + for (QMap<QString,QueryItem>::Iterator i(mQueries.begin()); i != mQueries.end(); ++i) + { + if (i.data().title != title) continue; + return &i.data(); + } + return 0; +} + + +SliceConfig::SliceConfig(QWidget *parent, Oblique *oblique) + : QWidget(parent) +{ + mOblique = oblique; + (new QVBoxLayout(this, 11, 7))->setAutoAdd(true); + + { + QHBox *middle = new QHBox(this); + middle->setSpacing(7); + + mSliceList = new KListView(middle); + QWhatsThis::add(mSliceList, i18n("The list of slices. A Slice is part of the full collection. This allows you to categorize your playlist. You can add an item to the list by right clicking on it and selecting the Slice you want it in.")); + mSliceList->addColumn(""); + mSliceList->header()->hide(); + + mSliceList->setSorting(0); + mSliceList->setItemsRenameable(true); + + QVBox *buttons = new QVBox(middle); + + mAdd = new QPushButton(BarIconSet("1rightarrow", KIcon::SizeSmall), "",buttons); + mAdd->setFixedWidth(mAdd->height()); + connect(mAdd, SIGNAL(clicked()), SLOT(addSibling())); + QToolTip::add(mAdd, i18n("Create a new item")); + + mRemove = new QPushButton(BarIconSet("filenew", KIcon::SizeSmall), "", buttons); + mRemove->setFixedWidth(mRemove->height()); + connect(mRemove, SIGNAL(clicked()), SLOT(removeSelf())); + QToolTip::add(mRemove, i18n("Remove the selected item")); + + new QWidget(buttons); + } +} + + +class SliceListItem : public KListViewItem +{ + Slice *mSlice; +public: + SliceListItem(KListView *parent, Slice *slice) + : KListViewItem(parent, slice->name()), mSlice(slice) + { + } + + /** + * new item + **/ + SliceListItem(KListView *parent) + : KListViewItem(parent, i18n("New Slice")), mSlice(0) + { + } + + Slice *slice() { return mSlice; } +}; + +SliceListItem *SliceConfig::currentItem() +{ + QListViewItem *c = mSliceList->currentItem(); + return static_cast<SliceListItem*>(c); +} + + +void SliceConfig::reopen() +{ + mSliceList->clear(); + mRemovedItems.clear(); + mAddedItems.clear(); + + QPtrList<Slice> slices = oblique()->base()->slices(); + + for (QPtrListIterator<Slice> i(slices); *i; ++i) + { + Slice *slice = *i; + new SliceListItem(mSliceList, slice); + } +} + +void SliceConfig::save() +{ + for ( + QValueList<Slice*>::Iterator i(mRemovedItems.begin()); + i != mRemovedItems.end(); + ++i + ) + { + (*i)->remove(); + delete *i; + } + + for ( + QValueList<SliceListItem*>::Iterator i(mAddedItems.begin()); + i != mAddedItems.end(); + ++i + ) + { + oblique()->base()->addSlice((*i)->text(0)); + } + + for (QListViewItem *i = mSliceList->firstChild(); i; i = i->nextSibling()) + { + SliceListItem *si = static_cast<SliceListItem*>(i); + + if (si->slice()) + { + si->slice()->setName(si->text(0)); + } + } + + reopen(); +} + + +void SliceConfig::addSibling() +{ + SliceListItem *si = new SliceListItem(mSliceList); + mAddedItems.append(si); +} + +void SliceConfig::removeSelf() +{ + SliceListItem *r = currentItem(); + if (mAddedItems.contains(r)) + { + mAddedItems.remove(r); + } + else + { + Q_ASSERT(r->slice()); + mRemovedItems.append(r->slice()); + } + + delete r; +} + + + +Configure::Configure(Oblique *oblique) + : CModule(i18n("Oblique"), i18n("Configure Oblique Playlist"), "", oblique) +{ + (new QVBoxLayout(this))->setAutoAdd(true); + tabs = new QTabWidget(this); + + tabs->addTab(slice = new SliceConfig(tabs, oblique), i18n("Slices")); + tabs->addTab(schema = new SchemaConfig(tabs, oblique), i18n("Schemas")); +} + +void Configure::reopen() +{ + schema->reopen(); + slice->reopen(); +} + +void Configure::save() +{ + schema->save(); + slice->save(); +} + + +#include "cmodule.moc" + diff --git a/noatun-plugins/oblique/cmodule.h b/noatun-plugins/oblique/cmodule.h new file mode 100644 index 0000000..f60c6c3 --- /dev/null +++ b/noatun-plugins/oblique/cmodule.h @@ -0,0 +1,123 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef CMODULE_H +#define CMODULE_H + +#include <noatun/pref.h> +#include "query.h" + +class KListView; +class KLineEdit; +class QDialog; +class Oblique; +class QCheckBox; +class QComboBox; +class QPushButton; +class QTabWidget; + +class SchemaConfig : public QWidget +{ +Q_OBJECT + Oblique *mOblique; + + KListView *mSchemaTree; + KLineEdit *mPropertyEdit, *mValueEdit, *mPresentationEdit; + QComboBox *mSchemaList; + + QCheckBox *mOptionPlayable, *mOptionChildrenVisible, *mOptionAutoOpen; + + QPushButton *mAdd, *mRemove, *mCopy; + + QPushButton *mAddSibling, *mAddChild, *mRemoveSelf; + + QDialog *mRegexpEditor; + bool mIgnore; + + struct QueryItem + { + Query query; + QString title; + bool changed; + }; + + QMap<QString, QueryItem> mQueries; + +public: + SchemaConfig(QWidget *parent, Oblique *oblique); + + Oblique *oblique() { return mOblique; } + + void reopen(); + void save(); + + static QString nameToFilename(const QString &name); + static QString filenameToName(const QString &filename); + +public slots: + void newSchema(); + void copySchema(); + void removeSchema(); + + void selectSchema(const QString &title); + + void addSibling(); + void addChild(); + void removeSelf(); + + void setCurrentModified(); + +private slots: + void editValueRegexp(); + + void setCurrent(QListViewItem *_item); + void updateCurrent(); + + void move(QListViewItem *item, QListViewItem *afterFirst, QListViewItem *afterNow); + +private: + QueryItem *currentQuery(); +}; + +class SliceListItem; + +class SliceConfig : public QWidget +{ +Q_OBJECT + Oblique *mOblique; + KListView *mSliceList; + QPushButton *mAdd, *mRemove; + QValueList<SliceListItem*> mAddedItems; + QValueList<Slice*> mRemovedItems; + +public: + SliceConfig(QWidget *parent, Oblique *oblique); + Oblique *oblique() { return mOblique; } + + void reopen(); + void save(); + + + SliceListItem *currentItem(); + +private slots: + void addSibling(); + void removeSelf(); +}; + +class Configure : public CModule +{ +Q_OBJECT + QTabWidget *tabs; + SchemaConfig *schema; + SliceConfig *slice; + +public: + Configure(Oblique *parent); + + virtual void reopen(); + virtual void save(); +}; + + +#endif diff --git a/noatun-plugins/oblique/configure.in.in b/noatun-plugins/oblique/configure.in.in new file mode 100644 index 0000000..7b7493f --- /dev/null +++ b/noatun-plugins/oblique/configure.in.in @@ -0,0 +1,30 @@ +AC_ARG_WITH(berkeley-db, + [AC_HELP_STRING([--with-berkeley-db],[enable support for Berkeley DB++ @<:@default=check@:>@])], + [], with_berkeley_db=check) + +AC_ARG_WITH(db-lib, + [AC_HELP_STRING([--with-db-lib=NAME],[name of the Berkeley DB++ library @<:@default=db_cxx@:>@])], + [ac_db_name="$withval"], [ac_db_name="db_cxx"]) + +berkeley_db=no +if test "x$with_berkeley_db" != xno; then + berkeley_db=yes + + KDE_CHECK_HEADER([db_cxx.h], + [:], [berkeley_db=no]) + + AC_CHECK_LIB([$ac_db_name], [main], + [:], [berkeley_db=no]) + + if test "x$berkeley_db" = xyes; then + AC_DEFINE(BERKELEY_DB, 1, [Define if you have Berkeley DB++ installed]) + BERKELEY_DB_LIBS="-l$ac_db_name" + AC_SUBST(BERKELEY_DB_LIBS) + fi + + if test "x$with_berkeley_db" != xcheck && test "x$berkeley_db" != xyes; then + AC_MSG_ERROR([--with-berkeley-db was given, but test for Berkeley DB++ failed]) + fi +fi + +AM_CONDITIONAL(include_BERKELEY_DB, test "$berkeley_db" = yes) diff --git a/noatun-plugins/oblique/file.cpp b/noatun-plugins/oblique/file.cpp new file mode 100644 index 0000000..b478e0f --- /dev/null +++ b/noatun-plugins/oblique/file.cpp @@ -0,0 +1,248 @@ +// Copyright (c) 2003-2004 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "file.h" +#include "selector.h" +#include "query.h" + +#include <iostream> + +#include <klocale.h> +#include <kfilemetainfo.h> +#include <kmimetype.h> + + +File::File(Base *base, FileId id) +{ + mBase = base; + mId = id; + +} + +File::File(const File &ref) +{ + operator =(ref); +} + +File::File() +{ + mBase=0; + mId = 0; +} + +File &File::operator=(const File &ref) +{ + mBase = ref.mBase; + mId = ref.mId; + + return *this; +} + +QString File::file() const +{ + return property("file"); +} + +KURL File::url() const +{ + KURL url; + url.setPath(file()); + return url; +} + +struct Map { const char *kfmi; const char *noatun; }; +static const Map propertyMap[] = +{ + { "Title", "ob::title_" }, + { "Artist", "ob::author_" }, + { "Album", "ob::album_" }, + { "Genre", "ob::genre_" }, + { "Tracknumber", "ob::track_" }, + { "Date", "ob::date_" }, + { "Comment", "ob::comment_" }, + { "Location", "ob::location_" }, + { "Organization", "ob::organization_" }, + { "Bitrate", "ob::bitrate_" }, + { "Sample Rate", "ob::samplerate_" }, + { "Channels", "ob::channels_" }, + { 0, 0 } +}; + +QString File::property(const QString &property) const +{ + QString str = base()->property(id(), property); + + if (!str) + { + QString mangled = "ob::" + property + "_"; + str = base()->property(id(), mangled); + } + + return str; +} + + +void File::makeCache() +{ + setProperty("ob::mimetype_", KMimeType::findByPath(file())->name()); + KFileMetaInfo info(file()); + + for (int i=0; propertyMap[i].kfmi; i++) + { + QString kname(propertyMap[i].kfmi); + if (info.isValid() && kname.length()) + { + QString val = info.item(kname).string(false); + if (val=="---" || !val.stripWhiteSpace().length()) + { // grr + val = ""; + } + if (val.length()) + { + setProperty(propertyMap[i].noatun, val); + } + } + } +} + + +void File::setProperty(const QString &key, const QString &value) +{ + if (property(key) == value) return; + base()->setProperty(id(), key, value); + PlaylistItem p=new Item(*this); + p.data()->modified(); +} + +void File::clearProperty(const QString &key) +{ + if (property(key).isNull()) return; + base()->clearProperty(id(), key); + PlaylistItem p=new Item(*this); + p.data()->modified(); +} + +QStringList File::properties() const +{ + QStringList l = base()->properties(id()); + + for (int i=0; propertyMap[i].noatun; i++) + { + if (property(propertyMap[i].noatun).length()) + { + l += propertyMap[i].noatun; + } + } + return l; +} + +void File::setId(FileId id) +{ + base()->move(mId, id); + mId = id; +} + + +void File::setPosition(Query *query, const File &after) +{ + setProperty( + "Oblique:after_" + query->name() + '_', + QString::number(after.id()) + ); +} + +bool File::getPosition(const Query *query, File *after) const +{ + assert(query); + assert(after); + QString name = "Oblique:after_" + query->name() + '_'; + if (name.isEmpty()) return false; + + QString val = property(name); + if (val.isEmpty()) + return false; + *after = File(mBase, val.toUInt()); + return true; +} + + +void File::remove() +{ + PlaylistItem p=new Item(*this); + p.data()->removed(); + mBase->remove(*this); +} + +void File::addTo(Slice *slice) +{ + QString slices = property("Oblique:slices_"); + slices += "\n" + QString::number(slice->id(), 16); + setProperty("Oblique:slices_", slices); + emit mBase->addedTo(slice, *this); +} + +void File::removeFrom(Slice *slice) +{ + QString slices = property("Oblique:slices_"); + QStringList sliceList = QStringList::split('\n', slices); + QString sid = QString::number(slice->id(), 16); + sliceList.remove(sid); + + slices = sliceList.join("\n"); + setProperty("Oblique:slices_", slices); + emit mBase->removedFrom(slice, *this); +} + +bool File::isIn(const Slice *slice) const +{ + int id = slice->id(); + if (id==0) return true; + + QString slices = property("Oblique:slices_"); + QStringList sliceList = QStringList::split('\n', slices); + for (QStringList::Iterator i(sliceList.begin()); i!= sliceList.end(); ++i) + { + if ((*i).toInt(0, 16) == id) return true; + } + return false; +} + + + +Slice::Slice(Base *base, int id, const QString &name) +{ + mId = id; + mBase = base; + mName = name; +} + +QString Slice::name() const +{ + if (mId == 0) return i18n("Complete Collection"); + return mName; +} + +void Slice::setName(const QString &name) +{ + if (mId == 0) return; + mName = name; + emit mBase->slicesModified(); +} + +void Slice::remove() +{ + if (mId == 0) return; + mBase->removeSlice(this); + Base *base = mBase; + + for (FileId fi=1; ; fi++) + { + File f = base->first(fi); + f.removeFrom(this); + fi = f.id(); + } + emit base->slicesModified(); +} + + + diff --git a/noatun-plugins/oblique/file.h b/noatun-plugins/oblique/file.h new file mode 100644 index 0000000..21d3be9 --- /dev/null +++ b/noatun-plugins/oblique/file.h @@ -0,0 +1,115 @@ +// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef FILE_H +#define FILE_H + +#include "base.h" +#include <kurl.h> + + +class Slice; +class Query; + +/** + * just an file from the list in the database + **/ +class File +{ + + friend class Base; + File(Base *base, FileId id); + + mutable Base *mBase; + FileId mId; + +public: + /** + * create a copy of the reference + **/ + File(const File &ref); + /** + * create a null reference + **/ + File(); + + /** + * make me a copy of the reference + **/ + File &operator=(const File &ref); + + bool operator ==(const File &other) { return mId == other.mId; } + + inline operator bool() const { return mId; } + + QString file() const; + KURL url() const; + QString property(const QString &property) const; + void setProperty(const QString &key, const QString &value); + void clearProperty(const QString &key); + QStringList properties() const; + inline FileId id() const { return mId; } + void setId(FileId id); + + inline Base *base() { return mBase; } + inline const Base *base() const { return mBase; } + + /** + * when displaying me in @p query, place + * me immediately after @p after + **/ + void setPosition(Query *query, const File &after); + + /** + * when displaying @p query, set @p after according + * to what @ref setPosition was given. + * + * @return false if no position was set + **/ + bool getPosition(const Query *query, File *after) const; + + /** + * remove this file from the db, and emit Base::removed(File) + * the File objects don't change, but become invalid (careful!) + **/ + void remove(); + + void addTo(Slice *slice); + void removeFrom(Slice *slice); + bool isIn(const Slice *slice) const; + + /** + * load the tag information into the DB + **/ + void makeCache(); +}; + +class Slice +{ + int mId; + QString mName; + Base *mBase; + +public: + /** + * @internal + * create a slice based on its data + **/ + Slice(Base *base, int id, const QString &name); + + QString name() const; + void setName(const QString &name); + + /** + * remove this slice from the list of slices + * and dereference all Files from this slice + **/ + void remove(); + + int id() const { return mId; } +}; + + + + +#endif diff --git a/noatun-plugins/oblique/kbuffer.cpp b/noatun-plugins/oblique/kbuffer.cpp new file mode 100644 index 0000000..f54110e --- /dev/null +++ b/noatun-plugins/oblique/kbuffer.cpp @@ -0,0 +1,87 @@ +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002 +// +// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html + +#include "kbuffer.h" +#include <algorithm> +#include <iostream> +#include <iomanip> + +KBuffer::KBuffer() +{ + bufPos = buf.end(); // will become 0 in the beginning +} + +KBuffer::~KBuffer(){ +} + +/** open a memory buffer */ +bool KBuffer::open(int ) { + // ignore mode + buf.erase(buf.begin(), buf.end()); // erase buffer + buf.reserve(8); // prevent iterators from ever being 0 and start with a reasonable mem + bufPos = buf.end(); // reset position + return true; +} + +/** Close buffer */ +void KBuffer::close(){ +} + +/** No descriptions */ +void KBuffer::flush(){ +} + +/** query buffer size */ +Q_ULONG KBuffer::size() const { + return buf.size(); +} + +/** read a block of memory from buffer, advances read/write position */ +Q_LONG KBuffer::readBlock(char* data, long unsigned int maxLen) { + int len; + if ((long unsigned)(buf.end()-bufPos) > maxLen) + len = maxLen; + else + len = buf.end()-bufPos; + std::vector<char>::iterator bufPosNew = bufPos + len; + for (std::vector<char>::iterator it=bufPos; it < bufPosNew; it++, data++) + *data = *it; + bufPos = bufPosNew; + return len; +} + +/** write a block of memory into buffer */ +Q_LONG KBuffer::writeBlock(const char *data, long unsigned int len){ + int pos = bufPos-buf.begin(); + copy(data, data+len, inserter(buf,bufPos)); + bufPos = buf.begin() + pos + len; + return len; +} + +/** read a byte */ +int KBuffer::getch() { + if (bufPos!=buf.end()) + return *(bufPos++); + else + return -1; +} + +/** write a byte */ +int KBuffer::putch(int c) { + int pos = bufPos-buf.begin(); + buf.insert(bufPos, c); + bufPos = buf.begin() + pos + 1; + return c; +} + +/** undo last getch() + */ +int KBuffer::ungetch(int c) { + if (bufPos!=buf.begin()) { + bufPos--; + return c; + } + else + return -1; +} diff --git a/noatun-plugins/oblique/kbuffer.h b/noatun-plugins/oblique/kbuffer.h new file mode 100644 index 0000000..adc62ba --- /dev/null +++ b/noatun-plugins/oblique/kbuffer.h @@ -0,0 +1,48 @@ +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002 +// +// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html + +#ifndef KBUFFER_H +#define KBUFFER_H + +#include <qiodevice.h> +#include <vector> +#include <queue> + +/**A buffer device for flexible and efficient buffers. + + *@author Eray Ozkural (exa) + */ + +class KBuffer : public QIODevice { +public: + KBuffer(); + ~KBuffer(); + /** open a memory buffer */ + bool open(int mode); + /** read in a block of memory */ + Q_LONG readBlock(char* data, long unsigned int maxLen); + /** query buffer size */ + Q_ULONG size() const; + /** No descriptions */ + void flush(); + /** Close buffer */ + void close(); + /** write a block of memory */ + Q_LONG writeBlock(const char *data, long unsigned int maxLen); + /** read a byte */ + int getch(); + /** undo last getch() + */ + int ungetch(int); + /** write a byte */ + int putch(int); + void* data() { + return &buf[0]; + } +private: + std::vector<char> buf; + std::vector<char>::iterator bufPos; +}; + +#endif diff --git a/noatun-plugins/oblique/kdatacollection.cpp b/noatun-plugins/oblique/kdatacollection.cpp new file mode 100644 index 0000000..9e2ddac --- /dev/null +++ b/noatun-plugins/oblique/kdatacollection.cpp @@ -0,0 +1,143 @@ +/* + This file is part of the KDE libraries + Copyright (C) 2003 Charles Samuels <charles@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kdatacollection.h" + +#include <kconfig.h> +#include <kglobal.h> +#include <kstandarddirs.h> + +#include <qfile.h> +#include <qfileinfo.h> + + +KDataCollection::KDataCollection( + KConfig *config, const QString &group, const QString &entry, + const char *datadir, const QString &dir + ) +{ + init(config, group, entry, datadir, dir); +} + +KDataCollection::KDataCollection( + KConfig *config, const QString &group, const QString &entry, + const QString &dir + ) +{ + init(config, group, entry, "appdata", dir); +} + +KDataCollection::KDataCollection( + KConfig *config, const QString &group, const QString &dir + ) +{ + init(config, group, dir, "appdata", dir); +} + +KDataCollection::KDataCollection(KConfig *config, const QString &dir) +{ + init(config, "KDataCollection", dir, "appdata", dir); +} + +KDataCollection::KDataCollection(const QString &dir) +{ + init(KGlobal::config(), "KDataCollection", dir, "appdata", dir); +} + +void KDataCollection::init( + KConfig *config, const QString &group, const QString &entry, + const char *datadir, const QString &dir + ) +{ + mConfig = config; + mGroup = group; + mEntry = entry; + mDir = dir; + mDatadir = datadir; +} + +QStringList KDataCollection::names() const +{ + KConfigGroup g(mConfig, mGroup); + + // these are the entries I have + QStringList n = g.readListEntry(mEntry); + QStringList fs = KGlobal::dirs()->findAllResources(mDatadir, mDir+"/*", false, true); + QStringList total; + + for (QStringList::Iterator i(fs.begin()); i != fs.end(); ++i) + { + QFileInfo fi(*i); + QString name = fi.fileName(); + if (!n.contains(name)) + { + total.append(name); + } + } + + return total; +} + +void KDataCollection::remove(const QString &name) +{ + KConfigGroup g(mConfig, mGroup); + QString location = file(name); + if (location.isEmpty()) return; + if (location == saveFile(name, false)) + { + QFile(location).remove(); + // is there a system one too? + location = file(name, false); + if (location.isEmpty()) return; + } + + QStringList n = g.readListEntry(mEntry); + if (n.contains(name)) return; + n.append(name); + g.writeEntry(mEntry, n); +} + +QString KDataCollection::file(const QString &name, bool create) +{ + QString path = ::locate(mDatadir, mDir+"/"+name); + + if (path.isEmpty() && create) + { + path = saveFile(name, true); + } + return path; +} + +QString KDataCollection::saveFile(const QString &name, bool create) +{ + if (!KGlobal::dirs()->isRestrictedResource(mDatadir, mDir+"/"+name)) + { + QString s = KGlobal::dirs()->saveLocation(mDatadir, mDir, create); + + if (s.length() && create) + { + s += "/" + name; + QFile(s).open(IO_ReadWrite); // create it + } + return s; + } + return QString::null; +} + + diff --git a/noatun-plugins/oblique/kdatacollection.h b/noatun-plugins/oblique/kdatacollection.h new file mode 100644 index 0000000..e8820f3 --- /dev/null +++ b/noatun-plugins/oblique/kdatacollection.h @@ -0,0 +1,144 @@ +/* + This file is part of the KDE libraries + Copyright (C) 2003 Charles Samuels <charles@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KDATACOLLECTION_H +#define KDATACOLLECTION_H + +#include <qstring.h> +#include <qstringlist.h> + +class KConfig; + +/** + * This class allows you to have a set of files. Some of which can be included + * with your application, and some can be created by your users. + * Examples of a use for this function can be: + *<ul> + * <li>Noatun's Equalizer preset: Each Equalizer preset is in its own XML + * file, and the user can delete, create new ones, and modify old ones</li> + *</ul> + * + *<pre> + * KDataCollection profiles("appname/ui_profiles"); + * QStringList letUserSelectOne = profiles.names(); + * QString fileToOpen = profiles.file(theOneUserSelected); + * QString fileToWriteTo = profiles.saveFile(theOneUserSelected); + *</pre> + * + * @author Charles Samuels <charles@kde.org> + **/ +class KDataCollection +{ + KConfig *mConfig; + QString mGroup, mEntry, mDir; + const char *mDatadir; + + struct Private; + Private *d; + +public: + /** + * constructor. This gives you most control over the destination of + * settings, @p dir is the second argument to locate(datadir, ...) + * + * @param datadir is what is passed to locate, this is "appdata" by default + **/ + KDataCollection( + KConfig *config, const QString &group, const QString &entry, + const char *datadir, const QString &dir + ); + + /** + * constructor. This gives you most control over the destination of + * settings, @p dir is the second argument to locate("appdata", ...) + **/ + KDataCollection( + KConfig *config, const QString &group, const QString &entry, + const QString &dir + ); + + /** + * constructor. The entry in the KConfig group will be named the same as + * @p dir. + * + * otherwise the same as the previous function + **/ + KDataCollection( + KConfig *config, const QString &group, + const QString &dir + ); + + /** + * constructor. The group will be "KDataCollection", The entry in the + * KConfig group will be named the same as + * @p dir. + * + * otherwise the same as the previous function + **/ + KDataCollection(KConfig *config, const QString &dir); + + /** + * constructor. the KConfig is assumed to be KGlobal::config() + * + * otherwise the same as the previous function + **/ + KDataCollection(const QString &dir); + + + /** + * returns a list of existant, non hidden files + **/ + QStringList names() const; + + /** + * deletes the file if it is in KDEHOME, or marks it as hidden if it's a + * system file + **/ + void remove(const QString &name); + + /** + * @returns the filename for a file named @p name, if @p create + * is true, it will create the file if it doesn't exist, if @p create is false, + * it will return an empty string, unless the file already exists + * + * if you want to modify this file, you should use saveFile instead + **/ + QString file(const QString &name, bool create=true); + + /** + * @returns the filename for a file you can save into. If @p create is + * false, it'll return an empty string if the file doesn't already exist in + * KDEHOME + * + * This function will not create the file, only return what the name is in + * theory. + * + * It will not return a file if the Kiosk framework claims that it's + * restricted + **/ + QString saveFile(const QString &name, bool create=true); + +private: + void init( + KConfig *config, const QString &group, const QString &entry, + const char *datadir, const QString &dir + ); +}; + +#endif diff --git a/noatun-plugins/oblique/kdbt.h b/noatun-plugins/oblique/kdbt.h new file mode 100644 index 0000000..acaae57 --- /dev/null +++ b/noatun-plugins/oblique/kdbt.h @@ -0,0 +1,59 @@ +// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002 +// +// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html + + +#ifndef KDbt_Interface +#define KDbt_Interface + +#include <db_cxx.h> +#include <qdatastream.h> +#include <qbuffer.h> +#include "kbuffer.h" + +/**A generic wrapper for "database thang" class that abstracts binary streaming operations. + *@author Eray Ozkural (exa) + */ + +template <typename T> +class KDbt : public Dbt { +public: + /* assume streaming operators on QDataStream + QDataStream & operator>> ( QDataStream& >>, T &); + QDataStream & operator<< ( QDataStream& >>, T &); + */ + KDbt() { + } + /** construct a Dbt from obj */ + KDbt(const T& obj) { + set(obj); + } +// operator Dbt() { +// return Dbt(thang.data(), thang.size()); +// } + /** set "thang" to the contents of obj */ + void set(const T& obj) { +// KBuffer buffer(thang); + QDataStream ds(&thang); + ds << obj; +// std::cerr << "thang size " << thang.size() << endl; +// buffer.close(); +// set_data(thang.data()); +// set_size(buffer.size()); + set_data(thang.data()); + set_size(thang.size()); + } + void get(T& obj) { + QByteArray buffer; + buffer.setRawData((char*)get_data(),get_size()); + QDataStream ds(buffer,IO_ReadWrite); + ds >> obj; + buffer.resetRawData((char*)get_data(),get_size()); + } +private: + /** Internal data */ +// QByteArray thang; + KBuffer thang; +}; + +#endif diff --git a/noatun-plugins/oblique/menu.cpp b/noatun-plugins/oblique/menu.cpp new file mode 100644 index 0000000..0556d88 --- /dev/null +++ b/noatun-plugins/oblique/menu.cpp @@ -0,0 +1,231 @@ +// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "menu.h" +#include <kiconloader.h> +#include <klocale.h> + +#include "tree.h" + +FileMenu::FileMenu(QWidget *parent, Oblique *oblique, File file) + : KPopupMenu(parent) +{ + if (file) + mFiles.append(file); + insertItem( + BarIconSet("delete"), i18n("&Remove From Playlist"), + this, SLOT(removeFromList()) + ); + insertItem(i18n("&Properties"), this, SLOT(properties())); + + (new SliceListAction( + i18n("&Slices"), oblique, + this, SLOT(toggleInSlice(Slice *)), + mFiles, this + ))->plug(this); +} + +static void addTo(QValueList<File> &files, TreeItem *item) +{ + File f = item->file(); + if (f) files.append(f); + + item = item->firstChild(); + + while (item) + { + addTo(files, item); + item = item->nextSibling(); + } +} + +FileMenu::FileMenu(QWidget *parent, Oblique *oblique, TreeItem *items) + : KPopupMenu(parent) +{ + addTo(mFiles, items); + + insertItem( + BarIconSet("delete"), i18n("&Remove From Playlist"), + this, SLOT(removeFromList()) + ); + insertItem(i18n("&Properties"), this, SLOT(properties())); + + (new SliceListAction( + i18n("&Slices"), oblique, + this, SLOT(toggleInSlice(Slice *)), + mFiles, this + ))->plug(this); +} + +void FileMenu::removeFromList() +{ + for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i) + { + (*i).remove(); + } +} + +void FileMenu::properties() +{ + new ObliquePropertiesDialog(mFiles, parentWidget()); +} + +void FileMenu::toggleInSlice(Slice *slice) +{ + void (File::*task)(Slice*)=0; + for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i) + { + if (!task) + { // we check with the first one + if ((*i).isIn(slice)) + task = &File::removeFrom; + else + task = &File::addTo; + } + + ((*i).*task)(slice); + } +} + + + +SliceListAction::SliceListAction( + const QString &text, Oblique *oblique, + QObject *reciever, const char *slot, + const QValueList<File> &files, QObject *parent, const char *name + ) : KActionMenu(text, parent, name) +{ + mFiles = files; + mOblique = oblique; + slicesModified(); + if (reciever) + connect(this, SIGNAL(activated(Slice*)), reciever, slot); + connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int))); + connect(oblique->base(), SIGNAL(slicesModified()), SLOT(slicesModified())); +} + +void SliceListAction::slicesModified() +{ + mIndexToSlices.clear(); + KPopupMenu *menu = popupMenu(); + menu->clear(); + + QPtrList<Slice> slices = mOblique->base()->slices(); + int id=1; + + + + for (QPtrListIterator<Slice> i(slices); *i; ++i) + { + Slice *s = *i; + if (s->id()==0 && mFiles.count()) + { + continue; + } + + menu->insertItem(s->name(), id); + if (mFiles.count()) + { + menu->setItemChecked(id, mFiles.first().isIn(s)); + } +// else if (mOblique->slice() == s) // TODO: show the selected one +// { +// menu->setItemChecked(id, true); +// } + + if (mFiles.count() && s->id() == 0) + { + menu->setItemEnabled(id, false); + } + + mIndexToSlices.insert(id, s); + id++; + } +} + +void SliceListAction::hit(int index) +{ + emit activated(mIndexToSlices[index]); +} + + + +SchemaListAction::SchemaListAction( + const QString &text, + QObject *reciever, const char *slot, + QObject *parent, const char *name + ) : KActionMenu(text, parent, name) +{ + mTree = 0; + if (reciever) + connect(this, SIGNAL(activated(const QString&)), reciever, slot); + connect(popupMenu(), SIGNAL(aboutToShow()), SLOT(prepare())); + connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int))); +} + +void SchemaListAction::prepare() +{ + assert(mTree); + mIndexToSchemas.clear(); + KPopupMenu *menu = popupMenu(); + menu->clear(); + + if (!mTree) return; + + int id=1; + + QStringList names = mTree->oblique()->schemaNames(); + + for (QStringList::Iterator i(names.begin()); i != names.end(); ++i) + { + Query q; + QString title = mTree->oblique()->loadSchema(q, *i); + + menu->insertItem(title, id); + + menu->setItemChecked(id, mTree->fileOfQuery() == *i); + + mIndexToSchemas.insert(id, *i); + id++; + } +} + +void SchemaListAction::hit(int index) +{ + emit activated(mIndexToSchemas[index]); +} + + + +ObliquePropertiesDialog::ObliquePropertiesDialog(const QValueList<File> &files, QWidget *parent) + : KPropertiesDialog(makeItems(files), parent), mFiles(files) +{ + connect(this, SIGNAL(propertiesClosed()), SLOT(deleteLater())); + connect(this, SIGNAL(applied()), SLOT(modified())); + + show(); +} + +void ObliquePropertiesDialog::modified() +{ + // TODO reload the file's info + for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i) + { + (*i).makeCache(); + (*i).base()->notifyChanged(*i); + } +} + +KFileItemList ObliquePropertiesDialog::makeItems(const QValueList<File> &files) +{ + KFileItemList kl; + for (QValueList<File>::ConstIterator i(files.begin()); i != files.end(); ++i) + { + File f = *i; + kl.append(new KFileItem(f.url(), f.property("mimetype"), KFileItem::Unknown)); + } + return kl; +} + +#include "menu.moc" + diff --git a/noatun-plugins/oblique/menu.h b/noatun-plugins/oblique/menu.h new file mode 100644 index 0000000..793180c --- /dev/null +++ b/noatun-plugins/oblique/menu.h @@ -0,0 +1,99 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef MENU_H +#define MENU_H + +#include <kpopupmenu.h> +#include <kpropertiesdialog.h> +#include <kaction.h> + +#include "file.h" +#include "oblique.h" + +/** + * a context menu for a item in the list + **/ +class FileMenu : public KPopupMenu +{ +Q_OBJECT + QValueList<File> mFiles; + +public: + FileMenu(QWidget *parent, Oblique *oblique, File file); + /** + * @recursively uses everything under @p files + **/ + FileMenu(QWidget *parent, Oblique *oblique, TreeItem *files); + +private slots: + void removeFromList(); + void properties(); + void toggleInSlice(Slice *slice); +}; + +class SliceListAction : public KActionMenu +{ +Q_OBJECT + QMap<int, Slice*> mIndexToSlices; + QValueList<File> mFiles; + Oblique *mOblique; + +public: + SliceListAction( + const QString &text, Oblique *oblique, + QObject *reciever, const char *slot, + const QValueList<File> &files = QValueList<File>(), QObject *parent=0, const char *name=0 + ); + +signals: + void activated(Slice *slice); + +private slots: + void hit(int index); + void slicesModified(); +}; + + +class SchemaListAction : public KActionMenu +{ +Q_OBJECT + QMap<int, QString> mIndexToSchemas; + Tree *mTree; + +public: + SchemaListAction( + const QString &text, + QObject *reciever, const char *slot, + QObject *parent, const char *name + ); + + void setTree(Tree *tree) { mTree = tree; } + +signals: + void activated(const QString &); + +private slots: + void hit(int index); + void prepare(); +}; + + +class ObliquePropertiesDialog : public KPropertiesDialog +{ +Q_OBJECT + QValueList<File> mFiles; + +public: + ObliquePropertiesDialog(const QValueList<File> &files, QWidget *parent); + +private: + static KFileItemList makeItems(const QValueList<File> &files); + +private slots: + void modified(); +}; + + +#endif + diff --git a/noatun-plugins/oblique/oblique.cpp b/noatun-plugins/oblique/oblique.cpp new file mode 100644 index 0000000..97e75be --- /dev/null +++ b/noatun-plugins/oblique/oblique.cpp @@ -0,0 +1,325 @@ +// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "oblique.h" +#include "base.h" +#include "view.h" +#include "file.h" +#include "selector.h" +#include "cmodule.h" + +#include <noatun/player.h> + +#include <kconfig.h> +#include <kstandarddirs.h> +#include <kio/job.h> +#include <kfileitem.h> + +#include <qtimer.h> + +extern "C" Plugin *create_plugin() +{ + return new Oblique(); +} + + + +Oblique::Oblique() + : Playlist(0, 0), mSchemaCollection("oblique/schemas") +{ + mView = 0; + mAdder = 0; + + KConfigGroup g(KGlobal::config(), "oblique"); + + mBase = new Base(::locate("data", "noatun/")+"/oblique-list"); + + mView = new View(this); + connect(napp->player(), SIGNAL(loopTypeChange(int)), SLOT(loopTypeChange(int))); + + mSelector = new SequentialSelector(mView->tree()); + + new Configure(this); + + // psst, window's gone, pass it on! + connect(mView, SIGNAL(listHidden()), SIGNAL(listHidden())); + connect(mView, SIGNAL(listShown()), SIGNAL(listShown())); + + loopTypeChange(napp->player()->loopStyle()); +} + + +Oblique::~Oblique() +{ + adderDone(); + delete mView; + delete mBase; +} + +void Oblique::loopTypeChange(int i) +{ + PlaylistItem now = current(); + + if (i == Player::Random) + { + if (!dynamic_cast<RandomSelector*>(mSelector)) + { + delete mSelector; + mSelector = new RandomSelector(mView->tree()); + } + } + else + { + delete mSelector; + mSelector = new SequentialSelector(mView->tree()); + } +} + +void Oblique::adderDone() +{ + delete mAdder; + mAdder = 0; +} + + +void Oblique::reset() +{ + mView->tree()->setCurrent(0); + loopTypeChange(0); +} + +void Oblique::clear() +{ + mBase->clear(); +} + +void Oblique::addFile(const KURL &url, bool play) +{ + KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, url); + if (fileItem.isDir()) + { + beginDirectoryAdd(url); + } + else + { + File f = mBase->add(url.path()); + PlaylistItem p=new Item(f); + p.data()->added(); + if (play) setCurrent(p); + } +} + + +PlaylistItem Oblique::next() +{ + return mSelector->next(); +} + +PlaylistItem Oblique::previous() +{ + return mSelector->previous(); +} + + +PlaylistItem Oblique::current() +{ + return mSelector->current(); +} + +void Oblique::setCurrent(const PlaylistItem &item) +{ + if (!item) return; + mSelector->setCurrent(*static_cast<Item*>(const_cast<PlaylistItemData*>(item.data()))); + emit playCurrent(); +} + + + +PlaylistItem Oblique::getFirst() const +{ + FileId first=1; + File item = mBase->first(first); + + if (!item) return 0; + + return new Item(item); +} + + +PlaylistItem Oblique::getAfter(const PlaylistItem &item) const +{ + File after = mBase->first(static_cast<const Item*>(item.data())->itemFile().id()+1); + if (!after) return 0; + return new Item(after); +} + +bool Oblique::listVisible() const +{ + return mView->isVisible(); +} + +void Oblique::showList() +{ + mView->show(); +} + +void Oblique::hideList() +{ + mView->hide(); +} + + +void Oblique::selected(TreeItem *cur) +{ + Item *item = new Item(cur->file()); + PlaylistItem pli = item; + setCurrent(pli); +} + +void Oblique::beginDirectoryAdd(const KURL &url) +{ + if (mAdder) + { + mAdder->add(url); + } + else + { + mAdder = new DirectoryAdder(url, this); + connect(mAdder, SIGNAL(done()), SLOT(adderDone())); + } +} + + + +Loader::Loader(Tree *tree) + : QObject(tree) +{ + mTree = tree; + mBase = mTree->oblique()->base(); + mDeferredLoaderAt=1; + + + QTimer::singleShot(0, this, SLOT(loadItemsDeferred())); +} + +void Loader::loadItemsDeferred() +{ + // do/try 16 at a time + for (int xx=0; xx < 16; xx++) + { + if (mDeferredLoaderAt > mBase->high()) + { + // finished + mBase->resetFormatVersion(); + emit finished(); + return; + } + + File f = mBase->find(mDeferredLoaderAt); + + if (f) + { + if (mBase->formatVersion() <= 0x00010001) + f.makeCache(); + + if (f.isIn(mTree->slice())) + mTree->insert(f); + } + mDeferredLoaderAt++; + } + + QTimer::singleShot(0, this, SLOT(loadItemsDeferred())); +} + + +DirectoryAdder::DirectoryAdder(const KURL &dir, Oblique *oblique) +{ + listJob=0; + mOblique = oblique; + + add(dir); +} + +void DirectoryAdder::add(const KURL &dir) +{ + if (dir.upURL().equals(currentJobURL, true)) + { + // We are a subdir of our currentJobURL and need to get listed next, + // NOT after all the other dirs that are on the same level as + // currentJobURL! + lastAddedSubDirectory = pendingAddDirectories.insert(lastAddedSubDirectory, dir); + lastAddedSubDirectory++; + } + else + { + pendingAddDirectories.append(dir); + } + addNextPending(); +} + +void DirectoryAdder::addNextPending() +{ + KURL::List::Iterator pendingIt= pendingAddDirectories.begin(); + if (!listJob && (pendingIt!= pendingAddDirectories.end())) + { + currentJobURL= *pendingIt; + listJob = KIO::listDir(currentJobURL, false, false); + connect( + listJob, SIGNAL(entries(KIO::Job*, const KIO::UDSEntryList&)), + SLOT(slotEntries(KIO::Job*, const KIO::UDSEntryList&)) + ); + connect( + listJob, SIGNAL(result(KIO::Job *)), + SLOT(slotResult(KIO::Job *)) + ); + connect( + listJob, SIGNAL(redirection(KIO::Job *, const KURL &)), + SLOT(slotRedirection(KIO::Job *, const KURL &)) + ); + pendingAddDirectories.remove(pendingIt); + lastAddedSubDirectory = pendingAddDirectories.begin(); + } +} + +void DirectoryAdder::slotResult(KIO::Job *job) +{ + listJob= 0; + if (job && job->error()) + job->showErrorDialog(); + addNextPending(); + if (!listJob) + emit done(); +} + +void DirectoryAdder::slotEntries(KIO::Job *, const KIO::UDSEntryList &entries) +{ + QMap<QString,KURL> __list; // temp list to sort entries + + KIO::UDSEntryListConstIterator it = entries.begin(); + KIO::UDSEntryListConstIterator end = entries.end(); + + for (; it != end; ++it) + { + KFileItem file(*it, currentJobURL, false /* no mimetype detection */, true); + // "prudhomm: + // insert the path + url in the map to sort automatically by path + // note also that you use audiocd to rip your CDs then it will be sorted the right way + // now it is an easy fix to have a nice sort BUT it is not the best + // we should sort based on the tracknumber" + // - copied over from old kdirlister hack <hans_meine@gmx.de> + __list.insert(file.url().path(), file.url()); + } + QMap<QString,KURL>::Iterator __it; + for( __it = __list.begin(); __it != __list.end(); ++__it ) + { + oblique()->addFile(__it.data(), false); + } +} + +void DirectoryAdder::slotRedirection(KIO::Job *, const KURL & url) +{ + currentJobURL= url; +} + + +#include "oblique.moc" diff --git a/noatun-plugins/oblique/oblique.h b/noatun-plugins/oblique/oblique.h new file mode 100644 index 0000000..93d1e18 --- /dev/null +++ b/noatun-plugins/oblique/oblique.h @@ -0,0 +1,142 @@ +// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef OBLIQUE_H +#define OBLIQUE_H + +#include <noatun/playlist.h> +#include <noatun/plugin.h> +#include "query.h" +#include "kdatacollection.h" + +#include <kio/global.h> + +class View; +class Tree; +class Base; +class Selector; +class TreeItem; +class DirectoryAdder; + +namespace KIO +{ + class ListJob; + class Job; +} + +class Oblique : public Playlist, public Plugin +{ +Q_OBJECT + View *mView; + Base *mBase; + Selector *mSelector; + KDataCollection mSchemaCollection; + DirectoryAdder *mAdder; + + +public: + Oblique(); + ~Oblique(); + + Base *base() { return mBase; } + + QStringList schemaNames() const { return mSchemaCollection.names(); } + QString loadSchema(Query &q, const QString &name) + { + QString t = q.load(mSchemaCollection.file(name)); + if (t.length()) + q.setName(name); + return t; + } + + void saveSchema(Query &q, const QString &name, const QString &title) + { + q.save(title, mSchemaCollection.saveFile(name)); + } + + void removeSchema(const QString &name) + { + mSchemaCollection.remove(name); + } + + virtual void reset(); + virtual void clear(); + virtual void addFile(const KURL&, bool play=false); + virtual PlaylistItem next(); + virtual PlaylistItem previous(); + virtual PlaylistItem current(); + virtual void setCurrent(const PlaylistItem &); + virtual PlaylistItem getFirst() const; + virtual PlaylistItem getAfter(const PlaylistItem &item) const; + virtual bool listVisible() const; + virtual void showList(); + virtual void hideList(); + + virtual Playlist *playlist() { return this; } + +public slots: + void selected(TreeItem *cur); + void beginDirectoryAdd(const KURL &url); + +private slots: + void loopTypeChange(int i); + void adderDone(); +}; + +/** + * loads the database into a Tree + **/ +class Loader : public QObject +{ +Q_OBJECT + // the id of the next file to load + FileId mDeferredLoaderAt; + Tree *mTree; + Base *mBase; + +public: + Loader(Tree *into); + +signals: + void finished(); + +private slots: + void loadItemsDeferred(); +}; + +/** + * Adds a directory to + * emits @ref done() when finished so you + * can delete it + **/ +class DirectoryAdder : public QObject +{ + Q_OBJECT + Oblique *mOblique; + KURL::List pendingAddDirectories; + KURL::List::Iterator lastAddedSubDirectory; + KIO::ListJob *listJob; + KURL currentJobURL; + +public: + DirectoryAdder(const KURL &dir, Oblique *oblique); + + Oblique *oblique() { return mOblique; } + +public slots: + void add(const KURL &dir); + +signals: + void done(); + +private slots: + void slotResult(KIO::Job *job); + void slotEntries(KIO::Job *job, const KIO::UDSEntryList &entries); + void slotRedirection(KIO::Job *, const KURL & url); + +private: + + void addNextPending(); +}; + +#endif diff --git a/noatun-plugins/oblique/oblique.plugin b/noatun-plugins/oblique/oblique.plugin new file mode 100644 index 0000000..c0b561c --- /dev/null +++ b/noatun-plugins/oblique/oblique.plugin @@ -0,0 +1,73 @@ +Filename=noatun_oblique.la +Author=Charles Samuels +Site=http://noatun.kde.org/oblique +Email=charles@kde.org +Type=playlist +License=GPL/QPL/Anti-Patent BSD +Name=Oblique +Name[az]=Oblik +Name[cy]=Lletraws +Name[eo]=Oblikva +Name[es]=Oblicuo +Name[fa]=مورب +Name[hi]=ऑब्लिक +Name[km]=បញ្ឆៀង +Name[ne]=बक्र +Name[pt_BR]=Oblíquo +Name[ro]=Oblic +Name[sl]=Ležeče +Name[ta]= சாய்வான +Name[tr]=Eğik +Name[vi]=Xiên +Comment=Auto-collating playlist +Comment[bg]=Списък на файлове за изпълнение, който автоматично се сортира и проверява +Comment[bs]=Auto-sortirajuća playlista +Comment[ca]=Llista de reproducció ordenada automàticament +Comment[cs]=Samořadící seznam skladeb +Comment[da]=Auto-kollateret spilleliste +Comment[de]=Selbständige Zusammenstellung der Wiedergabeliste +Comment[el]=Λίστα αναπαραγωγής με αυτόματη ταξινόμηση +Comment[eo]=Aŭtomate kunmetanta ludlisto +Comment[es]=Crear lista de reproducción de forma automática +Comment[et]=Automaatselt end kokkukeriv esitusnimekiri +Comment[eu]=Erreproduzio-zerrendaren antolaketa automatikoa +Comment[fa]=فهرست پخش تلفیق خودکار +Comment[fi]=Automaattisesti järjestyvä soittolista +Comment[fr]=Liste de lecture auto-assemblée +Comment[fy]=Auto-plakkende ôfspyllist +Comment[ga]=Seinmliosta uath-chomhordaithe +Comment[gl]=Lista de reproduición auto-incorporante +Comment[he]=רשימת ניגון נסגרת עצמאית +Comment[hi]=ऑटो-कोलेटिंग प्लेलिस्ट +Comment[hr]=Album s automatskim uspoređivanjem +Comment[hu]=Automatikusan szelektáló lejátszási lista +Comment[is]=Sjálfvirkur lagalisti +Comment[it]=Raccoglie automaticamente la lista di selezione +Comment[ja]=プレイリストの自動照合 +Comment[ka]=სიმღერათა სიის ავტო შეკუნშვა +Comment[kk]=Автосұрыпталатың орындау тізімі +Comment[km]=តម្រៀបបញ្ជីចាក់ដោយស្វ័យប្រវត្តិ +Comment[lt]=Automatiškai besikaupiantis gaidaraštis +Comment[mk]=Самоподредувачка листа со нумери +Comment[ms]=Mengumpul semak senarai main +Comment[nb]=Selvjusterende spilleliste +Comment[nds]=Automaatsch de Afspeellist tosamenstellen +Comment[ne]=स्वत: समानुक्रमित प्लेसूची +Comment[nl]=Auto-plakkende afspeellijst +Comment[nn]=Sjølvjusterande speleliste +Comment[pl]=Automatycznie zestawiająca się lista odtwarzania +Comment[pt]=Lista de músicas autocolante +Comment[pt_BR]=Lista de reprodução de colagem automática +Comment[ru]=Автоматически собирающийся список воспроизведения +Comment[sk]=Automaticky triedený playlist +Comment[sl]=Samodejno zlagajoč predvajalni seznam +Comment[sr]=Самосређујућа листа нумера +Comment[sr@Latn]=Samosređujuća lista numera +Comment[sv]=Spellista med automatiskt ordning +Comment[ta]=தானாகாவே-சேர்க்கும் வாசிப்புப் பட்டியல் +Comment[tg]=Худкорона ҷамъ кардани рӯйхати баровардҳо +Comment[tr]=Otomatik karşılaştırılmış çalma listesi +Comment[uk]=Список композицій, який автоматично об'єднується +Comment[vi]=Danh mục nhạc tự động đối chiếu +Comment[zh_CN]=自动收集播放列表 +Comment[zh_TW]=自動整理播放列表 diff --git a/noatun-plugins/oblique/obliqueui.rc b/noatun-plugins/oblique/obliqueui.rc new file mode 100644 index 0000000..0ef4740 --- /dev/null +++ b/noatun-plugins/oblique/obliqueui.rc @@ -0,0 +1,31 @@ +<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +<kpartgui name="Oblique" version="4"> + +<MenuBar> + <Menu name="file" noMerge="1"> + <text>&Collection</text> + <Action name="add_files" /> + <Action name="add_dir" /> + <Action name="reload" /> + <Separator /> + <Action name="make_slice" /> + <Action name="remove_slice" /> + <Action name="slices" /> + <Action name="schemas" /> + </Menu> + <Menu name="window"> + <text>&Window</text> + <Action name="newtab" /> + <Action name="removecurrenttab" /> + </Menu> +</MenuBar> + + + +<ToolBar noMerge="1" name="mainToolBar"> + <text>Main Toolbar</text> + <Action name="add_files" /> + <Action name="jump_label" /> + <Action name="jump_text" /> +</ToolBar> +</kpartgui> diff --git a/noatun-plugins/oblique/query.cpp b/noatun-plugins/oblique/query.cpp new file mode 100644 index 0000000..292ff16 --- /dev/null +++ b/noatun-plugins/oblique/query.cpp @@ -0,0 +1,570 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "query.h" +#include "file.h" + +#include <iostream> + +#include <klocale.h> + +#include <qdom.h> +#include <qfile.h> + +QueryGroup::QueryGroup() +{ + mFirstChild=0; + mNextSibling=0; + + mFuzzyness = Case | Spaces | Articles; + mOptions = AutoHide; +} + +QueryGroup::QueryGroup(const QueryGroup ©) +{ + mFirstChild=0; + mNextSibling=0; + + operator=(copy); + +} + +QueryGroup &QueryGroup::operator =(const QueryGroup ©) +{ + mFuzzyness = copy.mFuzzyness; + mOptions = copy.mOptions; + mPropertyName = copy.mPropertyName; + mPresentation = copy.mPresentation; + mValue = copy.mValue; + return *this; +} + +QueryGroup::~QueryGroup() +{ + delete mFirstChild; + delete mNextSibling; +} + +void QueryGroup::insertAfter(QueryGroup *insert) +{ + QueryGroup *oldAfter = mNextSibling; + insert->setNextSibling(oldAfter); + setNextSibling(insert); +} + +void QueryGroup::insertUnder(QueryGroup *insert) +{ + QueryGroup *oldUnder = mFirstChild; + insert->setNextSibling(oldUnder); + setFirstChild(insert); + +} + +void QueryGroup::move(Query *query, QueryGroup *under, QueryGroup *after) +{ + query->dump(); + + query->take(this); + if (after) after->insertAfter(this); + else if (under) under->insertUnder(this); + else query->insertFirst(this); + + query->dump(); +} + + +QueryGroup *QueryGroup::previous(Query *query) +{ + QueryGroup *f = query->firstChild(); + if (f == this) return 0; + + return previous(f); +} + +QueryGroup *QueryGroup::previous(QueryGroup *startWith) +{ + QueryGroup *current = startWith; + QueryGroup *after = 0; + + while (current) + { + after = current->nextSibling(); + if (after == this) + return current; + + if (QueryGroup *child = current->firstChild()) + { + if (child == this) + return current; + child = previous(child); + if (child) return child; + } + current = after; + } + return 0; +} + + + +QueryGroup *QueryGroup::lastChild() +{ + QueryGroup *first = mFirstChild; + if (!first) return 0; + while (first->nextSibling()) + first = first->nextSibling(); + return first; +} + + +bool QueryGroup::fuzzyness(Fuzzyness f) const +{ + return mFuzzyness & f; +} + +bool QueryGroup::option(Option option) const +{ + return mOptions & option; +} + +void QueryGroup::setOption(Option option, bool on) +{ + if (on) + mOptions |= option; + else + mOptions &= ~option; +} + +bool QueryGroup::matches(const File &file) const +{ + QString prop = file.property(propertyName()); + + prop = prop.simplifyWhiteSpace(); + if (prop.isNull()) prop = ""; + + QRegExp re(value()); + return re.search(prop) != -1; +} + + + +QString QueryGroup::presentation(const File &file) const +{ + // "$(property)" + QString format=presentation(); + + QRegExp find("(?:(?:\\\\\\\\))*\\$\\((.*)"); + + int start=0; + while (start != -1) + { + start = find.search(format, start); + if (start == -1) break; + + // test if there's an odd amount of backslashes + if (start>0 && format[start-1]=='\\') + { + // yes, so half the amount of backslashes + + // count how many there are first + QRegExp counter("([\\\\]+)"); + counter.search(format, start-1); + uint len=counter.cap(1).length()-1; + + // and half them, and remove one more + format.replace(start-1, len/2+1, ""); + start=start-1+len/2+find.cap(1).length()+3; + continue; + } + + // now replace the backslashes with half as many + + if (format[start]=='\\') + { + // count how many there are first + QRegExp counter("([\\\\]+)"); + counter.search(format, start); + uint len=counter.cap(1).length(); + + // and half them + format.replace(start, len/2, ""); + start=start+len/2; + } + + // "sth"foo"sth" + QString cont(find.cap(1)); + QString prefix,suffix,propname; + unsigned int i=0; + if (cont[i] == '"') + { + i++; + for (; i < cont.length(); i++) + { + if (cont[i] != '"') + prefix += cont[i]; + else + break; + } + i++; + } + + + for (; i < cont.length(); ++i) + { + if (cont[i]!='"' && cont[i]!=')') + propname += cont[i]; + else + break; + } + + if (cont[i] == '"') + { + i++; + for (; i < cont.length(); i++) + { + if (cont[i] != '"') + suffix += cont[i]; + else + break; + } + i++; + } + i++; + + + QString propval = file.property(propname); + +// the following code won't be enabled until the presentation is reloaded +// at the best times +/* if (propname == "length") + { + int len = propval.toInt(); + if ( len < 0 ) // no file loaded + propval = "--:--"; + + int secs = length()/1000; // convert milliseconds -> seconds + int seconds = secs % 60; + propval.sprintf("%.2d:%.2d", ((secs-seconds)/60), seconds); + } +*/ + + if (propval.length()) + { + propval = prefix+propval+suffix; + format.replace(start, i+2, propval); + start += propval.length(); + } + else + { + format.replace(start, i+2, ""); + } + } + return format; +} + + +Query::Query() +{ + mGroupFirst=0; +} + +Query::~Query() +{ + delete mGroupFirst; +} + +Query::Query(const Query ©) +{ + mGroupFirst = 0; + operator=(copy); +} + +Query &Query::operator =(const Query ©) +{ + if (© == this) return *this; + delete mGroupFirst; + mGroupFirst=0; + if (const QueryGroup *parent = copy.firstChild()) + { + mGroupFirst = new QueryGroup(*parent); + deepCopy(parent->firstChild(), mGroupFirst); + } + return *this; +} + +QueryGroup *Query::firstChild() +{ + return mGroupFirst; +} + +const QueryGroup *Query::firstChild() const +{ + return mGroupFirst; +} + +void Query::setFirstChild(QueryGroup *g) +{ + mGroupFirst = g; +} + +void Query::insertFirst(QueryGroup *g) +{ + g->setNextSibling(mGroupFirst); + mGroupFirst = g; +} + +void Query::clear() +{ + delete mGroupFirst; + mGroupFirst=0; +} + +QString Query::load(const QString &filename) +{ + QFile file(filename); + unless (file.open(IO_ReadOnly)) return QString::null; + + QDomDocument doc; + doc.setContent(&file); + return load(doc.documentElement()); +} + +QString Query::load(QDomElement element) +{ + clear(); + + if (element.tagName().lower() == "obliqueschema") + { + QDomNode node = element.firstChild(); + + while (!node.isNull()) + { + QDomElement e = node.toElement(); + if (e.tagName().lower() == "group") + loadGroup(e); + node = node.nextSibling(); + } + } + else + { + return QString::null; + } + + // for internationalization: + // Add these if you create new schemas and release them with Oblique + (void)I18N_NOOP("Standard"); + + QString title = element.attribute("title"); + if (element.hasAttribute("standard")) + title = i18n(title.utf8()); + return title; +} + +void Query::save(const QString &name, QDomElement &element) +{ + element.setTagName("ObliqueSchema"); + element.setAttribute("version", "1.0"); + element.setAttribute("title", name); + for (QueryGroup *g = firstChild(); g; g = g->nextSibling()) + saveGroup(element, g); +} + +void Query::save(const QString &name, const QString &filename) +{ + QFile file(filename); + unless (file.open(IO_Truncate|IO_ReadWrite )) + return; + QDomDocument doc("ObliqueSchema"); + doc.setContent(QString("<!DOCTYPE ObliqueSchema><ObliqueSchema/>")); + QDomElement e = doc.documentElement(); + save(name, e); + + QTextStream ts(&file); + ts.setEncoding(QTextStream::UnicodeUTF8); + // scourge elimination + QString data = doc.toString(); + QString old = data; + while (data.replace(QRegExp("([\n\r]+)(\t*) "), "\\1\\2\t") != old) + { + old = data; + } + ts << data; +} + + +void Query::take(QueryGroup *item) +{ + QueryGroup *previous = item->previous(this); + + if (!previous) + { + mGroupFirst = item->nextSibling(); + item->setNextSibling(0); + return; + } + + if (previous->nextSibling() == item) + { + previous->setNextSibling(item->nextSibling()); + item->setNextSibling(0); + } + else if (previous->firstChild() == item) + { + previous->setFirstChild(item->nextSibling()); + item->setNextSibling(0); + } +} + +static void dump(QueryGroup *item, int depth) +{ + if (!item) return; + + do + { + for (int d = 0; d < depth; d++) + std::cerr << " "; + std::cerr << "prop: " << item->propertyName().utf8() << " pres: " + << item->presentation().utf8() << std::endl; + dump(item->firstChild(), depth+1); + + } while ((item = item->nextSibling())); + +} + +void Query::dump() +{ + ::dump(firstChild(), 0); +} + + + + +void Query::loadGroup(QDomElement element, QueryGroup *parent) +{ + QDomNode node = element.firstChild(); + + QueryGroup *group = new QueryGroup; + if (parent) + { + if (QueryGroup *last = parent->lastChild()) + last->setNextSibling(group); + else + parent->setFirstChild(group); + } + else + { + mGroupFirst = group; + } + + while (!node.isNull()) + { + QDomElement e = node.toElement(); + if (e.tagName().lower() == "group") + { + loadGroup(e, group); + } + else if (e.tagName().lower() == "property") + { + group->setPropertyName(e.text()); + } + else if (e.tagName().lower() == "value") + { + group->setValue(QRegExp(e.text())); + } + else if (e.tagName().lower() == "presentation") + { + group->setPresentation(e.text()); + } + else if (e.tagName().lower() == "options") + { + QDomNode node = e.firstChild(); + while (!node.isNull()) + { + QDomElement e = node.toElement(); + + if (e.tagName().lower() == "disabled") + group->setOption(QueryGroup::Disabled, true); + else if (e.tagName().lower() == "unique") // backwards compat (for now) + group->setOption(QueryGroup::Playable, true); + else if (e.tagName().lower() == "playable") + group->setOption(QueryGroup::Playable, true); + else if (e.tagName().lower() == "childrenvisible") + group->setOption(QueryGroup::ChildrenVisible, true); + else if (e.tagName().lower() == "autoopen") + group->setOption(QueryGroup::AutoOpen, true); + + node = node.nextSibling(); + } + + } + node = node.nextSibling(); + } +} + +void Query::saveGroup(QDomElement &parent, QueryGroup *group) +{ + QDomDocument doc = parent.ownerDocument(); + QDomElement element = doc.createElement("group"); + parent.appendChild(element); + + QDomElement childe; + QDomText childtext; + { + childe = doc.createElement("property"); + element.appendChild(childe); + childtext = doc.createTextNode(group->propertyName()); + childe.appendChild(childtext); + } + { + childe = doc.createElement("value"); + element.appendChild(childe); + childtext = doc.createTextNode(group->value().pattern()); + childe.appendChild(childtext); + } + { + childe = doc.createElement("presentation"); + element.appendChild(childe); + childtext = doc.createTextNode(group->presentation()); + childe.appendChild(childtext); + } + { + childe = doc.createElement("options"); + element.appendChild(childe); + if (group->option(QueryGroup::Disabled)) + childe.appendChild(doc.createElement("disabled")); + if (group->option(QueryGroup::Playable)) + childe.appendChild(doc.createElement("playable")); + if (group->option(QueryGroup::ChildrenVisible)) + childe.appendChild(doc.createElement("childrenvisible")); + if (group->option(QueryGroup::AutoOpen)) + childe.appendChild(doc.createElement("autoopen")); + } + + for (QueryGroup *c = group->firstChild(); c; c = c->nextSibling()) + { + saveGroup(element, c); + } +} + +void Query::deepCopy(const QueryGroup *from, QueryGroup *toParent) +{ + if (!from) return; + QueryGroup *last=0; + + while (from) + { + QueryGroup *copy = new QueryGroup(*from); + if (last) + { + last->setNextSibling(copy); + last = copy; + } + else + { + toParent->setFirstChild(copy); + last = copy; + } + deepCopy(from->firstChild(), last); + from = from->nextSibling(); + } +} + diff --git a/noatun-plugins/oblique/query.h b/noatun-plugins/oblique/query.h new file mode 100644 index 0000000..60a19ff --- /dev/null +++ b/noatun-plugins/oblique/query.h @@ -0,0 +1,176 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef QUERY_H +#define QUERY_H + +#include "base.h" + +#include <qregexp.h> +#include <qstring.h> + +class Query; +class QDomElement; + +class QueryGroup +{ + friend class Query; + + QueryGroup *mFirstChild; + QueryGroup *mNextSibling; + + int mFuzzyness; + int mOptions; + + QString mPropertyName; + QString mPresentation; + QRegExp mValue; + +public: + QueryGroup(); + QueryGroup(const QueryGroup ©); + QueryGroup &operator =(const QueryGroup ©); + + + /** + * delete my first child, and my next sibling + **/ + ~QueryGroup(); + void setFirstChild(QueryGroup *g) { mFirstChild = g; } + void setNextSibling(QueryGroup *g) { mNextSibling = g; } + + + QueryGroup *firstChild() { return mFirstChild; } + const QueryGroup *firstChild() const { return mFirstChild; } + QueryGroup *lastChild(); + QueryGroup *nextSibling() { return mNextSibling; } + const QueryGroup *nextSibling() const { return mNextSibling; } + + /** + * insert @p after as a sibling immediately after this + **/ + void insertAfter(QueryGroup *insert); + + /** + * insert @p immediately after this as a child + **/ + void insertUnder(QueryGroup *insert); + + /** + * Try get the "best fit" for the two parameters + **/ + void move(Query *query, QueryGroup *under, QueryGroup *after); + + QString propertyName() const { return mPropertyName; } + QRegExp value() const { return mValue; } + QString presentation() const { return mPresentation; } + + void setPropertyName(const QString &v) { mPropertyName = v; } + void setPresentation(const QString &v) { mPresentation = v; } + void setValue(const QRegExp &v) { mValue = v; } + + enum Fuzzyness + { + Case = 1<<0, Spaces = 1<<1, Articles = 1<<2, Symbols = 1<<3 + }; + + bool fuzzyness(Fuzzyness f) const; + + enum Option + { + AutoHide = 1<<0, Disabled = 1<<1, Playable = 1<<2, + ChildrenVisible = 1<<3, AutoOpen = 1<<4 + }; + + bool option(Option option) const; + void setOption(Option option, bool on); + + /** + * @return if I match @p file + **/ + bool matches(const File &file) const; + + QString presentation(const File &file) const; + +private: + /** + * apply all the "normalizing" transformations according + * to the fuzzyness + **/ + QString fuzzify(const QString &str) const; + /** + * @returns the previous or parent of this item (slow) + **/ + QueryGroup *previous(Query *query); + QueryGroup *previous(QueryGroup *startWith); + +}; + + + + +/** + * a query is the tree structure that is shown to the user + **/ +class Query +{ + QueryGroup *mGroupFirst; + QString mName; + +public: + Query(); + Query(const Query ©); + ~Query(); + + Query &operator =(const Query ©); + + QueryGroup *firstChild(); + const QueryGroup *firstChild() const; + + void setFirstChild(QueryGroup *g); + void insertFirst(QueryGroup *g); + + void clear(); + + /** + * @returns the name to be used internally + **/ + QString name() const { return mName; } + void setName(const QString &name) { mName = name; } + + /** + * @returns the name of the query + **/ + QString load(const QString &filename); + void save(const QString &name, QDomElement &element); + void save(const QString &name, const QString &filename); + + /** + * remove any trace of this from the tree, but don't actually delete it + **/ + void take(QueryGroup *item); + + void dump(); + + /** + * @returns the name of this query as used internally by the db. + * + * Will give it a name in the db if necessary + **/ + QString dbname(Base *base); + +private: + void loadGroup(QDomElement element, QueryGroup *parent=0); + void saveGroup(QDomElement &parent, QueryGroup *group); + + void deepCopy(const QueryGroup *from, QueryGroup *toParent); + + /** + * @returns the name of the query + **/ + QString load(QDomElement element); +}; + + + +#endif diff --git a/noatun-plugins/oblique/schemas/Makefile.am b/noatun-plugins/oblique/schemas/Makefile.am new file mode 100644 index 0000000..9bda17b --- /dev/null +++ b/noatun-plugins/oblique/schemas/Makefile.am @@ -0,0 +1,3 @@ +schemasdir = $(kde_datadir)/noatun/oblique/schemas +schemas_DATA = standard + diff --git a/noatun-plugins/oblique/schemas/obliqueschema.dtd b/noatun-plugins/oblique/schemas/obliqueschema.dtd new file mode 100644 index 0000000..5fb45ea --- /dev/null +++ b/noatun-plugins/oblique/schemas/obliqueschema.dtd @@ -0,0 +1,14 @@ +<!ELEMENT ObliqueSchema (group+)> +<!ELEMENT group (property,value,presentation,options?,group*)> +<!ELEMENT options (disabled|stoponhit|unique)*> +<!ATTLIST ObliqueSchema version CDATA "1.0"> + +<!ELEMENT disabled EMPTY> +<!ELEMENT stoponhit EMPTY> +<!ELEMENT unique EMPTY> + + +<!ELEMENT property (#PCDATA)> +<!ELEMENT value (#PCDATA)> +<!ELEMENT presentation (#PCDATA)> + diff --git a/noatun-plugins/oblique/schemas/standard b/noatun-plugins/oblique/schemas/standard new file mode 100644 index 0000000..1c00f18 --- /dev/null +++ b/noatun-plugins/oblique/schemas/standard @@ -0,0 +1,80 @@ +<!DOCTYPE ObliqueSchema SYSTEM "obliqueschema.dtd"> +<ObliqueSchema title="Standard" i18n="true"> + <group> + <property>mimetype</property> + <value>^(?:audio/|.*/ogg$)</value> + <presentation>Music</presentation> + <options> + <autoopen/> + </options> + <group> + <property>author</property> + <value>^$</value> + <presentation>(Unknown Artist)</presentation> + + <group> + <property>title</property> + <value>^$</value> + <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation> + <options> + <playable /> + </options> + </group> + </group> + + <group> + <property>author</property> + <value></value> + <presentation>$(author)</presentation> + + <group> + <property>album</property> + <value>^$</value> + <presentation>(Unknown Album)</presentation> + + <group> + <property>title</property> + <value>^$</value> + <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation> + <options> + <playable /> + </options> + </group> + + <group> + <property>title</property> + <value></value> + <presentation>$(track". ")$(title)$(" ("bitrate"kbps)")</presentation> + <options> + <playable /> + </options> + </group> + </group> + + <group> + <property>album</property> + <value></value> + <presentation>$(album)</presentation> + + <group> + <property>title</property> + <value>^$</value> + <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation> + <options> + <playable /> + </options> + </group> + + <group> + <property>title</property> + <value></value> + <presentation>$(track". ")$(title)$(" ("bitrate"kbps)")</presentation> + <options> + <playable /> + </options> + </group> + </group> + </group> + </group> +</ObliqueSchema> + diff --git a/noatun-plugins/oblique/selector.cpp b/noatun-plugins/oblique/selector.cpp new file mode 100644 index 0000000..1c17650 --- /dev/null +++ b/noatun-plugins/oblique/selector.cpp @@ -0,0 +1,226 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "tree.h" +#include "selector.h" +#include "oblique.h" + +#include <noatun/app.h> +#include <noatun/player.h> + +Item::Item(const File &file) + : mFile(file) +{ + +} + +QString Item::property(const QString &key, const QString &def) const +{ + if (key == "url") + { + KURL url; + url.setPath(property("file")); + return url.url(); + } + + QString str = mFile.property(key); + if (str.isNull()) return def; + return str; +} + +void Item::setProperty(const QString &key, const QString &property) +{ + mFile.setProperty(key, property); +} + +void Item::clearProperty(const QString &key) +{ + mFile.clearProperty(key); +} + +QStringList Item::properties() const +{ + return mFile.properties(); +} + +bool Item::isProperty(const QString &key) const +{ + return !mFile.property(key).isNull(); +} + +bool Item::operator==(const PlaylistItemData &d) const +{ + return mFile == static_cast<const Item&>(d).mFile; +} + +void Item::remove() +{ + mFile.remove(); +} + + + +Selector::Selector() +{ +} + +Selector::~Selector() +{ +} + + +SequentialSelector::SequentialSelector(Tree *tree) +{ + mTree = tree; +} + +SequentialSelector::~SequentialSelector() +{ + +} + +Item *SequentialSelector::next() +{ + TreeItem *current = mTree->current(); + if (current) + { + current = current->nextPlayable(); + } + else + { + current = mTree->firstChild(); + if (current && !current->playable()) + { + current = current->nextPlayable(); + } + } + setCurrent(current); + if (current && current->file()) + return new Item(current->file()); + return 0; +} + +Item *SequentialSelector::previous() +{ + TreeItem *back = mTree->firstChild(); + TreeItem *after; + TreeItem *current = mTree->current(); + // now we just go forward on back until the item after back is me ;) + // this is terribly unoptimized, but I'm terribly lazy + while (back and (after = back->nextPlayable()) != current) + { + back = after; + } + current = back; + setCurrent(current); + if (current && current->file()) + return new Item(current->file()); + return 0; +} + +Item *SequentialSelector::current() +{ + TreeItem *current = mTree->current(); + if (!current) return next(); + if (current->file()) + return new Item(current->file()); + return 0; +} + +void SequentialSelector::setCurrent(const Item &item) +{ + TreeItem *current = mTree->find(item.itemFile()); + setCurrent(current); +} + +void SequentialSelector::setCurrent(TreeItem *current) +{ + if (current) + { + mTree->setCurrent(current); + } +} + + + +RandomSelector::RandomSelector(Tree *tree) +{ + mTree = tree; + mPrevious = 0; +} + +static TreeItem *randomItem(int &at, TreeItem *item) +{ + for ( ; item; item = item->nextSibling()) + { + if (item->playable()) + { + if (at==0) + return item; + + at--; + } + if (TreeItem *i = randomItem(at, item->firstChild())) + { + return i; + } + } + + return 0; +} + +Item *RandomSelector::next() +{ + TreeItem *previous = mTree->current(); + if (!mTree->playableItemCount()) + { + return 0; + } + + for (int tries=15; tries; tries--) + { + int randomIndex = KApplication::random() % (mTree->playableItemCount()); + + TreeItem *nowCurrent = randomItem(randomIndex, mTree->firstChild()); + if (!nowCurrent) continue; + + setCurrent(nowCurrent, previous); + return new Item(nowCurrent->file()); + } + + // !!!! + return 0; +} + +Item *RandomSelector::previous() +{ + if (!mPrevious) return 0; + TreeItem *current = mPrevious; + + mTree->setCurrent(current); + return new Item(current->file()); +} + +Item *RandomSelector::current() +{ + TreeItem *current = mTree->current(); + if (!current) return 0; + return new Item(current->file()); +} + +void RandomSelector::setCurrent(const Item &item) +{ + setCurrent(mTree->find(item.itemFile()), 0); +} + +void RandomSelector::setCurrent(TreeItem *item, TreeItem *previous) +{ + mPrevious = previous; + mTree->setCurrent(item); + + napp->player()->stop(); + napp->player()->play(); +} + + + diff --git a/noatun-plugins/oblique/selector.h b/noatun-plugins/oblique/selector.h new file mode 100644 index 0000000..1447dec --- /dev/null +++ b/noatun-plugins/oblique/selector.h @@ -0,0 +1,76 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef SELECTOR_H +#define SELECTOR_H + +#include <noatun/playlist.h> +#include "file.h" + +class Item : public PlaylistItemData +{ + File mFile; + +public: + Item(const File &file); + + File itemFile() const { return mFile; } + + virtual QString property(const QString &key, const QString &def=0) const; + virtual void setProperty(const QString &key, const QString &property); + virtual void clearProperty (const QString &key); + virtual QStringList properties() const; + + virtual bool isProperty(const QString &key) const; + + virtual bool operator==(const PlaylistItemData &d) const; + virtual void remove(); +}; + +/** + * a selector is an object that can get items from the + * playlist in a certain order + **/ +class Selector +{ +public: + Selector(); + virtual ~Selector(); + virtual Item *next()=0; + virtual Item *previous()=0; + virtual Item *current()=0; + virtual void setCurrent(const Item &item)=0; +}; + +class Tree; +class TreeItem; + +class SequentialSelector : public Selector +{ + Tree *mTree; + +public: + SequentialSelector(Tree *tree); + virtual ~SequentialSelector(); + virtual Item *next(); + virtual Item *previous(); + virtual Item *current(); + virtual void setCurrent(const Item &item); + virtual void setCurrent(TreeItem *current); +}; + +class RandomSelector : public Selector +{ + Tree *mTree; + TreeItem *mPrevious; +public: + RandomSelector(Tree *tree); + + virtual Item *next(); + virtual Item *previous(); + virtual Item *current(); + virtual void setCurrent(const Item &item); + virtual void setCurrent(TreeItem *item, TreeItem *previous); +}; + +#endif diff --git a/noatun-plugins/oblique/tree.cpp b/noatun-plugins/oblique/tree.cpp new file mode 100644 index 0000000..4160650 --- /dev/null +++ b/noatun-plugins/oblique/tree.cpp @@ -0,0 +1,812 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "tree.h" +#include "file.h" +#include "query.h" +#include "menu.h" +#include "oblique.h" + +#include <qpainter.h> +#include <iostream> + +#include <klocale.h> +#include <string.h> + +#include <noatun/player.h> + +// this is used for comparing pointers +// (I should _not_ need this) +template <typename T> +inline static long subtract(const T *end, const T *begin) +{ + return long(end-begin); +} + +static void treeItemMerge( + TreeItem **set, + TreeItem **intofirst, TreeItem **intolast, + TreeItem **fromfirst, TreeItem **fromlast + ) +{ + const int items = subtract(intolast, intofirst) + subtract(fromlast, fromfirst)+2; + TreeItem **temp = new TreeItem*[items]; + TreeItem **tempat = temp; + + while (1) + { + if (intofirst[0]->compare(fromfirst[0], 0, true) >= 0) + { + // from goes before into + *tempat = *fromfirst; + tempat++; + fromfirst++; + if (fromfirst > fromlast) break; + } + else + { + *tempat = *intofirst; + tempat++; + intofirst++; + if (intofirst > intolast) break; + } + } + while (intofirst <= intolast) + *tempat++ = *intofirst++; + while (fromfirst <= fromlast) + *tempat++ = *fromfirst++; + + ::memcpy(set, temp, items*sizeof(TreeItem**)); + delete [] temp; +} + +static void treeItemSort(TreeItem **begin, TreeItem **end) +{ + if (begin == end) return; + TreeItem **middle = subtract(end, begin)/2 + begin; + + if (begin != middle) + treeItemSort(begin, middle); + + if (middle+1 != end) + treeItemSort(middle+1, end); + + treeItemMerge(begin, begin, middle, middle+1, end); +} + +static void treeItemSort(TreeItem *first) +{ + const int count = first->parent() ? first->parent()->childCount() : first->listView()->childCount(); + if (count < 2) return; + + Query *q = first->tree()->query(); + TreeItem **set = new TreeItem*[count]; + + int manually = 0; // I store these starting at the end (of set) + int at=0; // I store these starting at the beginning + + for (TreeItem *i = first; i; i = i->nextSibling()) + { + File after; + if (i->file() && i->file().getPosition(q, &after)) + { + set[count-manually-1] = i; + manually++; + } + else + { + set[at] = i; + at++; + } + } + + assert(count == at + manually); + + if (at > 1) + treeItemSort(set, set+count-manually-1); + + // grr, QListView sucks + set[0]->moveItem(set[1]); + TreeItem *previous = set[0]; + + int manualPosition = count - manually; + + for (int i=1; i <count-manually; i++) + { + File maybeafter = previous->file(); + + // perhaps one of the manually sorted ones fit here.. + for (int mi = manualPosition; mi < count; mi++) + { + TreeItem *now = set[mi]; + File after; + if (now->file() && now->file().getPosition(q, &after)) + { + if (after == maybeafter) + { + now->moveItem(previous); + previous = now; + // just try again now, as another manually sorted item + // may be after previous + maybeafter = previous->file(); + manualPosition++; + } + } + + } + + set[i]->moveItem(previous); + previous = set[i]; + } + + delete [] set; +} + +template <class T> +inline static void sortify(T *item) +{ + treeItemSort(item->firstChild()); +} + + +TreeItem::TreeItem(Tree *parent, QueryGroup *group, const File &file, const QString &p) + : KListViewItem(parent, p), mGroup(group), mUserOpened(false), mHidden(false) +{ + if (group->option(QueryGroup::Playable)) + { + if (mFile = file) + parent->mPlayableItemCount++; + } + + sortify(parent); +} + +TreeItem::TreeItem(TreeItem *parent, QueryGroup *group, const File &file, const QString &p) + : KListViewItem(parent, p), mGroup(group), mUserOpened(false), mHidden(false) +{ + if (group->option(QueryGroup::Playable)) + { + if (mFile = file) + parent->tree()->mPlayableItemCount++; + } + + sortify(parent); +} + +TreeItem::~TreeItem() +{ + if (playable()) + { + tree()->mPlayableItemCount--; + } + + // I have to remove my children, because they need their parent + // in tact for the below code + while (TreeItem *c = firstChild()) + delete c; + tree()->deleted(this); +} + +void Tree::deleted(TreeItem *item) +{ + mAutoExpanded.removeRef(item); + if (current() == item) + { + oblique()->next(); + } +} + +static void pad(QString &str) +{ + int len=str.length(); + int at = 0; + int blocklen=0; + + static const int paddingsize=12; + + // not static for reason + const QChar chars[paddingsize] = + { + QChar('0'), QChar('0'), QChar('0'), QChar('0'), + QChar('0'), QChar('0'), QChar('0'), QChar('0'), + QChar('0'), QChar('0'), QChar('0'), QChar('0') + }; + + for (int i=0; i < len; i++) + { + if (str[i].isNumber()) + { + if (!blocklen) + at = i; + blocklen++; + } + else if (blocklen) + { + int pads=paddingsize; + pads -= blocklen; + str.insert(at, chars, pads); + i += pads; + blocklen = 0; + } + } + if (blocklen) + { + int pads=paddingsize; + pads -= blocklen; + str.insert(at, chars, pads); + } +} + +int TreeItem::compare(QListViewItem *i, int col, bool) const +{ + QString text1 = text(col); + QString text2 = i->text(col); + + pad(text1); + pad(text2); + return text1.compare(text2); +} + + +Tree *TreeItem::tree() +{ + return static_cast<Tree*>(KListViewItem::listView()); +} + +QString TreeItem::presentation() const +{ + return text(0); +} + +TreeItem *TreeItem::find(File item) +{ + TreeItem *i = firstChild(); + while (i) + { + if (i->file() == item) return i; + + TreeItem *found = i->find(item); + if (found and found->playable()) return found; + i = i->nextSibling(); + } + return 0; +} + +bool TreeItem::playable() const +{ + return mFile && mGroup->option(QueryGroup::Playable); +} + +TreeItem *TreeItem::nextPlayable() +{ + TreeItem *next=this; + do + { + next = next->next(); + } while (next && !next->playable()); + return next; +} + +void TreeItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align) +{ + QFont font = p->font(); + if (tree()->current() == this) + { + font.setUnderline(true); + p->setFont(font); + } + + QColorGroup newcg(cg); + if (parent() && parent()->isOpen() && !parent()->mUserOpened) + { + // slow, but not often used + QColor text = newcg.text(); + QColor bg = newcg.background(); + + int r = text.red() + bg.red(); + int g = text.green() + bg.green(); + int b = text.blue() + bg.blue(); + text.setRgb(r/2,g/2,b/2); + newcg.setColor(QColorGroup::Text, text); + } + KListViewItem::paintCell(p, newcg, column, width, align); + + font.setUnderline(false); + p->setFont(font); +} + +void TreeItem::setOpen(bool o) +{ + if (!tree()->autoExpanding()) + { + mUserOpened = o; + tree()->removeAutoExpanded(this); + } + KListViewItem::setOpen(o); +} + +void TreeItem::autoExpand() +{ + tree()->setAutoExpanding(true); + if (tree()->current() == this) + { + tree()->resetAutoExpanded(); + forceAutoExpand(); + } + tree()->setAutoExpanding(false); +} + +void TreeItem::forceAutoExpand() +{ + if (parent()) + parent()->forceAutoExpand(); + + if (!mUserOpened) + tree()->addAutoExpanded(this); + setOpen(true); +} + +bool TreeItem::hideIfNoMatch(const QString &match) +{ + if (!firstChild()) + { + if (match.length()) + { + if (!text(0).contains(match, false)) + { + setHidden(true); + return false; + } + } + setHidden(false); + return true; + } + else + { + bool visible=true; + + if (match.length()) + { + visible = text(0).contains(match, false); + } + + if (visible) + { + QString empty; + for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling()) + { + ch->hideIfNoMatch(empty); + } + } + else + { + for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling()) + { + bool here = ch->hideIfNoMatch(match); + visible = visible || here; + } + } + + setHidden(!visible); + + return visible; + } +} + +void TreeItem::setup() +{ + QListViewItem::setup(); + if (mHidden) + setHeight(0); +} + +void TreeItem::setHidden(bool h) +{ + mHidden = h; + setup(); +} + +TreeItem *TreeItem::next() +{ + if (firstChild()) + { + return firstChild(); + } + else + { // go up the tree + TreeItem *upYours = this; + do + { + if (upYours->nextSibling()) + return upYours->nextSibling(); + upYours = upYours->parent(); + } while (upYours); + } + return 0; +} + + + + + + + +Tree::Tree(Oblique *oblique, QWidget *parent) + : KListView(parent), mOblique(oblique), mAutoExpanding(0) +{ + mCurrent = 0; + lastMenu =0; + mPlayableItemCount = 0; + mLoader = 0; + + addColumn(""); + setCaption(i18n("Oblique")); + setRootIsDecorated(true); + + setAcceptDrops(true); + setDragEnabled(true); + setItemsMovable(true); + setDropVisualizer(true); + setSorting(-1); + + ((QWidget*)header())->hide(); + + + connect( + this, SIGNAL(moved(QPtrList<QListViewItem>&, QPtrList<QListViewItem>&, QPtrList<QListViewItem>&)), + SLOT(dropped(QPtrList<QListViewItem>&, QPtrList<QListViewItem>&, QPtrList<QListViewItem>&)) + ); + + connect( + this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), + SLOT(contextMenu(KListView*, QListViewItem*, const QPoint&)) + ); + connect( + this, SIGNAL(executed(QListViewItem*)), + SLOT(play(QListViewItem*)) + ); + + Base *base = oblique->base(); + connect(base, SIGNAL(added(File)), SLOT(insert(File))); + connect(base, SIGNAL(removed(File)), SLOT(remove(File))); + connect(base, SIGNAL(modified(File)), SLOT(update(File))); + + connect(base, SIGNAL(addedTo(Slice*, File)), SLOT(checkInsert(Slice*, File))); + connect(base, SIGNAL(removedFrom(Slice*, File)), SLOT(checkRemove(Slice*, File))); + + connect(this, SIGNAL(selected(TreeItem*)), oblique, SLOT(selected(TreeItem*))); + + mSlice = oblique->base()->defaultSlice(); + + KConfigGroup g(KGlobal::config(), "oblique"); + mFileOfQuery = g.readEntry("schema", "standard"); + if (!setSchema(mFileOfQuery)) + { + setSchema("standard"); + } + +} + +Tree::~Tree() +{ + // have to clear here to prevent sigsegv on exit + clear(); +} + +void Tree::clear() +{ + if (mCurrent) + { + napp->player()->stop(); + setCurrent(0); + } + KListView::clear(); +} + +void Tree::movableDropEvent (QListViewItem* parent, QListViewItem* afterme) +{ + QPtrList<QListViewItem> items = selectedItems(true); + for (QPtrList<QListViewItem>::Iterator i(items.begin()); *i; ++i) + { + if ((*i)->parent() != parent) + return; + } + + KListView::movableDropEvent(parent, afterme); +} + + +void Tree::dropped(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &afterNow) +{ + QPtrList<QListViewItem>::Iterator itemi = items.begin(); + QPtrList<QListViewItem>::Iterator afteri = afterNow.begin(); + while (*itemi) + { + TreeItem *item = static_cast<TreeItem*>(*itemi); + TreeItem *after = static_cast<TreeItem*>(*afteri); + item->file().setPosition(query(), after ? after->file() : File()); + + ++itemi; + ++afteri; + } +} + + +TreeItem *Tree::firstChild() + { return static_cast<TreeItem*>(KListView::firstChild()); } + +TreeItem *Tree::find(File item) +{ + TreeItem *i = firstChild(); + + while (i) + { + if (i->file() == item) return i; + + TreeItem *found = i->find(item); + if (found) return found; + + i = i->nextSibling(); + } + return i; +} + +void Tree::insert(TreeItem *replace, File file) +{ + TreeItem *created = collate(replace, file); + if (mCurrent == replace) + { + mCurrent = created; + repaintItem(created); + if (isSelected(replace)) + setSelected(created, true); + } + if (created != replace) + { + delete replace; + } +} + +void Tree::insert(File file) +{ + collate(file); +} + +void Tree::remove(File file) +{ + remove(firstChild(), file); +} + +void Tree::checkInsert(Slice *slice, File f) +{ + if (slice == mSlice) + insert(f); +} + +void Tree::checkRemove(Slice *slice, File f) +{ + if (slice == mSlice) + remove(f); +} + + +void Tree::update(File file) +{ + if (TreeItem *item = find(file)) + { + insert(item, file); + } +} + +void Tree::remove(TreeItem *ti, const File &file) +{ + while (ti) + { + if (ti->file() == file) + { + TreeItem *t = ti->nextSibling(); + delete ti; + ti = t; + } + else + { + remove(ti->firstChild(), file); + ti = ti->nextSibling(); + } + } +} + +void Tree::setCurrent(TreeItem *cur) +{ + if (cur == mCurrent) return; + // undo the old one + TreeItem *old = mCurrent; + mCurrent = cur; + QPtrList<TreeItem> oldAutoExpanded = mAutoExpanded; + mAutoExpanded.clear(); + repaintItem(old); + repaintItem(cur); + if (cur) cur->autoExpand(); + + // do an anti-intersection on oldAutoUpdated and the new mAutoExpanded + for (QPtrListIterator<TreeItem> i(mAutoExpanded); *i; ++i) + { + oldAutoExpanded.removeRef(*i); + } + + + bool user=false; + for (QPtrListIterator<TreeItem> i(oldAutoExpanded); *i; ++i) + { + if ((*i)->userOpened()) + { + user = true; + break; + } + } + if (!user) + { + for (QPtrListIterator<TreeItem> i(oldAutoExpanded); *i; ++i) + { + (*i)->setOpen(false); + } + } + + ensureItemVisible(cur); +} + +void Tree::reload() +{ + delete mLoader; + clear(); + mLoader = new Loader(this); + connect(mLoader, SIGNAL(finished()), SLOT(destroyLoader())); +} + +void Tree::setSlice(Slice *slice) +{ + if (mSlice == slice) return; + mSlice = slice; + reload(); +} + +bool Tree::setSchema(const QString &name) +{ + mFileOfQuery = name; + if (!oblique()->loadSchema(mQuery, name)) + return false; + reload(); + return true; +} + +QDragObject *Tree::dragObject() +{ + if (currentItem() && static_cast<TreeItem*>(currentItem())->file()) + return KListView::dragObject(); + return 0; +} + +void Tree::destroyLoader() +{ + delete mLoader; + mLoader = 0; +} + +void Tree::setLimit(const QString &text) +{ + for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling()) + { + ch->hideIfNoMatch(text); + } +} + + +void Tree::contextMenu(KListView*, QListViewItem* i, const QPoint& p) +{ + if (!i) return; + delete lastMenu; + lastMenu = new FileMenu(this, oblique(), static_cast<TreeItem*>(i) ); + lastMenu->popup(p); +} + +void Tree::play(QListViewItem *_item) +{ + if (!_item) return; + TreeItem *item = static_cast<TreeItem*>(_item); + if (item->playable()) + emit selected(item); + else + play(item->nextPlayable()); +} + + +TreeItem *Tree::collate(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf) +{ + do + { + if (group->matches(file)) + { + TreeItem *nodefix=0; + if (fix && fix->group() == group) + nodefix = fix; + + TreeItem *item = node(nodefix, group, file, childOf); + TreeItem *ti=0; + if (group->firstChild()) + { + ti = collate(fix, group->firstChild(), file, item); + } + if (ti && ti->playable()) + return ti; + else if(item && item->playable()) + return item; + else + return 0; + } + + } while (( group = group->nextSibling())); + return 0; +} + +TreeItem *Tree::node(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf) +{ + // search childOf's immediate children + TreeItem *children; + if (childOf) + children = childOf->firstChild(); + else + children = firstChild(); + + QString presentation = group->presentation(file); + while (children) + { + // merging would be done here + bool matches=false; + if (group->fuzzyness(QueryGroup::Case)) + { + matches = (children->text(0).lower() == presentation.lower()); + } + else + { + matches = (children->text(0) == presentation); + } + + matches = matches && !children->group()->option(QueryGroup::Playable); + + if (matches) + { + children->setFile(File()); + return children; + } + + children = children->nextSibling(); + } + + TreeItem *item; + if (group->option(QueryGroup::ChildrenVisible)) + { + item = childOf; + } + else if (fix) + { + item = fix; + if (fix->parent() != childOf) + moveItem(fix, childOf, 0); + item->setText(0, presentation); + } + else if (childOf) + { + item = new TreeItem(childOf, group, file, presentation); + } + else + { + item = new TreeItem(this, group, file, presentation); + } + + item->setOpen(group->option(QueryGroup::AutoOpen)); + + return item; +} + +#include "tree.moc" + diff --git a/noatun-plugins/oblique/tree.h b/noatun-plugins/oblique/tree.h new file mode 100644 index 0000000..0d53732 --- /dev/null +++ b/noatun-plugins/oblique/tree.h @@ -0,0 +1,194 @@ +// Copyright (c) 2003 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef TREE_H +#define TREE_H + +#include <qwidget.h> +#include <klistview.h> + +#include "base.h" +#include "query.h" +#include "file.h" + +class Oblique; +class Tree; + +class TreeItem : public KListViewItem +{ + QueryGroup *mGroup; + File mFile; + + bool mUserOpened:1; + bool mHidden:1; + +public: + TreeItem(Tree *parent, QueryGroup *group, const File &file, const QString &p=0); + TreeItem(TreeItem *parent, QueryGroup *group, const File &file, const QString &p=0); + ~TreeItem(); + + QueryGroup *group() { return mGroup; } + const QueryGroup *group() const { return mGroup; } + void setGroup(QueryGroup *group) { mGroup = group; } + + TreeItem *parent() { return static_cast<TreeItem*>(KListViewItem::parent()); } + Tree *tree(); + TreeItem *itemBelow() { return static_cast<TreeItem*>(KListViewItem::itemBelow()); } + TreeItem *firstChild() { return static_cast<TreeItem*>(KListViewItem::firstChild()); } + TreeItem *nextSibling() { return static_cast<TreeItem*>(KListViewItem::nextSibling()); } + + // for gdb, which sucks. + QString presentation() const; + + File file() { return mFile; } + void setFile(File file) { mFile = file; } + + void setOpen(bool o); + + TreeItem *find(File item); + + bool playable() const; + + /** + * get the next item that is playable logically. + * that is, if it has a File, and its parent hasn't a + * File + **/ + TreeItem *nextPlayable(); + + void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align); + + virtual int compare(QListViewItem * i, int col, bool) const; + + /** + * open my parents so that I'm visible, if I'm playing or + * close my parents if I'm not playing, and the user + * didn't open + **/ + void autoExpand(); + bool userOpened() const { return mUserOpened; } + bool hideIfNoMatch(const QString &match); + + void setHidden(bool on); + + virtual void setup(); + +private: + TreeItem *next(); + + void forceAutoExpand(); + +}; + +class FileMenu; +class Loader; + +class Tree : public KListView +{ +Q_OBJECT + Oblique *mOblique; + + Query mQuery; + TreeItem *mCurrent; + FileMenu *lastMenu; + Slice *mSlice; + QString mFileOfQuery; + + friend class TreeItem; + int mPlayableItemCount; // used by the friendship + + QPtrList<TreeItem> mAutoExpanded; + unsigned int mAutoExpanding; + + Loader *mLoader; + +public: + Tree(Oblique *oblique, QWidget *parent=0); + ~Tree(); + TreeItem *firstChild(); + TreeItem *find(File item); + TreeItem *current() { return mCurrent; } + Query *query() { return &mQuery; } + Oblique *oblique() { return mOblique; } + Slice *slice() { return mSlice; } + QString fileOfQuery() const { return mFileOfQuery; } + + void clear(); + + int playableItemCount() const { return mPlayableItemCount; } + + void addAutoExpanded(TreeItem *i) { mAutoExpanded.append(i); } + void removeAutoExpanded(TreeItem *i) { mAutoExpanded.removeRef(i); } + void resetAutoExpanded() { mAutoExpanded.clear(); } + + void setAutoExpanding(bool e) { mAutoExpanding += e ? 1 : -1; } + bool autoExpanding() const { return mAutoExpanding; } + + void deleted(TreeItem *item); + bool setSchema(const QString &name); + +protected: + virtual QDragObject *dragObject(); + void movableDropEvent(QListViewItem* parent, QListViewItem* afterme); + +public slots: + void insert(TreeItem *replace, File file); + void insert(File file); + void remove(File file); + void update(File file); + void setCurrent(TreeItem *cur); + void setSlice(Slice *sl); + + void checkInsert(Slice*, File); + void checkRemove(Slice*, File); + + /** + * the resulting presentation of this item must contain the string @p text + * or it will not be displayed + * (used for Jump) + **/ + void setLimit(const QString &text); + +private slots: + void contextMenu(KListView* l, QListViewItem* i, const QPoint& p); + void play(QListViewItem *item); + + void destroyLoader(); + + void dropped(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &afterNow); + +signals: + void selected(TreeItem *); + +private: + /** + * check if it fits into the group, and create + * the tree nodes for it + **/ + TreeItem *collate(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf=0); + TreeItem *collate(const File &file, TreeItem *childOf=0) + { + if (!mQuery.firstChild()) return 0; + return collate(0, mQuery.firstChild(), file, childOf); + } + + TreeItem *collate(TreeItem *fix, const File &file, TreeItem *childOf=0) + { + if (!mQuery.firstChild()) return 0; + return collate(fix, mQuery.firstChild(), file, childOf); + } + + TreeItem *node(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf); + + /** + * remove the siblings and children of the treeitem + **/ + void remove(TreeItem *, const File &file); + + void limitHide(TreeItem *i, const QString &text); + + void reload(); +}; + + +#endif diff --git a/noatun-plugins/oblique/view.cpp b/noatun-plugins/oblique/view.cpp new file mode 100644 index 0000000..93b79ce --- /dev/null +++ b/noatun-plugins/oblique/view.cpp @@ -0,0 +1,251 @@ +// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#include "view.h" +#include "oblique.h" +#include "menu.h" + +#include <noatun/app.h> + +#include <kstdaction.h> +#include <klocale.h> +#include <kedittoolbar.h> +#include <kfiledialog.h> +#include <qlabel.h> +#include <klineeditdlg.h> +#include <kmessagebox.h> +#include <ktabwidget.h> +#include <qtabbar.h> + +class TabWidget : public KTabWidget +{ +public: + TabWidget(QWidget *parent) + : KTabWidget(parent) + { + } +public: + QTabBar *tabBar() const { return KTabWidget::tabBar(); } +}; + + +View::View(Oblique *oblique) + : KMainWindow(0, 0) +{ + mOblique = oblique; + mTree = 0; + + mTabs = new TabWidget(this); + mTabs->tabBar()->hide(); + connect(mTabs, SIGNAL(currentChanged(QWidget*)), SLOT(currentTabChanged(QWidget*))); + + setCentralWidget(mTabs); + + KAction *ac; + ac = new KAction(i18n("Add &Files..."), "queue", 0, this, SLOT(addFiles()), actionCollection(), "add_files"); + ac->setWhatsThis(i18n("Add a reference to a media file on disk to this collection.")); + ac = new KAction(i18n("Add Fol&ders..."), "folder", 0, this, SLOT(addDirectory()), actionCollection(), "add_dir"); + + +// ac = new KAction(i18n("&Reload"), "reload", 0, oblique, SLOT(reload()), actionCollection(), "reload"); +// ac->setWhatsThis(i18n("Reread the collection and meta-information from its files.")); + + ac = new SliceListAction( + i18n("&Slices"), oblique, + this, SLOT(use(Slice*)), QValueList<File>(), actionCollection(), "slices" + ); + ac->setWhatsThis(i18n("Select a sub-collection to display")); + + mSchemaListAction = new SchemaListAction( + i18n("&Schemas"), this, SLOT(setSchema(const QString&)), actionCollection(), "schemas" + ); + mSchemaListAction->setWhatsThis(i18n("Select a schema to use to collate the tree.")); + + ac = new KAction( + i18n("&New Tab"), "tab_new", "CTRL+SHIFT+N;CTRL+T", this, SLOT(addTab()), + actionCollection(), "newtab" + ); + + mRemoveTabAction = new KAction( + i18n("&Close Current Tab"), "tab_remove", CTRL+Key_W, this, SLOT(removeTab()), + actionCollection(), "removecurrenttab" + ); + + { + QLabel *l = new QLabel(i18n("&Jump:"), 0, "kde toolbar widget"); + l->setBackgroundMode( Qt::PaletteButton ); + l->setAlignment( + (QApplication::reverseLayout() ? Qt::AlignRight : Qt::AlignLeft) | + Qt::AlignVCenter | Qt::ShowPrefix + ); + l->adjustSize(); + new KWidgetAction(l, i18n("&Jump:"), KShortcut(ALT + Key_J), 0, 0, actionCollection(), "jump_label"); + + LineEditAction *jumpAction = new LineEditAction(i18n("Jump Bar"), 0, 0, actionCollection(), "jump_text"); + jumpAction->setWhatsThis(i18n("Only display items which contain this string")); + l->setBuddy(jumpAction->lineEdit()); + connect(jumpAction->lineEdit(), SIGNAL(textChanged(const QString&)), SLOT(jumpTextChanged(const QString&))); + } + + KStdAction::configureToolbars(this, SLOT(configureToolBars()), actionCollection()); + + applyMainWindowSettings(KGlobal::config(), "Oblique View"); + createGUI("obliqueui.rc"); + + KConfigGroup g(KGlobal::config(), "oblique"); + QStringList tabids = g.readListEntry("tabids"); + + for (QStringList::Iterator i(tabids.begin()); i != tabids.end(); ++i) + { + QString t = *i; + int sliceid = t.section(':', 0, 0).toInt(); + QString fileOfQuery = t.section(':', 1, 1); + + Slice *slice = oblique->base()->sliceById(sliceid); + if (!slice) + slice = oblique->base()->defaultSlice(); + Tree *tree = new Tree(oblique, mTabs); + mTrees.append(tree); + tree->setSlice(slice); + tree->setSchema(fileOfQuery); + mTabs->addTab(tree, slice->name()); + } + + if (mTabs->count() == 0) + { // no tabs, so use the "normal" route + addTab(); + } + else + { + // ok, there's a tab, so make it present + if (mTabs->count() >= 1) + { + mTree = static_cast<Tree*>(mTrees.first()); + currentTabChanged(mTrees.first()); + } + + if (mTabs->count() > 1) + mTabs->tabBar()->show(); + } +} + +View::~View() +{ + QStringList tabids; + for (int i=0; i < mTabs->count(); i++) + { + Tree *tree = static_cast<Tree*>(mTabs->page(i)); + int slice = tree->slice()->id(); + QString query = tree->fileOfQuery(); + + QString t = QString("%1:%2").arg(slice).arg(query); + tabids.append(t); + } + + KConfigGroup g(KGlobal::config(), "oblique"); + g.writeEntry("tabids", tabids); + g.sync(); +} + +void View::configureToolBars() +{ + saveMainWindowSettings(KGlobal::config(), "Oblique View"); + KEditToolbar dlg(actionCollection(), "obliqueui.rc"); + connect(&dlg, SIGNAL(newToolbarConfig()), SLOT(newToolBarConfig())); + dlg.exec(); +} + +void View::newToolBarConfig() +{ + createGUI("obliqueui.rc"); + applyMainWindowSettings(KGlobal::config(), "Oblique View"); +} + +void View::closeEvent(QCloseEvent*) +{ + hide(); +} + + +void View::addFiles() +{ + KURL::List files=KFileDialog::getOpenURLs(":mediadir", napp->mimeTypes(), this, i18n("Select Files to Add")); + + for(KURL::List::Iterator it=files.begin(); it!=files.end(); ++it) + oblique()->addFile(KURL(*it)); +} + +void View::addDirectory() +{ + QString folder = KFileDialog::getExistingDirectory(":mediadir:", this, + i18n("Select Folder to Add")); + + if (!folder) + return; + + KURL url; + url.setPath(folder); + oblique()->beginDirectoryAdd(url); +} + +void View::addTab() +{ + Tree *t = new Tree(oblique(), mTabs); + if (!mTree) mTree = t; + mTrees.append(t); + + mTabs->addTab(t, t->slice()->name()); + mTabs->showPage(t); + if (mTabs->count() > 1) + mTabs->tabBar()->show(); + currentTabChanged(t); +} + +void View::removeTab() +{ + Tree *current = static_cast<Tree*>(mTabs->currentPage()); + if (current == mTree) return; + mTabs->removePage(current); + mTrees.remove(current); + delete current; + + if (mTabs->count() == 1) + mTabs->tabBar()->hide(); +} + +void View::currentTabChanged(QWidget *w) +{ + mRemoveTabAction->setEnabled(w != mTree); + mSchemaListAction->setTree(static_cast<Tree*>(w)); +} + +void View::setSchema(const QString &file) +{ + Tree *current = static_cast<Tree*>(mTabs->currentPage()); + current->setSchema(file); +} + + +void View::jumpTextChanged(const QString &text) +{ + Tree *current = static_cast<Tree*>(mTabs->currentPage()); + current->setLimit(text); +} + +void View::use(Slice *s) +{ + Tree *current = static_cast<Tree*>(mTabs->currentPage()); + current->setSlice(s); + mTabs->setTabLabel(current, current->slice()->name()); +} + + + +LineEditAction::LineEditAction(const QString &text, const QObject *reciever, const char *slot, KActionCollection *parent, const char *name) + : KWidgetAction(new KLineEdit(0), text, KShortcut(0), reciever, slot, parent, name) +{ + setAutoSized(true); +} + +#include "view.moc" + diff --git a/noatun-plugins/oblique/view.h b/noatun-plugins/oblique/view.h new file mode 100644 index 0000000..598c0cc --- /dev/null +++ b/noatun-plugins/oblique/view.h @@ -0,0 +1,71 @@ +// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org> +// See the file COPYING for redistribution terms. + +#ifndef VIEW_H +#define VIEW_H + +#include <kmainwindow.h> +#include <kaction.h> +#include <klineedit.h> + +#include "tree.h" + +class SchemaListAction; +class TabWidget; + +class View : public KMainWindow +{ +Q_OBJECT + Oblique *mOblique; + Tree *mTree; + QValueList<Tree*> mTrees; + TabWidget *mTabs; + KAction *mRemoveTabAction; + SchemaListAction *mSchemaListAction; + +public: + View(Oblique *oblique); + ~View(); + + Tree *tree() { return mTree; } + + Oblique *oblique() { return mOblique; } + +public slots: + void addFiles(); + void addDirectory(); + void addTab(); + void removeTab(); + +signals: + void listHidden(); + void listShown(); + +private slots: + void configureToolBars(); + void newToolBarConfig(); + void jumpTextChanged(const QString &text); + void use(Slice*); + void currentTabChanged(QWidget *); + void setSchema(const QString &file); + +protected: + virtual void showEvent(QShowEvent *) { emit listShown(); } + virtual void hideEvent(QHideEvent *) { emit listHidden(); } + void closeEvent(QCloseEvent*); +}; + + +class LineEditAction : public KWidgetAction +{ +Q_OBJECT +public: + LineEditAction(const QString &text, const QObject *reciever, const char *slot, KActionCollection *parent, const char *name); + + KLineEdit *widget() { return static_cast<KLineEdit*>(KWidgetAction::widget()); } + KLineEdit *lineEdit() { return widget(); } +}; + + +#endif + diff --git a/noatun-plugins/pitchablespeed/Makefile.am b/noatun-plugins/pitchablespeed/Makefile.am new file mode 100644 index 0000000..b994d98 --- /dev/null +++ b/noatun-plugins/pitchablespeed/Makefile.am @@ -0,0 +1,15 @@ +INCLUDES= -I$(kde_includes)/arts $(all_includes) + +kde_module_LTLIBRARIES = noatunpitchablespeed.la +noatunpitchablespeed_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunpitchablespeed_la_LIBADD = $(LIB_KFILE) -lnoatun -lm -lartsmodules + +noatunpitchablespeed_la_SOURCES = pitchablespeed.cpp speedtuner.ui +noatunpitchablespeed_la_METASOURCES = AUTO +noinst_HEADERS = pitchablespeed.h + +noatun_DATA = pitchablespeed.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/pitchablespeed.pot diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.cpp b/noatun-plugins/pitchablespeed/pitchablespeed.cpp new file mode 100644 index 0000000..f091c72 --- /dev/null +++ b/noatun-plugins/pitchablespeed/pitchablespeed.cpp @@ -0,0 +1,167 @@ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +// (c) 2001 hans_meine@gmx.net + +#include "pitchablespeed.h" +#include <arts/reference.h> +#include <arts/soundserver.h> +#include <arts/kmedia2.h> +#include <noatun/app.h> +#include <noatun/player.h> +#include <noatun/engine.h> +#include <noatun/noatunarts.h> +#include <qslider.h> +#include <qlineedit.h> +#include <qcheckbox.h> +#include <klocale.h> +#include <knuminput.h> + +extern "C" +{ + Plugin *create_plugin() + { + KGlobal::locale()->insertCatalogue("pitchablespeed"); + return new PitchableSpeed(); + } +} + +const int PitchableSpeed::DEFAULT_OFFSET = 5; +const int PitchableSpeed::DEFAULT_RANGE = 10; + +PitchableSpeed::PitchableSpeed() : Plugin(), + offset(DEFAULT_OFFSET), + range(DEFAULT_RANGE) +, frequenciesPreserved(false) +{ + + rangeInput->setRange(2,150,1,false); + rangeInput->setValue(range); + offsetInput->setRange(-5,15,1,false); + offsetInput->setValue(offset); + setupSliderRange(); + connect(napp->player(), SIGNAL(changed()), + this, SLOT(newSong())); + connect(preserveFrequencies, SIGNAL(toggled(bool)), + this, SLOT(preserveFrequenciesChanged(bool))); + //show(); +} + +PitchableSpeed::~PitchableSpeed() +{ + napp->pluginMenuRemove(pluginMenuItem); + + Arts::PlayObject playobject= napp->player()->engine()->playObject(); + Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); + if (!pitchable.isNull()) + pitchable.speed(1.0); + + if (frequenciesPreserved) + napp->player()->engine()->effectStack()->remove(pitchShiftEffectID); +} + +void PitchableSpeed::newSong() +{ + setSpeed(); + + Arts::PlayObject playobject= napp->player()->engine()->playObject(); + Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); + slider->setEnabled(!pitchable.isNull()); +} + +float PitchableSpeed::sliderSpeed() +{ + return 1.0f - slider->value()/1000.0f; +} + +void PitchableSpeed::setSpeed() +{ + Arts::PlayObject playobject= napp->player()->engine()->playObject(); + Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject); + float newSpeed= 1.0f; + if (!pitchable.isNull()) + { + newSpeed= sliderSpeed(); + pitchable.speed(newSpeed); + if (frequenciesPreserved) + pitchShift.speed(1.f/newSpeed); + } + + QString percentStr; + percentStr.setNum((newSpeed-1.f)*100.f,'f',1); + if (newSpeed<=0) percentStr.prepend('+').append(' ').append('%'); + currentValEdit->setText(percentStr); +} + +void PitchableSpeed::setupSliderRange() +{ + int min= (-offset+range)<99 ? (-offset+range)*10 : 990; + slider->setRange((-offset-range)*10,min); + slider->setTickInterval(10); +} + +void PitchableSpeed::speedChanged(int ) +{ + setSpeed(); +} + +void PitchableSpeed::offsetChanged(int newOffset) +{ + offset= newOffset; + setupSliderRange(); +} + +void PitchableSpeed::rangeChanged(int newRange) +{ + range= newRange; + setupSliderRange(); +} + +void PitchableSpeed::preserveFrequenciesChanged(bool preserveNow) +{ + if (preserveNow==frequenciesPreserved) + return; + if (preserveNow) + { + pitchShift = Arts::DynamicCast(napp->player()->engine()->server()-> + createObject("Arts::Synth_STEREO_PITCH_SHIFT")); + pitchShift.frequency(10.f); // TODO: might have to experiment a bit with this + pitchShift.speed(1.f/sliderSpeed()); + pitchShift.start(); + pitchShiftEffectID= napp->player()->engine()->effectStack()-> + insertTop(pitchShift, "correcting pitch shift"); + } + else + { + napp->player()->engine()->effectStack()->remove(pitchShiftEffectID); + pitchShift.stop(); + pitchShift = Arts::Synth_STEREO_PITCH_SHIFT::null(); + } + frequenciesPreserved= preserveNow; +} + +void PitchableSpeed::init() +{ + pluginMenuItem = napp->pluginMenuAdd(i18n("Toggle Speed Slider"), + this, SLOT(toggle(void))); +} + +void PitchableSpeed::toggle(void) +{ + show(); + raise(); +} + +void PitchableSpeed::closeEvent(QCloseEvent *) +{ + hide(); +} + +#include "pitchablespeed.moc" + diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.h b/noatun-plugins/pitchablespeed/pitchablespeed.h new file mode 100644 index 0000000..d11a7cc --- /dev/null +++ b/noatun-plugins/pitchablespeed/pitchablespeed.h @@ -0,0 +1,63 @@ +#ifndef PITCHABLESPEED_H +#define PITCHABLESPEED_H + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +// (c) 2001 hans_meine@gmx.net + +#include <noatun/plugin.h> +#include <arts/artsmodules.h> +#include "speedtuner.h" + +class QSlider; + +class PitchableSpeed : public SpeedTuner, public Plugin +{ +Q_OBJECT + +public: + PitchableSpeed(); + virtual ~PitchableSpeed(); + + void init(); + +public slots: + void toggle(void); + + void newSong(); + +protected: + virtual void closeEvent(QCloseEvent *); + + void setupSliderRange(); + void setSpeed(); + float sliderSpeed(); + +protected slots: + void speedChanged(int); + void offsetChanged(int); + void rangeChanged(int); + + void preserveFrequenciesChanged(bool); + +private: + static const int DEFAULT_OFFSET; + static const int DEFAULT_RANGE; + + int offset, range; // in percent, defaults 5% offset +-10% range + + bool frequenciesPreserved; + Arts::Synth_STEREO_PITCH_SHIFT pitchShift; + long pitchShiftEffectID; + + int pluginMenuItem; +}; + +#endif // PITCHABLESPEED_H diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.plugin b/noatun-plugins/pitchablespeed/pitchablespeed.plugin new file mode 100644 index 0000000..8b1dded --- /dev/null +++ b/noatun-plugins/pitchablespeed/pitchablespeed.plugin @@ -0,0 +1,113 @@ +Filename=noatunpitchablespeed.la +Author=Hans Meine +Site=http://noatun.kde.org/ +Email=hans@meine.de +Type=other +License=GPL +Name=Pitchable Playing Speed +Name[az]=Dəyişdirilə Bilən Çalma Sür'əti +Name[bs]=Prilagodljiva brzina sviranja +Name[ca]=Velocitat de reproducció canviant +Name[cs]=Přizpůsobitelná rychlost přehrávání +Name[cy]=Cyflymder Chwarae Addasu Traw +Name[da]=Indstillelig afspilningshastighed +Name[de]=Anpassbare Abspielgeschwindigkeit +Name[el]=Ρυθμιζόμενη ταχύτητα αναπαραγωγής +Name[eo]=Altigebla ludrapideco +Name[es]=Velocidad de juego ajustable +Name[et]=Esituskiiruse muutja +Name[eu]=Erreprodukzio abiadura aldagarria +Name[fa]=زیروبمی سرعت پخش +Name[fi]=Muutettava soittonopeus +Name[fr]=Vitesse de lecture variable +Name[fy]=Oanpasbere ôfspylsnelheid +Name[gl]=Velocidade Variábel de Reprodución +Name[he]=התאמת מהירות +Name[hi]=पिचेबल प्लेइंग स्पीड +Name[hr]=Promjenjiva brzina +Name[hu]=Változtatható lejátszási sebesség +Name[is]=Stillanlegur afspilunarhraði +Name[it]=Modificatore di velocità di riproduzione +Name[ka]=რეგულირებადი დაკვრის სიჩქარე +Name[kk]=Орындау жылдамдығын басқару +Name[km]=ល្បឿនចាក់ដែលអាចកំណត់កម្ពស់សំឡេងបាន +Name[lt]=Keičiamo tono grojimo greitis +Name[mk]=Приспособлива брзина на изведба +Name[nb]=Tonehøyde-spillehastighet +Name[nds]=Afspeelgauheit ännern +Name[ne]=पीचयोग्य प्ले गति +Name[nl]=Aanpasbare afspeelsnelheid +Name[nn]=Tonehøgde-spelesnøggleik +Name[pl]=Zmiana szybkości odtwarzania +Name[pt]=Velocidade Variável de Reprodução +Name[pt_BR]=Velocidade de Reprodução +Name[ro]=Viteză de redare variabilă +Name[ru]=Регулирование скорости проигрывания +Name[sk]=Nastaviteľná rýchlosť prehrávania +Name[sl]=Hitrost predvajanja +Name[sr]=Подесива брзина пуштања +Name[sr@Latn]=Podesiva brzina puštanja +Name[sv]=Anpassningsbar uppspelningshastighet +Name[ta]=அடர்வு வாசிப்பு வேகம் +Name[tg]=Танзими суръати ба кор андохтан +Name[tr]=Ayarlanabilir Çalma Hızı +Name[uk]=Довільна швидкість програвання +Name[vi]=Tốc độ phát có giọng +Name[xh]=Isantya Sokudlala Esingabasezantsi Okanye phezulu +Name[zh_CN]=可设定基准的播放速度 +Name[zh_TW]=可調整播放速度 +Comment=Makes playing speed adjustable with a slider +Comment[az]=Çalma sür'ətini bir qulp ilə dəyişdirmə imkanı verir +Comment[bg]=Регулиране скоростта на изпълнение чрез плъзгач +Comment[bs]=Omogućuje prilagođavanje brzine sviranja pomoću klizača +Comment[ca]=Fa que es puga variar la velocitat de reproducció amb un cursor +Comment[cs]=Umožní měnit rychlost přehrávání pomocí posuvníku +Comment[cy]=Newid cyflymder chwarae efo llithrydd +Comment[da]=Gør afspilningshastigheden indstillelig med en skyder +Comment[de]=Macht die Abspielgeschwindigkeit mit einem Schieberegler einstellbar +Comment[el]=Κάνει την ταχύτητα αναπαραγωγής να ρυθμίζεται μέσω ενός ολισθητή +Comment[eo]=Agordebligas ludrapidecon per rolumilo +Comment[es]=Permite ajustar la velocidad de reproducción con un botón deslizante +Comment[et]=Muudab mängimiskiiruse liuguriga kohandatavaks +Comment[eu]=Erreprodukzio abiadura botoi irristagarri baten bitartez doitzen du +Comment[fa]=سرعت پخش را توسط یک لغزان قابل تنظیم میسازد +Comment[fi]=Voit muuttaa soittonopeutta liukusäätimellä +Comment[fr]=Rend la vitesse de lecture ajustable avec un curseur +Comment[fy]=Makket de ôfspylsnelheid ynstelber mei in skúfregelder +Comment[gl]=Torna a velocidade de reproduición axustábel cunha barra +Comment[he]=מאפשר התאמה של מהירות הניגון בעזרת מחוון +Comment[hi]=प्लेइंग स्पीड एक स्लाइडर के द्वारा समायोजन योग्य बनाता है +Comment[hr]=Omogućuje promjenu brzine sviranja pomoću klizača +Comment[hu]=Változtatható lejátszási sebességet tesz lehetővé +Comment[is]=Gerir afspilunarhraðan stillanlegan með rennislá +Comment[it]=Permette di modificare la velocità di riproduzione tramite una barra +Comment[ja]=再生スピードをスライダーで調節させる +Comment[ka]=საშუალებას იძლევა დაკვრის სიჩქარე სოსიით შეცვალოთ +Comment[kk]=Орындау жылдамдығын жүгірткі арқылы басқару +Comment[km]=ធ្វើឲ្យល្បឿនការចាក់អាចលៃតម្រូវបានដោយប្រើគ្រាប់រំកិល +Comment[lt]=Leidžia keisti grojimo greitį su šliaužikliu +Comment[mk]=Ја прави брзината на изведба на музиката приспособлива со потенциометар +Comment[ms]=Menjadikan kelajuan pemain boleh laras dengan slider +Comment[nb]=Gjør avspillingsfarten justerbar med en skyver +Comment[nds]=De Afspeelgauheit mit en Schuver topassen +Comment[ne]=स्लाइडरबाट प्ले गति समायोजनयोग्य बनाउछ +Comment[nl]=Maakt de afspeelsnelheid instelbaar met een schuifregelaar +Comment[nn]=Gjer spelefarten justerbar med ein skyvar +Comment[pl]=Umożliwia łatwą zmianę szybkości odtwarzania +Comment[pt]=Torna a velocidade de reprodução ajustável com uma barra +Comment[pt_BR]=Torna a velocidade reprodução ajustável com uma barra deslizante +Comment[ro]=Permite ajustarea vitezei de redare cu un potenţiometru +Comment[ru]=Регулирование скорости проигрывания через бегунок +Comment[sk]=Umožňuje zmeniť rýchlosť prehrávania pomocou posúvadla +Comment[sl]=Naredi hitrost predvajanja prilagodljivo z drsnikom +Comment[sr]=Чини брзину пуштања подесивом помоћу клизача +Comment[sr@Latn]=Čini brzinu puštanja podesivom pomoću klizača +Comment[sv]=Gör uppspelningshastigheten justerbar med ett skjutreglage +Comment[ta]=ஸ்லைடருடன் வாசிப்பு வேகத்தை சரிபார்க்க கூடிய வகையில் அமைக்கிறது +Comment[tg]=Танзими суръати ба кор андохтан бо даванда +Comment[tr]=Bir kaydırma çubuğuyla oynatma hızını ayarlanabilir yapar +Comment[uk]=Дозволяє змінювати швидкість програвання за допомогою повзунка +Comment[vi]=Cung cấp khả năng điều chỉnh tốc độ phát bằng con trượt +Comment[xh]=Yenza isantya sokudlalo sikwazi ukucutheka ngesityibilikisi +Comment[zh_CN]=使播放速度可以使用滑动条来调整 +Comment[zh_TW]=讓播放速度可經由滑動器調整 diff --git a/noatun-plugins/pitchablespeed/speedtuner.ui b/noatun-plugins/pitchablespeed/speedtuner.ui new file mode 100644 index 0000000..79844c4 --- /dev/null +++ b/noatun-plugins/pitchablespeed/speedtuner.ui @@ -0,0 +1,195 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>SpeedTuner</class> +<author>Hans Meine <hans@meine.de></author> +<widget class="QDialog"> + <property name="name"> + <cstring>SpeedTuner</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>269</width> + <height>316</height> + </rect> + </property> + <property name="caption"> + <string>Adjust Playing Speed</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QSlider"> + <property name="name"> + <cstring>slider</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="tickmarks"> + <enum>Both</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QLineEdit"> + <property name="name"> + <cstring>currentValEdit</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="font"> + <font> + <family>Sans Serif</family> + <pointsize>24</pointsize> + <bold>1</bold> + </font> + </property> + <property name="frame"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + <property name="hAlign" stdset="0"> + </property> + </widget> + <spacer> + <property name="name" stdset="0"> + <cstring>Spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>Layout2</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>rangeLabel</cstring> + </property> + <property name="text"> + <string>&Range:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>rangeInput</cstring> + </property> + </widget> + <widget class="KIntNumInput" row="0" column="1"> + <property name="name"> + <cstring>rangeInput</cstring> + </property> + <property name="value"> + <number>10</number> + </property> + <property name="suffix"> + <string> %</string> + </property> + <property name="prefix"> + <string>+/- </string> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>offsetLabel</cstring> + </property> + <property name="text"> + <string>&Offset:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>offsetInput</cstring> + </property> + </widget> + <widget class="KIntNumInput" row="1" column="1"> + <property name="name"> + <cstring>offsetInput</cstring> + </property> + <property name="value"> + <number>5</number> + </property> + <property name="suffix"> + <string> %</string> + </property> + </widget> + </grid> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>preserveFrequencies</cstring> + </property> + <property name="text"> + <string>&Preserve frequencies</string> + </property> + </widget> + </vbox> + </widget> + </hbox> +</widget> +<connections> + <connection> + <sender>slider</sender> + <signal>valueChanged(int)</signal> + <receiver>SpeedTuner</receiver> + <slot>speedChanged(int)</slot> + </connection> + <connection> + <sender>rangeInput</sender> + <signal>valueChanged(int)</signal> + <receiver>SpeedTuner</receiver> + <slot>rangeChanged(int)</slot> + </connection> + <connection> + <sender>offsetInput</sender> + <signal>valueChanged(int)</signal> + <receiver>SpeedTuner</receiver> + <slot>offsetChanged(int)</slot> + </connection> +</connections> +<slots> + <slot access="protected">speedChanged(int)</slot> + <slot access="protected">offsetChanged(int)</slot> + <slot access="protected">rangeChanged(int)</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/noatun-plugins/synaescope/Makefile.am b/noatun-plugins/synaescope/Makefile.am new file mode 100644 index 0000000..27c35cc --- /dev/null +++ b/noatun-plugins/synaescope/Makefile.am @@ -0,0 +1,23 @@ +INCLUDES= $(all_includes) $(SDL_CFLAGS) + +METASOURCES = AUTO + +kde_module_LTLIBRARIES = noatunsynaescope.la + +noatunsynaescope_la_SOURCES = synaescope.cpp cmodule.cpp +noatunsynaescope_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunsynaescope_la_LIBADD = $(LIB_KFILE) -lnoatun -lm + +bin_PROGRAMS = noatunsynaescope.bin + +noatunsynaescope_bin_SOURCES = core.cpp main.cpp sdlwrap.cpp ui.cpp +noatunsynaescope_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH) +noatunsynaescope_bin_LDADD = $(LIB_KDEUI) -lnoatun $(SDL_LIBS) + +noatun_DATA = synaescope.plugin +noatundir = $(kde_datadir)/noatun + +KDE_ICON = AUTO + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/synaescope.pot diff --git a/noatun-plugins/synaescope/cmodule.cpp b/noatun-plugins/synaescope/cmodule.cpp new file mode 100644 index 0000000..4765eef --- /dev/null +++ b/noatun-plugins/synaescope/cmodule.cpp @@ -0,0 +1,88 @@ +// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include <kconfig.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kglobalsettings.h> +#include <klocale.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qspinbox.h> + +#include "cmodule.h" +#include "synaescope.h" + +SynaePrefs::SynaePrefs(QObject *parent) + : CModule(i18n("Synaescope"), i18n("Noatun Visualization"), "synaescope", parent) +{ +// kdDebug(66666) << k_funcinfo << endl; + xRes = new QSpinBox(320, 1024, 16, this); + yRes = new QSpinBox(240, 768, 12, this); + + QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint()); + QHBoxLayout *xResLayout = new QHBoxLayout(0, 0, KDialog::spacingHint()); + QHBoxLayout *yResLayout = new QHBoxLayout(0, 0, KDialog::spacingHint()); + + xResLayout->addWidget(new QLabel(i18n("Display width:"), this)); + xResLayout->addWidget(xRes); + + yResLayout->addWidget(new QLabel(i18n("Display height:"), this)); + yResLayout->addWidget(yRes); + + layout->addLayout(xResLayout); + layout->addLayout(yResLayout); + layout->addStretch(); + + changed=false; + connect(xRes, SIGNAL(valueChanged(int)), this, SLOT(slotChanges())); + connect(yRes, SIGNAL(valueChanged(int)), this, SLOT(slotChanges())); +} + +void SynaePrefs::save() +{ +// kdDebug(66666) << k_funcinfo << endl; + if(!changed) + return; + + KConfig *c = KGlobal::config(); + c->setGroup("Synaescope"); + c->writeEntry("xResolution", xRes->value()); + c->writeEntry("yResolution", yRes->value()); + c->sync(); + emit configChanged(); +} + +void SynaePrefs::reopen() +{ +// kdDebug(66666) << k_funcinfo << endl; + KConfig *c = KGlobal::config(); + c->setGroup("Synaescope"); + + xRes->setValue(c->readNumEntry("xResolution", 320)); + yRes->setValue(c->readNumEntry("yResolution", 240)); + changed=false; +} + +void SynaePrefs::slotChanges() +{ + changed=true; +} +#include "cmodule.moc" diff --git a/noatun-plugins/synaescope/cmodule.h b/noatun-plugins/synaescope/cmodule.h new file mode 100644 index 0000000..0642e2e --- /dev/null +++ b/noatun-plugins/synaescope/cmodule.h @@ -0,0 +1,49 @@ +// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef CMODULE_H +#define CMODULE_H + +#include <noatun/pref.h> + +class QSpinBox; + +class SynaePrefs : public CModule +{ + Q_OBJECT + + public: + SynaePrefs(QObject *parent); + + virtual void save(); + virtual void reopen(); + + signals: + void configChanged(); + + private slots: + void slotChanges(); + + private: + QSpinBox *xRes; + QSpinBox *yRes; + bool changed; +}; + +#endif diff --git a/noatun-plugins/synaescope/core.cpp b/noatun-plugins/synaescope/core.cpp new file mode 100644 index 0000000..56ff9c9 --- /dev/null +++ b/noatun-plugins/synaescope/core.cpp @@ -0,0 +1,432 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include "syna.h" +#include <unistd.h> +#include <noatun/conversion.h> + +using namespace std; + +Core *core; + +#define outputs unsigned char *Dlo=(unsigned char*)lastOutputBmp.data; \ +unsigned char *Dllo=(unsigned char*)lastLastOutputBmp.data; \ +unsigned char *Do=(unsigned char*)outputBmp.data; + +void Core::setupPalette(double) { interface->setupPalette(); } + +int Core::bitReverser(int i) +{ + int sum=0,j; + for(j=0;j<LogSize;j++) + { + sum = (i&1)+sum*2; + i >>= 1; + } + return sum; +} + +void Core::fft(double *x,double *y) +{ + int n2 = NumSamples, n1; + int twoToTheK; + for(twoToTheK=1;twoToTheK<NumSamples;twoToTheK*=2) + { + n1 = n2; + n2 /= 2; + for(int j=0;j<n2;j++) + { + double c = cosTable[j*twoToTheK&(NumSamples-1)], + s = negSinTable[j*twoToTheK&(NumSamples-1)]; + for(int i=j;i<NumSamples;i+=n1) + { + int l = i+n2; + double xt = x[i] - x[l]; + x[i] = (x[i] + x[l]); + double yt = y[i] - y[l]; + y[i] = (y[i] + y[l]); + x[l] = xt*c - yt*s; + y[l] = xt*s + yt*c; + } + } + } +} + +void Core::setStarSize(double size) +{ + //int factor = (fadeMode == Flame ? 100 : + // (fadeMode == Wave ? 150 : 200)); + + double fadeModeFudge = (fadeMode == Wave ? 0.4 : + (fadeMode == Flame ? 0.6 : 0.78)); + + int factor; + if (size > 0.0) + factor = int(exp(log(fadeModeFudge) / (size*8.0))*255); + else + factor = 0; + + if (factor > 255) factor = 255; + + for(int i=0;i<256;i++) + scaleDown[i] = i*factor>>8; + + maxStarRadius = 1; + for(int i=255;i;i = scaleDown[i]) + maxStarRadius++; +} + +void Core::addPixel(int x,int y,int br1,int br2) +{ + if (x < 0 || x >= outWidth || y < 0 || y >= outHeight) return; + + unsigned char *p = output()+x*2+y*outWidth*2; + if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; + //p += lastOutput()-output(); + //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; +} + +void Core::addPixelFast(unsigned char *p,int br1,int br2) +{ + if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; + //p += lastOutput()-output(); + //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; +} + +void Core::fadeFade() +{ + register unsigned long *ptr = (unsigned long*)output(); + int i = outWidth*outHeight*2/4; + do { + //Bytewize version was: *(ptr++) -= *ptr+(*ptr>>1)>>4; + if (*ptr) { + //if (*ptr & 0xf0f0f0f0ul) + *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5); + ptr++; + } + //else { + // *(ptr++) = (*ptr * 14 >> 4) & 0x0f0f0f0ful; + //} + else + ptr++; + } while(--i > 0); +} + +void Core::fadePixelWave(int x,int y,int where,int step) +{ +outputs + short j = + ( short(getPixel(x-1,y,where-2))+ + getPixel(x+1,y,where+2)+ + getPixel(x,y-1,where-step)+ + getPixel(x,y+1,where+step) + >> 2) + +Dlo[where]; + if (!j) { Do[where] = 0; return; } + j = j + -Dllo[where] + -1; + if (j < 0) Do[where] = 0; + else if (j & (255*256)) Do[where] = 255; + else Do[where] = j; +} + +void Core::fadeWave() +{ + unsigned short *t = lastLastOutputBmp.data; + lastLastOutputBmp.data = lastOutputBmp.data; + lastOutputBmp.data = outputBmp.data; + outputBmp.data = t; + + int x,y,i,j,start,end; + int step = outWidth*2; + for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) { + fadePixelWave(x,0,i,step); + fadePixelWave(x,0,i+1,step); + fadePixelWave(x,outHeight-1,j,step); + fadePixelWave(x,outHeight-1,j+1,step); + } + + for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) { + fadePixelWave(0,y,i,step); + fadePixelWave(0,y,i+1,step); + fadePixelWave(outWidth-1,y,j,step); + fadePixelWave(outWidth-1,y,j+1,step); + } +outputs + + for(y=1, + start=outWidth*2+2, + end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) { + int i = start; + do { + short j = + ( short(Dlo[i-2])+ + Dlo[i+2]+ + Dlo[i-step]+ + Dlo[i+step] + >> 2) + +Dlo[i]; + if (!j) { + Do[i] = 0; + } else { + j = j + -Dllo[i] + -1; + if (j < 0) Do[i] = 0; + else if (j & (255*256)) Do[i] = 255; + else Do[i] = j; + } + } while(++i < end); + } +} + +void Core::fadePixelHeat(int x,int y,int where,int step) +{ +outputs + short j = + ( short(getPixel(x-1,y,where-2))+ + getPixel(x+1,y,where+2)+ + getPixel(x,y-1,where-step)+ + getPixel(x,y+1,where+step) + >> 2) + +Dlo[where]; + if (!j) { Do[where] = 0; return; } + j = j + -Dllo[where] + -1; + if (j < 0) Do[where] = 0; + else if (j & (255*256)) Do[where] = 255; + else Do[where] = j; +} + +void Core::fadeHeat() +{ + unsigned short *t = lastLastOutputBmp.data; + lastLastOutputBmp.data = lastOutputBmp.data; + lastOutputBmp.data = outputBmp.data; + outputBmp.data = t; + + int x,y,i,j,start,end; + int step = outWidth*2; + for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) + { + fadePixelHeat(x,0,i,step); + fadePixelHeat(x,0,i+1,step); + fadePixelHeat(x,outHeight-1,j,step); + fadePixelHeat(x,outHeight-1,j+1,step); + } + + for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) + { + fadePixelHeat(0,y,i,step); + fadePixelHeat(0,y,i+1,step); + fadePixelHeat(outWidth-1,y,j,step); + fadePixelHeat(outWidth-1,y,j+1,step); + } + +outputs + for(y=1,start=outWidth*2+2, + end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) + { + int i = start; + do + { + short j = + ( short(Dlo[i-2])+ + Dlo[i+2]+ + +Dlo[i-step] + +Dlo[i+step] + >> 2) + +Dlo[i]; + if (!j) { + Do[i] = 0; + } + else + { + j = j + -Dllo[i] + +(Dllo[i] + -Dlo[i]>>2) + -1; + if (j < 0) Do[i] = 0; + else if (j & (255*256)) Do[i] = 255; + else Do[i] = j; + } + } while(++i < end); + } +} + +void Core::fade() +{ + switch(fadeMode) + { + case Stars : + fadeFade(); + break; + case Flame : + fadeHeat(); + break; + case Wave : + fadeWave(); + break; + default: + break; + } +} + +bool Core::calculate() +{ + double x[NumSamples], y[NumSamples]; + double a[NumSamples], b[NumSamples]; + int clarity[NumSamples]; //Surround sound + int i,j,k; +#ifndef LITTLEENDIAN + register sampleType temp; +#endif + + + int brightFactor = int(Brightness * brightnessTwiddler /(starSize+0.01)); + + { + vector<float> *left, *right; + scopeData(left, right); + Conversion::convertStereo2FloatToI16le(NumSamples, &left->front(), &right->front(), (unsigned char*)data); + delete left; + delete right; + } + + for(i=0;i<NumSamples;i++) + { +# ifdef LITTLEENDIAN + x[i] = data[i*2]; + y[i] = data[i*2+1]; +# else + // Need to convert to big-endian + temp = data[i*2]; + temp = (temp >> 8) | (temp << 8); + x[i] = temp; + temp = data[i*2+1]; + temp = (temp << 8) | (temp >> 8); + y[i] = temp; +# endif + } + + fft(x,y); + + for(i=0 +1;i<NumSamples;i++) + { + double x1 = x[bitReverse[i]], + y1 = y[bitReverse[i]], + x2 = x[bitReverse[NumSamples-i]], + y2 = y[bitReverse[NumSamples-i]], + aa,bb; + a[i] = sqrt(aa= (x1+x2)*(x1+x2) + (y1-y2)*(y1-y2) ); + b[i] = sqrt(bb= (x1-x2)*(x1-x2) + (y1+y2)*(y1+y2) ); + if (aa+bb != 0.0) + clarity[i] = (int)( + ( (x1+x2) * (x1-x2) + (y1+y2) * (y1-y2) )/(aa+bb) * 256 ); + else + clarity[i] = 0; + } + + int heightFactor = NumSamples/2 / outHeight + 1; + int actualHeight = NumSamples/2/heightFactor; + int heightAdd = outHeight + actualHeight >> 1; + + // Correct for window size + double brightFactor2 = (brightFactor/65536.0/NumSamples)* + sqrt(actualHeight*outWidth/(320.0*200.0)); + + for(i=1;i<NumSamples/2;i++) { + //int h = (int)( b[i]*280 / (a[i]+b[i]+0.0001)+20 ); + if (a[i] > 0 || b[i] > 0) { + int h = (int)( b[i]*outWidth / (a[i]+b[i]) ); + int br1, br2, br = (int)( + (a[i]+b[i])*i*brightFactor2 ); + br1 = br*(clarity[i]+128)>>8; + br2 = br*(128-clarity[i])>>8; + if (br1 < 0) br1 = 0; else if (br1 > 255) br1 = 255; + if (br2 < 0) br2 = 0; else if (br2 > 255) br2 = 255; + //unsigned char *p = output+ h*2+(164-((i<<8)>>m))*(outWidth*2); + int px = h, + py = heightAdd - i / heightFactor; + + if (pointsAreDiamonds) + { + addPixel(px,py,br1,br2); + br1=scaleDown[br1];br2=scaleDown[br2]; + + //TODO: Use addpixelfast + for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2]) + { + for(k=0;k<j;k++) + { + addPixel(px-j+k,py-k,br1,br2); + addPixel(px+k,py-j+k,br1,br2); + addPixel(px+j-k,py+k,br1,br2); + addPixel(px-k,py+j-k,br1,br2); + } + } + } + else + { + if (px < maxStarRadius || py < maxStarRadius || + px > outWidth-maxStarRadius || py > outHeight-maxStarRadius) + { + addPixel(px,py,br1,br2); + for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2]) + { + addPixel(px+j,py,br1,br2); + addPixel(px,py+j,br1,br2); + addPixel(px-j,py,br1,br2); + addPixel(px,py-j,br1,br2); + } + } + else + { + unsigned char *p = output()+px*2+py*outWidth*2, *p1=p, *p2=p, *p3=p, *p4=p; + addPixelFast(p,br1,br2); + for(;br1>0||br2>0;br1=scaleDown[br1],br2=scaleDown[br2]) + { + p1 += 2; + addPixelFast(p1,br1,br2); + p2 -= 2; + addPixelFast(p2,br1,br2); + p3 += outWidth*2; + addPixelFast(p3,br1,br2); + p4 -= outWidth*2; + addPixelFast(p4,br1,br2); + } + } + } + } + } + return true; +} + +#undef outputs diff --git a/noatun-plugins/synaescope/cr16-app-synaescope.png b/noatun-plugins/synaescope/cr16-app-synaescope.png Binary files differnew file mode 100644 index 0000000..5c29f7e --- /dev/null +++ b/noatun-plugins/synaescope/cr16-app-synaescope.png diff --git a/noatun-plugins/synaescope/font.h b/noatun-plugins/synaescope/font.h new file mode 100644 index 0000000..94d2627 --- /dev/null +++ b/noatun-plugins/synaescope/font.h @@ -0,0 +1,258 @@ +unsigned char font[] = { + 0,0,0,0,0,0,0,0, + 126,129,165,129,189,129,126,0, + 126,255,219,255,195,255,126,0, + 54,127,127,127,62,28,8,0, + 8,28,62,127,62,28,8,0, + 28,28,8,107,127,107,8,28, + 8,28,62,127,62,8,28,62, + 0,0,24,60,60,24,0,0, + 255,255,231,195,195,231,255,255, + 0,60,102,66,66,102,60,0, + 255,195,153,189,189,153,195,255, + 15,7,13,60,102,102,102,60, + 60,102,102,102,60,24,126,24, + 48,56,60,54,52,112,240,224, + 127,99,127,99,99,103,230,192, + 24,219,126,102,102,126,219,24, + 64,112,124,127,124,112,64,0, + 1,7,31,127,31,7,1,0, + 24,60,126,24,24,126,60,24, + 102,102,102,102,102,0,102,0, + 63,122,122,58,10,10,10,0, + 30,51,28,54,54,28,102,60, + 0,0,0,0,126,126,126,0, + 24,60,126,24,126,60,24,126, + 24,60,126,24,24,24,24,0, + 24,24,24,24,126,60,24,0, + 0,12,14,127,14,12,0,0, + 0,24,56,127,56,24,0,0, + 0,0,96,96,96,127,0,0, + 0,36,102,255,102,36,0,0, + 0,24,60,126,255,255,0,0, + 0,255,255,126,60,24,0,0, + 0,0,0,0,0,0,0,0, + 24,24,24,24,24,0,24,0, + 102,102,102,0,0,0,0,0, + 108,108,254,108,254,108,108,0, + 16,124,208,124,22,124,16,0, + 0,198,204,24,48,102,198,0, + 56,108,56,118,220,204,118,0, + 24,24,48,0,0,0,0,0, + 12,24,48,48,48,24,12,0, + 48,24,12,12,12,24,48,0, + 0,108,56,254,56,108,0,0, + 0,24,24,126,24,24,0,0, + 0,0,0,0,0,24,24,48, + 0,0,0,126,0,0,0,0, + 0,0,0,0,0,48,48,0, + 0,6,12,24,48,96,192,0, + 60,102,110,126,118,102,60,0, + 12,28,60,12,12,12,12,0, + 60,102,6,28,48,96,126,0, + 60,102,6,28,6,102,60,0, + 28,60,108,204,254,12,12,0, + 126,96,96,124,6,102,60,0, + 60,96,96,124,102,102,60,0, + 126,6,6,12,24,48,48,0, + 60,102,102,60,102,102,60,0, + 60,102,102,62,6,6,60,0, + 0,48,48,0,0,48,48,0, + 0,24,24,0,0,24,24,48, + 12,24,48,96,48,24,12,0, + 0,0,126,0,0,126,0,0, + 48,24,12,6,12,24,48,0, + 60,102,6,12,24,0,24,0, + 60,102,110,110,108,96,60,0, + 24,60,102,102,126,102,102,0, + 124,102,102,124,102,102,124,0, + 60,102,96,96,96,102,60,0, + 124,102,102,102,102,102,124,0, + 126,96,96,124,96,96,126,0, + 126,96,96,124,96,96,96,0, + 60,102,96,110,102,102,60,0, + 102,102,102,126,102,102,102,0, + 60,24,24,24,24,24,60,0, + 6,6,6,6,102,102,60,0, + 102,108,120,112,120,108,102,0, + 96,96,96,96,96,96,126,0, + 198,238,254,214,198,198,198,0, + 102,118,126,110,102,102,102,0, + 60,102,102,102,102,102,60,0, + 124,102,102,124,96,96,96,0, + 60,102,102,102,102,110,60,6, + 124,102,102,124,102,102,102,0, + 60,102,96,60,6,102,60,0, + 126,24,24,24,24,24,24,0, + 102,102,102,102,102,102,60,0, + 102,102,102,102,102,60,24,0, + 198,198,198,214,254,238,198,0, + 102,102,60,24,60,102,102,0, + 102,102,102,60,24,24,24,0, + 126,6,12,24,48,96,126,0, + 60,48,48,48,48,48,60,0, + 0,192,96,48,24,12,6,0, + 60,12,12,12,12,12,60,0, + 24,60,102,0,0,0,0,0, + 0,0,0,0,0,0,0,255, + 24,24,12,0,0,0,0,0, + 0,0,60,6,62,102,62,0, + 96,96,96,124,102,102,124,0, + 0,0,60,102,96,102,60,0, + 6,6,6,62,102,102,62,0, + 0,0,60,102,126,96,62,0, + 28,54,48,124,48,48,48,0, + 0,0,62,102,102,62,6,60, + 96,96,124,102,102,102,102,0, + 24,0,24,24,24,24,24,0, + 12,0,12,12,12,12,108,56, + 96,96,102,108,120,108,102,0, + 48,48,48,48,48,48,24,0, + 0,0,236,254,214,214,198,0, + 0,0,124,102,102,102,102,0, + 0,0,60,102,102,102,60,0, + 0,0,124,102,102,124,96,96, + 0,0,62,102,102,62,6,6, + 0,0,124,102,96,96,96,0, + 0,0,62,96,60,6,124,0, + 48,48,124,48,48,54,28,0, + 0,0,102,102,102,102,62,0, + 0,0,102,102,102,60,24,0, + 0,0,198,214,254,238,68,0, + 0,0,102,60,24,60,102,0, + 0,0,102,102,102,62,6,60, + 0,0,126,12,24,48,126,0, + 28,48,48,96,48,48,28,0, + 24,24,24,24,24,24,24,0, + 56,12,12,6,12,12,56,0, + 118,220,0,0,0,0,0,0, + 0,0,24,60,102,102,126,0, + 60,102,96,96,102,60,24,48, + 102,0,102,102,102,102,62,0, + 14,0,60,102,126,96,60,0, + 60,102,60,6,62,102,62,0, + 102,0,60,6,62,102,62,0, + 112,0,60,6,62,102,62,0, + 24,24,60,6,62,102,62,0, + 0,0,62,96,96,62,24,48, + 60,102,60,102,126,96,60,0, + 102,0,60,102,126,96,60,0, + 112,0,60,102,126,96,60,0, + 102,0,24,24,24,24,24,0, + 60,102,24,24,24,24,24,0, + 112,0,24,24,24,24,24,0, + 198,56,108,198,254,198,198,0, + 24,24,0,60,102,126,102,0, + 14,0,124,96,120,96,124,0, + 0,0,126,26,126,216,126,0, + 62,120,216,222,248,216,222,0, + 60,102,60,102,102,102,60,0, + 102,0,60,102,102,102,60,0, + 112,0,60,102,102,102,60,0, + 60,102,0,102,102,102,62,0, + 112,0,102,102,102,102,62,0, + 102,0,102,102,102,62,6,60, + 102,60,102,102,102,102,60,0, + 102,0,102,102,102,102,60,0, + 12,12,62,96,96,62,12,12, + 56,108,96,240,96,102,252,0, + 102,102,60,24,126,24,126,24, + 124,102,102,124,102,111,102,99, + 14,27,24,60,24,24,120,48, + 14,0,60,6,62,102,62,0, + 14,0,24,24,24,24,24,0, + 14,0,60,102,102,102,60,0, + 14,0,102,102,102,102,62,0, + 118,220,0,124,102,102,102,0, + 126,0,102,118,126,110,102,0, + 62,102,102,62,0,126,0,0, + 60,102,102,60,0,126,0,0, + 24,0,24,48,96,102,60,0, + 0,0,0,126,96,96,0,0, + 0,0,0,126,6,6,0,0, + 198,204,216,62,99,198,12,31, + 198,204,216,54,110,214,31,6, + 24,0,24,24,24,24,24,0, + 0,54,108,216,108,54,0,0, + 0,216,108,54,108,216,0,0, + 34,136,34,136,34,136,34,136, + 85,170,85,170,85,170,85,170, + 221,119,221,119,221,119,221,119, + 8,8,8,8,8,8,8,8, + 8,8,8,8,248,8,8,8, + 8,8,8,248,248,8,8,8, + 28,28,28,28,252,28,28,28, + 0,0,0,0,252,28,28,28, + 0,0,0,248,248,8,8,8, + 28,28,28,252,252,28,28,28, + 28,28,28,28,28,28,28,28, + 0,0,0,252,252,28,28,28, + 28,28,28,252,252,0,0,0, + 28,28,28,28,252,0,0,0, + 8,8,8,248,248,0,0,0, + 0,0,0,0,248,8,8,8, + 8,8,8,8,15,0,0,0, + 8,8,8,8,255,0,0,0, + 0,0,0,0,255,8,8,8, + 8,8,8,8,15,8,8,8, + 0,0,0,0,255,0,0,0, + 8,8,8,8,255,8,8,8, + 8,8,8,15,15,8,8,8, + 28,28,28,28,31,28,28,28, + 28,28,28,31,31,0,0,0, + 0,0,0,31,31,28,28,28, + 28,28,28,255,255,0,0,0, + 0,0,0,255,255,28,28,28, + 28,28,28,31,31,28,28,28, + 0,0,0,255,255,0,0,0, + 28,28,28,255,255,28,28,28, + 8,8,8,255,255,0,0,0, + 28,28,28,28,255,0,0,0, + 0,0,0,255,255,8,8,8, + 0,0,0,0,255,28,28,28, + 28,28,28,28,31,0,0,0, + 8,8,8,15,15,0,0,0, + 0,0,0,15,15,8,8,8, + 0,0,0,0,31,28,28,28, + 28,28,28,28,255,28,28,28, + 8,8,8,255,255,8,8,8, + 8,8,8,8,248,0,0,0, + 0,0,0,0,15,8,8,8, + 255,255,255,255,255,255,255,255, + 0,0,0,0,255,255,255,255, + 240,240,240,240,240,240,240,240, + 15,15,15,15,15,15,15,15, + 255,255,255,255,0,0,0,0, + 0,0,118,204,204,204,118,0, + 60,102,102,124,102,102,124,96, + 126,102,96,96,96,96,96,0, + 0,0,254,108,108,108,102,0, + 126,102,48,24,48,102,126,0, + 0,0,62,108,108,108,56,0, + 0,0,102,102,102,102,127,192, + 0,0,126,216,24,24,12,0, + 124,56,124,214,214,124,56,124, + 124,198,198,254,198,198,124,0, + 124,198,198,198,108,108,238,0, + 30,48,24,60,102,102,60,0, + 0,0,126,219,219,126,0,0, + 3,6,62,107,115,62,96,192, + 30,48,96,126,96,48,30,0, + 124,198,198,198,198,198,198,0, + 0,126,0,126,0,126,0,0, + 24,24,126,24,24,0,126,0, + 48,24,12,24,48,0,126,0, + 12,24,48,24,12,0,126,0, + 14,27,27,24,24,24,24,24, + 24,24,24,24,24,216,216,112, + 24,24,0,126,0,24,24,0, + 0,118,220,0,118,220,0,0, + 60,102,102,60,0,0,0,0, + 0,0,0,24,24,0,0,0, + 0,0,0,0,24,0,0,0, + 30,24,24,24,24,216,120,56, + 120,108,108,108,108,0,0,0, + 56,12,24,48,60,0,0,0, + 0,0,60,60,60,60,0,0, + 0,0,0,0,0,0,0,0 +}; diff --git a/noatun-plugins/synaescope/icons.h b/noatun-plugins/synaescope/icons.h new file mode 100644 index 0000000..6988dae --- /dev/null +++ b/noatun-plugins/synaescope/icons.h @@ -0,0 +1,4868 @@ +double Icon0[][4] = { + {0.5,0,0.166666666666667,0.333333333333333}, + {0.5,1,0.5,0}, + {0.166666666666667,0.666666666666667,0.5,1}, + {0,0.333333333333333,0,0.666666666666667}, + {0,0,0,0} +}; + +double Icon1[][4] = { + {0.5,0.262222,0.487778,0.185}, + {0.487778,0.185,0.452222666666667,0.115}, + {0.452222666666667,0.115,0.397222666666667,0.0599999999999999}, + {0.397222666666667,0.0599999999999999,0.327222666666667,0.0244446666666664}, + {0.327222666666667,0.0244446666666664,0.25,0.0122220000000002}, + {0.25,0.0122220000000002,0.172778,0.0244446666666664}, + {0.172778,0.0244446666666664,0.102778,0.0599999999999999}, + {0.102778,0.0599999999999999,0.047778,0.115}, + {0.047778,0.115,0.0122226666666666,0.185}, + {0.0122226666666666,0.185,0,0.262222}, + {0,0.262222,0.0122226666666666,0.339444666666667}, + {0.0122226666666666,0.339444666666667,0.047778,0.409444666666667}, + {0.047778,0.409444666666667,0.102778,0.464444666666667}, + {0.102778,0.464444666666667,0.172778,0.5}, + {0.172778,0.5,0.25,0.512222}, + {0.25,0.512222,0.327222666666667,0.5}, + {0.327222666666667,0.5,0.397222666666667,0.464444666666667}, + {0.397222666666667,0.464444666666667,0.452222666666667,0.409444666666667}, + {0.452222666666667,0.409444666666667,0.487778,0.339444666666667}, + {0.487778,0.339444666666667,0.5,0.262222}, + {0.381111333333333,0.583333333333333,0.381111333333333,0.541666666666667}, + {0.131111333333333,0.541666666666667,0.131111333333333,0.583333333333333}, + {0.381111333333333,0.666666666666667,0.381111333333333,0.625}, + {0.131111333333333,0.625,0.131111333333333,0.666666666666667}, + {0.381111333333333,0.75,0.381111333333333,0.708333333333333}, + {0.131111333333333,0.708333333333333,0.131111333333333,0.75}, + {0.297778,0.833333333333333,0.339444666666667,0.791666666666667}, + {0.172778,0.791666666666667,0.214444666666667,0.833333333333333}, + {0,0,0,0} +}; + +double Icon2[][4] = { + {0,0.166666666666667,0,0.833333333333333}, + {0,0.833333333333333,0.333333333333333,0.5}, + {0.333333333333333,0.5,0,0.166666666666667}, + {0,0,0,0} +}; + +double Icon3[][4] = { + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0,0.25,0,0.75}, + {0.5,0.75,0.5,0.25}, + {0.333333333333333,0.25,0.333333333333333,0.75}, + {0,0,0,0} +}; + +double Icon4[][4] = { + {0.5,0.75,0.5,0.25}, + {0,0.25,0,0.75}, + {0,0,0,0} +}; + +double Icon5[][4] = { + {0,0.166666666666667,0,0.833333333333333}, + {0,0.833333333333333,0.166666666666667,0.666666666666667}, + {0.166666666666667,0.666666666666667,0.166666666666667,0.833333333333333}, + {0.166666666666667,0.833333333333333,0.458333333333333,0.541666666666667}, + {0.458333333333333,0.541666666666667,0.458333333333333,0.833333333333333}, + {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667}, + {0.458333333333333,0.166666666666667,0.458333333333333,0.458333333333333}, + {0.458333333333333,0.458333333333333,0.166666666666667,0.166666666666667}, + {0.166666666666667,0.166666666666667,0.166666666666667,0.333333333333333}, + {0.166666666666667,0.333333333333333,0,0.166666666666667}, + {0,0,0,0} +}; + +double Icon6[][4] = { + {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667}, + {0.541666666666667,0.166666666666667,0.375,0.333333333333333}, + {0.375,0.333333333333333,0.375,0.166666666666667}, + {0.375,0.166666666666667,0.0833333333333333,0.458333333333333}, + {0.0833333333333333,0.458333333333333,0.0833333333333333,0.166666666666667}, + {0,0.166666666666667,0,0.833333333333333}, + {0.0833333333333333,0.833333333333333,0.0833333333333333,0.541666666666667}, + {0.0833333333333333,0.541666666666667,0.375,0.833333333333333}, + {0.375,0.833333333333333,0.375,0.666666666666667}, + {0.375,0.666666666666667,0.541666666666667,0.833333333333333}, + {0,0,0,0} +}; + +double Icon7[][4] = { + {0,0,0,1}, + {0,1,0.166666666666667,0.833333333333333}, + {0.166666666666667,0.833333333333333,0.166666666666667,0.166666666666667}, + {0.166666666666667,0.166666666666667,0,0}, + {0.125,0.166666666666667,0.125,0.833333333333333}, + {0.125,0.833333333333333,0.0833333333333333,0.875}, + {0.0833333333333333,0.875,0.0833333333333333,0.125}, + {0.0833333333333333,0.125,0.125,0.166666666666667}, + {0,0,0,0} +}; + +double Icon8[][4] = { + {0,0,0.166666666666667,0.5}, + {0.166666666666667,0.5,0.291666666666667,0.375}, + {0.291666666666667,0.375,0.416666666666667,0.5}, + {0.416666666666667,0.5,0.5,0.416666666666667}, + {0.5,0.416666666666667,0.375,0.291666666666667}, + {0.375,0.291666666666667,0.5,0.166666666666667}, + {0.5,0.166666666666667,0,0}, + {0,0,0,0} +}; + +double Icon9[][4] = { + {0.5,0.833333333333333,0.5,0.791666666666667}, + {0,0.791666666666667,0,0.833333333333333}, + {0.0833333333333333,0.625,0,0.791666666666667}, + {0.5,0.791666666666667,0.416666666666667,0.625}, + {0.5,0.541666666666667,0.416666666666667,0.375}, + {0.0833333333333333,0.375,0,0.541666666666667}, + {0,0.541666666666667,0,0.666666666666667}, + {0.0416666666666667,0.666666666666667,0.0416666666666667,0.583333333333333}, + {0.458333333333333,0.583333333333333,0.458333333333333,0.666666666666667}, + {0.5,0.666666666666667,0.5,0.541666666666667}, + {0.166666666666667,0.666666666666667,0.173888666666667,0.664444666666667}, + {0.173888666666667,0.664444666666667,0.181666666666667,0.662778}, + {0.181666666666667,0.662778,0.191111333333333,0.661111333333333}, + {0.191111333333333,0.661111333333333,0.201111333333333,0.660555333333334}, + {0.201111333333333,0.660555333333334,0.212778,0.659444666666667}, + {0.224444666666667,0.659444666666667,0.237222,0.658888666666667}, + {0.262778,0.658888666666667,0.275555333333333,0.659444666666667}, + {0.287222,0.659444666666667,0.298888666666667,0.660555333333334}, + {0.298888666666667,0.660555333333334,0.308888666666667,0.661111333333333}, + {0.308888666666667,0.661111333333333,0.318333333333333,0.662778}, + {0.318333333333333,0.662778,0.326111333333333,0.664444666666667}, + {0.326111333333333,0.664444666666667,0.333333333333333,0.666666666666667}, + {0.333333333333333,0.666666666666667,0.339444666666666,0.669444666666667}, + {0.339444666666666,0.669444666666667,0.345,0.673333333333333}, + {0.345,0.673333333333333,0.35,0.677778}, + {0.35,0.677778,0.355,0.682778}, + {0.355,0.682778,0.359999999999999,0.688888666666667}, + {0.359999999999999,0.688888666666667,0.364444666666666,0.695}, + {0.364444666666666,0.695,0.369444666666666,0.701666666666667}, + {0.369444666666666,0.701666666666667,0.373888666666667,0.708333333333333}, + {0.373888666666667,0.708333333333333,0.377778,0.715}, + {0.377778,0.715,0.381111333333333,0.721666666666666}, + {0.381111333333333,0.721666666666666,0.383888666666666,0.727778}, + {0.383888666666666,0.727778,0.385,0.733888666666667}, + {0.385,0.733888666666667,0.385,0.738888666666667}, + {0.385,0.738888666666667,0.383888666666666,0.743333333333334}, + {0.383888666666666,0.743333333333334,0.380555333333334,0.747222}, + {0.380555333333334,0.747222,0.375,0.75}, + {0.375,0.75,0.368888666666667,0.751666666666667}, + {0.368888666666667,0.751666666666667,0.361666666666667,0.753333333333333}, + {0.361666666666667,0.753333333333333,0.352222,0.754444666666667}, + {0.352222,0.754444666666667,0.341111333333333,0.755555333333334}, + {0.341111333333333,0.755555333333334,0.328888666666666,0.756111333333333}, + {0.328888666666666,0.756111333333333,0.315,0.756666666666667}, + {0.315,0.756666666666667,0.299444666666666,0.757222}, + {0.299444666666666,0.757222,0.283888666666667,0.757778}, + {0.216111333333333,0.757778,0.200555333333334,0.757222}, + {0.200555333333334,0.757222,0.185,0.756666666666667}, + {0.185,0.756666666666667,0.171111333333333,0.756111333333333}, + {0.171111333333333,0.756111333333333,0.158888666666667,0.755555333333334}, + {0.158888666666667,0.755555333333334,0.147778,0.754444666666667}, + {0.147778,0.754444666666667,0.138333333333333,0.753333333333333}, + {0.138333333333333,0.753333333333333,0.131111333333333,0.751666666666667}, + {0.131111333333333,0.751666666666667,0.125,0.75}, + {0.125,0.75,0.119444666666666,0.747222}, + {0.119444666666666,0.747222,0.116111333333334,0.743333333333334}, + {0.116111333333334,0.743333333333334,0.115,0.738888666666667}, + {0.115,0.738888666666667,0.115,0.733888666666667}, + {0.115,0.733888666666667,0.116111333333334,0.727778}, + {0.116111333333334,0.727778,0.118888666666667,0.721666666666666}, + {0.118888666666667,0.721666666666666,0.122222,0.715}, + {0.122222,0.715,0.126111333333333,0.708333333333333}, + {0.126111333333333,0.708333333333333,0.130555333333334,0.701666666666667}, + {0.130555333333334,0.701666666666667,0.135555333333334,0.695}, + {0.135555333333334,0.695,0.140000000000001,0.688888666666667}, + {0.140000000000001,0.688888666666667,0.145,0.682778}, + {0.145,0.682778,0.15,0.677778}, + {0.15,0.677778,0.155,0.673333333333333}, + {0.155,0.673333333333333,0.160555333333334,0.669444666666667}, + {0.160555333333334,0.669444666666667,0.166666666666667,0.666666666666667}, + {0,0,0,0} +}; + +double Icon10[][4] = { + {0.707221999999999,0.271111333333333,0.589444666666666,0.153333333333334}, + {0.471111333333333,0.507222,0.707221999999999,0.271111333333333}, + {0.707221999999999,0.742778,0.471111333333333,0.507222}, + {0.589444666666666,0.860555333333333,0.707221999999999,0.742778}, + {0.353333333333333,0.625,0.589444666666666,0.860555333333333}, + {0.117778,0.860555333333333,0.353333333333333,0.625}, + {0,0.742778,0.117778,0.860555333333333}, + {0.235555333333333,0.507222,0,0.742778}, + {0,0.271111333333333,0.235555333333333,0.507222}, + {0.117778,0.153333333333334,0,0.271111333333333}, + {0.353333333333333,0.388888666666666,0.117778,0.153333333333334}, + {0.589444666666666,0.153333333333334,0.353333333333333,0.388888666666666}, + {0,0,0,0} +}; + +double Icon11[][4] = { + {0.75,0.708333333333333,0.75,0.291666666666667}, + {0,0.291666666666667,0,0.708333333333333}, + {0.184444666666667,0.333333333333333,0.184444666666667,0.416666666666667}, + {0.0894446666666665,0.416666666666667,0.0894446666666665,0.458333333333333}, + {0.136666666666667,0.458333333333333,0.136666666666667,0.541666666666667}, + {0.0894446666666665,0.541666666666667,0.0894446666666665,0.583333333333333}, + {0.184444666666667,0.583333333333333,0.184444666666667,0.666666666666667}, + {0.0416666666666667,0.666666666666667,0.0416666666666667,0.333333333333333}, + {0.28,0.333333333333333,0.327778,0.458333333333333}, + {0.327778,0.458333333333333,0.375,0.333333333333333}, + {0.422222,0.333333333333333,0.363333333333333,0.5}, + {0.363333333333333,0.5,0.422222,0.666666666666667}, + {0.375,0.666666666666667,0.327778,0.541666666666667}, + {0.327778,0.541666666666667,0.28,0.666666666666667}, + {0.232222,0.666666666666667,0.291666666666667,0.5}, + {0.291666666666667,0.5,0.232222,0.333333333333333}, + {0.517778,0.333333333333333,0.517778,0.666666666666667}, + {0.47,0.666666666666667,0.47,0.333333333333333}, + {0.708333333333333,0.333333333333333,0.708333333333333,0.416666666666667}, + {0.660555333333333,0.416666666666667,0.660555333333333,0.666666666666667}, + {0.613333333333333,0.666666666666667,0.613333333333333,0.416666666666667}, + {0.565555333333333,0.416666666666667,0.565555333333333,0.333333333333333}, + {0,0,0,0} +}; + +double Icon12[][4] = { + {0.298333333333333,0.31,0.293888666666666,0.301666666666667}, + {0.302221999999999,0.32,0.298333333333333,0.31}, + {0.305555333333333,0.331111333333334,0.302221999999999,0.32}, + {0.308333333333334,0.343888666666667,0.305555333333333,0.331111333333334}, + {0.310555333333333,0.357222,0.308333333333334,0.343888666666667}, + {0.312777333333333,0.372778,0.310555333333333,0.357222}, + {0.314443999999999,0.388888666666666,0.312777333333333,0.372778}, + {0.315555333333333,0.406111333333333,0.314443999999999,0.388888666666666}, + {0.316666666666666,0.424444666666667,0.315555333333333,0.406111333333333}, + {0.317777333333333,0.443888666666667,0.316666666666666,0.424444666666667}, + {0.318333333333333,0.463333333333334,0.317777333333333,0.443888666666667}, + {0.318888666666666,0.483888666666667,0.318333333333333,0.463333333333334}, + {0.318888666666666,0.505,0.318888666666666,0.483888666666667}, + {0.318888666666666,0.526111333333333,0.318888666666666,0.505}, + {0.318888666666666,0.546666666666667,0.318888666666666,0.526111333333333}, + {0.318888666666666,0.567778,0.318888666666666,0.546666666666667}, + {0.318333333333333,0.588333333333334,0.318888666666666,0.567778}, + {0.317777333333333,0.607778,0.318333333333333,0.588333333333334}, + {0.316666666666666,0.627222,0.317777333333333,0.607778}, + {0.315555333333333,0.645555333333334,0.316666666666666,0.627222}, + {0.314443999999999,0.662778,0.315555333333333,0.645555333333334}, + {0.312777333333333,0.678888666666667,0.314443999999999,0.662778}, + {0.310555333333333,0.694444666666667,0.312777333333333,0.678888666666667}, + {0.308333333333334,0.707778,0.310555333333333,0.694444666666667}, + {0.305555333333333,0.720555333333333,0.308333333333334,0.707778}, + {0.302221999999999,0.731666666666667,0.305555333333333,0.720555333333333}, + {0.298333333333333,0.741666666666667,0.302221999999999,0.731666666666667}, + {0.293888666666666,0.75,0.298333333333333,0.741666666666667}, + {0.287777333333333,0.758333333333334,0.293888666666666,0.75}, + {0.280555333333333,0.765555333333333,0.287777333333333,0.758333333333334}, + {0.272777333333333,0.771666666666667,0.280555333333333,0.765555333333333}, + {0.263333333333333,0.776666666666667,0.272777333333333,0.771666666666667}, + {0.252777333333333,0.781111333333333,0.263333333333333,0.776666666666667}, + {0.241666666666666,0.783888666666667,0.252777333333333,0.781111333333333}, + {0.229444,0.786666666666667,0.241666666666666,0.783888666666667}, + {0.216666666666666,0.788888666666667,0.229444,0.786666666666667}, + {0.202777333333334,0.79,0.216666666666666,0.788888666666667}, + {0.188888666666666,0.791111333333333,0.202777333333334,0.79}, + {0.173888666666667,0.791666666666667,0.188888666666666,0.791111333333333}, + {0.159443999999999,0.792222,0.173888666666667,0.791666666666667}, + {0.145,0.791666666666667,0.159443999999999,0.792222}, + {0.13,0.791111333333333,0.145,0.791666666666667}, + {0.116110666666666,0.79,0.13,0.791111333333333}, + {0.102222,0.788888666666667,0.116110666666666,0.79}, + {0.0894440000000003,0.786666666666667,0.102222,0.788888666666667}, + {0.0772220000000002,0.783888666666667,0.0894440000000003,0.786666666666667}, + {0.0661106666666669,0.781111333333333,0.0772220000000002,0.783888666666667}, + {0.0555553333333331,0.776666666666667,0.0661106666666669,0.781111333333333}, + {0.0461106666666661,0.771666666666667,0.0555553333333331,0.776666666666667}, + {0.0383333333333328,0.765555333333333,0.0461106666666661,0.771666666666667}, + {0.0311106666666667,0.758333333333334,0.0383333333333328,0.765555333333333}, + {0.0249999999999998,0.75,0.0311106666666667,0.758333333333334}, + {0.020555333333333,0.741666666666667,0.0249999999999998,0.75}, + {0.0166666666666669,0.731666666666667,0.020555333333333,0.741666666666667}, + {0.013333333333333,0.720555333333333,0.0166666666666669,0.731666666666667}, + {0.0105553333333326,0.707778,0.013333333333333,0.720555333333333}, + {0.00833333333333286,0.694444666666667,0.0105553333333326,0.707778}, + {0.00611066666666697,0.678888666666667,0.00833333333333286,0.694444666666667}, + {0.00444399999999945,0.662778,0.00611066666666697,0.678888666666667}, + {0.00333333333333267,0.645555333333334,0.00444399999999945,0.662778}, + {0.00222199999999972,0.627222,0.00333333333333267,0.645555333333334}, + {0.00111066666666678,0.607778,0.00222199999999972,0.627222}, + {0.000555333333333389,0.588333333333334,0.00111066666666678,0.607778}, + {0,0.567778,0.000555333333333389,0.588333333333334}, + {0,0.546666666666667,0,0.567778}, + {0,0.525555333333333,0,0.546666666666667}, + {0,0.505,0,0.525555333333333}, + {0,0.483888666666667,0,0.505}, + {0.000555333333333389,0.463333333333334,0,0.483888666666667}, + {0.00111066666666678,0.443888666666667,0.000555333333333389,0.463333333333334}, + {0.00222199999999972,0.424444666666667,0.00111066666666678,0.443888666666667}, + {0.00333333333333267,0.406111333333333,0.00222199999999972,0.424444666666667}, + {0.00444399999999945,0.388888666666666,0.00333333333333267,0.406111333333333}, + {0.00611066666666697,0.372778,0.00444399999999945,0.388888666666666}, + {0.00833333333333286,0.357222,0.00611066666666697,0.372778}, + {0.0105553333333326,0.343888666666667,0.00833333333333286,0.357222}, + {0.013333333333333,0.331111333333334,0.0105553333333326,0.343888666666667}, + {0.0166666666666669,0.32,0.013333333333333,0.331111333333334}, + {0.020555333333333,0.31,0.0166666666666669,0.32}, + {0.0249999999999998,0.301666666666667,0.020555333333333,0.31}, + {0.0311106666666667,0.293333333333334,0.0249999999999998,0.301666666666667}, + {0.0383333333333328,0.286111333333333,0.0311106666666667,0.293333333333334}, + {0.0461106666666661,0.28,0.0383333333333328,0.286111333333333}, + {0.0555553333333331,0.275,0.0461106666666661,0.28}, + {0.0661106666666669,0.270555333333334,0.0555553333333331,0.275}, + {0.0772220000000002,0.267778,0.0661106666666669,0.270555333333334}, + {0.0894440000000003,0.265,0.0772220000000002,0.267778}, + {0.102222,0.262778,0.0894440000000003,0.265}, + {0.116110666666666,0.261666666666667,0.102222,0.262778}, + {0.13,0.260555333333333,0.116110666666666,0.261666666666667}, + {0.145,0.26,0.13,0.260555333333333}, + {0.159443999999999,0.259444666666666,0.145,0.26}, + {0.173888666666667,0.26,0.159443999999999,0.259444666666666}, + {0.188888666666666,0.260555333333333,0.173888666666667,0.26}, + {0.202777333333334,0.261666666666667,0.188888666666666,0.260555333333333}, + {0.216666666666666,0.262778,0.202777333333334,0.261666666666667}, + {0.229444,0.265,0.216666666666666,0.262778}, + {0.241666666666666,0.267778,0.229444,0.265}, + {0.252777333333333,0.270555333333334,0.241666666666666,0.267778}, + {0.263333333333333,0.275,0.252777333333333,0.270555333333334}, + {0.272777333333333,0.28,0.263333333333333,0.275}, + {0.280555333333333,0.286111333333333,0.272777333333333,0.28}, + {0.287777333333333,0.293333333333334,0.280555333333333,0.286111333333333}, + {0.293888666666666,0.301666666666667,0.287777333333333,0.293333333333334}, + {0.210555333333333,0.397222,0.212221999999999,0.403888666666666}, + {0.212221999999999,0.403888666666666,0.213888666666667,0.411666666666667}, + {0.213888666666667,0.411666666666667,0.215,0.421111333333334}, + {0.215,0.421111333333334,0.216110666666667,0.431666666666667}, + {0.216110666666667,0.431666666666667,0.217222,0.443333333333333}, + {0.217222,0.443333333333333,0.217777333333333,0.456111333333334}, + {0.217777333333333,0.456111333333334,0.218333333333333,0.47}, + {0.218333333333333,0.47,0.218333333333333,0.485}, + {0.218333333333333,0.485,0.218888666666666,0.5}, + {0.218888666666666,0.5,0.218888666666666,0.516111333333334}, + {0.218888666666666,0.516111333333334,0.218888666666666,0.532222}, + {0.218888666666666,0.532222,0.218888666666666,0.547778}, + {0.218888666666666,0.547778,0.218888666666666,0.563888666666667}, + {0.218888666666666,0.563888666666667,0.218333333333333,0.578888666666667}, + {0.218333333333333,0.578888666666667,0.218333333333333,0.593888666666667}, + {0.218333333333333,0.593888666666667,0.217777333333333,0.607778}, + {0.217777333333333,0.607778,0.217222,0.620555333333333}, + {0.217222,0.620555333333333,0.216110666666667,0.632222}, + {0.216110666666667,0.632222,0.215,0.642778}, + {0.215,0.642778,0.213888666666667,0.652222}, + {0.213888666666667,0.652222,0.212221999999999,0.66}, + {0.212221999999999,0.66,0.210555333333333,0.666666666666667}, + {0.210555333333333,0.666666666666667,0.208333333333333,0.672778}, + {0.208333333333333,0.672778,0.204999999999999,0.677778}, + {0.204999999999999,0.677778,0.201666666666667,0.681666666666667}, + {0.201666666666667,0.681666666666667,0.197777333333333,0.685}, + {0.197777333333333,0.685,0.193333333333333,0.687222}, + {0.193333333333333,0.687222,0.188333333333333,0.688888666666667}, + {0.188333333333333,0.688888666666667,0.182777333333333,0.690555333333334}, + {0.182777333333333,0.690555333333334,0.177221999999999,0.691111333333333}, + {0.177221999999999,0.691111333333333,0.171666666666667,0.691666666666666}, + {0.159443999999999,0.691666666666666,0.153888666666666,0.691111333333333}, + {0.153888666666666,0.691111333333333,0.148333333333333,0.690555333333334}, + {0.148333333333333,0.690555333333334,0.142777333333332,0.688888666666667}, + {0.142777333333332,0.688888666666667,0.137777333333333,0.687222}, + {0.137777333333333,0.687222,0.133333333333333,0.685}, + {0.133333333333333,0.685,0.129443999999999,0.681666666666667}, + {0.129443999999999,0.681666666666667,0.126110666666667,0.677778}, + {0.126110666666667,0.677778,0.122777333333333,0.672778}, + {0.122777333333333,0.672778,0.120555333333333,0.666666666666667}, + {0.120555333333333,0.666666666666667,0.118888666666667,0.66}, + {0.118888666666667,0.66,0.117221999999999,0.652222}, + {0.117221999999999,0.652222,0.116110666666666,0.642778}, + {0.116110666666666,0.642778,0.115,0.632222}, + {0.115,0.632222,0.113888666666667,0.620555333333333}, + {0.113888666666667,0.620555333333333,0.113333333333333,0.607778}, + {0.113333333333333,0.607778,0.112777333333333,0.593888666666667}, + {0.112777333333333,0.593888666666667,0.112777333333333,0.578888666666667}, + {0.112777333333333,0.578888666666667,0.112221999999999,0.563888666666667}, + {0.112221999999999,0.563888666666667,0.112221999999999,0.547778}, + {0.112221999999999,0.547778,0.112221999999999,0.531666666666667}, + {0.112221999999999,0.531666666666667,0.112221999999999,0.516111333333334}, + {0.112221999999999,0.516111333333334,0.112221999999999,0.5}, + {0.112221999999999,0.5,0.112777333333333,0.485}, + {0.112777333333333,0.485,0.112777333333333,0.47}, + {0.112777333333333,0.47,0.113333333333333,0.456111333333334}, + {0.113333333333333,0.456111333333334,0.113888666666667,0.443333333333333}, + {0.113888666666667,0.443333333333333,0.115,0.431666666666667}, + {0.115,0.431666666666667,0.116110666666666,0.421111333333334}, + {0.116110666666666,0.421111333333334,0.117221999999999,0.411666666666667}, + {0.117221999999999,0.411666666666667,0.118888666666667,0.403888666666666}, + {0.118888666666667,0.403888666666666,0.120555333333333,0.397222}, + {0.120555333333333,0.397222,0.122777333333333,0.391111333333334}, + {0.122777333333333,0.391111333333334,0.126110666666667,0.386111333333333}, + {0.126110666666667,0.386111333333333,0.129443999999999,0.382222}, + {0.129443999999999,0.382222,0.133333333333333,0.378888666666667}, + {0.133333333333333,0.378888666666667,0.137777333333333,0.376666666666667}, + {0.137777333333333,0.376666666666667,0.142777333333332,0.375}, + {0.142777333333332,0.375,0.148333333333333,0.373333333333333}, + {0.148333333333333,0.373333333333333,0.153888666666666,0.372778}, + {0.153888666666666,0.372778,0.159443999999999,0.372222}, + {0.171666666666667,0.372222,0.177221999999999,0.372778}, + {0.177221999999999,0.372778,0.182777333333333,0.373333333333333}, + {0.182777333333333,0.373333333333333,0.188333333333333,0.375}, + {0.188333333333333,0.375,0.193333333333333,0.376666666666667}, + {0.193333333333333,0.376666666666667,0.197777333333333,0.378888666666667}, + {0.197777333333333,0.378888666666667,0.201666666666667,0.382222}, + {0.201666666666667,0.382222,0.204999999999999,0.386111333333333}, + {0.204999999999999,0.386111333333333,0.208333333333333,0.391111333333334}, + {0.208333333333333,0.391111333333334,0.210555333333333,0.397222}, + {0,0,0,0} +}; + +double Icon13[][4] = { + {0.0994446666666668,0.297222,0.0977779999999993,0.288888666666667}, + {0.100555333333332,0.307222,0.0994446666666668,0.297222}, + {0.101666666666667,0.318333333333333,0.100555333333332,0.307222}, + {0.102778,0.331111333333334,0.101666666666667,0.318333333333333}, + {0.103333333333333,0.344444666666667,0.102778,0.331111333333334}, + {0.103888666666666,0.36,0.103333333333333,0.344444666666667}, + {0.104444666666666,0.376111333333334,0.103888666666666,0.36}, + {0.104999999999999,0.393333333333333,0.104444666666666,0.376111333333334}, + {0.105555333333333,0.411666666666667,0.104999999999999,0.393333333333333}, + {0.105555333333333,0.431111333333333,0.105555333333333,0.411666666666667}, + {0.106111333333333,0.450555333333333,0.105555333333333,0.431111333333333}, + {0.106111333333333,0.471111333333334,0.106111333333333,0.450555333333333}, + {0.106111333333333,0.492222,0.106111333333333,0.471111333333334}, + {0.106111333333333,0.513333333333333,0.106111333333333,0.492222}, + {0.106111333333333,0.533888666666667,0.106111333333333,0.513333333333333}, + {0.106111333333333,0.555,0.106111333333333,0.533888666666667}, + {0.106111333333333,0.575555333333333,0.106111333333333,0.555}, + {0.105555333333333,0.595,0.106111333333333,0.575555333333333}, + {0.105555333333333,0.614444666666667,0.105555333333333,0.595}, + {0.104999999999999,0.632778,0.105555333333333,0.614444666666667}, + {0.104444666666666,0.65,0.104999999999999,0.632778}, + {0.103888666666666,0.666111333333333,0.104444666666666,0.65}, + {0.103333333333333,0.681666666666667,0.103888666666666,0.666111333333333}, + {0.102778,0.695,0.103333333333333,0.681666666666667}, + {0.101666666666667,0.707778,0.102778,0.695}, + {0.100555333333332,0.718888666666667,0.101666666666667,0.707778}, + {0.0994446666666668,0.728888666666667,0.100555333333332,0.718888666666667}, + {0.0977779999999993,0.737222,0.0994446666666668,0.728888666666667}, + {0.096111333333333,0.744444666666666,0.0977779999999993,0.737222}, + {0.0944446666666666,0.750555333333333,0.096111333333333,0.744444666666666}, + {0.0922219999999996,0.755555333333334,0.0944446666666666,0.750555333333333}, + {0.0899999999999999,0.76,0.0922219999999996,0.755555333333334}, + {0.0877780000000001,0.763888666666666,0.0899999999999999,0.76}, + {0.0849999999999997,0.767222,0.0877780000000001,0.763888666666666}, + {0.0816666666666658,0.77,0.0849999999999997,0.767222}, + {0.0788886666666665,0.772222,0.0816666666666658,0.77}, + {0.0755553333333327,0.774444666666666,0.0788886666666665,0.772222}, + {0.072222,0.776111333333333,0.0755553333333327,0.774444666666666}, + {0.0683333333333328,0.777222,0.072222,0.776111333333333}, + {0.0644446666666667,0.778333333333334,0.0683333333333328,0.777222}, + {0.0611113333333329,0.778888666666666,0.0644446666666667,0.778333333333334}, + {0.052778,0.779444666666667,0.0572219999999994,0.778888666666666}, + {0.0488886666666666,0.778888666666666,0.052778,0.779444666666667}, + {0.0416666666666667,0.778333333333334,0.0449999999999993,0.778888666666666}, + {0.0377779999999994,0.777222,0.0416666666666667,0.778333333333334}, + {0.033888666666666,0.776111333333333,0.0377779999999994,0.777222}, + {0.0305553333333333,0.774444666666666,0.033888666666666,0.776111333333333}, + {0.0272219999999995,0.772222,0.0305553333333333,0.774444666666666}, + {0.0244446666666664,0.77,0.0272219999999995,0.772222}, + {0.0211113333333325,0.767222,0.0244446666666664,0.77}, + {0.0183333333333332,0.763888666666666,0.0211113333333325,0.767222}, + {0.0161113333333335,0.76,0.0183333333333332,0.763888666666666}, + {0.0138886666666664,0.755555333333334,0.0161113333333335,0.76}, + {0.0116666666666667,0.750555333333333,0.0138886666666664,0.755555333333334}, + {0.00999999999999919,0.744444666666666,0.0116666666666667,0.750555333333333}, + {0.00833333333333286,0.737222,0.00999999999999919,0.744444666666666}, + {0.00666666666666652,0.728888666666667,0.00833333333333286,0.737222}, + {0.00555533333333358,0.718888666666667,0.00666666666666652,0.728888666666667}, + {0.0044446666666668,0.707778,0.00555533333333358,0.718888666666667}, + {0.00333333333333267,0.695,0.0044446666666668,0.707778}, + {0.00277799999999928,0.681666666666667,0.00333333333333267,0.695}, + {0.00222199999999972,0.666111333333333,0.00277799999999928,0.681666666666667}, + {0.00166666666666634,0.65,0.00222199999999972,0.666111333333333}, + {0.00111133333333295,0.632778,0.00166666666666634,0.65}, + {0.000555333333333389,0.614444666666667,0.00111133333333295,0.632778}, + {0.000555333333333389,0.595,0.000555333333333389,0.614444666666667}, + {0,0.575555333333333,0.000555333333333389,0.595}, + {0,0.555,0,0.575555333333333}, + {0,0.533888666666667,0,0.555}, + {0,0.512778,0,0.533888666666667}, + {0,0.492222,0,0.512778}, + {0,0.471111333333334,0,0.492222}, + {0,0.450555333333333,0,0.471111333333334}, + {0.000555333333333389,0.431111333333333,0,0.450555333333333}, + {0.000555333333333389,0.411666666666667,0.000555333333333389,0.431111333333333}, + {0.00111133333333295,0.393333333333333,0.000555333333333389,0.411666666666667}, + {0.00166666666666634,0.376111333333334,0.00111133333333295,0.393333333333333}, + {0.00222199999999972,0.36,0.00166666666666634,0.376111333333334}, + {0.00277799999999928,0.344444666666667,0.00222199999999972,0.36}, + {0.00333333333333267,0.331111333333334,0.00277799999999928,0.344444666666667}, + {0.0044446666666668,0.318333333333333,0.00333333333333267,0.331111333333334}, + {0.00555533333333358,0.307222,0.0044446666666668,0.318333333333333}, + {0.00666666666666652,0.297222,0.00555533333333358,0.307222}, + {0.00833333333333286,0.288888666666667,0.00666666666666652,0.297222}, + {0.00999999999999919,0.281666666666667,0.00833333333333286,0.288888666666667}, + {0.0116666666666667,0.275555333333333,0.00999999999999919,0.281666666666667}, + {0.0138886666666664,0.270555333333334,0.0116666666666667,0.275555333333333}, + {0.0161113333333335,0.266111333333334,0.0138886666666664,0.270555333333334}, + {0.0183333333333332,0.262222,0.0161113333333335,0.266111333333334}, + {0.0211113333333325,0.258888666666667,0.0183333333333332,0.262222}, + {0.0244446666666664,0.256111333333333,0.0211113333333325,0.258888666666667}, + {0.0272219999999995,0.253888666666667,0.0244446666666664,0.256111333333333}, + {0.0305553333333333,0.251666666666667,0.0272219999999995,0.253888666666667}, + {0.033888666666666,0.25,0.0305553333333333,0.251666666666667}, + {0.0377779999999994,0.248888666666667,0.033888666666666,0.25}, + {0.0416666666666667,0.247778,0.0377779999999994,0.248888666666667}, + {0.0449999999999993,0.247222,0.0416666666666667,0.247778}, + {0.0533333333333334,0.246666666666667,0.0488886666666666,0.247222}, + {0.0572219999999994,0.247222,0.0533333333333334,0.246666666666667}, + {0.0644446666666667,0.247778,0.0611113333333329,0.247222}, + {0.0683333333333328,0.248888666666667,0.0644446666666667,0.247778}, + {0.072222,0.25,0.0683333333333328,0.248888666666667}, + {0.0755553333333327,0.251666666666667,0.072222,0.25}, + {0.0788886666666665,0.253888666666667,0.0755553333333327,0.251666666666667}, + {0.0816666666666658,0.256111333333333,0.0788886666666665,0.253888666666667}, + {0.0849999999999997,0.258888666666667,0.0816666666666658,0.256111333333333}, + {0.0877780000000001,0.262222,0.0849999999999997,0.258888666666667}, + {0.0899999999999999,0.266111333333334,0.0877780000000001,0.262222}, + {0.0922219999999996,0.270555333333334,0.0899999999999999,0.266111333333334}, + {0.0944446666666666,0.275555333333333,0.0922219999999996,0.270555333333334}, + {0.096111333333333,0.281666666666667,0.0944446666666666,0.275555333333333}, + {0.0977779999999993,0.288888666666667,0.096111333333333,0.281666666666667}, + {0,0,0,0} +}; + +double Icon14[][4] = { + {0.296110666666666,0.295555333333333,0.290555333333332,0.288888666666667}, + {0.300555333333333,0.303333333333333,0.296110666666666,0.295555333333333}, + {0.304444,0.312778,0.300555333333333,0.303333333333333}, + {0.307221999999999,0.323333333333334,0.304444,0.312778}, + {0.309443999999999,0.335,0.307221999999999,0.323333333333334}, + {0.310555333333333,0.347778,0.309443999999999,0.335}, + {0.311666666666666,0.361666666666667,0.310555333333333,0.347778}, + {0.312222,0.376111333333334,0.311666666666666,0.361666666666667}, + {0.312222,0.391666666666667,0.312222,0.376111333333334}, + {0.312222,0.407222,0.312222,0.391666666666667}, + {0.311666666666666,0.423333333333333,0.312222,0.407222}, + {0.310555333333333,0.439444666666667,0.311666666666666,0.423333333333333}, + {0.31,0.455,0.310555333333333,0.439444666666667}, + {0.308888666666667,0.470555333333333,0.31,0.455}, + {0.307221999999999,0.485,0.308888666666667,0.470555333333333}, + {0.306110666666666,0.498888666666667,0.307221999999999,0.485}, + {0.304444,0.511666666666667,0.306110666666666,0.498888666666667}, + {0.302221999999999,0.523333333333333,0.304444,0.511666666666667}, + {0.299999999999999,0.533888666666667,0.302221999999999,0.523333333333333}, + {0.297222,0.543333333333334,0.299999999999999,0.533888666666667}, + {0.294444,0.551111333333333,0.297222,0.543333333333334}, + {0.290555333333332,0.557778,0.294444,0.551111333333333}, + {0.284443999999999,0.565,0.290555333333332,0.557778}, + {0.276110666666667,0.570555333333333,0.284443999999999,0.565}, + {0.266666666666667,0.573333333333334,0.276110666666667,0.570555333333333}, + {0.255555333333334,0.574444666666666,0.266666666666667,0.573333333333334}, + {0.243333333333333,0.573888666666667,0.255555333333334,0.574444666666666}, + {0.229999999999999,0.572222,0.243333333333333,0.573888666666667}, + {0.215555333333333,0.569444666666667,0.229999999999999,0.572222}, + {0.201110666666666,0.566111333333333,0.215555333333333,0.569444666666667}, + {0.186110666666667,0.562778,0.201110666666666,0.566111333333333}, + {0.171666666666667,0.559444666666667,0.186110666666667,0.562778}, + {0.158333333333333,0.556666666666667,0.171666666666667,0.559444666666667}, + {0.146110666666666,0.554444666666667,0.158333333333333,0.556666666666667}, + {0.134999999999999,0.553888666666667,0.146110666666666,0.554444666666667}, + {0.117221999999999,0.555555333333333,0.125555333333333,0.553888666666667}, + {0.111110666666666,0.557778,0.117221999999999,0.555555333333333}, + {0.106110666666666,0.561111333333334,0.111110666666666,0.557778}, + {0.102222,0.565,0.106110666666666,0.561111333333334}, + {0.0994439999999995,0.569444666666667,0.102222,0.565}, + {0.0972219999999998,0.575,0.0994439999999995,0.569444666666667}, + {0.0961106666666668,0.581666666666666,0.0972219999999998,0.575}, + {0.095,0.588333333333334,0.0961106666666668,0.581666666666666}, + {0.0944439999999993,0.595555333333333,0.095,0.588333333333334}, + {0.0944439999999993,0.602778,0.0944439999999993,0.595555333333333}, + {0.0944439999999993,0.61,0.0944439999999993,0.602778}, + {0.095,0.617222,0.0944439999999993,0.61}, + {0.0961106666666668,0.623888666666667,0.095,0.617222}, + {0.0972219999999998,0.630555333333334,0.0961106666666668,0.623888666666667}, + {0.0994439999999995,0.636111333333333,0.0972219999999998,0.630555333333334}, + {0.102222,0.640555333333333,0.0994439999999995,0.636111333333333}, + {0.106110666666666,0.644444666666667,0.102222,0.640555333333333}, + {0.111110666666666,0.647778,0.106110666666666,0.644444666666667}, + {0.117221999999999,0.65,0.111110666666666,0.647778}, + {0.125555333333333,0.651666666666667,0.117221999999999,0.65}, + {0.134999999999999,0.652778,0.125555333333333,0.651666666666667}, + {0.158333333333333,0.652222,0.146110666666666,0.652778}, + {0.171666666666667,0.651111333333333,0.158333333333333,0.652222}, + {0.186110666666667,0.649444666666666,0.171666666666667,0.651111333333333}, + {0.201110666666666,0.647778,0.186110666666667,0.649444666666666}, + {0.215555333333333,0.646111333333333,0.201110666666666,0.647778}, + {0.229999999999999,0.644444666666667,0.215555333333333,0.646111333333333}, + {0.243333333333333,0.643333333333333,0.229999999999999,0.644444666666667}, + {0.255555333333334,0.642778,0.243333333333333,0.643333333333333}, + {0.276110666666667,0.643888666666667,0.266666666666667,0.642778}, + {0.284443999999999,0.645555333333334,0.276110666666667,0.643888666666667}, + {0.290555333333332,0.647778,0.284443999999999,0.645555333333334}, + {0.294999999999999,0.650555333333333,0.290555333333332,0.647778}, + {0.298888666666667,0.653888666666666,0.294999999999999,0.650555333333333}, + {0.301666666666666,0.657778,0.298888666666667,0.653888666666666}, + {0.303888666666667,0.662778,0.301666666666666,0.657778}, + {0.306110666666666,0.667778,0.303888666666667,0.662778}, + {0.307777333333333,0.673333333333333,0.306110666666666,0.667778}, + {0.309443999999999,0.679444666666667,0.307777333333333,0.673333333333333}, + {0.310555333333333,0.686111333333334,0.309443999999999,0.679444666666667}, + {0.311666666666666,0.692778,0.310555333333333,0.686111333333334}, + {0.312222,0.698888666666667,0.311666666666666,0.692778}, + {0.312222,0.705555333333334,0.312222,0.698888666666667}, + {0.312222,0.711666666666667,0.312222,0.705555333333334}, + {0.311110666666667,0.717222,0.312222,0.711666666666667}, + {0.308888666666667,0.722222,0.311110666666667,0.717222}, + {0.306110666666666,0.727222,0.308888666666667,0.722222}, + {0.302221999999999,0.731111333333333,0.306110666666666,0.727222}, + {0.297222,0.734444666666667,0.302221999999999,0.731111333333333}, + {0.290555333333332,0.737222,0.297222,0.734444666666667}, + {0.283888666666666,0.738888666666667,0.290555333333332,0.737222}, + {0.276110666666667,0.740555333333334,0.283888666666666,0.738888666666667}, + {0.266666666666667,0.742222,0.276110666666667,0.740555333333334}, + {0.256110666666667,0.743888666666667,0.266666666666667,0.742222}, + {0.244444,0.745,0.256110666666667,0.743888666666667}, + {0.231666666666667,0.746666666666667,0.244444,0.745}, + {0.217777333333333,0.748333333333333,0.231666666666667,0.746666666666667}, + {0.203333333333333,0.749444666666667,0.217777333333333,0.748333333333333}, + {0.187777333333333,0.751111333333334,0.203333333333333,0.749444666666667}, + {0.172222,0.752778,0.187777333333333,0.751111333333334}, + {0.156110666666667,0.753888666666667,0.172222,0.752778}, + {0.139999999999999,0.755,0.156110666666667,0.753888666666667}, + {0.124443999999999,0.756111333333333,0.139999999999999,0.755}, + {0.108888666666666,0.756666666666667,0.124443999999999,0.756111333333333}, + {0.0805553333333329,0.756111333333333,0.0944439999999993,0.756666666666667}, + {0.0677773333333332,0.755,0.0805553333333329,0.756111333333333}, + {0.0561106666666665,0.753333333333333,0.0677773333333332,0.755}, + {0.0455553333333327,0.750555333333333,0.0561106666666665,0.753333333333333}, + {0.0361106666666669,0.747222,0.0455553333333327,0.750555333333333}, + {0.0283333333333336,0.742778,0.0361106666666669,0.747222}, + {0.0216666666666659,0.737222,0.0283333333333336,0.742778}, + {0.0161106666666662,0.730555333333333,0.0216666666666659,0.737222}, + {0.0116666666666667,0.722778,0.0161106666666662,0.730555333333333}, + {0.0077773333333333,0.713333333333334,0.0116666666666667,0.722778}, + {0.00500000000000019,0.702778,0.0077773333333333,0.713333333333334}, + {0.00277733333333311,0.691111333333333,0.00500000000000019,0.702778}, + {0.00166666666666634,0.678333333333333,0.00277733333333311,0.691111333333333}, + {0.000555333333333389,0.664444666666667,0.00166666666666634,0.678333333333333}, + {0,0.65,0.000555333333333389,0.664444666666667}, + {0,0.634444666666666,0,0.65}, + {0,0.618888666666667,0,0.634444666666666}, + {0.000555333333333389,0.602778,0,0.618888666666667}, + {0.00166666666666634,0.586666666666667,0.000555333333333389,0.602778}, + {0.00222199999999972,0.571111333333333,0.00166666666666634,0.586666666666667}, + {0.00333333333333267,0.555555333333333,0.00222199999999972,0.571111333333333}, + {0.00500000000000019,0.541111333333333,0.00333333333333267,0.555555333333333}, + {0.00611066666666697,0.527222,0.00500000000000019,0.541111333333333}, + {0.0077773333333333,0.514444666666667,0.00611066666666697,0.527222}, + {0.00999999999999919,0.502778,0.0077773333333333,0.514444666666667}, + {0.0122220000000001,0.492222,0.00999999999999919,0.502778}, + {0.0149999999999994,0.482778,0.0122220000000001,0.492222}, + {0.0177773333333325,0.475,0.0149999999999994,0.482778}, + {0.0216666666666659,0.468333333333333,0.0177773333333325,0.475}, + {0.0277773333333329,0.461111333333333,0.0216666666666659,0.468333333333333}, + {0.0361106666666669,0.455555333333334,0.0277773333333329,0.461111333333333}, + {0.0455553333333327,0.452778,0.0361106666666669,0.455555333333334}, + {0.056666666666666,0.451666666666667,0.0455553333333327,0.452778}, + {0.0688886666666662,0.452222,0.056666666666666,0.451666666666667}, + {0.0822219999999992,0.453888666666667,0.0688886666666662,0.452222}, + {0.0966666666666664,0.456666666666666,0.0822219999999992,0.453888666666667}, + {0.111666666666667,0.46,0.0966666666666664,0.456666666666666}, + {0.126110666666667,0.463333333333334,0.111666666666667,0.46}, + {0.140555333333333,0.466666666666667,0.126110666666667,0.463333333333334}, + {0.153888666666666,0.469444666666667,0.140555333333333,0.466666666666667}, + {0.166110666666666,0.471666666666666,0.153888666666666,0.469444666666667}, + {0.177221999999999,0.472222,0.166110666666666,0.471666666666666}, + {0.195,0.470555333333333,0.186666666666666,0.472222}, + {0.201110666666666,0.468333333333333,0.195,0.470555333333333}, + {0.206110666666666,0.465,0.201110666666666,0.468333333333333}, + {0.21,0.461111333333333,0.206110666666666,0.465}, + {0.212777333333333,0.456666666666666,0.21,0.461111333333333}, + {0.215,0.451111333333333,0.212777333333333,0.456666666666666}, + {0.216110666666667,0.444444666666667,0.215,0.451111333333333}, + {0.217222,0.437778,0.216110666666667,0.444444666666667}, + {0.217777333333333,0.430555333333333,0.217222,0.437778}, + {0.217777333333333,0.423333333333333,0.217777333333333,0.430555333333333}, + {0.217777333333333,0.416111333333333,0.217777333333333,0.423333333333333}, + {0.217222,0.408888666666667,0.217777333333333,0.416111333333333}, + {0.216110666666667,0.402222,0.217222,0.408888666666667}, + {0.215,0.395555333333334,0.216110666666667,0.402222}, + {0.212777333333333,0.39,0.215,0.395555333333334}, + {0.21,0.385555333333333,0.212777333333333,0.39}, + {0.206110666666666,0.381666666666667,0.21,0.385555333333333}, + {0.201110666666666,0.378333333333333,0.206110666666666,0.381666666666667}, + {0.195,0.376111333333334,0.201110666666666,0.378333333333333}, + {0.186666666666666,0.374444666666667,0.195,0.376111333333334}, + {0.177221999999999,0.373333333333333,0.186666666666666,0.374444666666667}, + {0.153888666666666,0.373888666666667,0.166110666666666,0.373333333333333}, + {0.140555333333333,0.375,0.153888666666666,0.373888666666667}, + {0.126110666666667,0.376666666666667,0.140555333333333,0.375}, + {0.111666666666667,0.378333333333333,0.126110666666667,0.376666666666667}, + {0.0966666666666664,0.38,0.111666666666667,0.378333333333333}, + {0.0822219999999992,0.381666666666667,0.0966666666666664,0.38}, + {0.0688886666666662,0.382778,0.0822219999999992,0.381666666666667}, + {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778}, + {0.0361106666666669,0.382222,0.0455553333333327,0.383333333333334}, + {0.0277773333333329,0.380555333333334,0.0361106666666669,0.382222}, + {0.0216666666666659,0.378333333333333,0.0277773333333329,0.380555333333334}, + {0.0172220000000003,0.375555333333333,0.0216666666666659,0.378333333333333}, + {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333}, + {0.0105553333333326,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105553333333326,0.368333333333334}, + {0.00611066666666697,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.00444399999999945,0.352778,0.00611066666666697,0.358333333333333}, + {0.00277733333333311,0.346666666666666,0.00444399999999945,0.352778}, + {0.00166666666666634,0.34,0.00277733333333311,0.346666666666666}, + {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555333333333389,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111066666666678,0.308888666666667,0,0.314444666666667}, + {0.00333333333333267,0.303888666666667,0.00111066666666678,0.308888666666667}, + {0.00611066666666697,0.298888666666667,0.00333333333333267,0.303888666666667}, + {0.00999999999999919,0.295,0.00611066666666697,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.00999999999999919,0.295}, + {0.0216666666666659,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666659,0.288888666666667}, + {0.0361106666666669,0.285555333333334,0.0283333333333336,0.287222}, + {0.0455553333333327,0.283888666666667,0.0361106666666669,0.285555333333334}, + {0.0561106666666665,0.282222,0.0455553333333327,0.283888666666667}, + {0.0677773333333332,0.281111333333333,0.0561106666666665,0.282222}, + {0.0805553333333329,0.279444666666667,0.0677773333333332,0.281111333333333}, + {0.0944439999999993,0.277778,0.0805553333333329,0.279444666666667}, + {0.108888666666666,0.276666666666667,0.0944439999999993,0.277778}, + {0.124443999999999,0.275,0.108888666666666,0.276666666666667}, + {0.139999999999999,0.273333333333333,0.124443999999999,0.275}, + {0.156110666666667,0.272222,0.139999999999999,0.273333333333333}, + {0.172222,0.271111333333333,0.156110666666667,0.272222}, + {0.187777333333333,0.27,0.172222,0.271111333333333}, + {0.203333333333333,0.269444666666667,0.187777333333333,0.27}, + {0.231666666666667,0.27,0.217777333333333,0.269444666666667}, + {0.244444,0.271111333333333,0.231666666666667,0.27}, + {0.256110666666667,0.272778,0.244444,0.271111333333333}, + {0.266666666666667,0.275555333333333,0.256110666666667,0.272778}, + {0.276110666666667,0.278888666666666,0.266666666666667,0.275555333333333}, + {0.283888666666666,0.283333333333333,0.276110666666667,0.278888666666666}, + {0.290555333333332,0.288888666666667,0.283888666666666,0.283333333333333}, + {0,0,0,0} +}; + +double Icon15[][4] = { + {0.294999999999999,0.297222,0.290555333333334,0.288888666666667}, + {0.298888666666667,0.307222,0.294999999999999,0.297222}, + {0.302222,0.318333333333333,0.298888666666667,0.307222}, + {0.305,0.331111333333334,0.302222,0.318333333333333}, + {0.307221999999999,0.344444666666667,0.305,0.331111333333334}, + {0.309444666666666,0.36,0.307221999999999,0.344444666666667}, + {0.311111333333333,0.376111333333334,0.309444666666666,0.36}, + {0.312222,0.393333333333333,0.311111333333333,0.376111333333334}, + {0.313333333333334,0.411666666666667,0.312222,0.393333333333333}, + {0.314444666666667,0.431111333333333,0.313333333333334,0.411666666666667}, + {0.315,0.450555333333333,0.314444666666667,0.431111333333333}, + {0.315555333333333,0.471111333333334,0.315,0.450555333333333}, + {0.315555333333333,0.492222,0.315555333333333,0.471111333333334}, + {0.315555333333333,0.513333333333333,0.315555333333333,0.492222}, + {0.315555333333333,0.533888666666667,0.315555333333333,0.513333333333333}, + {0.315555333333333,0.555,0.315555333333333,0.533888666666667}, + {0.315,0.575555333333333,0.315555333333333,0.555}, + {0.314444666666667,0.595,0.315,0.575555333333333}, + {0.313333333333334,0.614444666666667,0.314444666666667,0.595}, + {0.312222,0.632778,0.313333333333334,0.614444666666667}, + {0.311111333333333,0.65,0.312222,0.632778}, + {0.309444666666666,0.666111333333333,0.311111333333333,0.65}, + {0.307221999999999,0.681666666666667,0.309444666666666,0.666111333333333}, + {0.305,0.695,0.307221999999999,0.681666666666667}, + {0.302222,0.707778,0.305,0.695}, + {0.298888666666667,0.718888666666667,0.302222,0.707778}, + {0.294999999999999,0.728888666666667,0.298888666666667,0.718888666666667}, + {0.290555333333334,0.737222,0.294999999999999,0.728888666666667}, + {0.283888666666666,0.746666666666667,0.290555333333334,0.737222}, + {0.276111333333333,0.753888666666667,0.283888666666666,0.746666666666667}, + {0.266666666666667,0.76,0.276111333333333,0.753888666666667}, + {0.256111333333333,0.763888666666666,0.266666666666667,0.76}, + {0.244444666666666,0.766666666666667,0.256111333333333,0.763888666666666}, + {0.231666666666667,0.768333333333333,0.244444666666666,0.766666666666667}, + {0.217778,0.768888666666667,0.231666666666667,0.768333333333333}, + {0.203333333333333,0.768333333333333,0.217778,0.768888666666667}, + {0.187778,0.766666666666667,0.203333333333333,0.768333333333333}, + {0.172222,0.765,0.187778,0.766666666666667}, + {0.156111333333333,0.762222,0.172222,0.765}, + {0.139999999999999,0.76,0.156111333333333,0.762222}, + {0.124444666666667,0.757222,0.139999999999999,0.76}, + {0.108888666666666,0.753888666666667,0.124444666666667,0.757222}, + {0.0944446666666666,0.751666666666667,0.108888666666666,0.753888666666667}, + {0.0805553333333329,0.748888666666667,0.0944446666666666,0.751666666666667}, + {0.0677779999999994,0.746666666666667,0.0805553333333329,0.748888666666667}, + {0.0561113333333327,0.744444666666666,0.0677779999999994,0.746666666666667}, + {0.0455553333333327,0.742778,0.0561113333333327,0.744444666666666}, + {0.0361113333333331,0.741111333333333,0.0455553333333327,0.742778}, + {0.0283333333333336,0.738888666666667,0.0361113333333331,0.741111333333333}, + {0.0216666666666671,0.737222,0.0283333333333336,0.738888666666667}, + {0.0149999999999994,0.734444666666667,0.0216666666666671,0.737222}, + {0.0100000000000004,0.731111333333333,0.0149999999999994,0.734444666666667}, + {0.00611133333333314,0.727222,0.0100000000000004,0.731111333333333}, + {0.00333333333333267,0.722222,0.00611133333333314,0.727222}, + {0.00111133333333295,0.717222,0.00333333333333267,0.722222}, + {0,0.711666666666667,0.00111133333333295,0.717222}, + {0,0.705555333333334,0,0.711666666666667}, + {0,0.698888666666667,0,0.705555333333334}, + {0.000555333333333389,0.692222,0,0.698888666666667}, + {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222}, + {0.00277800000000046,0.679444666666667,0.00166666666666634,0.686111333333334}, + {0.0044446666666668,0.673333333333333,0.00277800000000046,0.679444666666667}, + {0.00611133333333314,0.667778,0.0044446666666668,0.673333333333333}, + {0.00833333333333286,0.662778,0.00611133333333314,0.667778}, + {0.0105553333333338,0.657778,0.00833333333333286,0.662778}, + {0.013333333333333,0.653888666666666,0.0105553333333338,0.657778}, + {0.0172220000000003,0.650555333333333,0.013333333333333,0.653888666666666}, + {0.0216666666666671,0.647778,0.0172220000000003,0.650555333333333}, + {0.0277780000000002,0.645555333333334,0.0216666666666671,0.647778}, + {0.0361113333333331,0.643888666666667,0.0277780000000002,0.645555333333334}, + {0.0455553333333327,0.642778,0.0361113333333331,0.643888666666667}, + {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778}, + {0.0822220000000004,0.644444666666667,0.0688886666666662,0.643333333333333}, + {0.0966666666666664,0.646111333333333,0.0822220000000004,0.644444666666667}, + {0.111666666666667,0.647778,0.0966666666666664,0.646111333333333}, + {0.126111333333333,0.649444666666666,0.111666666666667,0.647778}, + {0.140555333333333,0.651111333333333,0.126111333333333,0.649444666666666}, + {0.153888666666667,0.652222,0.140555333333333,0.651111333333333}, + {0.166111333333333,0.652778,0.153888666666667,0.652222}, + {0.186666666666666,0.651666666666667,0.177222,0.652778}, + {0.195,0.65,0.186666666666666,0.651666666666667}, + {0.201111333333333,0.647778,0.195,0.65}, + {0.206666666666667,0.643888666666667,0.201111333333333,0.647778}, + {0.210555333333333,0.639444666666667,0.206666666666667,0.643888666666667}, + {0.213333333333334,0.633333333333334,0.210555333333333,0.639444666666667}, + {0.214444666666666,0.626666666666667,0.213333333333334,0.633333333333334}, + {0.215,0.619444666666666,0.214444666666666,0.626666666666667}, + {0.214444666666666,0.611111333333334,0.215,0.619444666666666}, + {0.213888666666667,0.602778,0.214444666666666,0.611111333333334}, + {0.212778,0.594444666666667,0.213888666666667,0.602778}, + {0.211111333333334,0.586111333333333,0.212778,0.594444666666667}, + {0.209444666666666,0.578888666666667,0.211111333333334,0.586111333333333}, + {0.207778,0.572222,0.209444666666666,0.578888666666667}, + {0.206111333333334,0.566111333333333,0.207778,0.572222}, + {0.203888666666667,0.561666666666667,0.206111333333334,0.566111333333333}, + {0.201111333333333,0.557778,0.203888666666667,0.561666666666667}, + {0.196666666666667,0.554444666666667,0.201111333333333,0.557778}, + {0.191111333333333,0.552778,0.196666666666667,0.554444666666667}, + {0.175,0.553888666666667,0.183888666666667,0.552778}, + {0.166111333333333,0.555555333333333,0.175,0.553888666666667}, + {0.156111333333333,0.557778,0.166111333333333,0.555555333333333}, + {0.146111333333334,0.56,0.156111333333333,0.557778}, + {0.137222,0.561666666666667,0.146111333333334,0.56}, + {0.128333333333333,0.562778,0.137222,0.561666666666667}, + {0.121111333333333,0.562222,0.128333333333333,0.562778}, + {0.115555333333333,0.561111333333334,0.121111333333333,0.562222}, + {0.111111333333334,0.557778,0.115555333333333,0.561111333333334}, + {0.107778,0.553333333333333,0.111111333333334,0.557778}, + {0.105555333333334,0.547778,0.107778,0.553333333333333}, + {0.104444666666667,0.540555333333333,0.105555333333334,0.547778}, + {0.103333333333333,0.532222,0.104444666666667,0.540555333333333}, + {0.102778,0.522778,0.103333333333333,0.532222}, + {0.102778,0.512778,0.102778,0.522778}, + {0.102778,0.503333333333333,0.102778,0.512778}, + {0.103333333333333,0.493888666666667,0.102778,0.503333333333333}, + {0.104444666666667,0.485555333333333,0.103333333333333,0.493888666666667}, + {0.105555333333334,0.478333333333333,0.104444666666667,0.485555333333333}, + {0.107778,0.472778,0.105555333333334,0.478333333333333}, + {0.111111333333334,0.468333333333333,0.107778,0.472778}, + {0.115555333333333,0.465,0.111111333333334,0.468333333333333}, + {0.121111333333333,0.463888666666667,0.115555333333333,0.465}, + {0.128333333333333,0.463333333333334,0.121111333333333,0.463888666666667}, + {0.137222,0.464444666666667,0.128333333333333,0.463333333333334}, + {0.146111333333334,0.466111333333333,0.137222,0.464444666666667}, + {0.156111333333333,0.468333333333333,0.146111333333334,0.466111333333333}, + {0.166111333333333,0.470555333333333,0.156111333333333,0.468333333333333}, + {0.175,0.472222,0.166111333333333,0.470555333333333}, + {0.183888666666667,0.473333333333333,0.175,0.472222}, + {0.196666666666667,0.471666666666666,0.191111333333333,0.473333333333333}, + {0.201111333333333,0.468333333333333,0.196666666666667,0.471666666666666}, + {0.203888666666667,0.464444666666667,0.201111333333333,0.468333333333333}, + {0.206111333333334,0.46,0.203888666666667,0.464444666666667}, + {0.207778,0.453888666666667,0.206111333333334,0.46}, + {0.209444666666666,0.447222,0.207778,0.453888666666667}, + {0.211111333333334,0.44,0.209444666666666,0.447222}, + {0.212778,0.431666666666667,0.211111333333334,0.44}, + {0.213888666666667,0.423333333333333,0.212778,0.431666666666667}, + {0.214444666666666,0.415,0.213888666666667,0.423333333333333}, + {0.215,0.406666666666667,0.214444666666666,0.415}, + {0.214444666666666,0.399444666666666,0.215,0.406666666666667}, + {0.213333333333334,0.392778,0.214444666666666,0.399444666666666}, + {0.210555333333333,0.386666666666667,0.213333333333334,0.392778}, + {0.206666666666667,0.382222,0.210555333333333,0.386666666666667}, + {0.201111333333333,0.378333333333333,0.206666666666667,0.382222}, + {0.195,0.376111333333334,0.201111333333333,0.378333333333333}, + {0.186666666666666,0.374444666666667,0.195,0.376111333333334}, + {0.177222,0.373333333333333,0.186666666666666,0.374444666666667}, + {0.153888666666667,0.373888666666667,0.166111333333333,0.373333333333333}, + {0.140555333333333,0.375,0.153888666666667,0.373888666666667}, + {0.126111333333333,0.376666666666667,0.140555333333333,0.375}, + {0.111666666666667,0.378333333333333,0.126111333333333,0.376666666666667}, + {0.0966666666666664,0.38,0.111666666666667,0.378333333333333}, + {0.0822220000000004,0.381666666666667,0.0966666666666664,0.38}, + {0.0688886666666662,0.382778,0.0822220000000004,0.381666666666667}, + {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778}, + {0.0361113333333331,0.382222,0.0455553333333327,0.383333333333334}, + {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222}, + {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334}, + {0.0172220000000003,0.375555333333333,0.0216666666666671,0.378333333333333}, + {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333}, + {0.0105553333333338,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105553333333338,0.368333333333334}, + {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333}, + {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778}, + {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666}, + {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555333333333389,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111133333333295,0.308888666666667,0,0.314444666666667}, + {0.00333333333333267,0.303888666666667,0.00111133333333295,0.308888666666667}, + {0.00611133333333314,0.298888666666667,0.00333333333333267,0.303888666666667}, + {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295}, + {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667}, + {0.0361113333333331,0.285,0.0283333333333336,0.287222}, + {0.0455553333333327,0.283333333333333,0.0361113333333331,0.285}, + {0.0561113333333327,0.281666666666667,0.0455553333333327,0.283333333333333}, + {0.0677779999999994,0.279444666666667,0.0561113333333327,0.281666666666667}, + {0.0805553333333329,0.277222,0.0677779999999994,0.279444666666667}, + {0.0944446666666666,0.274444666666666,0.0805553333333329,0.277222}, + {0.108888666666666,0.272222,0.0944446666666666,0.274444666666666}, + {0.124444666666667,0.268888666666667,0.108888666666666,0.272222}, + {0.139999999999999,0.266111333333334,0.124444666666667,0.268888666666667}, + {0.156111333333333,0.263888666666666,0.139999999999999,0.266111333333334}, + {0.172222,0.261111333333333,0.156111333333333,0.263888666666666}, + {0.187778,0.259444666666666,0.172222,0.261111333333333}, + {0.203333333333333,0.257778,0.187778,0.259444666666666}, + {0.217778,0.257222,0.203333333333333,0.257778}, + {0.231666666666667,0.257778,0.217778,0.257222}, + {0.244444666666666,0.259444666666666,0.231666666666667,0.257778}, + {0.256111333333333,0.262222,0.244444666666666,0.259444666666666}, + {0.266666666666667,0.266111333333334,0.256111333333333,0.262222}, + {0.276111333333333,0.272222,0.266666666666667,0.266111333333334}, + {0.283888666666666,0.279444666666667,0.276111333333333,0.272222}, + {0.290555333333334,0.288888666666667,0.283888666666666,0.279444666666667}, + {0,0,0,0} +}; + +double Icon16[][4] = { + {0.105555333333333,0.295,0.103333333333333,0.288888666666667}, + {0.107221999999999,0.303333333333333,0.105555333333333,0.295}, + {0.108333333333333,0.312778,0.107221999999999,0.303333333333333}, + {0.108333333333333,0.323888666666667,0.108333333333333,0.312778}, + {0.107778,0.336111333333333,0.108333333333333,0.323888666666667}, + {0.106666666666666,0.349444666666667,0.107778,0.336111333333333}, + {0.104999999999999,0.363888666666667,0.106666666666666,0.349444666666667}, + {0.103333333333333,0.378888666666667,0.104999999999999,0.363888666666667}, + {0.101666666666667,0.393333333333333,0.103333333333333,0.378888666666667}, + {0.099999999999999,0.407778,0.101666666666667,0.393333333333333}, + {0.0988886666666661,0.421111333333334,0.099999999999999,0.407778}, + {0.0983333333333327,0.433333333333334,0.0988886666666661,0.421111333333334}, + {0.0983333333333327,0.444444666666667,0.0983333333333327,0.433333333333334}, + {0.0994446666666657,0.453888666666667,0.0983333333333327,0.444444666666667}, + {0.101111333333333,0.462222,0.0994446666666657,0.453888666666667}, + {0.103333333333333,0.468333333333333,0.101111333333333,0.462222}, + {0.106666666666666,0.473333333333333,0.103333333333333,0.468333333333333}, + {0.110555333333333,0.477222,0.106666666666666,0.473333333333333}, + {0.115,0.48,0.110555333333333,0.477222}, + {0.120555333333333,0.482222,0.115,0.48}, + {0.127222,0.483333333333333,0.120555333333333,0.482222}, + {0.133888666666666,0.484444666666667,0.127222,0.483333333333333}, + {0.141111333333332,0.485,0.133888666666666,0.484444666666667}, + {0.162777999999999,0.484444666666667,0.155555333333333,0.485}, + {0.169444666666666,0.483333333333333,0.162777999999999,0.484444666666667}, + {0.176111333333332,0.482222,0.169444666666666,0.483333333333333}, + {0.181666666666666,0.48,0.176111333333332,0.482222}, + {0.186111333333333,0.477222,0.181666666666666,0.48}, + {0.189999999999999,0.473333333333333,0.186111333333333,0.477222}, + {0.193333333333333,0.468333333333333,0.189999999999999,0.473333333333333}, + {0.195555333333332,0.462222,0.193333333333333,0.468333333333333}, + {0.197222,0.453888666666667,0.195555333333332,0.462222}, + {0.198333333333333,0.444444666666667,0.197222,0.453888666666667}, + {0.198333333333333,0.433333333333334,0.198333333333333,0.444444666666667}, + {0.197778,0.421111333333334,0.198333333333333,0.433333333333334}, + {0.196666666666667,0.407778,0.197778,0.421111333333334}, + {0.194999999999999,0.393333333333333,0.196666666666667,0.407778}, + {0.193333333333333,0.378888666666667,0.194999999999999,0.393333333333333}, + {0.191666666666666,0.363888666666667,0.193333333333333,0.378888666666667}, + {0.189999999999999,0.349444666666667,0.191666666666666,0.363888666666667}, + {0.188888666666666,0.336111333333333,0.189999999999999,0.349444666666667}, + {0.188333333333333,0.323888666666667,0.188888666666666,0.336111333333333}, + {0.188333333333333,0.312778,0.188333333333333,0.323888666666667}, + {0.189444666666666,0.303333333333333,0.188333333333333,0.312778}, + {0.191111333333333,0.295,0.189444666666666,0.303333333333333}, + {0.193333333333333,0.288888666666667,0.191111333333333,0.295}, + {0.195555333333332,0.285,0.193333333333333,0.288888666666667}, + {0.198333333333333,0.281666666666667,0.195555333333332,0.285}, + {0.201111333333332,0.278888666666666,0.198333333333333,0.281666666666667}, + {0.204999999999999,0.276111333333333,0.201111333333332,0.278888666666666}, + {0.208888666666666,0.273888666666667,0.204999999999999,0.276111333333333}, + {0.212777999999999,0.271111333333333,0.208888666666666,0.273888666666667}, + {0.217777999999999,0.268888666666667,0.212777999999999,0.271111333333333}, + {0.222777999999999,0.266111333333334,0.217777999999999,0.268888666666667}, + {0.227778,0.263888666666666,0.222777999999999,0.266111333333334}, + {0.232778,0.261666666666667,0.227778,0.263888666666666}, + {0.238333333333333,0.259444666666666,0.232778,0.261666666666667}, + {0.243888666666666,0.257778,0.238333333333333,0.259444666666666}, + {0.248888666666666,0.256666666666667,0.243888666666666,0.257778}, + {0.253888666666666,0.255555333333334,0.248888666666666,0.256666666666667}, + {0.263888666666666,0.256666666666667,0.258888666666666,0.255555333333334}, + {0.267778,0.258333333333334,0.263888666666666,0.256666666666667}, + {0.271666666666666,0.261666666666667,0.267778,0.258333333333334}, + {0.275555333333333,0.266111333333334,0.271666666666666,0.261666666666667}, + {0.278333333333332,0.272222,0.275555333333333,0.266111333333334}, + {0.281111333333333,0.279444666666667,0.278333333333332,0.272222}, + {0.283333333333333,0.288888666666667,0.281111333333333,0.279444666666667}, + {0.284999999999999,0.297222,0.283333333333333,0.288888666666667}, + {0.286111333333333,0.307222,0.284999999999999,0.297222}, + {0.287222,0.318333333333333,0.286111333333333,0.307222}, + {0.288333333333333,0.331111333333334,0.287222,0.318333333333333}, + {0.288888666666666,0.344444666666667,0.288333333333333,0.331111333333334}, + {0.289444666666666,0.36,0.288888666666666,0.344444666666667}, + {0.289999999999999,0.376111333333334,0.289444666666666,0.36}, + {0.290555333333332,0.393333333333333,0.289999999999999,0.376111333333334}, + {0.291111333333333,0.411666666666667,0.290555333333332,0.393333333333333}, + {0.291111333333333,0.431111333333333,0.291111333333333,0.411666666666667}, + {0.291666666666667,0.450555333333333,0.291111333333333,0.431111333333333}, + {0.291666666666667,0.471111333333334,0.291666666666667,0.450555333333333}, + {0.291666666666667,0.492222,0.291666666666667,0.471111333333334}, + {0.291666666666667,0.513333333333333,0.291666666666667,0.492222}, + {0.291666666666667,0.533888666666667,0.291666666666667,0.513333333333333}, + {0.291666666666667,0.555,0.291666666666667,0.533888666666667}, + {0.291666666666667,0.575555333333333,0.291666666666667,0.555}, + {0.291111333333333,0.595,0.291666666666667,0.575555333333333}, + {0.291111333333333,0.614444666666667,0.291111333333333,0.595}, + {0.290555333333332,0.632778,0.291111333333333,0.614444666666667}, + {0.289999999999999,0.65,0.290555333333332,0.632778}, + {0.289444666666666,0.666111333333333,0.289999999999999,0.65}, + {0.288888666666666,0.681666666666667,0.289444666666666,0.666111333333333}, + {0.288333333333333,0.695,0.288888666666666,0.681666666666667}, + {0.287222,0.707778,0.288333333333333,0.695}, + {0.286111333333333,0.718888666666667,0.287222,0.707778}, + {0.284999999999999,0.728888666666667,0.286111333333333,0.718888666666667}, + {0.283333333333333,0.737222,0.284999999999999,0.728888666666667}, + {0.281111333333333,0.746666666666667,0.283333333333333,0.737222}, + {0.278333333333332,0.753888666666667,0.281111333333333,0.746666666666667}, + {0.275555333333333,0.76,0.278333333333332,0.753888666666667}, + {0.271666666666666,0.764444666666667,0.275555333333333,0.76}, + {0.267778,0.767778,0.271666666666666,0.764444666666667}, + {0.263888666666666,0.769444666666667,0.267778,0.767778}, + {0.258888666666666,0.770555333333334,0.263888666666666,0.769444666666667}, + {0.248888666666666,0.769444666666667,0.253888666666666,0.770555333333334}, + {0.243888666666666,0.768333333333333,0.248888666666666,0.769444666666667}, + {0.238333333333333,0.766666666666667,0.243888666666666,0.768333333333333}, + {0.232778,0.764444666666667,0.238333333333333,0.766666666666667}, + {0.227778,0.762222,0.232778,0.764444666666667}, + {0.222777999999999,0.76,0.227778,0.762222}, + {0.217777999999999,0.757222,0.222777999999999,0.76}, + {0.212777999999999,0.755,0.217777999999999,0.757222}, + {0.208888666666666,0.752222,0.212777999999999,0.755}, + {0.204999999999999,0.75,0.208888666666666,0.752222}, + {0.201111333333332,0.747222,0.204999999999999,0.75}, + {0.198333333333333,0.744444666666666,0.201111333333332,0.747222}, + {0.195555333333332,0.741111333333333,0.198333333333333,0.744444666666666}, + {0.193333333333333,0.737222,0.195555333333332,0.741111333333333}, + {0.191111333333333,0.731111333333333,0.193333333333333,0.737222}, + {0.189444666666666,0.722778,0.191111333333333,0.731111333333333}, + {0.188888666666666,0.713333333333334,0.189444666666666,0.722778}, + {0.189444666666666,0.702222,0.188888666666666,0.713333333333334}, + {0.190555333333332,0.69,0.189444666666666,0.702222}, + {0.192222,0.676666666666667,0.190555333333332,0.69}, + {0.194999999999999,0.662222,0.192222,0.676666666666667}, + {0.197778,0.647778,0.194999999999999,0.662222}, + {0.199999999999999,0.632778,0.197778,0.647778}, + {0.202221999999999,0.618333333333334,0.199999999999999,0.632778}, + {0.203888666666667,0.605,0.202221999999999,0.618333333333334}, + {0.204444666666666,0.592778,0.203888666666667,0.605}, + {0.203888666666667,0.581666666666666,0.204444666666666,0.592778}, + {0.201666666666666,0.572222,0.203888666666667,0.581666666666666}, + {0.198333333333333,0.563888666666667,0.201666666666666,0.572222}, + {0.193333333333333,0.557778,0.198333333333333,0.563888666666667}, + {0.187222,0.552778,0.193333333333333,0.557778}, + {0.178888666666666,0.55,0.187222,0.552778}, + {0.169444666666666,0.548333333333333,0.178888666666666,0.55}, + {0.158333333333333,0.548888666666667,0.169444666666666,0.548333333333333}, + {0.146111333333333,0.550555333333334,0.158333333333333,0.548888666666667}, + {0.132777999999999,0.553888666666667,0.146111333333333,0.550555333333334}, + {0.118333333333332,0.557778,0.132777999999999,0.553888666666667}, + {0.103888666666666,0.562222,0.118333333333332,0.557778}, + {0.0888886666666657,0.566111333333333,0.103888666666666,0.562222}, + {0.0744446666666659,0.57,0.0888886666666657,0.566111333333333}, + {0.0611113333333329,0.572778,0.0744446666666659,0.57}, + {0.0488886666666666,0.573888666666667,0.0611113333333329,0.572778}, + {0.0377779999999994,0.572778,0.0488886666666666,0.573888666666667}, + {0.0283333333333324,0.57,0.0377779999999994,0.572778}, + {0.0199999999999996,0.565,0.0283333333333324,0.57}, + {0.0138886666666664,0.557778,0.0199999999999996,0.565}, + {0.00999999999999919,0.551111333333333,0.0138886666666664,0.557778}, + {0.00722199999999991,0.543333333333334,0.00999999999999919,0.551111333333333}, + {0.00499999999999901,0.533888666666667,0.00722199999999991,0.543333333333334}, + {0.00277799999999928,0.523333333333333,0.00499999999999901,0.533888666666667}, + {0.00166666666666634,0.511666666666667,0.00277799999999928,0.523333333333333}, + {0.000555333333332205,0.498888666666667,0.00166666666666634,0.511666666666667}, + {0.000555333333332205,0.485,0.000555333333332205,0.498888666666667}, + {0,0.470555333333333,0.000555333333332205,0.485}, + {0.000555333333332205,0.455,0,0.470555333333333}, + {0.000555333333332205,0.439444666666667,0.000555333333332205,0.455}, + {0.00111133333333295,0.423333333333333,0.000555333333332205,0.439444666666667}, + {0.00222199999999972,0.407222,0.00111133333333295,0.423333333333333}, + {0.00277799999999928,0.391666666666667,0.00222199999999972,0.407222}, + {0.00388866666666606,0.376111333333334,0.00277799999999928,0.391666666666667}, + {0.00444466666666562,0.361666666666667,0.00388866666666606,0.376111333333334}, + {0.00555533333333239,0.347778,0.00444466666666562,0.361666666666667}, + {0.00666666666666652,0.335,0.00555533333333239,0.347778}, + {0.00777799999999947,0.323333333333334,0.00666666666666652,0.335}, + {0.00888866666666625,0.312778,0.00777799999999947,0.323333333333334}, + {0.0105553333333326,0.303333333333333,0.00888866666666625,0.312778}, + {0.0122219999999989,0.295555333333333,0.0105553333333326,0.303333333333333}, + {0.0138886666666664,0.288888666666667,0.0122219999999989,0.295555333333333}, + {0.0166666666666657,0.282222,0.0138886666666664,0.288888666666667}, + {0.0199999999999996,0.277222,0.0166666666666657,0.282222}, + {0.0238886666666656,0.273333333333333,0.0199999999999996,0.277222}, + {0.0288886666666658,0.270555333333334,0.0238886666666656,0.273333333333333}, + {0.033888666666666,0.268333333333333,0.0288886666666658,0.270555333333334}, + {0.0394446666666658,0.267222,0.033888666666666,0.268333333333333}, + {0.0588886666666658,0.267778,0.0522219999999992,0.267222}, + {0.0649999999999989,0.268888666666667,0.0588886666666658,0.267778}, + {0.0716666666666666,0.27,0.0649999999999989,0.268888666666667}, + {0.0777779999999998,0.271666666666667,0.0716666666666666,0.27}, + {0.0833333333333333,0.273333333333333,0.0777779999999998,0.271666666666667}, + {0.0883333333333323,0.275555333333333,0.0833333333333333,0.273333333333333}, + {0.0933333333333325,0.277778,0.0883333333333323,0.275555333333333}, + {0.0972219999999998,0.280555333333333,0.0933333333333325,0.277778}, + {0.100555333333332,0.284444666666667,0.0972219999999998,0.280555333333333}, + {0.103333333333333,0.288888666666667,0.100555333333332,0.284444666666667}, + {0,0,0,0} +}; + +double Icon17[][4] = { + {0.297777333333332,0.291666666666667,0.291110666666666,0.288888666666667}, + {0.302777333333333,0.295,0.297777333333332,0.291666666666667}, + {0.306666666666666,0.298888666666667,0.302777333333333,0.295}, + {0.309443999999999,0.303888666666667,0.306666666666666,0.298888666666667}, + {0.311666666666666,0.308888666666667,0.309443999999999,0.303888666666667}, + {0.312777333333333,0.314444666666667,0.311666666666666,0.308888666666667}, + {0.312777333333333,0.320555333333333,0.312777333333333,0.314444666666667}, + {0.312777333333333,0.327222,0.312777333333333,0.320555333333333}, + {0.312222,0.333888666666667,0.312777333333333,0.327222}, + {0.311110666666667,0.34,0.312222,0.333888666666667}, + {0.31,0.346666666666666,0.311110666666667,0.34}, + {0.308333333333332,0.352778,0.31,0.346666666666666}, + {0.306666666666666,0.358333333333333,0.308333333333332,0.352778}, + {0.304444,0.363333333333333,0.306666666666666,0.358333333333333}, + {0.302221999999999,0.368333333333334,0.304444,0.363333333333333}, + {0.299444,0.372222,0.302221999999999,0.368333333333334}, + {0.295555333333333,0.375555333333333,0.299444,0.372222}, + {0.291110666666666,0.378333333333333,0.295555333333333,0.375555333333333}, + {0.285,0.380555333333334,0.291110666666666,0.378333333333333}, + {0.276666666666666,0.382222,0.285,0.380555333333334}, + {0.267221999999999,0.383333333333334,0.276666666666666,0.382222}, + {0.243888666666666,0.382778,0.256110666666666,0.383333333333334}, + {0.230555333333333,0.381666666666667,0.243888666666666,0.382778}, + {0.216110666666667,0.38,0.230555333333333,0.381666666666667}, + {0.201666666666667,0.378333333333333,0.216110666666667,0.38}, + {0.186666666666666,0.376666666666667,0.201666666666667,0.378333333333333}, + {0.172221999999999,0.375,0.186666666666666,0.376666666666667}, + {0.158888666666666,0.373888666666667,0.172221999999999,0.375}, + {0.146666666666666,0.373333333333333,0.158888666666666,0.373888666666667}, + {0.126110666666667,0.374444666666667,0.135555333333333,0.373333333333333}, + {0.117777333333333,0.376111333333334,0.126110666666667,0.374444666666667}, + {0.111666666666666,0.378333333333333,0.117777333333333,0.376111333333334}, + {0.106666666666667,0.381666666666667,0.111666666666666,0.378333333333333}, + {0.102777333333333,0.385555333333333,0.106666666666667,0.381666666666667}, + {0.099999999999999,0.39,0.102777333333333,0.385555333333333}, + {0.0977773333333332,0.395555333333334,0.099999999999999,0.39}, + {0.0966666666666664,0.402222,0.0977773333333332,0.395555333333334}, + {0.0955553333333334,0.408888666666667,0.0966666666666664,0.402222}, + {0.095,0.416111333333333,0.0955553333333334,0.408888666666667}, + {0.095,0.423333333333333,0.095,0.416111333333333}, + {0.095,0.430555333333333,0.095,0.423333333333333}, + {0.0955553333333334,0.437778,0.095,0.430555333333333}, + {0.0966666666666664,0.444444666666667,0.0955553333333334,0.437778}, + {0.0977773333333332,0.451111333333333,0.0966666666666664,0.444444666666667}, + {0.099999999999999,0.456666666666666,0.0977773333333332,0.451111333333333}, + {0.102777333333333,0.461111333333333,0.099999999999999,0.456666666666666}, + {0.106666666666667,0.465,0.102777333333333,0.461111333333333}, + {0.111666666666666,0.468333333333333,0.106666666666667,0.465}, + {0.117777333333333,0.470555333333333,0.111666666666666,0.468333333333333}, + {0.126110666666667,0.472222,0.117777333333333,0.470555333333333}, + {0.146666666666666,0.471666666666666,0.135555333333333,0.472222}, + {0.158888666666666,0.469444666666667,0.146666666666666,0.471666666666666}, + {0.172221999999999,0.466666666666667,0.158888666666666,0.469444666666667}, + {0.186666666666666,0.463333333333334,0.172221999999999,0.466666666666667}, + {0.201666666666667,0.46,0.186666666666666,0.463333333333334}, + {0.216110666666667,0.456666666666666,0.201666666666667,0.46}, + {0.230555333333333,0.453888666666667,0.216110666666667,0.456666666666666}, + {0.243888666666666,0.452222,0.230555333333333,0.453888666666667}, + {0.256110666666666,0.451666666666667,0.243888666666666,0.452222}, + {0.267221999999999,0.452778,0.256110666666666,0.451666666666667}, + {0.276666666666666,0.455555333333334,0.267221999999999,0.452778}, + {0.285,0.461111333333333,0.276666666666666,0.455555333333334}, + {0.291110666666666,0.468333333333333,0.285,0.461111333333333}, + {0.294999999999999,0.475,0.291110666666666,0.468333333333333}, + {0.297777333333332,0.482778,0.294999999999999,0.475}, + {0.300555333333333,0.492222,0.297777333333332,0.482778}, + {0.302777333333333,0.502778,0.300555333333333,0.492222}, + {0.305,0.514444666666667,0.302777333333333,0.502778}, + {0.306666666666666,0.527222,0.305,0.514444666666667}, + {0.307777333333333,0.541111333333333,0.306666666666666,0.527222}, + {0.309443999999999,0.555555333333333,0.307777333333333,0.541111333333333}, + {0.310555333333333,0.571111333333333,0.309443999999999,0.555555333333333}, + {0.311666666666666,0.586666666666667,0.310555333333333,0.571111333333333}, + {0.312222,0.602778,0.311666666666666,0.586666666666667}, + {0.312777333333333,0.618888666666667,0.312222,0.602778}, + {0.312777333333333,0.634444666666666,0.312777333333333,0.618888666666667}, + {0.312777333333333,0.65,0.312777333333333,0.634444666666666}, + {0.312222,0.664444666666667,0.312777333333333,0.65}, + {0.311110666666667,0.678333333333333,0.312222,0.664444666666667}, + {0.31,0.691111333333333,0.311110666666667,0.678333333333333}, + {0.307777333333333,0.702778,0.31,0.691111333333333}, + {0.305,0.713333333333334,0.307777333333333,0.702778}, + {0.301110666666666,0.722778,0.305,0.713333333333334}, + {0.296666666666666,0.730555333333333,0.301110666666666,0.722778}, + {0.291110666666666,0.737222,0.296666666666666,0.730555333333333}, + {0.284443999999999,0.742778,0.291110666666666,0.737222}, + {0.276666666666666,0.747222,0.284443999999999,0.742778}, + {0.267221999999999,0.750555333333333,0.276666666666666,0.747222}, + {0.256666666666666,0.753333333333333,0.267221999999999,0.750555333333333}, + {0.245,0.755,0.256666666666666,0.753333333333333}, + {0.232222,0.756111333333333,0.245,0.755}, + {0.218333333333333,0.756666666666667,0.232222,0.756111333333333}, + {0.188333333333333,0.756111333333333,0.203333333333333,0.756666666666667}, + {0.172221999999999,0.755,0.188333333333333,0.756111333333333}, + {0.156110666666667,0.753888666666667,0.172221999999999,0.755}, + {0.140555333333333,0.752778,0.156110666666667,0.753888666666667}, + {0.124443999999999,0.751111333333334,0.140555333333333,0.752778}, + {0.109444,0.749444666666667,0.124443999999999,0.751111333333334}, + {0.0944439999999993,0.748333333333333,0.109444,0.749444666666667}, + {0.0805553333333329,0.746666666666667,0.0944439999999993,0.748333333333333}, + {0.0677773333333332,0.745,0.0805553333333329,0.746666666666667}, + {0.0561106666666665,0.743888666666667,0.0677773333333332,0.745}, + {0.0455553333333327,0.742222,0.0561106666666665,0.743888666666667}, + {0.0361106666666657,0.740555333333334,0.0455553333333327,0.742222}, + {0.0283333333333324,0.738888666666667,0.0361106666666657,0.740555333333334}, + {0.0216666666666659,0.737222,0.0283333333333324,0.738888666666667}, + {0.0149999999999994,0.734444666666667,0.0216666666666659,0.737222}, + {0.00999999999999919,0.731111333333333,0.0149999999999994,0.734444666666667}, + {0.00611066666666578,0.727222,0.00999999999999919,0.731111333333333}, + {0.00333333333333267,0.722222,0.00611066666666578,0.727222}, + {0.00111066666666678,0.717222,0.00333333333333267,0.722222}, + {0,0.711666666666667,0.00111066666666678,0.717222}, + {0,0.705555333333334,0,0.711666666666667}, + {0,0.698888666666667,0,0.705555333333334}, + {0.000555333333333389,0.692222,0,0.698888666666667}, + {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222}, + {0.00277733333333311,0.679444666666667,0.00166666666666634,0.686111333333334}, + {0.00444399999999945,0.673333333333333,0.00277733333333311,0.679444666666667}, + {0.00611066666666578,0.667778,0.00444399999999945,0.673333333333333}, + {0.00833333333333286,0.662778,0.00611066666666578,0.667778}, + {0.0105553333333326,0.657778,0.00833333333333286,0.662778}, + {0.013333333333333,0.653888666666666,0.0105553333333326,0.657778}, + {0.0172219999999991,0.650555333333333,0.013333333333333,0.653888666666666}, + {0.0216666666666659,0.647778,0.0172219999999991,0.650555333333333}, + {0.0277773333333329,0.645555333333334,0.0216666666666659,0.647778}, + {0.0361106666666657,0.643888666666667,0.0277773333333329,0.645555333333334}, + {0.0455553333333327,0.642778,0.0361106666666657,0.643888666666667}, + {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778}, + {0.0822219999999992,0.644444666666667,0.0688886666666662,0.643333333333333}, + {0.0966666666666664,0.646111333333333,0.0822219999999992,0.644444666666667}, + {0.111666666666666,0.647778,0.0966666666666664,0.646111333333333}, + {0.126110666666667,0.649444666666666,0.111666666666666,0.647778}, + {0.140555333333333,0.651111333333333,0.126110666666667,0.649444666666666}, + {0.153888666666666,0.652222,0.140555333333333,0.651111333333333}, + {0.166110666666666,0.652778,0.153888666666666,0.652222}, + {0.186666666666666,0.651666666666667,0.177221999999999,0.652778}, + {0.194999999999999,0.65,0.186666666666666,0.651666666666667}, + {0.201110666666666,0.647778,0.194999999999999,0.65}, + {0.206110666666666,0.644444666666667,0.201110666666666,0.647778}, + {0.21,0.640555333333333,0.206110666666666,0.644444666666667}, + {0.212777333333333,0.636111333333333,0.21,0.640555333333333}, + {0.215,0.630555333333334,0.212777333333333,0.636111333333333}, + {0.216110666666667,0.623888666666667,0.215,0.630555333333334}, + {0.217222,0.617222,0.216110666666667,0.623888666666667}, + {0.217777333333333,0.61,0.217222,0.617222}, + {0.217777333333333,0.602778,0.217777333333333,0.61}, + {0.217777333333333,0.595555333333333,0.217777333333333,0.602778}, + {0.217222,0.588333333333334,0.217777333333333,0.595555333333333}, + {0.216110666666667,0.581666666666666,0.217222,0.588333333333334}, + {0.215,0.575,0.216110666666667,0.581666666666666}, + {0.212777333333333,0.569444666666667,0.215,0.575}, + {0.21,0.565,0.212777333333333,0.569444666666667}, + {0.206110666666666,0.561111333333334,0.21,0.565}, + {0.201110666666666,0.557778,0.206110666666666,0.561111333333334}, + {0.194999999999999,0.555555333333333,0.201110666666666,0.557778}, + {0.186666666666666,0.553888666666667,0.194999999999999,0.555555333333333}, + {0.166110666666666,0.554444666666667,0.177221999999999,0.553888666666667}, + {0.153888666666666,0.556666666666667,0.166110666666666,0.554444666666667}, + {0.140555333333333,0.559444666666667,0.153888666666666,0.556666666666667}, + {0.126110666666667,0.562778,0.140555333333333,0.559444666666667}, + {0.111666666666666,0.566111333333333,0.126110666666667,0.562778}, + {0.0966666666666664,0.569444666666667,0.111666666666666,0.566111333333333}, + {0.0822219999999992,0.572222,0.0966666666666664,0.569444666666667}, + {0.0688886666666662,0.573888666666667,0.0822219999999992,0.572222}, + {0.056666666666666,0.574444666666666,0.0688886666666662,0.573888666666667}, + {0.0455553333333327,0.573333333333334,0.056666666666666,0.574444666666666}, + {0.0361106666666657,0.570555333333333,0.0455553333333327,0.573333333333334}, + {0.0277773333333329,0.565,0.0361106666666657,0.570555333333333}, + {0.0216666666666659,0.557778,0.0277773333333329,0.565}, + {0.0177773333333325,0.551111333333333,0.0216666666666659,0.557778}, + {0.0149999999999994,0.543333333333334,0.0177773333333325,0.551111333333333}, + {0.0122220000000001,0.533888666666667,0.0149999999999994,0.543333333333334}, + {0.00999999999999919,0.523333333333333,0.0122220000000001,0.533888666666667}, + {0.0077773333333333,0.511666666666667,0.00999999999999919,0.523333333333333}, + {0.00611066666666578,0.498888666666667,0.0077773333333333,0.511666666666667}, + {0.00499999999999901,0.485,0.00611066666666578,0.498888666666667}, + {0.00333333333333267,0.470555333333333,0.00499999999999901,0.485}, + {0.00222199999999972,0.455,0.00333333333333267,0.470555333333333}, + {0.00111066666666678,0.439444666666667,0.00222199999999972,0.455}, + {0.000555333333333389,0.423333333333333,0.00111066666666678,0.439444666666667}, + {0,0.407222,0.000555333333333389,0.423333333333333}, + {0,0.391666666666667,0,0.407222}, + {0,0.376111333333334,0,0.391666666666667}, + {0.000555333333333389,0.361666666666667,0,0.376111333333334}, + {0.00166666666666634,0.347778,0.000555333333333389,0.361666666666667}, + {0.00277733333333311,0.335,0.00166666666666634,0.347778}, + {0.00499999999999901,0.323333333333334,0.00277733333333311,0.335}, + {0.0077773333333333,0.312778,0.00499999999999901,0.323333333333334}, + {0.0116666666666667,0.303333333333333,0.0077773333333333,0.312778}, + {0.0161106666666662,0.295555333333333,0.0116666666666667,0.303333333333333}, + {0.0216666666666659,0.288888666666667,0.0161106666666662,0.295555333333333}, + {0.0283333333333324,0.283333333333333,0.0216666666666659,0.288888666666667}, + {0.0361106666666657,0.278888666666666,0.0283333333333324,0.283333333333333}, + {0.0455553333333327,0.275555333333333,0.0361106666666657,0.278888666666666}, + {0.0561106666666665,0.272778,0.0455553333333327,0.275555333333333}, + {0.0677773333333332,0.271111333333333,0.0561106666666665,0.272778}, + {0.0805553333333329,0.27,0.0677773333333332,0.271111333333333}, + {0.0944439999999993,0.269444666666667,0.0805553333333329,0.27}, + {0.124443999999999,0.27,0.109444,0.269444666666667}, + {0.140555333333333,0.271111333333333,0.124443999999999,0.27}, + {0.156666666666666,0.272222,0.140555333333333,0.271111333333333}, + {0.172221999999999,0.273333333333333,0.156666666666666,0.272222}, + {0.188333333333333,0.275,0.172221999999999,0.273333333333333}, + {0.203333333333333,0.276666666666667,0.188333333333333,0.275}, + {0.218333333333333,0.277778,0.203333333333333,0.276666666666667}, + {0.232222,0.279444666666667,0.218333333333333,0.277778}, + {0.245,0.281111333333333,0.232222,0.279444666666667}, + {0.256666666666666,0.282222,0.245,0.281111333333333}, + {0.267221999999999,0.283888666666667,0.256666666666666,0.282222}, + {0.276666666666666,0.285555333333334,0.267221999999999,0.283888666666667}, + {0.284443999999999,0.287222,0.276666666666666,0.285555333333334}, + {0.291110666666666,0.288888666666667,0.284443999999999,0.287222}, + {0,0,0,0} +}; + +double Icon18[][4] = { + {0.0249999999999998,0.288888666666667,0.0205553333333341,0.297222}, + {0.0205553333333341,0.297222,0.0166666666666669,0.307222}, + {0.0166666666666669,0.307222,0.013333333333333,0.318333333333333}, + {0.013333333333333,0.318333333333333,0.0105553333333338,0.331111333333334}, + {0.0105553333333338,0.331111333333334,0.00833333333333404,0.344444666666667}, + {0.00833333333333404,0.344444666666667,0.00611133333333314,0.36}, + {0.00611133333333314,0.36,0.0044446666666668,0.376111333333334}, + {0.0044446666666668,0.376111333333334,0.00333333333333385,0.393333333333333}, + {0.00333333333333385,0.393333333333333,0.00222199999999972,0.411666666666667}, + {0.00222199999999972,0.411666666666667,0.00111133333333413,0.431111333333333}, + {0.00111133333333413,0.431111333333333,0.000555333333333389,0.450555333333333}, + {0.000555333333333389,0.450555333333333,0,0.471111333333334}, + {0,0.471111333333334,0,0.492222}, + {0,0.492222,0,0.513333333333333}, + {0,0.513333333333333,0,0.533888666666667}, + {0,0.533888666666667,0,0.555}, + {0,0.555,0.000555333333333389,0.575555333333333}, + {0.000555333333333389,0.575555333333333,0.00111133333333413,0.595}, + {0.00111133333333413,0.595,0.00222199999999972,0.614444666666667}, + {0.00222199999999972,0.614444666666667,0.00333333333333385,0.632778}, + {0.00333333333333385,0.632778,0.0044446666666668,0.65}, + {0.0044446666666668,0.65,0.00611133333333314,0.666111333333333}, + {0.00611133333333314,0.666111333333333,0.00833333333333404,0.681666666666667}, + {0.00833333333333404,0.681666666666667,0.0105553333333338,0.695}, + {0.0105553333333338,0.695,0.013333333333333,0.707778}, + {0.013333333333333,0.707778,0.0166666666666669,0.718888666666667}, + {0.0166666666666669,0.718888666666667,0.0205553333333341,0.728888666666667}, + {0.0205553333333341,0.728888666666667,0.0249999999999998,0.737222}, + {0.0249999999999998,0.737222,0.0311113333333341,0.745555333333333}, + {0.0311113333333341,0.745555333333333,0.038333333333334,0.752778}, + {0.038333333333334,0.752778,0.0466666666666669,0.758888666666667}, + {0.0466666666666669,0.758888666666667,0.0555553333333331,0.763333333333333}, + {0.0555553333333331,0.763333333333333,0.066111333333333,0.767222}, + {0.066111333333333,0.767222,0.0772220000000002,0.769444666666667}, + {0.0772220000000002,0.769444666666667,0.0894446666666665,0.771111333333333}, + {0.0894446666666665,0.771111333333333,0.102778000000001,0.772222}, + {0.102778000000001,0.772222,0.116111333333334,0.772778}, + {0.116111333333334,0.772778,0.130555333333334,0.772222}, + {0.130555333333334,0.772222,0.145000000000001,0.771666666666667}, + {0.145000000000001,0.771666666666667,0.16,0.771111333333333}, + {0.16,0.771111333333333,0.174444666666667,0.769444666666667}, + {0.174444666666667,0.769444666666667,0.188888666666667,0.767778}, + {0.188888666666667,0.767778,0.203333333333333,0.766111333333334}, + {0.203333333333333,0.766111333333334,0.216666666666667,0.763888666666666}, + {0.216666666666667,0.763888666666666,0.23,0.762222}, + {0.23,0.762222,0.242222000000001,0.759444666666666}, + {0.242222000000001,0.759444666666666,0.253333333333334,0.756666666666667}, + {0.253333333333334,0.756666666666667,0.263888666666666,0.753888666666667}, + {0.263888666666666,0.753888666666667,0.272778,0.750555333333333}, + {0.272778,0.750555333333333,0.281111333333334,0.746666666666667}, + {0.281111333333334,0.746666666666667,0.288333333333334,0.742222}, + {0.288333333333334,0.742222,0.294444666666667,0.737222}, + {0.294444666666667,0.737222,0.300000000000001,0.730555333333333}, + {0.300000000000001,0.730555333333333,0.304444666666667,0.722778}, + {0.304444666666667,0.722778,0.308333333333334,0.713333333333334}, + {0.308333333333334,0.713333333333334,0.311111333333334,0.702778}, + {0.311111333333334,0.702778,0.313333333333334,0.691111333333333}, + {0.313333333333334,0.691111333333333,0.314444666666667,0.678333333333333}, + {0.314444666666667,0.678333333333333,0.315555333333333,0.664444666666667}, + {0.315555333333333,0.664444666666667,0.316111333333333,0.65}, + {0.316111333333333,0.65,0.316111333333333,0.634444666666666}, + {0.316111333333333,0.634444666666666,0.316111333333333,0.618888666666667}, + {0.316111333333333,0.618888666666667,0.315555333333333,0.602778}, + {0.315555333333333,0.602778,0.315,0.586666666666667}, + {0.315,0.586666666666667,0.313888666666667,0.571111333333333}, + {0.313888666666667,0.571111333333333,0.312778,0.555555333333333}, + {0.312778,0.555555333333333,0.311111333333334,0.541111333333333}, + {0.311111333333334,0.541111333333333,0.31,0.527222}, + {0.31,0.527222,0.308333333333334,0.514444666666667}, + {0.308333333333334,0.514444666666667,0.306111333333334,0.502778}, + {0.306111333333334,0.502778,0.303888666666667,0.492222}, + {0.303888666666667,0.492222,0.301111333333334,0.482778}, + {0.301111333333334,0.482778,0.298333333333333,0.475}, + {0.298333333333333,0.475,0.294444666666667,0.468333333333333}, + {0.294444666666667,0.468333333333333,0.288333333333334,0.461111333333333}, + {0.288333333333334,0.461111333333333,0.28,0.455555333333334}, + {0.28,0.455555333333334,0.270555333333334,0.452778}, + {0.270555333333334,0.452778,0.259444666666667,0.451666666666667}, + {0.259444666666667,0.451666666666667,0.247222000000001,0.452222}, + {0.247222000000001,0.452222,0.233888666666666,0.453888666666667}, + {0.233888666666666,0.453888666666667,0.219444666666667,0.456666666666666}, + {0.219444666666667,0.456666666666666,0.205000000000001,0.46}, + {0.205000000000001,0.46,0.19,0.463333333333334}, + {0.19,0.463333333333334,0.175555333333334,0.466666666666667}, + {0.175555333333334,0.466666666666667,0.162222,0.469444666666667}, + {0.162222,0.469444666666667,0.15,0.471666666666666}, + {0.15,0.471666666666666,0.138888666666666,0.472222}, + {0.129444666666667,0.472222,0.121111333333334,0.470555333333333}, + {0.121111333333334,0.470555333333333,0.115000000000001,0.468333333333333}, + {0.115000000000001,0.468333333333333,0.110000000000001,0.465}, + {0.110000000000001,0.465,0.106111333333333,0.461111333333333}, + {0.106111333333333,0.461111333333333,0.103333333333334,0.456666666666666}, + {0.103333333333334,0.456666666666666,0.101111333333333,0.451111333333333}, + {0.101111333333333,0.451111333333333,0.1,0.444444666666667}, + {0.1,0.444444666666667,0.0988886666666673,0.437778}, + {0.0988886666666673,0.437778,0.0983333333333339,0.430555333333333}, + {0.0983333333333339,0.430555333333333,0.0983333333333339,0.423333333333333}, + {0.0983333333333339,0.423333333333333,0.0983333333333339,0.416111333333333}, + {0.0983333333333339,0.416111333333333,0.0988886666666673,0.408888666666667}, + {0.0988886666666673,0.408888666666667,0.1,0.402222}, + {0.1,0.402222,0.101111333333333,0.395555333333334}, + {0.101111333333333,0.395555333333334,0.103333333333334,0.39}, + {0.103333333333334,0.39,0.106111333333333,0.385555333333333}, + {0.106111333333333,0.385555333333333,0.110000000000001,0.381666666666667}, + {0.110000000000001,0.381666666666667,0.115000000000001,0.378333333333333}, + {0.115000000000001,0.378333333333333,0.121111333333334,0.376111333333334}, + {0.121111333333334,0.376111333333334,0.129444666666667,0.374444666666667}, + {0.129444666666667,0.374444666666667,0.138888666666666,0.373333333333333}, + {0.15,0.373333333333333,0.162222,0.373888666666667}, + {0.162222,0.373888666666667,0.175555333333334,0.375}, + {0.175555333333334,0.375,0.19,0.376666666666667}, + {0.19,0.376666666666667,0.205000000000001,0.378333333333333}, + {0.205000000000001,0.378333333333333,0.219444666666667,0.38}, + {0.219444666666667,0.38,0.233888666666666,0.381666666666667}, + {0.233888666666666,0.381666666666667,0.247222000000001,0.382778}, + {0.247222000000001,0.382778,0.259444666666667,0.383333333333334}, + {0.270555333333334,0.383333333333334,0.28,0.382222}, + {0.28,0.382222,0.288333333333334,0.380555333333334}, + {0.288333333333334,0.380555333333334,0.294444666666667,0.378333333333333}, + {0.294444666666667,0.378333333333333,0.298888666666667,0.375555333333333}, + {0.298888666666667,0.375555333333333,0.302778,0.372222}, + {0.302778,0.372222,0.305555333333333,0.368333333333334}, + {0.305555333333333,0.368333333333334,0.307778,0.363333333333333}, + {0.307778,0.363333333333333,0.31,0.358333333333333}, + {0.31,0.358333333333333,0.311666666666667,0.352778}, + {0.311666666666667,0.352778,0.313333333333334,0.346666666666666}, + {0.313333333333334,0.346666666666666,0.314444666666667,0.34}, + {0.314444666666667,0.34,0.315555333333333,0.333333333333333}, + {0.315555333333333,0.333333333333333,0.316111333333333,0.327222}, + {0.316111333333333,0.327222,0.316111333333333,0.320555333333333}, + {0.316111333333333,0.320555333333333,0.316111333333333,0.314444666666667}, + {0.316111333333333,0.314444666666667,0.315,0.308888666666667}, + {0.315,0.308888666666667,0.312778,0.303888666666667}, + {0.312778,0.303888666666667,0.31,0.298888666666667}, + {0.31,0.298888666666667,0.306111333333334,0.295}, + {0.306111333333334,0.295,0.301111333333334,0.291666666666667}, + {0.301111333333334,0.291666666666667,0.294444666666667,0.288888666666667}, + {0.294444666666667,0.288888666666667,0.287778000000001,0.287222}, + {0.287778000000001,0.287222,0.28,0.285}, + {0.28,0.285,0.270555333333334,0.283333333333333}, + {0.270555333333334,0.283333333333333,0.26,0.281666666666667}, + {0.26,0.281666666666667,0.248333333333334,0.279444666666667}, + {0.248333333333334,0.279444666666667,0.235555333333334,0.277222}, + {0.235555333333334,0.277222,0.221666666666666,0.274444666666666}, + {0.221666666666666,0.274444666666666,0.206666666666667,0.272222}, + {0.206666666666667,0.272222,0.191666666666666,0.268888666666667}, + {0.191666666666666,0.268888666666667,0.175555333333334,0.266111333333334}, + {0.175555333333334,0.266111333333334,0.159444666666667,0.263888666666666}, + {0.159444666666667,0.263888666666666,0.143888666666667,0.261111333333333}, + {0.143888666666667,0.261111333333333,0.127778,0.259444666666666}, + {0.127778,0.259444666666666,0.112778,0.257778}, + {0.112778,0.257778,0.0977780000000005,0.257222}, + {0.0977780000000005,0.257222,0.0838886666666667,0.257778}, + {0.0838886666666667,0.257778,0.0711113333333332,0.259444666666666}, + {0.0711113333333332,0.259444666666666,0.0594446666666665,0.262222}, + {0.0594446666666665,0.262222,0.0488886666666666,0.266111333333334}, + {0.0488886666666666,0.266111333333334,0.0394446666666669,0.272222}, + {0.0394446666666669,0.272222,0.0316666666666675,0.279444666666667}, + {0.0316666666666675,0.279444666666667,0.0249999999999998,0.288888666666667}, + {0.204444666666667,0.557778,0.207778,0.562222}, + {0.207778,0.562222,0.210000000000001,0.567778}, + {0.210000000000001,0.567778,0.211111333333334,0.575}, + {0.211111333333334,0.575,0.212222000000001,0.583888666666667}, + {0.212222000000001,0.583888666666667,0.212778,0.592778}, + {0.212778,0.592778,0.212778,0.602778}, + {0.212778,0.602778,0.212778,0.612778}, + {0.212778,0.612778,0.212222000000001,0.621666666666667}, + {0.212222000000001,0.621666666666667,0.211111333333334,0.630555333333334}, + {0.211111333333334,0.630555333333334,0.210000000000001,0.637778}, + {0.210000000000001,0.637778,0.207778,0.643333333333333}, + {0.207778,0.643333333333333,0.204444666666667,0.647778}, + {0.204444666666667,0.647778,0.2,0.651111333333333}, + {0.2,0.651111333333333,0.194444666666667,0.653333333333334}, + {0.194444666666667,0.653333333333334,0.187222000000001,0.654444666666667}, + {0.187222000000001,0.654444666666667,0.178888666666667,0.655555333333333}, + {0.178888666666667,0.655555333333333,0.169444666666667,0.656111333333333}, + {0.15,0.656111333333333,0.140555333333334,0.655555333333333}, + {0.140555333333334,0.655555333333333,0.132222,0.654444666666667}, + {0.132222,0.654444666666667,0.125,0.653333333333334}, + {0.125,0.653333333333334,0.119444666666666,0.651111333333333}, + {0.119444666666666,0.651111333333333,0.115000000000001,0.647778}, + {0.115000000000001,0.647778,0.111666666666667,0.643333333333333}, + {0.111666666666667,0.643333333333333,0.109444666666667,0.637778}, + {0.109444666666667,0.637778,0.108333333333333,0.630555333333334}, + {0.108333333333333,0.630555333333334,0.107222,0.621666666666667}, + {0.107222,0.621666666666667,0.106666666666667,0.612778}, + {0.106666666666667,0.612778,0.106666666666667,0.602778}, + {0.106666666666667,0.602778,0.106666666666667,0.592778}, + {0.106666666666667,0.592778,0.107222,0.583888666666667}, + {0.107222,0.583888666666667,0.108333333333333,0.575}, + {0.108333333333333,0.575,0.109444666666667,0.567778}, + {0.109444666666667,0.567778,0.111666666666667,0.562222}, + {0.111666666666667,0.562222,0.115000000000001,0.557778}, + {0.115000000000001,0.557778,0.119444666666666,0.554444666666667}, + {0.119444666666666,0.554444666666667,0.125,0.552222}, + {0.125,0.552222,0.132222,0.551111333333333}, + {0.132222,0.551111333333333,0.140555333333334,0.55}, + {0.140555333333334,0.55,0.15,0.549444666666667}, + {0.169444666666667,0.549444666666667,0.178888666666667,0.55}, + {0.178888666666667,0.55,0.187222000000001,0.551111333333333}, + {0.187222000000001,0.551111333333333,0.194444666666667,0.552222}, + {0.194444666666667,0.552222,0.2,0.554444666666667}, + {0.2,0.554444666666667,0.204444666666667,0.557778}, + {0,0,0,0} +}; + +double Icon19[][4] = { + {0.293889333333333,0.297222,0.291111333333333,0.288888666666667}, + {0.295556,0.307222,0.293889333333333,0.297222}, + {0.296666666666667,0.318333333333333,0.295556,0.307222}, + {0.296666666666667,0.331111333333334,0.296666666666667,0.318333333333333}, + {0.296111333333333,0.344444666666667,0.296666666666667,0.331111333333334}, + {0.294444666666666,0.36,0.296111333333333,0.344444666666667}, + {0.292222666666667,0.376111333333334,0.294444666666666,0.36}, + {0.289444666666666,0.393333333333333,0.292222666666667,0.376111333333334}, + {0.286111333333333,0.411666666666667,0.289444666666666,0.393333333333333}, + {0.282222666666667,0.431111333333333,0.286111333333333,0.411666666666667}, + {0.277778,0.450555333333333,0.282222666666667,0.431111333333333}, + {0.272778,0.471111333333334,0.277778,0.450555333333333}, + {0.268333333333333,0.492222,0.272778,0.471111333333334}, + {0.262778,0.513333333333333,0.268333333333333,0.492222}, + {0.257777999999999,0.533888666666667,0.262778,0.513333333333333}, + {0.252222666666666,0.555,0.257777999999999,0.533888666666667}, + {0.247222666666666,0.575555333333333,0.252222666666666,0.555}, + {0.241666666666667,0.595,0.247222666666666,0.575555333333333}, + {0.236666666666667,0.614444666666667,0.241666666666667,0.595}, + {0.231666666666667,0.632778,0.236666666666667,0.614444666666667}, + {0.227222666666667,0.65,0.231666666666667,0.632778}, + {0.222778000000001,0.666111333333333,0.227222666666667,0.65}, + {0.218889333333334,0.681666666666667,0.222778000000001,0.666111333333333}, + {0.215000000000001,0.695,0.218889333333334,0.681666666666667}, + {0.211111333333333,0.707778,0.215000000000001,0.695}, + {0.207778,0.718888666666667,0.211111333333333,0.707778}, + {0.204444666666667,0.728888666666667,0.207778,0.718888666666667}, + {0.201111333333332,0.737222,0.204444666666667,0.728888666666667}, + {0.197778,0.744444666666666,0.201111333333332,0.737222}, + {0.194444666666667,0.751111333333334,0.197778,0.744444666666666}, + {0.191111333333334,0.756666666666667,0.194444666666667,0.751111333333334}, + {0.187777999999999,0.761111333333333,0.191111333333334,0.756666666666667}, + {0.184444666666667,0.765,0.187777999999999,0.761111333333333}, + {0.180556,0.767778,0.184444666666667,0.765}, + {0.176666666666667,0.770555333333334,0.180556,0.767778}, + {0.172778000000001,0.772222,0.176666666666667,0.770555333333334}, + {0.168889333333333,0.773888666666667,0.172778000000001,0.772222}, + {0.164999999999999,0.774444666666666,0.168889333333333,0.773888666666667}, + {0.160556,0.775555333333333,0.164999999999999,0.774444666666666}, + {0.147778,0.775,0.152222666666667,0.775555333333333}, + {0.143889333333334,0.774444666666666,0.147778,0.775}, + {0.140000000000001,0.773333333333333,0.143889333333334,0.774444666666666}, + {0.136111333333332,0.772222,0.140000000000001,0.773333333333333}, + {0.132222666666666,0.771111333333333,0.136111333333332,0.772222}, + {0.128333333333333,0.769444666666667,0.132222666666666,0.771111333333333}, + {0.125,0.767778,0.128333333333333,0.769444666666667}, + {0.122222666666666,0.765555333333333,0.125,0.767778}, + {0.119444666666666,0.762778,0.122222666666666,0.765555333333333}, + {0.117222666666666,0.76,0.119444666666666,0.762778}, + {0.115,0.756666666666667,0.117222666666666,0.76}, + {0.113889333333333,0.752778,0.115,0.756666666666667}, + {0.112778000000001,0.748333333333333,0.113889333333333,0.752778}, + {0.111666666666667,0.743333333333334,0.112778000000001,0.748333333333333}, + {0.111666666666667,0.737222,0.111666666666667,0.743333333333334}, + {0.112222666666668,0.728888666666667,0.111666666666667,0.737222}, + {0.112778000000001,0.719444666666667,0.112222666666668,0.728888666666667}, + {0.115,0.708888666666667,0.112778000000001,0.719444666666667}, + {0.117222666666666,0.696111333333333,0.115,0.708888666666667}, + {0.121111333333334,0.682778,0.117222666666666,0.696111333333333}, + {0.125,0.667222,0.121111333333334,0.682778}, + {0.13,0.651111333333333,0.125,0.667222}, + {0.135,0.633888666666667,0.13,0.651111333333333}, + {0.141111333333332,0.615555333333334,0.135,0.633888666666667}, + {0.147222666666667,0.596666666666666,0.141111333333332,0.615555333333334}, + {0.153889333333334,0.577222,0.147222666666667,0.596666666666666}, + {0.160556,0.557778,0.153889333333334,0.577222}, + {0.167222666666667,0.538333333333333,0.160556,0.557778}, + {0.173889333333333,0.518888666666667,0.167222666666667,0.538333333333333}, + {0.179444666666666,0.5,0.173889333333333,0.518888666666667}, + {0.185556000000001,0.481666666666667,0.179444666666666,0.5}, + {0.190556000000001,0.464444666666667,0.185556000000001,0.481666666666667}, + {0.194444666666667,0.448333333333334,0.190556000000001,0.464444666666667}, + {0.198333333333333,0.432778,0.194444666666667,0.448333333333334}, + {0.200555999999999,0.419444666666667,0.198333333333333,0.432778}, + {0.202222666666666,0.406666666666667,0.200555999999999,0.419444666666667}, + {0.202778,0.396111333333333,0.202222666666666,0.406666666666667}, + {0.202778,0.386666666666667,0.202778,0.396111333333333}, + {0.201111333333332,0.378333333333333,0.202778,0.386666666666667}, + {0.197222666666666,0.368333333333334,0.201111333333332,0.378333333333333}, + {0.191111333333334,0.361666666666667,0.197222666666666,0.368333333333334}, + {0.182777999999999,0.357222,0.191111333333334,0.361666666666667}, + {0.172222666666668,0.355555333333333,0.182777999999999,0.357222}, + {0.159999999999999,0.356111333333333,0.172222666666668,0.355555333333333}, + {0.146111333333333,0.358333333333333,0.159999999999999,0.356111333333333}, + {0.131111333333334,0.361666666666667,0.146111333333333,0.358333333333333}, + {0.115556,0.365555333333334,0.131111333333334,0.361666666666667}, + {0.099999999999999,0.37,0.115556,0.365555333333334}, + {0.0850000000000009,0.374444666666667,0.099999999999999,0.37}, + {0.070556000000001,0.377778,0.0850000000000009,0.374444666666667}, + {0.0572226666666656,0.380555333333334,0.070556000000001,0.377778}, + {0.0461113333333335,0.381666666666667,0.0572226666666656,0.380555333333334}, + {0.0361113333333331,0.382222,0.0461113333333335,0.381666666666667}, + {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222}, + {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334}, + {0.0172226666666665,0.375555333333333,0.0216666666666671,0.378333333333333}, + {0.013333333333333,0.372222,0.0172226666666665,0.375555333333333}, + {0.0105559999999999,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105559999999999,0.368333333333334}, + {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333}, + {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778}, + {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666}, + {0.000555999999999557,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555999999999557,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111133333333295,0.308888666666667,0,0.314444666666667}, + {0.00333333333333385,0.303888666666667,0.00111133333333295,0.308888666666667}, + {0.00611133333333314,0.298888666666667,0.00333333333333385,0.303888666666667}, + {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295}, + {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667}, + {0.0361113333333331,0.285,0.0283333333333336,0.287222}, + {0.0455560000000001,0.283333333333333,0.0361113333333331,0.285}, + {0.0566666666666672,0.281666666666667,0.0455560000000001,0.283333333333333}, + {0.0683333333333328,0.279444666666667,0.0566666666666672,0.281666666666667}, + {0.0816666666666658,0.277222,0.0683333333333328,0.279444666666667}, + {0.096111333333333,0.274444666666666,0.0816666666666658,0.277222}, + {0.111666666666667,0.272222,0.096111333333333,0.274444666666666}, + {0.127222666666666,0.268888666666667,0.111666666666667,0.272222}, + {0.143889333333334,0.266111333333334,0.127222666666666,0.268888666666667}, + {0.160556,0.263888666666666,0.143889333333334,0.266111333333334}, + {0.177222666666668,0.261111333333333,0.160556,0.263888666666666}, + {0.193333333333333,0.259444666666666,0.177222666666668,0.261111333333333}, + {0.209444666666667,0.257778,0.193333333333333,0.259444666666666}, + {0.224444666666666,0.257222,0.209444666666667,0.257778}, + {0.238333333333332,0.257778,0.224444666666666,0.257222}, + {0.251111333333334,0.259444666666666,0.238333333333332,0.257778}, + {0.262222666666666,0.262222,0.251111333333334,0.259444666666666}, + {0.271666666666666,0.266111333333334,0.262222666666666,0.262222}, + {0.279999999999999,0.272222,0.271666666666666,0.266111333333334}, + {0.286111333333333,0.279444666666667,0.279999999999999,0.272222}, + {0.291111333333333,0.288888666666667,0.286111333333333,0.279444666666667}, + {0,0,0,0} +}; + +double Icon20[][4] = { + {0.0988886666666673,0.285555333333334,0.0916666666666662,0.288888666666667}, + {0.106666666666667,0.283333333333333,0.0988886666666673,0.285555333333334}, + {0.113888666666665,0.282222,0.106666666666667,0.283333333333333}, + {0.121666666666667,0.281111333333333,0.113888666666665,0.282222}, + {0.128888666666666,0.280555333333333,0.121666666666667,0.281111333333333}, + {0.151666666666666,0.281111333333333,0.144444,0.280555333333333}, + {0.159444000000001,0.282222,0.151666666666666,0.281111333333333}, + {0.166666666666667,0.283333333333333,0.159444000000001,0.282222}, + {0.174443999999999,0.285555333333334,0.166666666666667,0.283333333333333}, + {0.181666666666667,0.288888666666667,0.174443999999999,0.285555333333334}, + {0.188333333333333,0.292778,0.181666666666667,0.288888666666667}, + {0.195,0.297222,0.188333333333333,0.292778}, + {0.201666666666666,0.302222,0.195,0.297222}, + {0.208888666666667,0.307778,0.201666666666666,0.302222}, + {0.216110666666665,0.313888666666667,0.208888666666667,0.307778}, + {0.223888666666667,0.320555333333333,0.216110666666665,0.313888666666667}, + {0.231666666666667,0.327222,0.223888666666667,0.320555333333333}, + {0.239443999999999,0.334444666666667,0.231666666666667,0.327222}, + {0.246110666666667,0.341111333333333,0.239443999999999,0.334444666666667}, + {0.252777333333334,0.348333333333333,0.246110666666667,0.341111333333333}, + {0.258888666666666,0.355555333333333,0.252777333333334,0.348333333333333}, + {0.263888666666666,0.362778,0.258888666666666,0.355555333333333}, + {0.268333333333333,0.370555333333333,0.263888666666666,0.362778}, + {0.271110666666667,0.378333333333333,0.268333333333333,0.370555333333333}, + {0.272777333333333,0.386666666666667,0.271110666666667,0.378333333333333}, + {0.273333333333333,0.395555333333334,0.272777333333333,0.386666666666667}, + {0.273333333333333,0.404444666666667,0.273333333333333,0.395555333333334}, + {0.271666666666666,0.413888666666667,0.273333333333333,0.404444666666667}, + {0.269444,0.423888666666667,0.271666666666666,0.413888666666667}, + {0.266666666666666,0.433333333333334,0.269444,0.423888666666667}, + {0.263333333333333,0.443888666666667,0.266666666666666,0.433333333333334}, + {0.26,0.453888666666667,0.263333333333333,0.443888666666667}, + {0.256666666666668,0.463888666666667,0.26,0.453888666666667}, + {0.253888666666666,0.473888666666667,0.256666666666668,0.463888666666667}, + {0.251666666666667,0.483888666666667,0.253888666666666,0.473888666666667}, + {0.25,0.493888666666667,0.251666666666667,0.483888666666667}, + {0.248888666666666,0.503888666666667,0.25,0.493888666666667}, + {0.248888666666666,0.513333333333333,0.248888666666666,0.503888666666667}, + {0.248888666666666,0.522778,0.248888666666666,0.513333333333333}, + {0.25,0.532778,0.248888666666666,0.522778}, + {0.251666666666667,0.542222,0.25,0.532778}, + {0.253888666666666,0.552222,0.251666666666667,0.542222}, + {0.256666666666668,0.562222,0.253888666666666,0.552222}, + {0.26,0.572778,0.256666666666668,0.562222}, + {0.263333333333333,0.582778,0.26,0.572778}, + {0.266666666666666,0.592778,0.263333333333333,0.582778}, + {0.269444,0.602778,0.266666666666666,0.592778}, + {0.271666666666666,0.612222,0.269444,0.602778}, + {0.273333333333333,0.621666666666667,0.271666666666666,0.612222}, + {0.273333333333333,0.631111333333333,0.273333333333333,0.621666666666667}, + {0.272777333333333,0.639444666666667,0.273333333333333,0.631111333333333}, + {0.271110666666667,0.647778,0.272777333333333,0.639444666666667}, + {0.268333333333333,0.655555333333333,0.271110666666667,0.647778}, + {0.263888666666666,0.663333333333333,0.268333333333333,0.655555333333333}, + {0.258888666666666,0.670555333333333,0.263888666666666,0.663333333333333}, + {0.252777333333334,0.677778,0.258888666666666,0.670555333333333}, + {0.246110666666667,0.685,0.252777333333334,0.677778}, + {0.239443999999999,0.691666666666666,0.246110666666667,0.685}, + {0.231666666666667,0.698888666666667,0.239443999999999,0.691666666666666}, + {0.223888666666667,0.705555333333334,0.231666666666667,0.698888666666667}, + {0.216110666666665,0.712222,0.223888666666667,0.705555333333334}, + {0.208888666666667,0.718333333333333,0.216110666666665,0.712222}, + {0.201666666666666,0.723888666666667,0.208888666666667,0.718333333333333}, + {0.195,0.728888666666667,0.201666666666666,0.723888666666667}, + {0.188333333333333,0.733333333333333,0.195,0.728888666666667}, + {0.181666666666667,0.737222,0.188333333333333,0.733333333333333}, + {0.174443999999999,0.740555333333334,0.181666666666667,0.737222}, + {0.166666666666667,0.742778,0.174443999999999,0.740555333333334}, + {0.159444000000001,0.743888666666667,0.166666666666667,0.742778}, + {0.151666666666666,0.745,0.159444000000001,0.743888666666667}, + {0.144444,0.745555333333333,0.151666666666666,0.745}, + {0.121666666666667,0.745,0.128888666666666,0.745555333333333}, + {0.113888666666665,0.743888666666667,0.121666666666667,0.745}, + {0.106666666666667,0.742778,0.113888666666665,0.743888666666667}, + {0.0988886666666673,0.740555333333334,0.106666666666667,0.742778}, + {0.0916666666666662,0.737222,0.0988886666666673,0.740555333333334}, + {0.0850000000000009,0.733333333333333,0.0916666666666662,0.737222}, + {0.0783333333333331,0.728888666666667,0.0850000000000009,0.733333333333333}, + {0.0716666666666654,0.723888666666667,0.0783333333333331,0.728888666666667}, + {0.0644439999999993,0.718333333333333,0.0716666666666654,0.723888666666667}, + {0.0572220000000006,0.712222,0.0644439999999993,0.718333333333333}, + {0.0494439999999988,0.705555333333334,0.0572220000000006,0.712222}, + {0.0416666666666667,0.698888666666667,0.0494439999999988,0.705555333333334}, + {0.0338886666666672,0.691666666666666,0.0416666666666667,0.698888666666667}, + {0.0272219999999995,0.685,0.0338886666666672,0.691666666666666}, + {0.0205553333333341,0.677778,0.0272219999999995,0.685}, + {0.0144439999999998,0.670555333333333,0.0205553333333341,0.677778}, + {0.00944399999999964,0.663333333333333,0.0144439999999998,0.670555333333333}, + {0.00500000000000019,0.655555333333333,0.00944399999999964,0.663333333333333}, + {0.00222200000000091,0.647778,0.00500000000000019,0.655555333333333}, + {0.000555333333333389,0.639444666666667,0.00222200000000091,0.647778}, + {0,0.631111333333333,0.000555333333333389,0.639444666666667}, + {0,0.621666666666667,0,0.631111333333333}, + {0.00166666666666752,0.612222,0,0.621666666666667}, + {0.00388866666666606,0.602778,0.00166666666666752,0.612222}, + {0.00666666666666771,0.592778,0.00388866666666606,0.602778}, + {0.0100000000000004,0.582778,0.00666666666666771,0.592778}, + {0.013333333333333,0.572778,0.0100000000000004,0.582778}, + {0.0166666666666657,0.562222,0.013333333333333,0.572778}, + {0.019444,0.552222,0.0166666666666657,0.562222}, + {0.0216666666666659,0.542222,0.019444,0.552222}, + {0.0233333333333334,0.532778,0.0216666666666659,0.542222}, + {0.0244440000000002,0.522778,0.0233333333333334,0.532778}, + {0.0244440000000002,0.513333333333333,0.0244440000000002,0.522778}, + {0.0244440000000002,0.503888666666667,0.0244440000000002,0.513333333333333}, + {0.0233333333333334,0.493888666666667,0.0244440000000002,0.503888666666667}, + {0.0216666666666659,0.483888666666667,0.0233333333333334,0.493888666666667}, + {0.019444,0.473888666666667,0.0216666666666659,0.483888666666667}, + {0.0166666666666657,0.463888666666667,0.019444,0.473888666666667}, + {0.013333333333333,0.453888666666667,0.0166666666666657,0.463888666666667}, + {0.0100000000000004,0.443888666666667,0.013333333333333,0.453888666666667}, + {0.00666666666666771,0.433333333333334,0.0100000000000004,0.443888666666667}, + {0.00388866666666606,0.423888666666667,0.00666666666666771,0.433333333333334}, + {0.00166666666666752,0.413888666666667,0.00388866666666606,0.423888666666667}, + {0,0.404444666666667,0.00166666666666752,0.413888666666667}, + {0,0.395555333333334,0,0.404444666666667}, + {0.000555333333333389,0.386666666666667,0,0.395555333333334}, + {0.00222200000000091,0.378333333333333,0.000555333333333389,0.386666666666667}, + {0.00500000000000019,0.370555333333333,0.00222200000000091,0.378333333333333}, + {0.00944399999999964,0.362778,0.00500000000000019,0.370555333333333}, + {0.0144439999999998,0.355555333333333,0.00944399999999964,0.362778}, + {0.0205553333333341,0.348333333333333,0.0144439999999998,0.355555333333333}, + {0.0272219999999995,0.341111333333333,0.0205553333333341,0.348333333333333}, + {0.0338886666666672,0.334444666666667,0.0272219999999995,0.341111333333333}, + {0.0416666666666667,0.327222,0.0338886666666672,0.334444666666667}, + {0.0494439999999988,0.320555333333333,0.0416666666666667,0.327222}, + {0.0572220000000006,0.313888666666667,0.0494439999999988,0.320555333333333}, + {0.0644439999999993,0.307778,0.0572220000000006,0.313888666666667}, + {0.0716666666666654,0.302222,0.0644439999999993,0.307778}, + {0.0783333333333331,0.297222,0.0716666666666654,0.302222}, + {0.0850000000000009,0.292778,0.0783333333333331,0.297222}, + {0.0916666666666662,0.288888666666667,0.0850000000000009,0.292778}, + {0.181666666666667,0.557778,0.185,0.562222}, + {0.185,0.562222,0.187222000000001,0.567778}, + {0.187222000000001,0.567778,0.188333333333333,0.575}, + {0.188333333333333,0.575,0.189443999999999,0.583888666666667}, + {0.189443999999999,0.583888666666667,0.19,0.592778}, + {0.19,0.592778,0.19,0.602778}, + {0.19,0.602778,0.19,0.612778}, + {0.19,0.612778,0.189443999999999,0.621666666666667}, + {0.189443999999999,0.621666666666667,0.188333333333333,0.630555333333334}, + {0.188333333333333,0.630555333333334,0.187222000000001,0.637778}, + {0.187222000000001,0.637778,0.185,0.643333333333333}, + {0.185,0.643333333333333,0.181666666666667,0.647778}, + {0.181666666666667,0.647778,0.177222,0.651111333333333}, + {0.177222,0.651111333333333,0.171666666666667,0.653333333333334}, + {0.171666666666667,0.653333333333334,0.164444000000001,0.654444666666667}, + {0.164444000000001,0.654444666666667,0.155555333333332,0.655555333333333}, + {0.155555333333332,0.655555333333333,0.146666666666666,0.656111333333333}, + {0.126666666666668,0.656111333333333,0.117777333333334,0.655555333333333}, + {0.117777333333334,0.655555333333333,0.108888666666668,0.654444666666667}, + {0.108888666666668,0.654444666666667,0.101666666666667,0.653333333333334}, + {0.101666666666667,0.653333333333334,0.0961106666666656,0.651111333333333}, + {0.0961106666666656,0.651111333333333,0.0916666666666662,0.647778}, + {0.0916666666666662,0.647778,0.0883333333333335,0.643333333333333}, + {0.0883333333333335,0.643333333333333,0.0861106666666676,0.637778}, + {0.0861106666666676,0.637778,0.0850000000000009,0.630555333333334}, + {0.0850000000000009,0.630555333333334,0.0838886666666667,0.621666666666667}, + {0.0838886666666667,0.621666666666667,0.0833333333333333,0.612778}, + {0.0833333333333333,0.612778,0.0833333333333333,0.602778}, + {0.0833333333333333,0.602778,0.0833333333333333,0.592778}, + {0.0833333333333333,0.592778,0.0838886666666667,0.583888666666667}, + {0.0838886666666667,0.583888666666667,0.0850000000000009,0.575}, + {0.0850000000000009,0.575,0.0861106666666676,0.567778}, + {0.0861106666666676,0.567778,0.0883333333333335,0.562222}, + {0.0883333333333335,0.562222,0.0916666666666662,0.557778}, + {0.0916666666666662,0.557778,0.0961106666666656,0.554444666666667}, + {0.0961106666666656,0.554444666666667,0.101666666666667,0.552222}, + {0.101666666666667,0.552222,0.108888666666668,0.551111333333333}, + {0.108888666666668,0.551111333333333,0.117777333333334,0.55}, + {0.117777333333334,0.55,0.126666666666668,0.549444666666667}, + {0.146666666666666,0.549444666666667,0.155555333333332,0.55}, + {0.155555333333332,0.55,0.164444000000001,0.551111333333333}, + {0.164444000000001,0.551111333333333,0.171666666666667,0.552222}, + {0.171666666666667,0.552222,0.177222,0.554444666666667}, + {0.177222,0.554444666666667,0.181666666666667,0.557778}, + {0.181666666666667,0.378333333333333,0.185,0.382778}, + {0.185,0.382778,0.187222000000001,0.388333333333333}, + {0.187222000000001,0.388333333333333,0.188333333333333,0.395555333333334}, + {0.188333333333333,0.395555333333334,0.189443999999999,0.404444666666667}, + {0.189443999999999,0.404444666666667,0.19,0.413333333333333}, + {0.19,0.413333333333333,0.19,0.423333333333333}, + {0.19,0.423333333333333,0.19,0.433333333333334}, + {0.19,0.433333333333334,0.189443999999999,0.442222}, + {0.189443999999999,0.442222,0.188333333333333,0.451111333333333}, + {0.188333333333333,0.451111333333333,0.187222000000001,0.458333333333333}, + {0.187222000000001,0.458333333333333,0.185,0.463888666666667}, + {0.185,0.463888666666667,0.181666666666667,0.468333333333333}, + {0.181666666666667,0.468333333333333,0.177222,0.471666666666666}, + {0.177222,0.471666666666666,0.171666666666667,0.473888666666667}, + {0.171666666666667,0.473888666666667,0.164444000000001,0.475}, + {0.164444000000001,0.475,0.155555333333332,0.476111333333333}, + {0.155555333333332,0.476111333333333,0.146666666666666,0.476666666666667}, + {0.126666666666668,0.476666666666667,0.117777333333334,0.476111333333333}, + {0.117777333333334,0.476111333333333,0.108888666666668,0.475}, + {0.108888666666668,0.475,0.101666666666667,0.473888666666667}, + {0.101666666666667,0.473888666666667,0.0961106666666656,0.471666666666666}, + {0.0961106666666656,0.471666666666666,0.0916666666666662,0.468333333333333}, + {0.0916666666666662,0.468333333333333,0.0883333333333335,0.463888666666667}, + {0.0883333333333335,0.463888666666667,0.0861106666666676,0.458333333333333}, + {0.0861106666666676,0.458333333333333,0.0850000000000009,0.451111333333333}, + {0.0850000000000009,0.451111333333333,0.0838886666666667,0.442222}, + {0.0838886666666667,0.442222,0.0833333333333333,0.433333333333334}, + {0.0833333333333333,0.433333333333334,0.0833333333333333,0.423333333333333}, + {0.0833333333333333,0.423333333333333,0.0833333333333333,0.413333333333333}, + {0.0833333333333333,0.413333333333333,0.0838886666666667,0.404444666666667}, + {0.0838886666666667,0.404444666666667,0.0850000000000009,0.395555333333334}, + {0.0850000000000009,0.395555333333334,0.0861106666666676,0.388333333333333}, + {0.0861106666666676,0.388333333333333,0.0883333333333335,0.382778}, + {0.0883333333333335,0.382778,0.0916666666666662,0.378333333333333}, + {0.0916666666666662,0.378333333333333,0.0961106666666656,0.375}, + {0.0961106666666656,0.375,0.101666666666667,0.372778}, + {0.101666666666667,0.372778,0.108888666666668,0.371666666666667}, + {0.108888666666668,0.371666666666667,0.117777333333334,0.370555333333333}, + {0.117777333333334,0.370555333333333,0.126666666666668,0.37}, + {0.146666666666666,0.37,0.155555333333332,0.370555333333333}, + {0.155555333333332,0.370555333333333,0.164444000000001,0.371666666666667}, + {0.164444000000001,0.371666666666667,0.171666666666667,0.372778}, + {0.171666666666667,0.372778,0.177222,0.375}, + {0.177222,0.375,0.181666666666667,0.378333333333333}, + {0,0,0,0} +}; + +double Icon21[][4] = { + {0.0277780000000002,0.283888666666667,0.0216666666666659,0.288888666666667}, + {0.034999999999999,0.279444666666667,0.0277780000000002,0.283888666666667}, + {0.0427779999999984,0.275555333333333,0.034999999999999,0.279444666666667}, + {0.0522226666666654,0.272222,0.0427779999999984,0.275555333333333}, + {0.0627779999999992,0.269444666666667,0.0522226666666654,0.272222}, + {0.0738893333333337,0.266666666666667,0.0627779999999992,0.269444666666667}, + {0.0861113333333326,0.263888666666666,0.0738893333333337,0.266666666666667}, + {0.0988893333333323,0.262222,0.0861113333333326,0.263888666666666}, + {0.112777999999999,0.26,0.0988893333333323,0.262222}, + {0.126666666666665,0.258333333333334,0.112777999999999,0.26}, + {0.141666666666666,0.256666666666667,0.126666666666665,0.258333333333334}, + {0.156111333333333,0.255,0.141666666666666,0.256666666666667}, + {0.170556,0.254444666666667,0.156111333333333,0.255}, + {0.185556000000001,0.253888666666667,0.170556,0.254444666666667}, + {0.199444666666667,0.253333333333333,0.185556000000001,0.253888666666667}, + {0.213333333333334,0.253888666666667,0.199444666666667,0.253333333333333}, + {0.226111333333333,0.255,0.213333333333334,0.253888666666667}, + {0.238333333333332,0.256666666666667,0.226111333333333,0.255}, + {0.249444666666667,0.258888666666667,0.238333333333332,0.256666666666667}, + {0.26,0.262778,0.249444666666667,0.258888666666667}, + {0.269444666666667,0.267222,0.26,0.262778}, + {0.277222666666667,0.273333333333333,0.269444666666667,0.267222}, + {0.284444666666666,0.280555333333333,0.277222666666667,0.273333333333333}, + {0.290556,0.288888666666667,0.284444666666666,0.280555333333333}, + {0.294999999999999,0.297222,0.290556,0.288888666666667}, + {0.298889333333333,0.307222,0.294999999999999,0.297222}, + {0.302222666666665,0.318333333333333,0.298889333333333,0.307222}, + {0.304444666666666,0.331111333333334,0.302222666666665,0.318333333333333}, + {0.306666666666667,0.344444666666667,0.304444666666666,0.331111333333334}, + {0.308333333333332,0.36,0.306666666666667,0.344444666666667}, + {0.309444666666666,0.376111333333334,0.308333333333332,0.36}, + {0.31,0.393333333333333,0.309444666666666,0.376111333333334}, + {0.31,0.411666666666667,0.31,0.393333333333333}, + {0.31,0.431111333333333,0.31,0.411666666666667}, + {0.309444666666666,0.450555333333333,0.31,0.431111333333333}, + {0.308889333333333,0.471111333333334,0.309444666666666,0.450555333333333}, + {0.308333333333332,0.492222,0.308889333333333,0.471111333333334}, + {0.307222666666666,0.513333333333333,0.308333333333332,0.492222}, + {0.306111333333334,0.533888666666667,0.307222666666666,0.513333333333333}, + {0.305,0.555,0.306111333333334,0.533888666666667}, + {0.303889333333333,0.575555333333333,0.305,0.555}, + {0.302777999999999,0.595,0.303889333333333,0.575555333333333}, + {0.301666666666667,0.614444666666667,0.302777999999999,0.595}, + {0.300556,0.632778,0.301666666666667,0.614444666666667}, + {0.299444666666666,0.65,0.300556,0.632778}, + {0.298333333333332,0.666111333333333,0.299444666666666,0.65}, + {0.296666666666667,0.681666666666667,0.298333333333332,0.666111333333333}, + {0.295556,0.695,0.296666666666667,0.681666666666667}, + {0.294444666666666,0.707778,0.295556,0.695}, + {0.293333333333332,0.718888666666667,0.294444666666666,0.707778}, + {0.292222666666667,0.728888666666667,0.293333333333332,0.718888666666667}, + {0.290556,0.737222,0.292222666666667,0.728888666666667}, + {0.288333333333334,0.745555333333333,0.290556,0.737222}, + {0.286111333333333,0.752778,0.288333333333334,0.745555333333333}, + {0.283333333333334,0.758888666666667,0.286111333333333,0.752778}, + {0.280555999999999,0.763333333333333,0.283333333333334,0.758888666666667}, + {0.276666666666666,0.766111333333334,0.280555999999999,0.763333333333333}, + {0.273333333333333,0.768888666666667,0.276666666666666,0.766111333333334}, + {0.268889333333334,0.77,0.273333333333333,0.768888666666667}, + {0.265000000000001,0.770555333333334,0.268889333333334,0.77}, + {0.26,0.77,0.265000000000001,0.770555333333334}, + {0.255555999999999,0.769444666666667,0.26,0.77}, + {0.250556000000001,0.768333333333333,0.255555999999999,0.769444666666667}, + {0.245556000000001,0.766666666666667,0.250556000000001,0.768333333333333}, + {0.241111333333334,0.765,0.245556000000001,0.766666666666667}, + {0.236111333333334,0.762778,0.241111333333334,0.765}, + {0.231666666666667,0.760555333333333,0.236111333333334,0.762778}, + {0.226666666666667,0.758333333333334,0.231666666666667,0.760555333333333}, + {0.222778000000001,0.756111333333333,0.226666666666667,0.758333333333334}, + {0.218333333333334,0.753888666666667,0.222778000000001,0.756111333333333}, + {0.214999999999999,0.751111333333334,0.218333333333334,0.753888666666667}, + {0.211111333333333,0.748888666666667,0.214999999999999,0.751111333333334}, + {0.208333333333333,0.746666666666667,0.211111333333333,0.748888666666667}, + {0.205555999999999,0.743888666666667,0.208333333333333,0.746666666666667}, + {0.203333333333333,0.740555333333334,0.205555999999999,0.743888666666667}, + {0.201111333333332,0.737222,0.203333333333333,0.740555333333334}, + {0.198889333333334,0.731111333333333,0.201111333333332,0.737222}, + {0.197222666666666,0.722778,0.198889333333334,0.731111333333333}, + {0.196666666666665,0.713333333333334,0.197222666666666,0.722778}, + {0.197222666666666,0.702222,0.196666666666665,0.713333333333334}, + {0.198333333333333,0.69,0.197222666666666,0.702222}, + {0.200555999999999,0.676666666666667,0.198333333333333,0.69}, + {0.202778,0.662222,0.200555999999999,0.676666666666667}, + {0.205555999999999,0.647778,0.202778,0.662222}, + {0.207778,0.632778,0.205555999999999,0.647778}, + {0.209999999999998,0.618333333333334,0.207778,0.632778}, + {0.211666666666666,0.605,0.209999999999998,0.618333333333334}, + {0.212222666666667,0.592778,0.211666666666666,0.605}, + {0.211666666666666,0.581666666666666,0.212222666666667,0.592778}, + {0.209444666666665,0.572222,0.211666666666666,0.581666666666666}, + {0.206111333333332,0.563888666666667,0.209444666666665,0.572222}, + {0.201111333333332,0.557778,0.206111333333332,0.563888666666667}, + {0.195,0.552778,0.201111333333332,0.557778}, + {0.186666666666665,0.55,0.195,0.552778}, + {0.177222666666665,0.548333333333333,0.186666666666665,0.55}, + {0.166111333333333,0.548888666666667,0.177222666666665,0.548333333333333}, + {0.153889333333332,0.550555333333334,0.166111333333333,0.548888666666667}, + {0.140555999999999,0.553888666666667,0.153889333333332,0.550555333333334}, + {0.126111333333332,0.557778,0.140555999999999,0.553888666666667}, + {0.111666666666667,0.562222,0.126111333333332,0.557778}, + {0.0966666666666664,0.566111333333333,0.111666666666667,0.562222}, + {0.0822226666666666,0.57,0.0966666666666664,0.566111333333333}, + {0.0688893333333335,0.572778,0.0822226666666666,0.57}, + {0.0566666666666672,0.573888666666667,0.0688893333333335,0.572778}, + {0.0455560000000001,0.572778,0.0566666666666672,0.573888666666667}, + {0.0361113333333331,0.57,0.0455560000000001,0.572778}, + {0.0277780000000002,0.565,0.0361113333333331,0.57}, + {0.0216666666666659,0.557778,0.0277780000000002,0.565}, + {0.0177779999999998,0.551111333333333,0.0216666666666659,0.557778}, + {0.0150000000000006,0.543333333333334,0.0177779999999998,0.551111333333333}, + {0.0122226666666663,0.533888666666667,0.0150000000000006,0.543333333333334}, + {0.0100000000000004,0.523333333333333,0.0122226666666663,0.533888666666667}, + {0.00777799999999947,0.511666666666667,0.0100000000000004,0.523333333333333}, + {0.00611133333333195,0.498888666666667,0.00777799999999947,0.511666666666667}, + {0.00500000000000019,0.485,0.00611133333333195,0.498888666666667}, + {0.00333333333333267,0.470555333333333,0.00500000000000019,0.485}, + {0.00222266666666589,0.455,0.00333333333333267,0.470555333333333}, + {0.00166666666666515,0.439444666666667,0.00222266666666589,0.455}, + {0.000556000000000741,0.423333333333333,0.00166666666666515,0.439444666666667}, + {0,0.407222,0.000556000000000741,0.423333333333333}, + {0,0.391666666666667,0,0.407222}, + {0,0.376111333333334,0,0.391666666666667}, + {0.000556000000000741,0.361666666666667,0,0.376111333333334}, + {0.00166666666666515,0.347778,0.000556000000000741,0.361666666666667}, + {0.00277799999999928,0.335,0.00166666666666515,0.347778}, + {0.00500000000000019,0.323333333333334,0.00277799999999928,0.335}, + {0.00777799999999947,0.312778,0.00500000000000019,0.323333333333334}, + {0.0116666666666655,0.303333333333333,0.00777799999999947,0.312778}, + {0.0161113333333323,0.295555333333333,0.0116666666666655,0.303333333333333}, + {0.0216666666666659,0.288888666666667,0.0161113333333323,0.295555333333333}, + {0.201111333333332,0.378333333333333,0.204444666666667,0.382778}, + {0.204444666666667,0.382778,0.206666666666666,0.388333333333333}, + {0.206666666666666,0.388333333333333,0.207778,0.395555333333334}, + {0.207778,0.395555333333334,0.208889333333334,0.404444666666667}, + {0.208889333333334,0.404444666666667,0.209444666666665,0.413333333333333}, + {0.209444666666665,0.413333333333333,0.209444666666665,0.423333333333333}, + {0.209444666666665,0.423333333333333,0.209444666666665,0.433333333333334}, + {0.209444666666665,0.433333333333334,0.208889333333334,0.442222}, + {0.208889333333334,0.442222,0.207778,0.451111333333333}, + {0.207778,0.451111333333333,0.206666666666666,0.458333333333333}, + {0.206666666666666,0.458333333333333,0.204444666666667,0.463888666666667}, + {0.204444666666667,0.463888666666667,0.201111333333332,0.468333333333333}, + {0.201111333333332,0.468333333333333,0.196666666666665,0.471666666666666}, + {0.196666666666665,0.471666666666666,0.191111333333332,0.473888666666667}, + {0.191111333333332,0.473888666666667,0.183889333333333,0.475}, + {0.183889333333333,0.475,0.175,0.476111333333333}, + {0.175,0.476111333333333,0.166111333333333,0.476666666666667}, + {0.146111333333333,0.476666666666667,0.137222666666666,0.476111333333333}, + {0.137222666666666,0.476111333333333,0.128333333333333,0.475}, + {0.128333333333333,0.475,0.121111333333334,0.473888666666667}, + {0.121111333333334,0.473888666666667,0.115556,0.471666666666666}, + {0.115556,0.471666666666666,0.111111333333334,0.468333333333333}, + {0.111111333333334,0.468333333333333,0.107777999999999,0.463888666666667}, + {0.107777999999999,0.463888666666667,0.105556,0.458333333333333}, + {0.105556,0.458333333333333,0.104444666666666,0.451111333333333}, + {0.104444666666666,0.451111333333333,0.103333333333332,0.442222}, + {0.103333333333332,0.442222,0.102778000000001,0.433333333333334}, + {0.102778000000001,0.433333333333334,0.102778000000001,0.423333333333333}, + {0.102778000000001,0.423333333333333,0.102778000000001,0.413333333333333}, + {0.102778000000001,0.413333333333333,0.103333333333332,0.404444666666667}, + {0.103333333333332,0.404444666666667,0.104444666666666,0.395555333333334}, + {0.104444666666666,0.395555333333334,0.105556,0.388333333333333}, + {0.105556,0.388333333333333,0.107777999999999,0.382778}, + {0.107777999999999,0.382778,0.111111333333334,0.378333333333333}, + {0.111111333333334,0.378333333333333,0.115556,0.375}, + {0.115556,0.375,0.121111333333334,0.372778}, + {0.121111333333334,0.372778,0.128333333333333,0.371666666666667}, + {0.128333333333333,0.371666666666667,0.137222666666666,0.370555333333333}, + {0.137222666666666,0.370555333333333,0.146111333333333,0.37}, + {0.166111333333333,0.37,0.175,0.370555333333333}, + {0.175,0.370555333333333,0.183889333333333,0.371666666666667}, + {0.183889333333333,0.371666666666667,0.191111333333332,0.372778}, + {0.191111333333332,0.372778,0.196666666666665,0.375}, + {0.196666666666665,0.375,0.201111333333332,0.378333333333333}, + {0,0,0,0} +}; + +double Icon22[][4] = { + {0.0416666666666667,0.208333333333333,0,0.25}, + {0.166666666666667,0.25,0.125,0.208333333333333}, + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0.125,0.791666666666667,0.166666666666667,0.75}, + {0,0.75,0.0416666666666667,0.791666666666667}, + {0,0.25,0,0.75}, + {0.125,0.375,0.125,0.416666666666667}, + {0.0416666666666667,0.416666666666667,0.0416666666666667,0.375}, + {0.125,0.458333333333333,0.125,0.541666666666667}, + {0.0416666666666667,0.541666666666667,0.0416666666666667,0.458333333333333}, + {0.125,0.583333333333333,0.125,0.625}, + {0.0416666666666667,0.625,0.0416666666666667,0.583333333333333}, + {0,0,0,0} +}; + +double Icon23[][4] = { + {0.0416666666666667,0.208333333333333,0,0.25}, + {0.166666666666667,0.25,0.125,0.208333333333333}, + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0.125,0.791666666666667,0.166666666666667,0.75}, + {0,0.75,0.0416666666666667,0.791666666666667}, + {0,0.25,0,0.75}, + {0.0416666666666667,0.291666666666667,0.0833333333333333,0.25}, + {0.0833333333333333,0.25,0.125,0.291666666666667}, + {0.125,0.291666666666667,0.125,0.708333333333333}, + {0.125,0.708333333333333,0.0833333333333333,0.75}, + {0.0833333333333333,0.75,0.0416666666666667,0.708333333333333}, + {0.0416666666666667,0.708333333333333,0.0416666666666667,0.291666666666667}, + {0,0,0,0} +}; + +double Icon24[][4] = { + {0.0377780000000006,0.191666666666666,0.0377780000000006,0.341666666666667}, + {0.0377780000000006,0.153888666666666,0.0750000000000005,0.191666666666666}, + {0.112778000000001,0.0416666666666667,0.0377780000000006,0.153888666666666}, + {0.187777999999999,0.153888666666666,0.112778000000001,0.0416666666666667}, + {0.150000000000001,0.191666666666666,0.187777999999999,0.153888666666666}, + {0.187777999999999,0.341666666666667,0.187777999999999,0.191666666666666}, + {0.224999999999999,0.678888666666667,0.224999999999999,0.341666666666667}, + {0,0.341666666666667,0,0.678888666666667}, + {0.0750000000000005,0.678888666666667,0.112778000000001,0.941666666666666}, + {0.112778000000001,0.941666666666666,0.150000000000001,0.978888666666667}, + {0.375,0.978888666666667,0.375,0.866666666666667}, + {0.224999999999999,0.866666666666667,0.187777999999999,0.828888666666667}, + {0.187777999999999,0.828888666666667,0.150000000000001,0.678888666666667}, + {0,0,0,0} +}; + +double Icon25[][4] = { + {0.166666666666667,0.583333333333333,0.333333333333333,0.416666666666667}, + {0,0.416666666666667,0.166666666666667,0.583333333333333}, + {0,0,0,0} +}; + +double Icon26[][4] = { + {0.148888666666664,0.0399999999999998,0.136666666666666,0.0416666666666667}, + {0.161666666666666,0.0383333333333334,0.148888666666664,0.0399999999999998}, + {0.176111333333331,0.0372219999999999,0.161666666666666,0.0383333333333334}, + {0.191111333333332,0.0361113333333332,0.176111333333331,0.0372219999999999}, + {0.207778,0.0350000000000001,0.191111333333332,0.0361113333333332}, + {0.224999999999999,0.0338886666666667,0.207778,0.0350000000000001}, + {0.243888666666666,0.0333333333333332,0.224999999999999,0.0338886666666667}, + {0.263333333333333,0.0322220000000003,0.243888666666666,0.0333333333333332}, + {0.283333333333331,0.031666666666667,0.263333333333333,0.0322220000000003}, + {0.305,0.0311113333333335,0.283333333333331,0.031666666666667}, + {0.349444666666666,0.0305553333333334,0.326666666666666,0.0311113333333335}, + {0.396666666666666,0.03,0.372777999999999,0.0305553333333334}, + {0.567221999999999,0.0305553333333334,0.543333333333332,0.03}, + {0.613333333333332,0.0311113333333335,0.590555333333332,0.0305553333333334}, + {0.656666666666666,0.031666666666667,0.634999999999998,0.0311113333333335}, + {0.676666666666665,0.0322220000000003,0.656666666666666,0.031666666666667}, + {0.696111333333332,0.0333333333333332,0.676666666666665,0.0322220000000003}, + {0.714999999999999,0.0338886666666667,0.696111333333332,0.0333333333333332}, + {0.732221999999998,0.0350000000000001,0.714999999999999,0.0338886666666667}, + {0.748888666666666,0.0361113333333332,0.732221999999998,0.0350000000000001}, + {0.763888666666666,0.0372219999999999,0.748888666666666,0.0361113333333332}, + {0.778333333333331,0.0383333333333334,0.763888666666666,0.0372219999999999}, + {0.791111333333333,0.0399999999999998,0.778333333333331,0.0383333333333334}, + {0.803333333333332,0.0416666666666667,0.791111333333333,0.0399999999999998}, + {0.818888666666666,0.0444446666666666,0.803333333333332,0.0416666666666667}, + {0.832778,0.0472220000000003,0.818888666666666,0.0444446666666666}, + {0.844444666666665,0.0505553333333335,0.832778,0.0472220000000003}, + {0.854999999999999,0.0533333333333335,0.844444666666665,0.0505553333333335}, + {0.863888666666665,0.0566666666666666,0.854999999999999,0.0533333333333335}, + {0.871666666666665,0.058888666666667,0.863888666666665,0.0566666666666666}, + {0.877777999999999,0.0616666666666669,0.871666666666665,0.058888666666667}, + {0.883333333333333,0.0638886666666666,0.877777999999999,0.0616666666666669}, + {0.887778,0.0661113333333331,0.883333333333333,0.0638886666666666}, + {0.891111333333332,0.0683333333333334,0.887778,0.0661113333333331}, + {0.894444666666665,0.0705553333333331,0.891111333333332,0.0683333333333334}, + {0.897221999999999,0.0727780000000002,0.894444666666665,0.0705553333333331}, + {0.899444666666665,0.0755553333333333,0.897221999999999,0.0727780000000002}, + {0.901666666666666,0.0788886666666666,0.899444666666665,0.0755553333333333}, + {0.903888666666665,0.0822219999999998,0.901666666666666,0.0788886666666666}, + {0.906111333333333,0.0866666666666667,0.903888666666665,0.0822219999999998}, + {0.908333333333331,0.0922220000000002,0.906111333333333,0.0866666666666667}, + {0.911111333333333,0.0983333333333334,0.908333333333331,0.0922220000000002}, + {0.913333333333332,0.106111333333333,0.911111333333333,0.0983333333333334}, + {0.916666666666667,0.115,0.913333333333332,0.106111333333333}, + {0.919444666666666,0.125555333333333,0.916666666666667,0.115}, + {0.922777999999999,0.137222,0.919444666666666,0.125555333333333}, + {0.925555333333333,0.151111333333333,0.922777999999999,0.137222}, + {0.928333333333332,0.166666666666667,0.925555333333333,0.151111333333333}, + {0.93,0.178888666666667,0.928333333333332,0.166666666666667}, + {0.931666666666665,0.191666666666666,0.93,0.178888666666667}, + {0.932777999999999,0.206111333333334,0.931666666666665,0.191666666666666}, + {0.933888666666666,0.221111333333334,0.932777999999999,0.206111333333334}, + {0.935,0.237778,0.933888666666666,0.221111333333334}, + {0.936111333333332,0.255,0.935,0.237778}, + {0.936666666666665,0.273888666666667,0.936111333333332,0.255}, + {0.937777999999999,0.293333333333334,0.936666666666665,0.273888666666667}, + {0.938333333333333,0.313333333333333,0.937777999999999,0.293333333333334}, + {0.938888666666666,0.335,0.938333333333333,0.313333333333333}, + {0.938888666666666,0.356666666666667,0.938888666666666,0.335}, + {0.939444666666667,0.379444666666667,0.938888666666666,0.356666666666667}, + {0.939444666666667,0.402778,0.939444666666667,0.379444666666667}, + {0.939999999999998,0.426666666666667,0.939444666666667,0.402778}, + {0.939999999999998,0.451111333333333,0.939999999999998,0.426666666666667}, + {0.939999999999998,0.475555333333334,0.939999999999998,0.451111333333333}, + {0.939999999999998,0.5,0.939999999999998,0.475555333333334}, + {0.939999999999998,0.524444666666666,0.939999999999998,0.5}, + {0.939999999999998,0.548888666666667,0.939999999999998,0.524444666666666}, + {0.939999999999998,0.573333333333334,0.939999999999998,0.548888666666667}, + {0.939444666666667,0.597222,0.939999999999998,0.573333333333334}, + {0.939444666666667,0.620555333333333,0.939444666666667,0.597222}, + {0.938888666666666,0.643333333333333,0.939444666666667,0.620555333333333}, + {0.938888666666666,0.665,0.938888666666666,0.643333333333333}, + {0.938333333333333,0.686666666666667,0.938888666666666,0.665}, + {0.937777999999999,0.706666666666666,0.938333333333333,0.686666666666667}, + {0.936666666666665,0.726111333333333,0.937777999999999,0.706666666666666}, + {0.936111333333332,0.745,0.936666666666665,0.726111333333333}, + {0.935,0.762222,0.936111333333332,0.745}, + {0.933888666666666,0.778888666666666,0.935,0.762222}, + {0.932777999999999,0.793888666666666,0.933888666666666,0.778888666666666}, + {0.931666666666665,0.808333333333334,0.932777999999999,0.793888666666666}, + {0.93,0.821111333333333,0.931666666666665,0.808333333333334}, + {0.928333333333332,0.833333333333333,0.93,0.821111333333333}, + {0.925555333333333,0.848888666666667,0.928333333333332,0.833333333333333}, + {0.922777999999999,0.862778,0.925555333333333,0.848888666666667}, + {0.919444666666666,0.874444666666667,0.922777999999999,0.862778}, + {0.916666666666667,0.885,0.919444666666666,0.874444666666667}, + {0.913333333333332,0.893888666666667,0.916666666666667,0.885}, + {0.911111333333333,0.901666666666667,0.913333333333332,0.893888666666667}, + {0.908333333333331,0.907778,0.911111333333333,0.901666666666667}, + {0.906111333333333,0.913333333333333,0.908333333333331,0.907778}, + {0.903888666666665,0.917778,0.906111333333333,0.913333333333333}, + {0.901666666666666,0.921111333333334,0.903888666666665,0.917778}, + {0.899444666666665,0.924444666666667,0.901666666666666,0.921111333333334}, + {0.897221999999999,0.927222,0.899444666666665,0.924444666666667}, + {0.894444666666665,0.929444666666667,0.897221999999999,0.927222}, + {0.891111333333332,0.931666666666667,0.894444666666665,0.929444666666667}, + {0.887778,0.933888666666667,0.891111333333332,0.931666666666667}, + {0.883333333333333,0.936111333333333,0.887778,0.933888666666667}, + {0.877777999999999,0.938333333333333,0.883333333333333,0.936111333333333}, + {0.871666666666665,0.941111333333333,0.877777999999999,0.938333333333333}, + {0.863888666666665,0.943333333333333,0.871666666666665,0.941111333333333}, + {0.854999999999999,0.946666666666667,0.863888666666665,0.943333333333333}, + {0.844444666666665,0.949444666666666,0.854999999999999,0.946666666666667}, + {0.832778,0.952778,0.844444666666665,0.949444666666666}, + {0.818888666666666,0.955555333333333,0.832778,0.952778}, + {0.803333333333332,0.958333333333333,0.818888666666666,0.955555333333333}, + {0.791111333333333,0.96,0.803333333333332,0.958333333333333}, + {0.778333333333331,0.961666666666667,0.791111333333333,0.96}, + {0.763888666666666,0.962778,0.778333333333331,0.961666666666667}, + {0.748888666666666,0.963888666666667,0.763888666666666,0.962778}, + {0.732221999999998,0.965,0.748888666666666,0.963888666666667}, + {0.714999999999999,0.966111333333333,0.732221999999998,0.965}, + {0.696111333333332,0.966666666666667,0.714999999999999,0.966111333333333}, + {0.676666666666665,0.967778,0.696111333333332,0.966666666666667}, + {0.656666666666666,0.968333333333333,0.676666666666665,0.967778}, + {0.634999999999998,0.968888666666667,0.656666666666666,0.968333333333333}, + {0.590555333333332,0.969444666666667,0.613333333333332,0.968888666666667}, + {0.543333333333332,0.97,0.567221999999999,0.969444666666667}, + {0.372777999999999,0.969444666666667,0.396666666666666,0.97}, + {0.326666666666666,0.968888666666667,0.349444666666666,0.969444666666667}, + {0.283333333333331,0.968333333333333,0.305,0.968888666666667}, + {0.263333333333333,0.967778,0.283333333333331,0.968333333333333}, + {0.243888666666666,0.966666666666667,0.263333333333333,0.967778}, + {0.224999999999999,0.966111333333333,0.243888666666666,0.966666666666667}, + {0.207778,0.965,0.224999999999999,0.966111333333333}, + {0.191111333333332,0.963888666666667,0.207778,0.965}, + {0.176111333333331,0.962778,0.191111333333332,0.963888666666667}, + {0.161666666666666,0.961666666666667,0.176111333333331,0.962778}, + {0.148888666666664,0.96,0.161666666666666,0.961666666666667}, + {0.136666666666666,0.958333333333333,0.148888666666664,0.96}, + {0.121111333333332,0.955555333333333,0.136666666666666,0.958333333333333}, + {0.107221999999998,0.952778,0.121111333333332,0.955555333333333}, + {0.0955553333333322,0.949444666666666,0.107221999999998,0.952778}, + {0.0849999999999985,0.946666666666667,0.0955553333333322,0.949444666666666}, + {0.0761113333333322,0.943333333333333,0.0849999999999985,0.946666666666667}, + {0.0683333333333328,0.941111333333333,0.0761113333333322,0.943333333333333}, + {0.0622219999999984,0.938333333333333,0.0683333333333328,0.941111333333333}, + {0.0566666666666649,0.936111333333333,0.0622219999999984,0.938333333333333}, + {0.0522219999999981,0.933888666666667,0.0566666666666649,0.936111333333333}, + {0.0488886666666654,0.931666666666667,0.0522219999999981,0.933888666666667}, + {0.0455553333333327,0.929444666666667,0.0488886666666654,0.931666666666667}, + {0.0427779999999984,0.927222,0.0455553333333327,0.929444666666667}, + {0.0405553333333325,0.924444666666667,0.0427779999999984,0.927222}, + {0.0383333333333316,0.921111333333334,0.0405553333333325,0.924444666666667}, + {0.0361113333333331,0.917778,0.0383333333333316,0.921111333333334}, + {0.0338886666666648,0.913333333333333,0.0361113333333331,0.917778}, + {0.0316666666666663,0.907778,0.0338886666666648,0.913333333333333}, + {0.0288886666666646,0.901666666666667,0.0316666666666663,0.907778}, + {0.0266666666666661,0.893888666666667,0.0288886666666646,0.901666666666667}, + {0.0233333333333311,0.885,0.0266666666666661,0.893888666666667}, + {0.0205553333333318,0.874444666666667,0.0233333333333311,0.885}, + {0.0172219999999991,0.862778,0.0205553333333318,0.874444666666667}, + {0.0144446666666648,0.848888666666667,0.0172219999999991,0.862778}, + {0.0116666666666655,0.833333333333333,0.0144446666666648,0.848888666666667}, + {0.00999999999999801,0.821111333333333,0.0116666666666655,0.833333333333333}, + {0.00833333333333286,0.808333333333334,0.00999999999999801,0.821111333333333}, + {0.00722199999999873,0.793888666666666,0.00833333333333286,0.808333333333334}, + {0.00611133333333195,0.778888666666666,0.00722199999999873,0.793888666666666}, + {0.00499999999999782,0.762222,0.00611133333333195,0.778888666666666}, + {0.00388866666666606,0.745,0.00499999999999782,0.762222}, + {0.00333333333333267,0.726111333333333,0.00388866666666606,0.745}, + {0.00222199999999854,0.706666666666666,0.00333333333333267,0.726111333333333}, + {0.00166666666666515,0.686666666666667,0.00222199999999854,0.706666666666666}, + {0.00111133333333176,0.665,0.00166666666666515,0.686666666666667}, + {0.00111133333333176,0.643333333333333,0.00111133333333176,0.665}, + {0.000555333333331021,0.620555333333333,0.00111133333333176,0.643333333333333}, + {0.000555333333331021,0.597222,0.000555333333331021,0.620555333333333}, + {0,0.573333333333334,0.000555333333331021,0.597222}, + {0,0.548888666666667,0,0.573333333333334}, + {0,0.524444666666666,0,0.548888666666667}, + {0,0.5,0,0.524444666666666}, + {0,0.475555333333334,0,0.5}, + {0,0.451111333333333,0,0.475555333333334}, + {0,0.426666666666667,0,0.451111333333333}, + {0.000555333333331021,0.402778,0,0.426666666666667}, + {0.000555333333331021,0.379444666666667,0.000555333333331021,0.402778}, + {0.00111133333333176,0.356666666666667,0.000555333333331021,0.379444666666667}, + {0.00111133333333176,0.335,0.00111133333333176,0.356666666666667}, + {0.00166666666666515,0.313333333333333,0.00111133333333176,0.335}, + {0.00222199999999854,0.293333333333334,0.00166666666666515,0.313333333333333}, + {0.00333333333333267,0.273888666666667,0.00222199999999854,0.293333333333334}, + {0.00388866666666606,0.255,0.00333333333333267,0.273888666666667}, + {0.00499999999999782,0.237778,0.00388866666666606,0.255}, + {0.00611133333333195,0.221111333333334,0.00499999999999782,0.237778}, + {0.00722199999999873,0.206111333333334,0.00611133333333195,0.221111333333334}, + {0.00833333333333286,0.191666666666666,0.00722199999999873,0.206111333333334}, + {0.00999999999999801,0.178888666666667,0.00833333333333286,0.191666666666666}, + {0.0116666666666655,0.166666666666667,0.00999999999999801,0.178888666666667}, + {0.0144446666666648,0.151111333333333,0.0116666666666655,0.166666666666667}, + {0.0172219999999991,0.137222,0.0144446666666648,0.151111333333333}, + {0.0205553333333318,0.125555333333333,0.0172219999999991,0.137222}, + {0.0233333333333311,0.115,0.0205553333333318,0.125555333333333}, + {0.0266666666666661,0.106111333333333,0.0233333333333311,0.115}, + {0.0288886666666646,0.0983333333333334,0.0266666666666661,0.106111333333333}, + {0.0316666666666663,0.0922220000000002,0.0288886666666646,0.0983333333333334}, + {0.0338886666666648,0.0866666666666667,0.0316666666666663,0.0922220000000002}, + {0.0361113333333331,0.0822219999999998,0.0338886666666648,0.0866666666666667}, + {0.0383333333333316,0.0788886666666666,0.0361113333333331,0.0822219999999998}, + {0.0405553333333325,0.0755553333333333,0.0383333333333316,0.0788886666666666}, + {0.0427779999999984,0.0727780000000002,0.0405553333333325,0.0755553333333333}, + {0.0455553333333327,0.0705553333333331,0.0427779999999984,0.0727780000000002}, + {0.0488886666666654,0.0683333333333334,0.0455553333333327,0.0705553333333331}, + {0.0522219999999981,0.0661113333333331,0.0488886666666654,0.0683333333333334}, + {0.0566666666666649,0.0638886666666666,0.0522219999999981,0.0661113333333331}, + {0.0622219999999984,0.0616666666666669,0.0566666666666649,0.0638886666666666}, + {0.0683333333333328,0.058888666666667,0.0622219999999984,0.0616666666666669}, + {0.0761113333333322,0.0566666666666666,0.0683333333333328,0.058888666666667}, + {0.0849999999999985,0.0533333333333335,0.0761113333333322,0.0566666666666666}, + {0.0955553333333322,0.0505553333333335,0.0849999999999985,0.0533333333333335}, + {0.107221999999998,0.0472220000000003,0.0955553333333322,0.0505553333333335}, + {0.121111333333332,0.0444446666666666,0.107221999999998,0.0472220000000003}, + {0.136666666666666,0.0416666666666667,0.121111333333332,0.0444446666666666}, + {0,0,0,0} +}; + +double Icon27[][4] = { + {0,0.458333333333333,0,0.541666666666667}, + {1,0.541666666666667,1,0.458333333333333}, + {0,0,0,0} +}; + +double Icon28[][4] = { + {0.0838893333333317,0.25,0.0822226666666666,0.251111333333334}, + {0.0822226666666666,0.251111333333334,0.0794446666666649,0.253333333333333}, + {0.0794446666666649,0.253333333333333,0.0738893333333337,0.256666666666667}, + {0.0738893333333337,0.256666666666667,0.0661113333333319,0.262222}, + {0.0661113333333319,0.262222,0.0572226666666656,0.268888666666667}, + {0.0572226666666656,0.268888666666667,0.0472226666666652,0.276666666666667}, + {0.0472226666666652,0.276666666666667,0.0366666666666665,0.284444666666667}, + {0.0366666666666665,0.284444666666667,0.0272226666666668,0.292778}, + {0.0272226666666668,0.292778,0.0188893333333316,0.300555333333334}, + {0.0188893333333316,0.300555333333334,0.0116666666666655,0.308888666666667}, + {0.0116666666666655,0.308888666666667,0.00666666666666534,0.316666666666666}, + {0.00666666666666534,0.316666666666666,0.00277799999999928,0.325}, + {0.00277799999999928,0.325,0.000555999999998373,0.333333333333333}, + {0.000555999999998373,0.333333333333333,0,0.341666666666667}, + {0,0.341666666666667,0,0.350555333333334}, + {0,0.350555333333334,0.00111133333333176,0.360555333333333}, + {0.00111133333333176,0.360555333333333,0.00277799999999928,0.371111333333333}, + {0.00277799999999928,0.371111333333333,0.00500000000000019,0.382778}, + {0.00500000000000019,0.382778,0.00833333333333286,0.395}, + {0.00833333333333286,0.395,0.0116666666666655,0.407778}, + {0.0116666666666655,0.407778,0.0155559999999989,0.420555333333333}, + {0.0155559999999989,0.420555333333333,0.019444666666665,0.433333333333334}, + {0.019444666666665,0.433333333333334,0.0233333333333334,0.445555333333333}, + {0.0233333333333334,0.445555333333333,0.0272226666666668,0.457778}, + {0.0272226666666668,0.457778,0.0305559999999995,0.468333333333333}, + {0.0305559999999995,0.468333333333333,0.0338893333333322,0.478333333333333}, + {0.0338893333333322,0.478333333333333,0.0366666666666665,0.486666666666667}, + {0.0366666666666665,0.486666666666667,0.0394446666666658,0.493888666666667}, + {0.0394446666666658,0.493888666666667,0.042222666666665,0.5}, + {0.042222666666665,0.5,0.0449999999999993,0.505}, + {0.0449999999999993,0.505,0.048333333333332,0.508333333333334}, + {0.048333333333332,0.508333333333334,0.0516666666666647,0.510555333333333}, + {0.0516666666666647,0.510555333333333,0.0555559999999981,0.511666666666667}, + {0.0555559999999981,0.511666666666667,0.0599999999999999,0.511111333333333}, + {0.0599999999999999,0.511111333333333,0.0638893333333333,0.51}, + {0.0638893333333333,0.51,0.0688893333333335,0.508333333333334}, + {0.0688893333333335,0.508333333333334,0.0727779999999996,0.506111333333333}, + {0.0727779999999996,0.506111333333333,0.0766666666666656,0.504444666666667}, + {0.0766666666666656,0.504444666666667,0.0799999999999983,0.502778}, + {0.0799999999999983,0.502778,0.0822226666666666,0.501111333333334}, + {0.0822226666666666,0.501111333333334,0.0833333333333333,0.500555333333333}, + {0.0833333333333333,0.500555333333333,0.0838893333333317,0.5}, + {0.187777999999999,0.333333333333333,0.187777999999999,0.335}, + {0.187777999999999,0.335,0.188889333333333,0.338333333333334}, + {0.188889333333333,0.338333333333334,0.189444666666667,0.345}, + {0.189444666666667,0.345,0.191111333333332,0.353888666666667}, + {0.191111333333332,0.353888666666667,0.192777999999999,0.365555333333334}, + {0.192777999999999,0.365555333333334,0.194444666666667,0.379444666666667}, + {0.194444666666667,0.379444666666667,0.196111333333332,0.394444666666667}, + {0.196111333333332,0.394444666666667,0.197778,0.41}, + {0.197778,0.41,0.198889333333334,0.425555333333334}, + {0.198889333333334,0.425555333333334,0.199444666666665,0.440555333333334}, + {0.199444666666665,0.440555333333334,0.198889333333334,0.453888666666667}, + {0.198889333333334,0.453888666666667,0.197778,0.466666666666667}, + {0.197778,0.466666666666667,0.195555999999999,0.478333333333333}, + {0.195555999999999,0.478333333333333,0.192222666666666,0.489444666666667}, + {0.192222666666666,0.489444666666667,0.187777999999999,0.5}, + {0.187777999999999,0.5,0.183333333333332,0.508333333333334}, + {0.183333333333332,0.508333333333334,0.177777999999999,0.516666666666667}, + {0.177777999999999,0.516666666666667,0.170556,0.525}, + {0.170556,0.525,0.162777999999998,0.533333333333333}, + {0.162777999999998,0.533333333333333,0.153889333333332,0.541666666666667}, + {0.153889333333332,0.541666666666667,0.144444666666665,0.55}, + {0.144444666666665,0.55,0.133333333333333,0.558333333333334}, + {0.133333333333333,0.558333333333334,0.122222666666666,0.566666666666666}, + {0.122222666666666,0.566666666666666,0.110556,0.575}, + {0.110556,0.575,0.0983333333333315,0.583333333333333}, + {0.0983333333333315,0.583333333333333,0.086666666666666,0.591666666666667}, + {0.086666666666666,0.591666666666667,0.0749999999999981,0.6}, + {0.0749999999999981,0.6,0.0644446666666667,0.608333333333333}, + {0.0644446666666667,0.608333333333333,0.0544446666666663,0.616666666666667}, + {0.0544446666666663,0.616666666666667,0.0449999999999993,0.625}, + {0.0449999999999993,0.625,0.0372226666666648,0.633333333333334}, + {0.0372226666666648,0.633333333333334,0.0311113333333329,0.641666666666667}, + {0.0311113333333329,0.641666666666667,0.0261113333333327,0.65}, + {0.0261113333333327,0.65,0.022778,0.658333333333333}, + {0.022778,0.658333333333333,0.0211113333333325,0.666666666666667}, + {0.0211113333333325,0.666666666666667,0.0211113333333325,0.676111333333333}, + {0.0211113333333325,0.676111333333333,0.0222226666666666,0.685555333333333}, + {0.0222226666666666,0.685555333333333,0.0255559999999993,0.695}, + {0.0255559999999993,0.695,0.0311113333333329,0.705}, + {0.0311113333333329,0.705,0.0372226666666648,0.715}, + {0.0372226666666648,0.715,0.0455560000000001,0.725555333333334}, + {0.0455560000000001,0.725555333333334,0.0538893333333329,0.736111333333334}, + {0.0538893333333329,0.736111333333334,0.0638893333333333,0.747222}, + {0.0638893333333333,0.747222,0.0738893333333337,0.757778}, + {0.0738893333333337,0.757778,0.0838893333333317,0.768333333333333}, + {0.0838893333333317,0.768333333333333,0.0944446666666655,0.778888666666666}, + {0.0944446666666655,0.778888666666666,0.103889333333332,0.788888666666667}, + {0.103889333333332,0.788888666666667,0.113333333333332,0.798333333333333}, + {0.113333333333332,0.798333333333333,0.121666666666665,0.807222}, + {0.121666666666665,0.807222,0.128889333333333,0.815}, + {0.128889333333333,0.815,0.135555999999999,0.822222}, + {0.135555999999999,0.822222,0.141111333333332,0.828333333333333}, + {0.141111333333332,0.828333333333333,0.146111333333333,0.833333333333333}, + {0.146111333333333,0.833333333333333,0.151666666666666,0.838333333333334}, + {0.151666666666666,0.838333333333334,0.156666666666666,0.841666666666667}, + {0.156666666666666,0.841666666666667,0.161111333333333,0.843888666666667}, + {0.161111333333333,0.843888666666667,0.164999999999999,0.845}, + {0.164999999999999,0.845,0.169444666666666,0.844444666666667}, + {0.169444666666666,0.844444666666667,0.173333333333332,0.843333333333333}, + {0.173333333333332,0.843333333333333,0.176666666666665,0.841666666666667}, + {0.176666666666665,0.841666666666667,0.18,0.839444666666667}, + {0.18,0.839444666666667,0.182777999999999,0.837778}, + {0.182777999999999,0.837778,0.185,0.836111333333333}, + {0.185,0.836111333333333,0.186666666666665,0.834444666666667}, + {0.186666666666665,0.834444666666667,0.187222666666666,0.833888666666667}, + {0.187222666666666,0.833888666666667,0.187777999999999,0.833333333333333}, + {0.354444666666666,1,0.354444666666666,0.916666666666667}, + {0.0211113333333325,0.916666666666667,0.0211113333333325,1}, + {0.0833333333333333,0.251666666666667,0.0838893333333317,0.25}, + {0.0827779999999999,0.255555333333334,0.0833333333333333,0.251666666666667}, + {0.0822226666666666,0.262222,0.0827779999999999,0.255555333333334}, + {0.0811113333333324,0.270555333333334,0.0822226666666666,0.262222}, + {0.0794446666666649,0.280555333333333,0.0811113333333324,0.270555333333334}, + {0.0788893333333315,0.291111333333333,0.0794446666666649,0.280555333333333}, + {0.0783333333333331,0.301111333333333,0.0788893333333315,0.291111333333333}, + {0.0783333333333331,0.310555333333333,0.0783333333333331,0.301111333333333}, + {0.0794446666666649,0.318888666666667,0.0783333333333331,0.310555333333333}, + {0.0811113333333324,0.326111333333333,0.0794446666666649,0.318888666666667}, + {0.0838893333333317,0.333333333333333,0.0811113333333324,0.326111333333333}, + {0.0872226666666667,0.339444666666667,0.0838893333333317,0.333333333333333}, + {0.0916666666666662,0.345,0.0872226666666667,0.339444666666667}, + {0.0972226666666648,0.351111333333333,0.0916666666666662,0.345}, + {0.104444666666666,0.357222,0.0972226666666648,0.351111333333333}, + {0.111666666666667,0.363333333333333,0.104444666666666,0.357222}, + {0.12,0.368888666666667,0.111666666666667,0.363333333333333}, + {0.128333333333333,0.375,0.12,0.368888666666667}, + {0.136666666666666,0.381111333333333,0.128333333333333,0.375}, + {0.144999999999998,0.386666666666667,0.136666666666666,0.381111333333333}, + {0.152222666666667,0.392778,0.144999999999998,0.386666666666667}, + {0.157777999999998,0.398888666666667,0.152222666666667,0.392778}, + {0.162777999999998,0.405,0.157777999999998,0.398888666666667}, + {0.165556,0.410555333333334,0.162777999999998,0.405}, + {0.167222666666665,0.416666666666667,0.165556,0.410555333333334}, + {0.167222666666665,0.423888666666667,0.167222666666665,0.416666666666667}, + {0.164999999999999,0.431111333333333,0.167222666666665,0.423888666666667}, + {0.160556,0.438333333333333,0.164999999999999,0.431111333333333}, + {0.154999999999999,0.446111333333333,0.160556,0.438333333333333}, + {0.148333333333333,0.454444666666667,0.154999999999999,0.446111333333333}, + {0.140555999999999,0.462222,0.148333333333333,0.454444666666667}, + {0.132777999999999,0.47,0.140555999999999,0.462222}, + {0.125555999999998,0.477778,0.132777999999999,0.47}, + {0.118889333333333,0.484444666666667,0.125555999999998,0.477778}, + {0.112777999999999,0.490555333333334,0.118889333333333,0.484444666666667}, + {0.108333333333332,0.496111333333333,0.112777999999999,0.490555333333334}, + {0.104444666666666,0.5,0.108333333333332,0.496111333333333}, + {0.101666666666667,0.502778,0.104444666666666,0.5}, + {0.0994446666666657,0.504444666666667,0.101666666666667,0.502778}, + {0.0972226666666648,0.505555333333334,0.0994446666666657,0.504444666666667}, + {0.0911113333333328,0.505,0.0927780000000003,0.505555333333334}, + {0.0894446666666653,0.503888666666667,0.0911113333333328,0.505}, + {0.0877780000000001,0.503333333333333,0.0894446666666653,0.503888666666667}, + {0.0861113333333326,0.502222,0.0877780000000001,0.503333333333333}, + {0.0849999999999985,0.501111333333334,0.0861113333333326,0.502222}, + {0.0844446666666651,0.500555333333333,0.0849999999999985,0.501111333333334}, + {0.0838893333333317,0.5,0.0844446666666651,0.500555333333333}, + {0.208333333333333,0.0416666666666667,0.208889333333332,0.0433333333333337}, + {0.208889333333332,0.0433333333333337,0.209444666666665,0.0472220000000003}, + {0.209444666666665,0.0472220000000003,0.209999999999998,0.0538886666666668}, + {0.209999999999998,0.0538886666666668,0.211111333333333,0.0622220000000002}, + {0.211111333333333,0.0622220000000002,0.212778,0.072222}, + {0.212778,0.072222,0.213333333333334,0.082778}, + {0.213333333333334,0.082778,0.213889333333332,0.0927779999999998}, + {0.213889333333332,0.0927779999999998,0.213889333333332,0.102222}, + {0.213889333333332,0.102222,0.212778,0.110555333333333}, + {0.212778,0.110555333333333,0.211111333333333,0.117778}, + {0.211111333333333,0.117778,0.208333333333333,0.125}, + {0.208333333333333,0.125,0.204999999999998,0.131111333333333}, + {0.204999999999998,0.131111333333333,0.200555999999999,0.136666666666667}, + {0.200555999999999,0.136666666666667,0.195,0.142778}, + {0.195,0.142778,0.187777999999999,0.148888666666667}, + {0.187777999999999,0.148888666666667,0.180555999999998,0.155}, + {0.180555999999998,0.155,0.172222666666665,0.160555333333334}, + {0.172222666666665,0.160555333333334,0.163889333333332,0.166666666666667}, + {0.163889333333332,0.166666666666667,0.155556,0.172778}, + {0.155556,0.172778,0.147222666666667,0.178333333333333}, + {0.147222666666667,0.178333333333333,0.139999999999998,0.184444666666667}, + {0.139999999999998,0.184444666666667,0.134444666666667,0.190555333333334}, + {0.134444666666667,0.190555333333334,0.129444666666667,0.196666666666667}, + {0.129444666666667,0.196666666666667,0.126666666666665,0.202222}, + {0.126666666666665,0.202222,0.125,0.208333333333333}, + {0.125,0.208333333333333,0.125,0.215555333333333}, + {0.125,0.215555333333333,0.127222666666666,0.222778}, + {0.127222666666666,0.222778,0.131666666666665,0.23}, + {0.131666666666665,0.23,0.137222666666666,0.237778}, + {0.137222666666666,0.237778,0.143889333333332,0.246111333333333}, + {0.143889333333332,0.246111333333333,0.151666666666666,0.253888666666667}, + {0.151666666666666,0.253888666666667,0.159444666666666,0.261666666666667}, + {0.159444666666666,0.261666666666667,0.166666666666667,0.269444666666667}, + {0.166666666666667,0.269444666666667,0.173333333333332,0.276111333333333}, + {0.173333333333332,0.276111333333333,0.179444666666666,0.282222}, + {0.179444666666666,0.282222,0.183889333333333,0.287778}, + {0.183889333333333,0.287778,0.187777999999999,0.291666666666667}, + {0.187777999999999,0.291666666666667,0.190555999999998,0.294444666666667}, + {0.190555999999998,0.294444666666667,0.192777999999999,0.296111333333334}, + {0.192777999999999,0.296111333333334,0.195,0.297222}, + {0.199444666666665,0.297222,0.201111333333332,0.296666666666667}, + {0.201111333333332,0.296666666666667,0.202778,0.295555333333333}, + {0.202778,0.295555333333333,0.204444666666665,0.295}, + {0.204444666666665,0.295,0.206111333333332,0.293888666666666}, + {0.206111333333332,0.293888666666666,0.207222666666667,0.292778}, + {0.207222666666667,0.292778,0.207778,0.292222}, + {0.207778,0.292222,0.208333333333333,0.291666666666667}, + {0.188889333333333,0.333888666666667,0.187777999999999,0.333333333333333}, + {0.191111333333332,0.335555333333333,0.188889333333333,0.333888666666667}, + {0.195555999999999,0.338888666666667,0.191111333333332,0.335555333333333}, + {0.202222666666666,0.342778,0.195555999999999,0.338888666666667}, + {0.210555999999999,0.348888666666667,0.202222666666666,0.342778}, + {0.221111333333333,0.356666666666667,0.210555999999999,0.348888666666667}, + {0.233889333333333,0.365555333333334,0.221111333333333,0.356666666666667}, + {0.247222666666666,0.375555333333333,0.233889333333333,0.365555333333334}, + {0.261666666666665,0.386111333333333,0.247222666666666,0.375555333333333}, + {0.275555999999999,0.397222,0.261666666666665,0.386111333333333}, + {0.289444666666666,0.408888666666667,0.275555999999999,0.397222}, + {0.302777999999999,0.420555333333333,0.289444666666666,0.408888666666667}, + {0.315,0.431666666666667,0.302777999999999,0.420555333333333}, + {0.325555999999999,0.442778,0.315,0.431666666666667}, + {0.334444666666665,0.453888666666667,0.325555999999999,0.442778}, + {0.341666666666666,0.465,0.334444666666665,0.453888666666667}, + {0.347777999999998,0.476111333333333,0.341666666666666,0.465}, + {0.351666666666667,0.487778,0.347777999999998,0.476111333333333}, + {0.354444666666666,0.5,0.351666666666667,0.487778}, + {0.355556,0.510555333333333,0.354444666666666,0.5}, + {0.356111333333333,0.522222,0.355556,0.510555333333333}, + {0.355556,0.534444666666667,0.356111333333333,0.522222}, + {0.354444666666666,0.547222,0.355556,0.534444666666667}, + {0.352777999999998,0.561111333333334,0.354444666666666,0.547222}, + {0.349999999999999,0.575555333333333,0.352777999999998,0.561111333333334}, + {0.346666666666666,0.591111333333333,0.349999999999999,0.575555333333333}, + {0.343333333333331,0.607222,0.346666666666666,0.591111333333333}, + {0.338889333333332,0.623333333333333,0.343333333333331,0.607222}, + {0.334444666666665,0.64,0.338889333333332,0.623333333333333}, + {0.329444666666665,0.657222,0.334444666666665,0.64}, + {0.324444666666665,0.674444666666667,0.329444666666665,0.657222}, + {0.319444666666667,0.691666666666666,0.324444666666665,0.674444666666667}, + {0.314444666666667,0.708333333333333,0.319444666666667,0.691666666666666}, + {0.308889333333333,0.725,0.314444666666667,0.708333333333333}, + {0.303889333333333,0.740555333333334,0.308889333333333,0.725}, + {0.299444666666666,0.756111333333333,0.303889333333333,0.740555333333334}, + {0.294444666666666,0.77,0.299444666666666,0.756111333333333}, + {0.289999999999999,0.783888666666667,0.294444666666666,0.77}, + {0.286111333333333,0.796111333333334,0.289999999999999,0.783888666666667}, + {0.281666666666666,0.807222,0.286111333333333,0.796111333333334}, + {0.278333333333334,0.817222,0.281666666666666,0.807222}, + {0.274444666666665,0.825555333333333,0.278333333333334,0.817222}, + {0.271111333333332,0.833333333333333,0.274444666666665,0.825555333333333}, + {0.266666666666666,0.841666666666667,0.271111333333332,0.833333333333333}, + {0.261666666666665,0.847778,0.266666666666666,0.841666666666667}, + {0.256666666666665,0.852222,0.261666666666665,0.847778}, + {0.251111333333332,0.855,0.256666666666665,0.852222}, + {0.245,0.856111333333333,0.251111333333332,0.855}, + {0.232222666666665,0.855,0.238889333333333,0.856111333333333}, + {0.224999999999999,0.852778,0.232222666666665,0.855}, + {0.218333333333331,0.85,0.224999999999999,0.852778}, + {0.211666666666666,0.846666666666666,0.218333333333331,0.85}, + {0.205555999999999,0.843888666666667,0.211666666666666,0.846666666666666}, + {0.199999999999998,0.840555333333333,0.205555999999999,0.843888666666667}, + {0.195555999999999,0.837778,0.199999999999998,0.840555333333333}, + {0.192222666666666,0.836111333333333,0.195555999999999,0.837778}, + {0.189444666666667,0.834444666666667,0.192222666666666,0.836111333333333}, + {0.188333333333333,0.833888666666667,0.189444666666667,0.834444666666667}, + {0.187777999999999,0.833333333333333,0.188333333333333,0.833888666666667}, + {0.209999999999998,0.0427780000000002,0.208333333333333,0.0416666666666667}, + {0.212778,0.0449999999999999,0.209999999999998,0.0427780000000002}, + {0.218333333333331,0.0483333333333332,0.212778,0.0449999999999999}, + {0.226111333333333,0.0538886666666668,0.218333333333331,0.0483333333333332}, + {0.234999999999999,0.0605553333333333,0.226111333333333,0.0538886666666668}, + {0.245,0.0683333333333334,0.234999999999999,0.0605553333333333}, + {0.255555999999999,0.0761113333333334,0.245,0.0683333333333334}, + {0.264999999999998,0.0844446666666669,0.255555999999999,0.0761113333333334}, + {0.273333333333333,0.0922220000000002,0.264999999999998,0.0844446666666669}, + {0.280555999999999,0.100555333333334,0.273333333333333,0.0922220000000002}, + {0.285556,0.108333333333333,0.280555999999999,0.100555333333334}, + {0.289444666666666,0.116666666666667,0.285556,0.108333333333333}, + {0.291666666666667,0.125,0.289444666666666,0.116666666666667}, + {0.292222666666665,0.133333333333334,0.291666666666667,0.125}, + {0.292222666666665,0.142222,0.292222666666665,0.133333333333334}, + {0.291111333333333,0.152222,0.292222666666665,0.142222}, + {0.289444666666666,0.162778,0.291111333333333,0.152222}, + {0.287222666666665,0.174444666666667,0.289444666666666,0.162778}, + {0.283889333333332,0.186666666666667,0.287222666666665,0.174444666666667}, + {0.280555999999999,0.199444666666666,0.283889333333332,0.186666666666667}, + {0.276666666666666,0.212222,0.280555999999999,0.199444666666666}, + {0.272778,0.225,0.276666666666666,0.212222}, + {0.268889333333332,0.237222,0.272778,0.225}, + {0.264999999999998,0.249444666666667,0.268889333333332,0.237222}, + {0.261666666666665,0.26,0.264999999999998,0.249444666666667}, + {0.258333333333333,0.27,0.261666666666665,0.26}, + {0.255555999999999,0.278333333333334,0.258333333333333,0.27}, + {0.252777999999999,0.285555333333334,0.255555999999999,0.278333333333334}, + {0.25,0.291666666666667,0.252777999999999,0.285555333333334}, + {0.247222666666666,0.296666666666667,0.25,0.291666666666667}, + {0.243889333333333,0.3,0.247222666666666,0.296666666666667}, + {0.240556,0.302222,0.243889333333333,0.3}, + {0.236666666666667,0.303333333333333,0.240556,0.302222}, + {0.232222666666665,0.302778,0.236666666666667,0.303333333333333}, + {0.228333333333332,0.301666666666667,0.232222666666665,0.302778}, + {0.223333333333332,0.3,0.228333333333332,0.301666666666667}, + {0.219444666666665,0.297778,0.223333333333332,0.3}, + {0.215555999999999,0.296111333333334,0.219444666666665,0.297778}, + {0.212222666666667,0.294444666666667,0.215555999999999,0.296111333333334}, + {0.209999999999998,0.292778,0.212222666666667,0.294444666666667}, + {0.208889333333332,0.292222,0.209999999999998,0.292778}, + {0.208333333333333,0.291666666666667,0.208889333333332,0.292222}, + {0,0,0,0} +}; + +double Icon29[][4] = { + {0,0.75,0,1}, + {1,1,1,0.75}, + {0.00333333333333267,0.750555333333333,0.00111133333333413,0.75}, + {0.0072220000000011,0.751111333333334,0.00333333333333267,0.750555333333333}, + {0.0127779999999997,0.751666666666667,0.0072220000000011,0.751111333333334}, + {0.0194446666666674,0.752778,0.0127779999999997,0.751666666666667}, + {0.0438886666666676,0.752222,0.0355553333333323,0.752778}, + {0.0522220000000004,0.750555333333333,0.0438886666666676,0.752222}, + {0.0599999999999999,0.747778,0.0522220000000004,0.750555333333333}, + {0.0677779999999994,0.743333333333334,0.0599999999999999,0.747778}, + {0.0755553333333339,0.737222,0.0677779999999994,0.743333333333334}, + {0.0833333333333333,0.729444666666667,0.0755553333333339,0.737222}, + {0.0888886666666669,0.723333333333333,0.0833333333333333,0.729444666666667}, + {0.0944446666666678,0.716111333333333,0.0888886666666669,0.723333333333333}, + {0.099999999999999,0.708333333333333,0.0944446666666678,0.716111333333333}, + {0.106666666666667,0.698888666666667,0.099999999999999,0.708333333333333}, + {0.112778000000001,0.688888666666667,0.106666666666667,0.698888666666667}, + {0.119444666666666,0.678333333333333,0.112778000000001,0.688888666666667}, + {0.126666666666668,0.666666666666667,0.119444666666666,0.678333333333333}, + {0.133333333333333,0.653888666666666,0.126666666666668,0.666666666666667}, + {0.140555333333334,0.641111333333334,0.133333333333333,0.653888666666666}, + {0.147778,0.628333333333333,0.140555333333334,0.641111333333334}, + {0.155555333333332,0.614444666666667,0.147778,0.628333333333333}, + {0.162778000000001,0.601111333333333,0.155555333333332,0.614444666666667}, + {0.169999999999999,0.588333333333334,0.162778000000001,0.601111333333333}, + {0.177222,0.575555333333333,0.169999999999999,0.588333333333334}, + {0.184444666666667,0.562778,0.177222,0.575555333333333}, + {0.191666666666668,0.551111333333333,0.184444666666667,0.562778}, + {0.198333333333333,0.540555333333333,0.191666666666668,0.551111333333333}, + {0.205000000000001,0.530555333333333,0.198333333333333,0.540555333333333}, + {0.211666666666666,0.521111333333333,0.205000000000001,0.530555333333333}, + {0.217778,0.513333333333333,0.211666666666666,0.521111333333333}, + {0.223888666666667,0.506111333333333,0.217778,0.513333333333333}, + {0.229444666666666,0.5,0.223888666666667,0.506111333333333}, + {0.239444666666666,0.491111333333333,0.229444666666666,0.5}, + {0.249444666666667,0.484444666666667,0.239444666666666,0.491111333333333}, + {0.258888666666666,0.480555333333333,0.249444666666667,0.484444666666667}, + {0.267778,0.478333333333333,0.258888666666666,0.480555333333333}, + {0.276666666666666,0.477222,0.267778,0.478333333333333}, + {0.302222,0.477778,0.293888666666668,0.477222}, + {0.310555333333333,0.478333333333333,0.302222,0.477778}, + {0.318333333333333,0.478888666666667,0.310555333333333,0.478333333333333}, + {0.333333333333333,0.479444666666667,0.326111333333332,0.478888666666667}, + {0.341111333333333,0.481111333333333,0.333333333333333,0.479444666666667}, + {0.349444666666666,0.484444666666667,0.341111333333333,0.481111333333333}, + {0.357778000000001,0.489444666666667,0.349444666666666,0.484444666666667}, + {0.366111333333334,0.495555333333333,0.357778000000001,0.489444666666667}, + {0.375,0.502778,0.366111333333334,0.495555333333333}, + {0.383333333333333,0.509444666666666,0.375,0.502778}, + {0.390000000000001,0.515555333333333,0.383333333333333,0.509444666666666}, + {0.393888666666667,0.518888666666667,0.390000000000001,0.515555333333333}, + {0.395555333333334,0.521111333333333,0.393888666666667,0.518888666666667}, + {0.393888666666667,0.520555333333334,0.395555333333334,0.521111333333333}, + {0.388888666666666,0.519444666666667,0.393888666666667,0.520555333333334}, + {0.381666666666668,0.518333333333333,0.388888666666666,0.519444666666667}, + {0.373333333333332,0.516666666666667,0.381666666666668,0.518333333333333}, + {0.363888666666665,0.515555333333333,0.373333333333332,0.516666666666667}, + {0.346666666666666,0.516111333333334,0.354444666666666,0.515555333333333}, + {0.339444666666668,0.517778,0.346666666666666,0.516111333333334}, + {0.333333333333333,0.521111333333333,0.339444666666668,0.517778}, + {0.328333333333333,0.525,0.333333333333333,0.521111333333333}, + {0.322221999999999,0.53,0.328333333333333,0.525}, + {0.316666666666668,0.536111333333333,0.322221999999999,0.53}, + {0.31,0.542778,0.316666666666668,0.536111333333333}, + {0.303333333333332,0.549444666666667,0.31,0.542778}, + {0.296111333333333,0.556666666666667,0.303333333333332,0.549444666666667}, + {0.289999999999999,0.564444666666667,0.296111333333333,0.556666666666667}, + {0.283888666666667,0.572222,0.289999999999999,0.564444666666667}, + {0.278333333333334,0.58,0.283888666666667,0.572222}, + {0.274444666666668,0.587778,0.278333333333334,0.58}, + {0.272221999999999,0.596111333333334,0.274444666666668,0.587778}, + {0.271111333333332,0.604444666666667,0.272221999999999,0.596111333333334}, + {0.271666666666666,0.612222,0.271111333333332,0.604444666666667}, + {0.273333333333333,0.620555333333333,0.271666666666666,0.612222}, + {0.276111333333333,0.629444666666667,0.273333333333333,0.620555333333333}, + {0.278888666666667,0.638888666666666,0.276111333333333,0.629444666666667}, + {0.282778,0.648888666666667,0.278888666666667,0.638888666666666}, + {0.287222,0.659444666666667,0.282778,0.648888666666667}, + {0.291666666666667,0.67,0.287222,0.659444666666667}, + {0.296111333333333,0.680555333333333,0.291666666666667,0.67}, + {0.301666666666667,0.690555333333334,0.296111333333333,0.680555333333333}, + {0.306666666666667,0.7,0.301666666666667,0.690555333333334}, + {0.312777999999999,0.708888666666667,0.306666666666667,0.7}, + {0.318888666666666,0.716666666666667,0.312777999999999,0.708888666666667}, + {0.325555333333334,0.723888666666667,0.318888666666666,0.716666666666667}, + {0.333333333333333,0.729444666666667,0.325555333333334,0.723888666666667}, + {0.341111333333333,0.733333333333333,0.333333333333333,0.729444666666667}, + {0.349999999999999,0.737222,0.341111333333333,0.733333333333333}, + {0.359999999999999,0.74,0.349999999999999,0.737222}, + {0.372222000000001,0.742222,0.359999999999999,0.74}, + {0.386111333333334,0.743888666666667,0.372222000000001,0.742222}, + {0.401111333333333,0.745555333333333,0.386111333333334,0.743888666666667}, + {0.417222,0.746666666666667,0.401111333333333,0.745555333333333}, + {0.433888666666666,0.747778,0.417222,0.746666666666667}, + {0.45,0.748333333333333,0.433888666666666,0.747778}, + {0.464444666666668,0.748888666666667,0.45,0.748333333333333}, + {0.477222,0.749444666666667,0.464444666666668,0.748888666666667}, + {0.494444666666666,0.75,0.487222,0.749444666666667}, + {0.503333333333333,0.750555333333333,0.501111333333334,0.75}, + {0.507222000000001,0.751111333333334,0.503333333333333,0.750555333333333}, + {0.512778,0.751666666666667,0.507222000000001,0.751111333333334}, + {0.519444666666667,0.752778,0.512778,0.751666666666667}, + {0.543888666666668,0.752222,0.535555333333332,0.752778}, + {0.552222,0.750555333333333,0.543888666666668,0.752222}, + {0.56,0.747778,0.552222,0.750555333333333}, + {0.567777999999999,0.743333333333334,0.56,0.747778}, + {0.575555333333334,0.737222,0.567777999999999,0.743333333333334}, + {0.583333333333333,0.729444666666667,0.575555333333334,0.737222}, + {0.588888666666667,0.723333333333333,0.583333333333333,0.729444666666667}, + {0.594444666666668,0.716111333333333,0.588888666666667,0.723333333333333}, + {0.599999999999999,0.708333333333333,0.594444666666668,0.716111333333333}, + {0.606666666666667,0.698888666666667,0.599999999999999,0.708333333333333}, + {0.612778000000001,0.688888666666667,0.606666666666667,0.698888666666667}, + {0.619444666666666,0.678333333333333,0.612778000000001,0.688888666666667}, + {0.626666666666667,0.666666666666667,0.619444666666666,0.678333333333333}, + {0.633333333333333,0.653888666666666,0.626666666666667,0.666666666666667}, + {0.640555333333334,0.641111333333334,0.633333333333333,0.653888666666666}, + {0.647778,0.628333333333333,0.640555333333334,0.641111333333334}, + {0.655555333333332,0.614444666666667,0.647778,0.628333333333333}, + {0.662778000000001,0.601111333333333,0.655555333333332,0.614444666666667}, + {0.669999999999999,0.588333333333334,0.662778000000001,0.601111333333333}, + {0.677222,0.575555333333333,0.669999999999999,0.588333333333334}, + {0.684444666666666,0.562778,0.677222,0.575555333333333}, + {0.691666666666668,0.551111333333333,0.684444666666666,0.562778}, + {0.698333333333333,0.540555333333333,0.691666666666668,0.551111333333333}, + {0.705000000000001,0.530555333333333,0.698333333333333,0.540555333333333}, + {0.711666666666666,0.521111333333333,0.705000000000001,0.530555333333333}, + {0.717778,0.513333333333333,0.711666666666666,0.521111333333333}, + {0.723888666666667,0.506111333333333,0.717778,0.513333333333333}, + {0.729444666666666,0.5,0.723888666666667,0.506111333333333}, + {0.739444666666666,0.491111333333333,0.729444666666666,0.5}, + {0.749444666666667,0.484444666666667,0.739444666666666,0.491111333333333}, + {0.758888666666666,0.480555333333333,0.749444666666667,0.484444666666667}, + {0.767778,0.478333333333333,0.758888666666666,0.480555333333333}, + {0.776666666666666,0.477222,0.767778,0.478333333333333}, + {0.802222,0.477778,0.793888666666668,0.477222}, + {0.810555333333333,0.478333333333333,0.802222,0.477778}, + {0.818333333333333,0.478888666666667,0.810555333333333,0.478333333333333}, + {0.833333333333333,0.479444666666667,0.826111333333332,0.478888666666667}, + {0.841111333333333,0.481111333333333,0.833333333333333,0.479444666666667}, + {0.849444666666666,0.484444666666667,0.841111333333333,0.481111333333333}, + {0.857778000000001,0.489444666666667,0.849444666666666,0.484444666666667}, + {0.866111333333334,0.495555333333333,0.857778000000001,0.489444666666667}, + {0.875,0.502778,0.866111333333334,0.495555333333333}, + {0.883333333333333,0.509444666666666,0.875,0.502778}, + {0.890000000000001,0.515555333333333,0.883333333333333,0.509444666666666}, + {0.893888666666667,0.518888666666667,0.890000000000001,0.515555333333333}, + {0.895555333333334,0.521111333333333,0.893888666666667,0.518888666666667}, + {0.893888666666667,0.520555333333334,0.895555333333334,0.521111333333333}, + {0.888888666666666,0.519444666666667,0.893888666666667,0.520555333333334}, + {0.881666666666668,0.518333333333333,0.888888666666666,0.519444666666667}, + {0.873333333333332,0.516666666666667,0.881666666666668,0.518333333333333}, + {0.863888666666665,0.515555333333333,0.873333333333332,0.516666666666667}, + {0.846666666666666,0.516111333333334,0.854444666666666,0.515555333333333}, + {0.839444666666668,0.517778,0.846666666666666,0.516111333333334}, + {0.833333333333333,0.521111333333333,0.839444666666668,0.517778}, + {0.828333333333333,0.525,0.833333333333333,0.521111333333333}, + {0.822221999999999,0.53,0.828333333333333,0.525}, + {0.816666666666668,0.536111333333333,0.822221999999999,0.53}, + {0.81,0.542778,0.816666666666668,0.536111333333333}, + {0.803333333333332,0.549444666666667,0.81,0.542778}, + {0.796111333333333,0.556666666666667,0.803333333333332,0.549444666666667}, + {0.789999999999999,0.564444666666667,0.796111333333333,0.556666666666667}, + {0.783888666666667,0.572222,0.789999999999999,0.564444666666667}, + {0.778333333333334,0.58,0.783888666666667,0.572222}, + {0.774444666666668,0.587778,0.778333333333334,0.58}, + {0.772221999999999,0.596111333333334,0.774444666666668,0.587778}, + {0.771111333333332,0.604444666666667,0.772221999999999,0.596111333333334}, + {0.771666666666666,0.612222,0.771111333333332,0.604444666666667}, + {0.773333333333333,0.620555333333333,0.771666666666666,0.612222}, + {0.776111333333333,0.629444666666667,0.773333333333333,0.620555333333333}, + {0.778888666666667,0.638888666666666,0.776111333333333,0.629444666666667}, + {0.782778,0.648888666666667,0.778888666666667,0.638888666666666}, + {0.787222,0.659444666666667,0.782778,0.648888666666667}, + {0.791666666666667,0.67,0.787222,0.659444666666667}, + {0.796111333333333,0.680555333333333,0.791666666666667,0.67}, + {0.801666666666667,0.690555333333334,0.796111333333333,0.680555333333333}, + {0.806666666666667,0.7,0.801666666666667,0.690555333333334}, + {0.812777999999999,0.708888666666667,0.806666666666667,0.7}, + {0.818888666666666,0.716666666666667,0.812777999999999,0.708888666666667}, + {0.825555333333334,0.723888666666667,0.818888666666666,0.716666666666667}, + {0.833333333333333,0.729444666666667,0.825555333333334,0.723888666666667}, + {0.841111333333333,0.733333333333333,0.833333333333333,0.729444666666667}, + {0.849999999999999,0.737222,0.841111333333333,0.733333333333333}, + {0.859999999999999,0.74,0.849999999999999,0.737222}, + {0.872222000000001,0.742222,0.859999999999999,0.74}, + {0.886111333333334,0.743888666666667,0.872222000000001,0.742222}, + {0.901111333333333,0.745555333333333,0.886111333333334,0.743888666666667}, + {0.917222,0.746666666666667,0.901111333333333,0.745555333333333}, + {0.933888666666666,0.747778,0.917222,0.746666666666667}, + {0.95,0.748333333333333,0.933888666666666,0.747778}, + {0.964444666666668,0.748888666666667,0.95,0.748333333333333}, + {0.977222,0.749444666666667,0.964444666666668,0.748888666666667}, + {0.994444666666666,0.75,0.987222,0.749444666666667}, + {0,0,0,0} +}; + +double Icon30[][4] = { + {0.103888666666667,0.687222,0,0.708333333333333}, + {0.125,0.583333333333333,0.103888666666667,0.687222}, + {0.145555333333334,0.687222,0.125,0.583333333333333}, + {0.25,0.708333333333333,0.145555333333334,0.687222}, + {0.145555333333334,0.728888666666667,0.25,0.708333333333333}, + {0.125,0.833333333333333,0.145555333333334,0.728888666666667}, + {0.103888666666667,0.728888666666667,0.125,0.833333333333333}, + {0,0.708333333333333,0.103888666666667,0.728888666666667}, + {0.291666666666667,0.458333333333333,0.0833333333333333,0.5}, + {0.333333333333333,0.25,0.291666666666667,0.458333333333333}, + {0.375,0.458333333333333,0.333333333333333,0.25}, + {0.583333333333333,0.5,0.375,0.458333333333333}, + {0.375,0.541666666666667,0.583333333333333,0.5}, + {0.333333333333333,0.75,0.375,0.541666666666667}, + {0.291666666666667,0.541666666666667,0.333333333333333,0.75}, + {0.0833333333333333,0.5,0.291666666666667,0.541666666666667}, + {0.520555333333334,0.270555333333334,0.416666666666667,0.291666666666667}, + {0.541666666666667,0.166666666666667,0.520555333333334,0.270555333333334}, + {0.562222000000001,0.270555333333334,0.541666666666667,0.166666666666667}, + {0.666666666666667,0.291666666666667,0.562222000000001,0.270555333333334}, + {0.562222000000001,0.312222,0.666666666666667,0.291666666666667}, + {0.541666666666667,0.416666666666667,0.562222000000001,0.312222}, + {0.520555333333334,0.312222,0.541666666666667,0.416666666666667}, + {0.416666666666667,0.291666666666667,0.520555333333334,0.312222}, + {0,0,0,0} +}; + +double Icon31[][4] = { + {0.208333333333333,0.458333333333333,0,0.5}, + {0.25,0.25,0.208333333333333,0.458333333333333}, + {0.291666666666667,0.458333333333333,0.25,0.25}, + {0.5,0.5,0.291666666666667,0.458333333333333}, + {0.291666666666667,0.541666666666667,0.5,0.5}, + {0.25,0.75,0.291666666666667,0.541666666666667}, + {0.208333333333333,0.541666666666667,0.25,0.75}, + {0,0.5,0.208333333333333,0.541666666666667}, + {0,0,0,0} +}; + +double Icon32[][4] = { + {0.25,0.25,0,0.5}, + {0.5,0.5,0.25,0.25}, + {0.25,0.75,0.5,0.5}, + {0,0.5,0.25,0.75}, + {0,0,0,0} +}; + +double Icon33[][4] = { + {0.166666666666667,0.25,0,0.333333333333333}, + {0.166666666666667,0.291666666666667,0.166666666666667,0.25}, + {0,0.333333333333333,0.166666666666667,0.416666666666667}, + {0.166666666666667,0.416666666666667,0.166666666666667,0.375}, + {0.208333333333333,0.458333333333333,0.291666666666667,0.625}, + {0.25,0.375,0.25,0.458333333333333}, + {0.291666666666667,0.0416666666666667,0.208333333333333,0.208333333333333}, + {0.25,0.208333333333333,0.25,0.291666666666667}, + {0.291666666666667,0.625,0.375,0.458333333333333}, + {0.333333333333333,0.458333333333333,0.333333333333333,0.375}, + {0.375,0.208333333333333,0.291666666666667,0.0416666666666667}, + {0.333333333333333,0.291666666666667,0.333333333333333,0.208333333333333}, + {0.416666666666667,0.416666666666667,0.583333333333333,0.333333333333333}, + {0.416666666666667,0.375,0.416666666666667,0.416666666666667}, + {0.583333333333333,0.333333333333333,0.416666666666667,0.25}, + {0.416666666666667,0.25,0.416666666666667,0.291666666666667}, + {0,0,0,0} +}; + +double Icon34[][4] = { + {0.125,0.497778,0.125,0.5}, + {0.124444666666667,0.493888666666667,0.125,0.497778}, + {0.123888666666668,0.486666666666667,0.124444666666667,0.493888666666667}, + {0.122778000000001,0.476111333333333,0.123888666666668,0.486666666666667}, + {0.121666666666665,0.462778,0.122778000000001,0.476111333333333}, + {0.12,0.447222,0.121666666666665,0.462778}, + {0.118888666666668,0.430555333333333,0.12,0.447222}, + {0.117778000000001,0.413333333333333,0.118888666666668,0.430555333333333}, + {0.116666666666665,0.396666666666667,0.117778000000001,0.413333333333333}, + {0.116666666666665,0.381666666666667,0.116666666666665,0.396666666666667}, + {0.116666666666665,0.367778,0.116666666666665,0.381666666666667}, + {0.117221999999998,0.356666666666667,0.116666666666665,0.367778}, + {0.118888666666668,0.346666666666666,0.117221999999998,0.356666666666667}, + {0.121666666666665,0.339444666666667,0.118888666666668,0.346666666666666}, + {0.125,0.333333333333333,0.121666666666665,0.339444666666667}, + {0.13,0.328333333333333,0.125,0.333333333333333}, + {0.136666666666666,0.325,0.13,0.328333333333333}, + {0.145000000000001,0.324444666666666,0.136666666666666,0.325}, + {0.153888666666665,0.325,0.145000000000001,0.324444666666666}, + {0.164444666666668,0.327778,0.153888666666665,0.325}, + {0.176111333333334,0.331111333333334,0.164444666666668,0.327778}, + {0.187777999999999,0.335555333333333,0.176111333333334,0.331111333333334}, + {0.198888666666666,0.339444666666667,0.187777999999999,0.335555333333333}, + {0.210555333333332,0.342778,0.198888666666666,0.339444666666667}, + {0.221111333333335,0.345,0.210555333333332,0.342778}, + {0.229999999999999,0.345555333333333,0.221111333333335,0.345}, + {0.238333333333334,0.343888666666667,0.229999999999999,0.345555333333333}, + {0.245,0.339444666666667,0.238333333333334,0.343888666666667}, + {0.25,0.333333333333333,0.245,0.339444666666667}, + {0.253333333333335,0.326666666666667,0.25,0.333333333333333}, + {0.255555333333334,0.318888666666667,0.253333333333335,0.326666666666667}, + {0.256666666666665,0.309444666666667,0.255555333333334,0.318888666666667}, + {0.257221999999999,0.298888666666667,0.256666666666665,0.309444666666667}, + {0.257221999999999,0.286666666666667,0.257221999999999,0.298888666666667}, + {0.256666666666665,0.273333333333333,0.257221999999999,0.286666666666667}, + {0.255555333333334,0.258888666666667,0.256666666666665,0.273333333333333}, + {0.253888666666668,0.244444666666666,0.255555333333334,0.258888666666667}, + {0.252221999999999,0.228888666666667,0.253888666666668,0.244444666666666}, + {0.25,0.213888666666667,0.252221999999999,0.228888666666667}, + {0.248333333333335,0.199444666666666,0.25,0.213888666666667}, + {0.247221999999998,0.185,0.248333333333335,0.199444666666666}, + {0.246111333333332,0.171666666666667,0.247221999999998,0.185}, + {0.245555333333333,0.159444666666667,0.246111333333332,0.171666666666667}, + {0.245555333333333,0.148888666666667,0.245555333333333,0.159444666666667}, + {0.246666666666665,0.139444666666667,0.245555333333333,0.148888666666667}, + {0.247778000000001,0.131666666666667,0.246666666666665,0.139444666666667}, + {0.25,0.125,0.247778000000001,0.131666666666667}, + {0.252778000000002,0.12,0.25,0.125}, + {0.255555333333334,0.115555333333334,0.252778000000002,0.12}, + {0.259444666666667,0.112778,0.255555333333334,0.115555333333334}, + {0.263888666666669,0.11,0.259444666666667,0.112778}, + {0.268888666666669,0.108333333333333,0.263888666666669,0.11}, + {0.273888666666664,0.107222,0.268888666666669,0.108333333333333}, + {0.279444666666668,0.106111333333333,0.273888666666664,0.107222}, + {0.285555333333335,0.105555333333333,0.279444666666668,0.106111333333333}, + {0.303888666666666,0.106111333333333,0.297777999999999,0.105555333333333}, + {0.309444666666669,0.107222,0.303888666666666,0.106111333333333}, + {0.314444666666664,0.108333333333333,0.309444666666669,0.107222}, + {0.319444666666664,0.11,0.314444666666664,0.108333333333333}, + {0.323888666666666,0.112778,0.319444666666664,0.11}, + {0.327778,0.115555333333334,0.323888666666666,0.112778}, + {0.330555333333332,0.12,0.327778,0.115555333333334}, + {0.333333333333333,0.125,0.330555333333332,0.12}, + {0.335555333333332,0.131666666666667,0.333333333333333,0.125}, + {0.336666666666668,0.139444666666667,0.335555333333332,0.131666666666667}, + {0.337778,0.148888666666667,0.336666666666668,0.139444666666667}, + {0.337778,0.159444666666667,0.337778,0.148888666666667}, + {0.337222000000002,0.171666666666667,0.337778,0.159444666666667}, + {0.336111333333335,0.185,0.337222000000002,0.171666666666667}, + {0.334999999999998,0.199444666666666,0.336111333333335,0.185}, + {0.333333333333333,0.213888666666667,0.334999999999998,0.199444666666666}, + {0.331111333333335,0.229444666666667,0.333333333333333,0.213888666666667}, + {0.329444666666665,0.244444666666666,0.331111333333335,0.229444666666667}, + {0.327778,0.258888666666667,0.329444666666665,0.244444666666666}, + {0.326666666666668,0.273333333333333,0.327778,0.258888666666667}, + {0.326111333333335,0.286666666666667,0.326666666666668,0.273333333333333}, + {0.326111333333335,0.298888666666667,0.326111333333335,0.286666666666667}, + {0.326666666666668,0.309444666666667,0.326111333333335,0.298888666666667}, + {0.327778,0.318888666666667,0.326666666666668,0.309444666666667}, + {0.329999999999998,0.326666666666667,0.327778,0.318888666666667}, + {0.333333333333333,0.333333333333333,0.329999999999998,0.326666666666667}, + {0.338333333333333,0.339444666666667,0.333333333333333,0.333333333333333}, + {0.344999999999999,0.343888666666667,0.338333333333333,0.339444666666667}, + {0.353333333333334,0.345555333333333,0.344999999999999,0.343888666666667}, + {0.362221999999998,0.345,0.353333333333334,0.345555333333333}, + {0.372778000000001,0.342778,0.362221999999998,0.345}, + {0.384444666666667,0.339444666666667,0.372778000000001,0.342778}, + {0.396111333333332,0.335555333333333,0.384444666666667,0.339444666666667}, + {0.407222,0.331111333333334,0.396111333333332,0.335555333333333}, + {0.418888666666665,0.327778,0.407222,0.331111333333334}, + {0.429444666666669,0.325,0.418888666666665,0.327778}, + {0.438333333333333,0.324444666666666,0.429444666666669,0.325}, + {0.446666666666668,0.325,0.438333333333333,0.324444666666666}, + {0.453333333333333,0.328333333333333,0.446666666666668,0.325}, + {0.458333333333333,0.333333333333333,0.453333333333333,0.328333333333333}, + {0.461666666666668,0.339444666666667,0.458333333333333,0.333333333333333}, + {0.464444666666665,0.346666666666666,0.461666666666668,0.339444666666667}, + {0.466111333333335,0.356666666666667,0.464444666666665,0.346666666666666}, + {0.466666666666669,0.367778,0.466111333333335,0.356666666666667}, + {0.466666666666669,0.381666666666667,0.466666666666669,0.367778}, + {0.466666666666669,0.396666666666667,0.466666666666669,0.381666666666667}, + {0.465555333333332,0.413333333333333,0.466666666666669,0.396666666666667}, + {0.464444666666665,0.430555333333333,0.465555333333332,0.413333333333333}, + {0.463333333333333,0.447222,0.464444666666665,0.430555333333333}, + {0.461666666666668,0.462778,0.463333333333333,0.447222}, + {0.460555333333332,0.476111333333333,0.461666666666668,0.462778}, + {0.459444666666665,0.486666666666667,0.460555333333332,0.476111333333333}, + {0.458888666666667,0.493888666666667,0.459444666666665,0.486666666666667}, + {0.458333333333333,0.497778,0.458888666666667,0.493888666666667}, + {0.458333333333333,0.5,0.458333333333333,0.497778}, + {0.125,0.541666666666667,0.125,0.542222}, + {0.125,0.542222,0.125,0.543888666666666}, + {0.125,0.543888666666666,0.124444666666667,0.547778}, + {0.124444666666667,0.547778,0.123888666666668,0.554444666666667}, + {0.123888666666668,0.554444666666667,0.123333333333335,0.563888666666667}, + {0.123333333333335,0.563888666666667,0.122778000000001,0.574444666666666}, + {0.122778000000001,0.574444666666666,0.122221999999998,0.585}, + {0.122221999999998,0.585,0.122221999999998,0.595555333333333}, + {0.122221999999998,0.595555333333333,0.122221999999998,0.605}, + {0.122221999999998,0.605,0.122778000000001,0.612778}, + {0.122778000000001,0.612778,0.123333333333335,0.619444666666666}, + {0.123333333333335,0.619444666666666,0.125,0.625}, + {0.125,0.625,0.127778000000002,0.631111333333333}, + {0.127778000000002,0.631111333333333,0.131111333333332,0.636666666666667}, + {0.131111333333332,0.636666666666667,0.136111333333332,0.642222}, + {0.136111333333332,0.642222,0.142778000000002,0.647778}, + {0.142778000000002,0.647778,0.149444666666668,0.653333333333334}, + {0.149444666666668,0.653333333333334,0.156111333333333,0.658888666666667}, + {0.156111333333333,0.658888666666667,0.161111333333333,0.662778}, + {0.161111333333333,0.662778,0.165000000000002,0.665555333333333}, + {0.165000000000002,0.665555333333333,0.166666666666667,0.666666666666667}, + {0.458333333333333,0.542222,0.458333333333333,0.541666666666667}, + {0.458333333333333,0.543888666666666,0.458333333333333,0.542222}, + {0.457778,0.547778,0.458333333333333,0.543888666666666}, + {0.457222000000002,0.554444666666667,0.457778,0.547778}, + {0.456666666666668,0.563888666666667,0.457222000000002,0.554444666666667}, + {0.456111333333335,0.574444666666666,0.456666666666668,0.563888666666667}, + {0.455555333333332,0.585,0.456111333333335,0.574444666666666}, + {0.455555333333332,0.595555333333333,0.455555333333332,0.585}, + {0.455555333333332,0.605,0.455555333333332,0.595555333333333}, + {0.456111333333335,0.612778,0.455555333333332,0.605}, + {0.456666666666668,0.619444666666666,0.456111333333335,0.612778}, + {0.458333333333333,0.625,0.456666666666668,0.619444666666666}, + {0.461111333333335,0.631111333333333,0.458333333333333,0.625}, + {0.464444666666665,0.636666666666667,0.461111333333335,0.631111333333333}, + {0.469444666666665,0.642222,0.464444666666665,0.636666666666667}, + {0.476111333333336,0.647778,0.469444666666665,0.642222}, + {0.482778000000001,0.653333333333334,0.476111333333336,0.647778}, + {0.489444666666666,0.658888666666667,0.482778000000001,0.653333333333334}, + {0.494444666666666,0.662778,0.489444666666666,0.658888666666667}, + {0.498333333333335,0.665555333333333,0.494444666666666,0.662778}, + {0.5,0.666666666666667,0.498333333333335,0.665555333333333}, + {0,0,0,0} +}; + +double Icon35[][4] = { + {0.583333333333333,0.75,0.583333333333333,0}, + {0,0,0,0.75}, + {0.125,0.5,0.125,0.497778}, + {0.125,0.497778,0.124444666666667,0.493888666666667}, + {0.124444666666667,0.493888666666667,0.123888666666668,0.486666666666667}, + {0.123888666666668,0.486666666666667,0.122778000000001,0.476111333333333}, + {0.122778000000001,0.476111333333333,0.121666666666665,0.462778}, + {0.121666666666665,0.462778,0.12,0.447222}, + {0.12,0.447222,0.118888666666668,0.430555333333333}, + {0.118888666666668,0.430555333333333,0.117778000000001,0.413333333333333}, + {0.117778000000001,0.413333333333333,0.116666666666665,0.396666666666667}, + {0.116666666666665,0.396666666666667,0.116666666666665,0.381666666666667}, + {0.116666666666665,0.381666666666667,0.116666666666665,0.367778}, + {0.116666666666665,0.367778,0.117221999999998,0.356666666666667}, + {0.117221999999998,0.356666666666667,0.118888666666668,0.346666666666666}, + {0.118888666666668,0.346666666666666,0.121666666666665,0.339444666666667}, + {0.121666666666665,0.339444666666667,0.125,0.333333333333333}, + {0.125,0.333333333333333,0.13,0.328333333333333}, + {0.13,0.328333333333333,0.136666666666666,0.325}, + {0.136666666666666,0.325,0.145000000000001,0.324444666666666}, + {0.145000000000001,0.324444666666666,0.153888666666665,0.325}, + {0.153888666666665,0.325,0.164444666666668,0.327778}, + {0.164444666666668,0.327778,0.176111333333334,0.331111333333334}, + {0.176111333333334,0.331111333333334,0.187777999999999,0.335555333333333}, + {0.187777999999999,0.335555333333333,0.198888666666666,0.339444666666667}, + {0.198888666666666,0.339444666666667,0.210555333333332,0.342778}, + {0.210555333333332,0.342778,0.221111333333335,0.345}, + {0.221111333333335,0.345,0.229999999999999,0.345555333333333}, + {0.229999999999999,0.345555333333333,0.238333333333334,0.343888666666667}, + {0.238333333333334,0.343888666666667,0.245,0.339444666666667}, + {0.245,0.339444666666667,0.25,0.333333333333333}, + {0.25,0.333333333333333,0.253333333333335,0.326666666666667}, + {0.253333333333335,0.326666666666667,0.255555333333334,0.318888666666667}, + {0.255555333333334,0.318888666666667,0.256666666666665,0.309444666666667}, + {0.256666666666665,0.309444666666667,0.257221999999999,0.298888666666667}, + {0.257221999999999,0.298888666666667,0.257221999999999,0.286666666666667}, + {0.257221999999999,0.286666666666667,0.256666666666665,0.273333333333333}, + {0.256666666666665,0.273333333333333,0.255555333333334,0.258888666666667}, + {0.255555333333334,0.258888666666667,0.253888666666668,0.244444666666666}, + {0.253888666666668,0.244444666666666,0.252221999999999,0.228888666666667}, + {0.252221999999999,0.228888666666667,0.25,0.213888666666667}, + {0.25,0.213888666666667,0.248333333333335,0.199444666666666}, + {0.248333333333335,0.199444666666666,0.247221999999998,0.185}, + {0.247221999999998,0.185,0.246111333333332,0.171666666666667}, + {0.246111333333332,0.171666666666667,0.245555333333333,0.159444666666667}, + {0.245555333333333,0.159444666666667,0.245555333333333,0.148888666666667}, + {0.245555333333333,0.148888666666667,0.246666666666665,0.139444666666667}, + {0.246666666666665,0.139444666666667,0.247778000000001,0.131666666666667}, + {0.247778000000001,0.131666666666667,0.25,0.125}, + {0.25,0.125,0.252778000000002,0.12}, + {0.252778000000002,0.12,0.255555333333334,0.115555333333334}, + {0.255555333333334,0.115555333333334,0.259444666666667,0.112778}, + {0.259444666666667,0.112778,0.263888666666669,0.11}, + {0.263888666666669,0.11,0.268888666666669,0.108333333333333}, + {0.268888666666669,0.108333333333333,0.273888666666664,0.107222}, + {0.273888666666664,0.107222,0.279444666666668,0.106111333333333}, + {0.279444666666668,0.106111333333333,0.285555333333335,0.105555333333333}, + {0.297777999999999,0.105555333333333,0.303888666666666,0.106111333333333}, + {0.303888666666666,0.106111333333333,0.309444666666669,0.107222}, + {0.309444666666669,0.107222,0.314444666666664,0.108333333333333}, + {0.314444666666664,0.108333333333333,0.319444666666664,0.11}, + {0.319444666666664,0.11,0.323888666666666,0.112778}, + {0.323888666666666,0.112778,0.327778,0.115555333333334}, + {0.327778,0.115555333333334,0.330555333333332,0.12}, + {0.330555333333332,0.12,0.333333333333333,0.125}, + {0.333333333333333,0.125,0.335555333333332,0.131666666666667}, + {0.335555333333332,0.131666666666667,0.336666666666668,0.139444666666667}, + {0.336666666666668,0.139444666666667,0.337778,0.148888666666667}, + {0.337778,0.148888666666667,0.337778,0.159444666666667}, + {0.337778,0.159444666666667,0.337222000000002,0.171666666666667}, + {0.337222000000002,0.171666666666667,0.336111333333335,0.185}, + {0.336111333333335,0.185,0.334999999999998,0.199444666666666}, + {0.334999999999998,0.199444666666666,0.333333333333333,0.213888666666667}, + {0.333333333333333,0.213888666666667,0.331111333333335,0.229444666666667}, + {0.331111333333335,0.229444666666667,0.329444666666665,0.244444666666666}, + {0.329444666666665,0.244444666666666,0.327778,0.258888666666667}, + {0.327778,0.258888666666667,0.326666666666668,0.273333333333333}, + {0.326666666666668,0.273333333333333,0.326111333333335,0.286666666666667}, + {0.326111333333335,0.286666666666667,0.326111333333335,0.298888666666667}, + {0.326111333333335,0.298888666666667,0.326666666666668,0.309444666666667}, + {0.326666666666668,0.309444666666667,0.327778,0.318888666666667}, + {0.327778,0.318888666666667,0.329999999999998,0.326666666666667}, + {0.329999999999998,0.326666666666667,0.333333333333333,0.333333333333333}, + {0.333333333333333,0.333333333333333,0.338333333333333,0.339444666666667}, + {0.338333333333333,0.339444666666667,0.344999999999999,0.343888666666667}, + {0.344999999999999,0.343888666666667,0.353333333333334,0.345555333333333}, + {0.353333333333334,0.345555333333333,0.362221999999998,0.345}, + {0.362221999999998,0.345,0.372778000000001,0.342778}, + {0.372778000000001,0.342778,0.384444666666667,0.339444666666667}, + {0.384444666666667,0.339444666666667,0.396111333333332,0.335555333333333}, + {0.396111333333332,0.335555333333333,0.407222,0.331111333333334}, + {0.407222,0.331111333333334,0.418888666666665,0.327778}, + {0.418888666666665,0.327778,0.429444666666669,0.325}, + {0.429444666666669,0.325,0.438333333333333,0.324444666666666}, + {0.438333333333333,0.324444666666666,0.446666666666668,0.325}, + {0.446666666666668,0.325,0.453333333333333,0.328333333333333}, + {0.453333333333333,0.328333333333333,0.458333333333333,0.333333333333333}, + {0.458333333333333,0.333333333333333,0.461666666666668,0.339444666666667}, + {0.461666666666668,0.339444666666667,0.464444666666665,0.346666666666666}, + {0.464444666666665,0.346666666666666,0.466111333333335,0.356666666666667}, + {0.466111333333335,0.356666666666667,0.466666666666669,0.367778}, + {0.466666666666669,0.367778,0.466666666666669,0.381666666666667}, + {0.466666666666669,0.381666666666667,0.466666666666669,0.396666666666667}, + {0.466666666666669,0.396666666666667,0.465555333333332,0.413333333333333}, + {0.465555333333332,0.413333333333333,0.464444666666665,0.430555333333333}, + {0.464444666666665,0.430555333333333,0.463333333333333,0.447222}, + {0.463333333333333,0.447222,0.461666666666668,0.462778}, + {0.461666666666668,0.462778,0.460555333333332,0.476111333333333}, + {0.460555333333332,0.476111333333333,0.459444666666665,0.486666666666667}, + {0.459444666666665,0.486666666666667,0.458888666666667,0.493888666666667}, + {0.458888666666667,0.493888666666667,0.458333333333333,0.497778}, + {0.458333333333333,0.497778,0.458333333333333,0.5}, + {0.125,0.542222,0.125,0.541666666666667}, + {0.125,0.543888666666666,0.125,0.542222}, + {0.124444666666667,0.547778,0.125,0.543888666666666}, + {0.123888666666668,0.554444666666667,0.124444666666667,0.547778}, + {0.123333333333335,0.563888666666667,0.123888666666668,0.554444666666667}, + {0.122778000000001,0.574444666666666,0.123333333333335,0.563888666666667}, + {0.122221999999998,0.585,0.122778000000001,0.574444666666666}, + {0.122221999999998,0.595555333333333,0.122221999999998,0.585}, + {0.122221999999998,0.605,0.122221999999998,0.595555333333333}, + {0.122778000000001,0.612778,0.122221999999998,0.605}, + {0.123333333333335,0.619444666666666,0.122778000000001,0.612778}, + {0.125,0.625,0.123333333333335,0.619444666666666}, + {0.127778000000002,0.631111333333333,0.125,0.625}, + {0.131111333333332,0.636666666666667,0.127778000000002,0.631111333333333}, + {0.136111333333332,0.642222,0.131111333333332,0.636666666666667}, + {0.142778000000002,0.647778,0.136111333333332,0.642222}, + {0.149444666666668,0.653333333333334,0.142778000000002,0.647778}, + {0.156111333333333,0.658888666666667,0.149444666666668,0.653333333333334}, + {0.161111333333333,0.662778,0.156111333333333,0.658888666666667}, + {0.165000000000002,0.665555333333333,0.161111333333333,0.662778}, + {0.166666666666667,0.666666666666667,0.165000000000002,0.665555333333333}, + {0.458333333333333,0.541666666666667,0.458333333333333,0.542222}, + {0.458333333333333,0.542222,0.458333333333333,0.543888666666666}, + {0.458333333333333,0.543888666666666,0.457778,0.547778}, + {0.457778,0.547778,0.457222000000002,0.554444666666667}, + {0.457222000000002,0.554444666666667,0.456666666666668,0.563888666666667}, + {0.456666666666668,0.563888666666667,0.456111333333335,0.574444666666666}, + {0.456111333333335,0.574444666666666,0.455555333333332,0.585}, + {0.455555333333332,0.585,0.455555333333332,0.595555333333333}, + {0.455555333333332,0.595555333333333,0.455555333333332,0.605}, + {0.455555333333332,0.605,0.456111333333335,0.612778}, + {0.456111333333335,0.612778,0.456666666666668,0.619444666666666}, + {0.456666666666668,0.619444666666666,0.458333333333333,0.625}, + {0.458333333333333,0.625,0.461111333333335,0.631111333333333}, + {0.461111333333335,0.631111333333333,0.464444666666665,0.636666666666667}, + {0.464444666666665,0.636666666666667,0.469444666666665,0.642222}, + {0.469444666666665,0.642222,0.476111333333336,0.647778}, + {0.476111333333336,0.647778,0.482778000000001,0.653333333333334}, + {0.482778000000001,0.653333333333334,0.489444666666666,0.658888666666667}, + {0.489444666666666,0.658888666666667,0.494444666666666,0.662778}, + {0.494444666666666,0.662778,0.498333333333335,0.665555333333333}, + {0.498333333333335,0.665555333333333,0.5,0.666666666666667}, + {0,0,0,0} +}; + +double Icon36[][4] = { + {0.0694446666666645,0.397778,0.0733333333333329,0.395555333333334}, + {0.067222666666666,0.401111333333333,0.0694446666666645,0.397778}, + {0.0649999999999977,0.405,0.067222666666666,0.401111333333333}, + {0.0638893333333309,0.409444666666667,0.0649999999999977,0.405}, + {0.0627779999999992,0.414444666666667,0.0638893333333309,0.409444666666667}, + {0.0622226666666658,0.42,0.0627779999999992,0.414444666666667}, + {0.0622226666666658,0.425555333333334,0.0622226666666658,0.42}, + {0.0622226666666658,0.431111333333333,0.0622226666666658,0.425555333333334}, + {0.0627779999999992,0.436666666666667,0.0622226666666658,0.431111333333333}, + {0.0638893333333309,0.441666666666666,0.0627779999999992,0.436666666666667}, + {0.0649999999999977,0.446111333333333,0.0638893333333309,0.441666666666666}, + {0.067222666666666,0.45,0.0649999999999977,0.446111333333333}, + {0.0694446666666645,0.453333333333333,0.067222666666666,0.45}, + {0.0733333333333329,0.455555333333334,0.0694446666666645,0.453333333333333}, + {0.0783333333333331,0.457222,0.0733333333333329,0.455555333333334}, + {0.0844446666666651,0.458333333333333,0.0783333333333331,0.457222}, + {0.101111333333331,0.457222,0.0922226666666669,0.458333333333333}, + {0.111111333333331,0.455,0.101111333333331,0.457222}, + {0.121666666666665,0.452778,0.111111333333331,0.455}, + {0.132777999999997,0.45,0.121666666666665,0.452778}, + {0.143889333333334,0.447222,0.132777999999997,0.45}, + {0.154444666666668,0.445555333333333,0.143889333333334,0.447222}, + {0.164444666666663,0.444444666666667,0.154444666666668,0.445555333333333}, + {0.181111333333334,0.446666666666667,0.173333333333332,0.444444666666667}, + {0.187222666666666,0.45,0.181111333333334,0.446666666666667}, + {0.192222666666666,0.455555333333334,0.187222666666666,0.45}, + {0.195556000000001,0.461666666666667,0.192222666666666,0.455555333333334}, + {0.198333333333333,0.47,0.195556000000001,0.461666666666667}, + {0.199999999999998,0.479444666666667,0.198333333333333,0.47}, + {0.201666666666663,0.49,0.199999999999998,0.479444666666667}, + {0.203333333333333,0.502778,0.201666666666663,0.49}, + {0.204444666666665,0.516111333333334,0.203333333333333,0.502778}, + {0.205555999999997,0.53,0.204444666666665,0.516111333333334}, + {0.20611133333333,0.545,0.205555999999997,0.53}, + {0.206666666666663,0.559444666666667,0.20611133333333,0.545}, + {0.206666666666663,0.573333333333334,0.206666666666663,0.559444666666667}, + {0.20611133333333,0.586666666666667,0.206666666666663,0.573333333333334}, + {0.204999999999998,0.599444666666667,0.20611133333333,0.586666666666667}, + {0.203333333333333,0.61,0.204999999999998,0.599444666666667}, + {0.200555999999996,0.619444666666666,0.203333333333333,0.61}, + {0.197222666666666,0.627778,0.200555999999996,0.619444666666666}, + {0.192222666666666,0.633888666666667,0.197222666666666,0.627778}, + {0.186111333333334,0.638888666666666,0.192222666666666,0.633888666666667}, + {0.178333333333332,0.642222,0.186111333333334,0.638888666666666}, + {0.16888933333333,0.645,0.178333333333332,0.642222}, + {0.157777999999998,0.646111333333333,0.16888933333333,0.645}, + {0.145555999999999,0.646666666666667,0.157777999999998,0.646111333333333}, + {0.117777999999997,0.646111333333333,0.132222666666664,0.646666666666667}, + {0.103333333333334,0.645,0.117777999999997,0.646111333333333}, + {0.0888893333333319,0.643888666666667,0.103333333333334,0.645}, + {0.0744446666666647,0.642222,0.0888893333333319,0.643888666666667}, + {0.061111333333334,0.641111333333334,0.0744446666666647,0.642222}, + {0.0488893333333304,0.639444666666667,0.061111333333334,0.641111333333334}, + {0.0377779999999982,0.638333333333333,0.0488893333333304,0.639444666666667}, + {0.0283333333333312,0.637222,0.0377779999999982,0.638333333333333}, + {0.0205559999999991,0.635555333333333,0.0283333333333312,0.637222}, + {0.0144446666666672,0.633888666666667,0.0205559999999991,0.635555333333333}, + {0.00944466666666699,0.631666666666667,0.0144446666666672,0.633888666666667}, + {0.00611133333333195,0.628888666666667,0.00944466666666699,0.631666666666667}, + {0.0033333333333303,0.626111333333334,0.00611133333333195,0.628888666666667}, + {0.00166666666666515,0.622222,0.0033333333333303,0.626111333333334}, + {0.000555999999998373,0.618333333333334,0.00166666666666515,0.622222}, + {0,0.613888666666667,0.000555999999998373,0.618333333333334}, + {0,0.608888666666667,0,0.613888666666667}, + {0.000555999999998373,0.604444666666667,0,0.608888666666667}, + {0.00111133333333176,0.599444666666667,0.000555999999998373,0.604444666666667}, + {0.00222266666666352,0.594444666666667,0.00111133333333176,0.599444666666667}, + {0.0033333333333303,0.59,0.00222266666666352,0.594444666666667}, + {0.00500000000000019,0.586111333333333,0.0033333333333303,0.59}, + {0.00666666666666534,0.582222,0.00500000000000019,0.586111333333333}, + {0.00833333333333049,0.579444666666667,0.00666666666666534,0.582222}, + {0.0111113333333321,0.576666666666667,0.00833333333333049,0.579444666666667}, + {0.0144446666666672,0.574444666666666,0.0111113333333321,0.576666666666667}, + {0.0194446666666674,0.572778,0.0144446666666672,0.574444666666666}, + {0.0255559999999993,0.571666666666667,0.0194446666666674,0.572778}, + {0.0333333333333314,0.571111333333333,0.0255559999999993,0.571666666666667}, + {0.0522226666666654,0.572222,0.042222666666665,0.571111333333333}, + {0.0627779999999992,0.573333333333334,0.0522226666666654,0.572222}, + {0.0738893333333313,0.574444666666666,0.0627779999999992,0.573333333333334}, + {0.0849999999999985,0.575555333333333,0.0738893333333313,0.574444666666666}, + {0.0955559999999972,0.576666666666667,0.0849999999999985,0.575555333333333}, + {0.105555999999998,0.577778,0.0955559999999972,0.576666666666667}, + {0.122222666666663,0.577222,0.114444666666666,0.577778}, + {0.12833333333333,0.576111333333333,0.122222666666663,0.577222}, + {0.13333333333333,0.574444666666666,0.12833333333333,0.576111333333333}, + {0.137222666666664,0.572222,0.13333333333333,0.574444666666666}, + {0.139444666666667,0.568888666666667,0.137222666666664,0.572222}, + {0.141666666666666,0.565,0.139444666666667,0.568888666666667}, + {0.142777999999997,0.560555333333333,0.141666666666666,0.565}, + {0.143889333333334,0.555555333333333,0.142777999999997,0.560555333333333}, + {0.144444666666667,0.55,0.143889333333334,0.555555333333333}, + {0.144444666666667,0.544444666666667,0.144444666666667,0.55}, + {0.144444666666667,0.539444666666667,0.144444666666667,0.544444666666667}, + {0.143889333333334,0.533888666666667,0.144444666666667,0.539444666666667}, + {0.142777999999997,0.528888666666666,0.143889333333334,0.533888666666667}, + {0.141666666666666,0.524444666666666,0.142777999999997,0.528888666666666}, + {0.139444666666667,0.520555333333334,0.141666666666666,0.524444666666666}, + {0.137222666666664,0.517222,0.139444666666667,0.520555333333334}, + {0.13333333333333,0.515,0.137222666666664,0.517222}, + {0.12833333333333,0.513333333333333,0.13333333333333,0.515}, + {0.122222666666663,0.512222,0.12833333333333,0.513333333333333}, + {0.105555999999998,0.513333333333333,0.114444666666666,0.512222}, + {0.0955559999999972,0.515555333333333,0.105555999999998,0.513333333333333}, + {0.0849999999999985,0.517778,0.0955559999999972,0.515555333333333}, + {0.0738893333333313,0.520555333333334,0.0849999999999985,0.517778}, + {0.0627779999999992,0.523333333333333,0.0738893333333313,0.520555333333334}, + {0.0522226666666654,0.525,0.0627779999999992,0.523333333333333}, + {0.042222666666665,0.526111333333333,0.0522226666666654,0.525}, + {0.0255559999999993,0.523888666666667,0.0333333333333314,0.526111333333333}, + {0.0194446666666674,0.520555333333334,0.0255559999999993,0.523888666666667}, + {0.0144446666666672,0.515,0.0194446666666674,0.520555333333334}, + {0.0111113333333321,0.508888666666667,0.0144446666666672,0.515}, + {0.00833333333333049,0.500555333333333,0.0111113333333321,0.508888666666667}, + {0.00666666666666534,0.491111333333333,0.00833333333333049,0.500555333333333}, + {0.00500000000000019,0.480555333333333,0.00666666666666534,0.491111333333333}, + {0.0033333333333303,0.467778,0.00500000000000019,0.480555333333333}, + {0.00222266666666352,0.454444666666667,0.0033333333333303,0.467778}, + {0.00111133333333176,0.440555333333334,0.00222266666666352,0.454444666666667}, + {0.000555999999998373,0.426111333333333,0.00111133333333176,0.440555333333334}, + {0,0.411111333333333,0.000555999999998373,0.426111333333333}, + {0,0.397222,0,0.411111333333333}, + {0.000555999999998373,0.383888666666667,0,0.397222}, + {0.00166666666666515,0.371111333333333,0.000555999999998373,0.383888666666667}, + {0.0033333333333303,0.360555333333333,0.00166666666666515,0.371111333333333}, + {0.00611133333333195,0.351111333333333,0.0033333333333303,0.360555333333333}, + {0.00944466666666699,0.342778,0.00611133333333195,0.351111333333333}, + {0.0144446666666672,0.336666666666667,0.00944466666666699,0.342778}, + {0.0205559999999991,0.331666666666666,0.0144446666666672,0.336666666666667}, + {0.0283333333333312,0.328333333333333,0.0205559999999991,0.331666666666666}, + {0.0377779999999982,0.325555333333333,0.0283333333333312,0.328333333333333}, + {0.0488893333333304,0.324444666666666,0.0377779999999982,0.325555333333333}, + {0.061111333333334,0.323888666666667,0.0488893333333304,0.324444666666666}, + {0.0888893333333319,0.324444666666666,0.0744446666666647,0.323888666666667}, + {0.103333333333334,0.325555333333333,0.0888893333333319,0.324444666666666}, + {0.117777999999997,0.326666666666667,0.103333333333334,0.325555333333333}, + {0.132222666666664,0.328333333333333,0.117777999999997,0.326666666666667}, + {0.145555999999999,0.329444666666667,0.132222666666664,0.328333333333333}, + {0.157777999999998,0.331111333333334,0.145555999999999,0.329444666666667}, + {0.16888933333333,0.332222,0.157777999999998,0.331111333333334}, + {0.178333333333332,0.333333333333333,0.16888933333333,0.332222}, + {0.186111333333334,0.335,0.178333333333332,0.333333333333333}, + {0.192222666666666,0.336666666666667,0.186111333333334,0.335}, + {0.197222666666666,0.338888666666667,0.192222666666666,0.336666666666667}, + {0.200555999999996,0.341111333333333,0.197222666666666,0.338888666666667}, + {0.203333333333333,0.344444666666667,0.200555999999996,0.341111333333333}, + {0.204999999999998,0.348333333333333,0.203333333333333,0.344444666666667}, + {0.20611133333333,0.352222,0.204999999999998,0.348333333333333}, + {0.206666666666663,0.356666666666667,0.20611133333333,0.352222}, + {0.206666666666663,0.361111333333334,0.206666666666663,0.356666666666667}, + {0.20611133333333,0.366111333333333,0.206666666666663,0.361111333333334}, + {0.205555999999997,0.371111333333333,0.20611133333333,0.366111333333333}, + {0.204444666666665,0.375555333333333,0.205555999999997,0.371111333333333}, + {0.203333333333333,0.38,0.204444666666665,0.375555333333333}, + {0.201666666666663,0.383888666666667,0.203333333333333,0.38}, + {0.199999999999998,0.387778,0.201666666666663,0.383888666666667}, + {0.198333333333333,0.391111333333334,0.199999999999998,0.387778}, + {0.195556000000001,0.393333333333333,0.198333333333333,0.391111333333334}, + {0.192222666666666,0.395555333333334,0.195556000000001,0.393333333333333}, + {0.187222666666666,0.397222,0.192222666666666,0.395555333333334}, + {0.181111333333334,0.398333333333333,0.187222666666666,0.397222}, + {0.173333333333332,0.398888666666667,0.181111333333334,0.398333333333333}, + {0.154444666666668,0.397778,0.164444666666663,0.398888666666667}, + {0.143889333333334,0.396666666666667,0.154444666666668,0.397778}, + {0.132777999999997,0.395555333333334,0.143889333333334,0.396666666666667}, + {0.121666666666665,0.394444666666667,0.132777999999997,0.395555333333334}, + {0.111111333333331,0.393333333333333,0.121666666666665,0.394444666666667}, + {0.101111333333331,0.392222,0.111111333333331,0.393333333333333}, + {0.0844446666666651,0.392778,0.0922226666666669,0.392222}, + {0.0783333333333331,0.393888666666667,0.0844446666666651,0.392778}, + {0.0733333333333329,0.395555333333334,0.0783333333333331,0.393888666666667}, + {0.317777999999999,0.334444666666667,0.311666666666667,0.336666666666667}, + {0.323333333333333,0.332778,0.317777999999999,0.334444666666667}, + {0.329444666666665,0.331666666666666,0.323333333333333,0.332778}, + {0.335555999999997,0.331111333333334,0.329444666666665,0.331666666666666}, + {0.353333333333334,0.331666666666666,0.347222666666667,0.331111333333334}, + {0.359444666666666,0.332778,0.353333333333334,0.331666666666666}, + {0.365,0.334444666666667,0.359444666666666,0.332778}, + {0.371111333333332,0.336666666666667,0.365,0.334444666666667}, + {0.375555999999998,0.338888666666667,0.371111333333332,0.336666666666667}, + {0.38,0.341666666666667,0.375555999999998,0.338888666666667}, + {0.384444666666667,0.344444666666667,0.38,0.341666666666667}, + {0.388889333333334,0.347222,0.384444666666667,0.344444666666667}, + {0.393889333333334,0.349444666666667,0.388889333333334,0.347222}, + {0.398889333333334,0.352222,0.393889333333334,0.349444666666667}, + {0.403889333333334,0.355,0.398889333333334,0.352222}, + {0.408333333333331,0.357778,0.403889333333334,0.355}, + {0.413333333333332,0.361666666666667,0.408333333333331,0.357778}, + {0.417777999999998,0.366111333333333,0.413333333333332,0.361666666666667}, + {0.421666666666667,0.371111333333333,0.417777999999998,0.366111333333333}, + {0.424999999999997,0.377778,0.421666666666667,0.371111333333333}, + {0.428333333333332,0.385555333333333,0.424999999999997,0.377778}, + {0.430556,0.395555333333334,0.428333333333332,0.385555333333333}, + {0.431666666666667,0.403333333333334,0.430556,0.395555333333334}, + {0.432777999999999,0.412222,0.431666666666667,0.403333333333334}, + {0.433889333333331,0.422222,0.432777999999999,0.412222}, + {0.434444666666664,0.433333333333334,0.433889333333331,0.422222}, + {0.434999999999997,0.445555333333333,0.434444666666664,0.433333333333334}, + {0.435556000000001,0.458888666666667,0.434999999999997,0.445555333333333}, + {0.435556000000001,0.472778,0.435556000000001,0.458888666666667}, + {0.436111333333334,0.487222,0.435556000000001,0.472778}, + {0.436111333333334,0.502222,0.436111333333334,0.487222}, + {0.436111333333334,0.517222,0.436111333333334,0.502222}, + {0.436111333333334,0.532778,0.436111333333334,0.517222}, + {0.436111333333334,0.547222,0.436111333333334,0.532778}, + {0.435556000000001,0.561666666666667,0.436111333333334,0.547222}, + {0.435556000000001,0.575555333333333,0.435556000000001,0.561666666666667}, + {0.434999999999997,0.588333333333334,0.435556000000001,0.575555333333333}, + {0.434444666666664,0.6,0.434999999999997,0.588333333333334}, + {0.433889333333331,0.610555333333333,0.434444666666664,0.6}, + {0.432777999999999,0.619444666666666,0.433889333333331,0.610555333333333}, + {0.431666666666667,0.627222,0.432777999999999,0.619444666666666}, + {0.430556,0.633888666666667,0.431666666666667,0.627222}, + {0.428889333333331,0.64,0.430556,0.633888666666667}, + {0.426666666666667,0.644444666666667,0.428889333333331,0.64}, + {0.42388933333333,0.647778,0.426666666666667,0.644444666666667}, + {0.420556,0.65,0.42388933333333,0.647778}, + {0.417222666666665,0.651666666666667,0.420556,0.65}, + {0.413333333333332,0.652222,0.417222666666665,0.651666666666667}, + {0.405000000000001,0.651666666666667,0.409444666666663,0.652222}, + {0.400555999999999,0.650555333333333,0.405000000000001,0.651666666666667}, + {0.396666666666666,0.649444666666666,0.400555999999999,0.650555333333333}, + {0.392222666666664,0.648333333333333,0.396666666666666,0.649444666666666}, + {0.388333333333331,0.646666666666667,0.392222666666664,0.648333333333333}, + {0.384444666666667,0.645,0.388333333333331,0.646666666666667}, + {0.381111333333332,0.643333333333333,0.384444666666667,0.645}, + {0.377777999999997,0.641666666666667,0.381111333333332,0.643333333333333}, + {0.375,0.639444666666667,0.377777999999997,0.641666666666667}, + {0.372777999999997,0.636666666666667,0.375,0.639444666666667}, + {0.371111333333332,0.633888666666667,0.372777999999997,0.636666666666667}, + {0.369444666666666,0.628888666666667,0.371111333333332,0.633888666666667}, + {0.36833333333333,0.622778,0.369444666666666,0.628888666666667}, + {0.367777999999996,0.615,0.36833333333333,0.622778}, + {0.367777999999996,0.606111333333333,0.367777999999996,0.615}, + {0.368889333333333,0.596111333333334,0.367777999999996,0.606111333333333}, + {0.37,0.585555333333333,0.368889333333333,0.596111333333334}, + {0.371111333333332,0.574444666666666,0.37,0.585555333333333}, + {0.372222666666663,0.563333333333333,0.371111333333332,0.574444666666666}, + {0.37333333333333,0.552778,0.372222666666663,0.563333333333333}, + {0.374444666666667,0.542778,0.37333333333333,0.552778}, + {0.374444666666667,0.533888666666667,0.374444666666667,0.542778}, + {0.373889333333333,0.526111333333333,0.374444666666667,0.533888666666667}, + {0.372777999999997,0.52,0.373889333333333,0.526111333333333}, + {0.371111333333332,0.515,0.372777999999997,0.52}, + {0.368889333333333,0.511111333333333,0.371111333333332,0.515}, + {0.365555999999998,0.508888666666667,0.368889333333333,0.511111333333333}, + {0.361666666666665,0.506666666666667,0.365555999999998,0.508888666666667}, + {0.357222666666667,0.505555333333334,0.361666666666665,0.506666666666667}, + {0.352222666666667,0.504444666666667,0.357222666666667,0.505555333333334}, + {0.346666666666664,0.503888666666667,0.352222666666667,0.504444666666667}, + {0.330555999999997,0.504444666666667,0.33611133333333,0.503888666666667}, + {0.325555999999996,0.505555333333334,0.330555999999997,0.504444666666667}, + {0.321111333333334,0.506666666666667,0.325555999999996,0.505555333333334}, + {0.317222666666666,0.508888666666667,0.321111333333334,0.506666666666667}, + {0.313889333333331,0.511111333333333,0.317222666666666,0.508888666666667}, + {0.311666666666667,0.515,0.313889333333331,0.511111333333333}, + {0.309999999999997,0.52,0.311666666666667,0.515}, + {0.308889333333331,0.526111333333333,0.309999999999997,0.52}, + {0.308333333333332,0.533888666666667,0.308889333333331,0.526111333333333}, + {0.308333333333332,0.542778,0.308333333333332,0.533888666666667}, + {0.309444666666664,0.552778,0.308333333333332,0.542778}, + {0.310556000000001,0.563333333333333,0.309444666666664,0.552778}, + {0.311666666666667,0.574444666666666,0.310556000000001,0.563333333333333}, + {0.312777999999999,0.585555333333333,0.311666666666667,0.574444666666666}, + {0.313889333333331,0.596111333333334,0.312777999999999,0.585555333333333}, + {0.314999999999998,0.606111333333333,0.313889333333331,0.596111333333334}, + {0.314999999999998,0.615,0.314999999999998,0.606111333333333}, + {0.314444666666664,0.622778,0.314999999999998,0.615}, + {0.313333333333333,0.628888666666667,0.314444666666664,0.622778}, + {0.311666666666667,0.633888666666667,0.313333333333333,0.628888666666667}, + {0.309999999999997,0.636666666666667,0.311666666666667,0.633888666666667}, + {0.307777999999999,0.639444666666667,0.309999999999997,0.636666666666667}, + {0.304999999999997,0.641666666666667,0.307777999999999,0.639444666666667}, + {0.301666666666667,0.643333333333333,0.304999999999997,0.641666666666667}, + {0.298333333333332,0.645,0.301666666666667,0.643333333333333}, + {0.294444666666664,0.646666666666667,0.298333333333332,0.645}, + {0.290556,0.648333333333333,0.294444666666664,0.646666666666667}, + {0.286111333333333,0.649444666666666,0.290556,0.648333333333333}, + {0.281666666666666,0.650555333333333,0.286111333333333,0.649444666666666}, + {0.277777999999998,0.651666666666667,0.281666666666666,0.650555333333333}, + {0.273333333333331,0.652222,0.277777999999998,0.651666666666667}, + {0.265555999999999,0.651666666666667,0.269444666666667,0.652222}, + {0.262222666666664,0.65,0.265555999999999,0.651666666666667}, + {0.258889333333334,0.647778,0.262222666666664,0.65}, + {0.256111333333332,0.644444666666667,0.258889333333334,0.647778}, + {0.253889333333333,0.64,0.256111333333332,0.644444666666667}, + {0.252222666666663,0.633888666666667,0.253889333333333,0.64}, + {0.251111333333332,0.627222,0.252222666666663,0.633888666666667}, + {0.25,0.619444666666666,0.251111333333332,0.627222}, + {0.248889333333333,0.610555333333333,0.25,0.619444666666666}, + {0.24833333333333,0.6,0.248889333333333,0.610555333333333}, + {0.247777999999997,0.588333333333334,0.24833333333333,0.6}, + {0.247222666666663,0.575555333333333,0.247777999999997,0.588333333333334}, + {0.247222666666663,0.561666666666667,0.247222666666663,0.575555333333333}, + {0.246666666666665,0.547222,0.247222666666663,0.561666666666667}, + {0.246666666666665,0.532778,0.246666666666665,0.547222}, + {0.246666666666665,0.517222,0.246666666666665,0.532778}, + {0.246666666666665,0.502222,0.246666666666665,0.517222}, + {0.246666666666665,0.487222,0.246666666666665,0.502222}, + {0.247222666666663,0.472778,0.246666666666665,0.487222}, + {0.247222666666663,0.458888666666667,0.247222666666663,0.472778}, + {0.247777999999997,0.445555333333333,0.247222666666663,0.458888666666667}, + {0.24833333333333,0.433333333333334,0.247777999999997,0.445555333333333}, + {0.248889333333333,0.422222,0.24833333333333,0.433333333333334}, + {0.25,0.412222,0.248889333333333,0.422222}, + {0.251111333333332,0.403333333333334,0.25,0.412222}, + {0.252222666666663,0.395555333333334,0.251111333333332,0.403333333333334}, + {0.254444666666667,0.385555333333333,0.252222666666663,0.395555333333334}, + {0.257777999999997,0.377778,0.254444666666667,0.385555333333333}, + {0.261111333333332,0.371111333333333,0.257777999999997,0.377778}, + {0.265000000000001,0.366111333333333,0.261111333333332,0.371111333333333}, + {0.269444666666667,0.361666666666667,0.265000000000001,0.366111333333333}, + {0.274444666666668,0.357778,0.269444666666667,0.361666666666667}, + {0.278889333333334,0.355,0.274444666666668,0.357778}, + {0.28388933333333,0.352222,0.278889333333334,0.355}, + {0.28888933333333,0.349444666666667,0.28388933333333,0.352222}, + {0.29388933333333,0.347222,0.28888933333333,0.349444666666667}, + {0.298333333333332,0.344444666666667,0.29388933333333,0.347222}, + {0.302777999999999,0.341666666666667,0.298333333333332,0.344444666666667}, + {0.307222666666666,0.338888666666667,0.302777999999999,0.341666666666667}, + {0.311666666666667,0.336666666666667,0.307222666666666,0.338888666666667}, + {0.371111333333332,0.455555333333334,0.367222666666663,0.457778}, + {0.367222666666663,0.457778,0.362778000000001,0.459444666666667}, + {0.362778000000001,0.459444666666667,0.356111333333331,0.460555333333333}, + {0.356111333333331,0.460555333333333,0.348889333333332,0.461111333333333}, + {0.333889333333332,0.461111333333333,0.326666666666663,0.460555333333333}, + {0.326666666666663,0.460555333333333,0.319999999999998,0.459444666666667}, + {0.319999999999998,0.459444666666667,0.315556000000001,0.457778}, + {0.315556000000001,0.457778,0.311666666666667,0.455555333333334}, + {0.311666666666667,0.455555333333334,0.309444666666664,0.451666666666667}, + {0.309444666666664,0.451666666666667,0.307777999999999,0.446666666666667}, + {0.307777999999999,0.446666666666667,0.306666666666667,0.440555333333334}, + {0.306666666666667,0.440555333333334,0.306111333333334,0.433333333333334}, + {0.306111333333334,0.433333333333334,0.306111333333334,0.425555333333334}, + {0.306111333333334,0.425555333333334,0.306111333333334,0.417778}, + {0.306111333333334,0.417778,0.306666666666667,0.410555333333334}, + {0.306666666666667,0.410555333333334,0.307777999999999,0.404444666666667}, + {0.307777999999999,0.404444666666667,0.309444666666664,0.399444666666666}, + {0.309444666666664,0.399444666666666,0.311666666666667,0.395555333333334}, + {0.311666666666667,0.395555333333334,0.315556000000001,0.393333333333333}, + {0.315556000000001,0.393333333333333,0.319999999999998,0.391666666666667}, + {0.319999999999998,0.391666666666667,0.326666666666663,0.390555333333333}, + {0.326666666666663,0.390555333333333,0.333889333333332,0.39}, + {0.348889333333332,0.39,0.356111333333331,0.390555333333333}, + {0.356111333333331,0.390555333333333,0.362778000000001,0.391666666666667}, + {0.362778000000001,0.391666666666667,0.367222666666663,0.393333333333333}, + {0.367222666666663,0.393333333333333,0.371111333333332,0.395555333333334}, + {0.371111333333332,0.395555333333334,0.37333333333333,0.399444666666666}, + {0.37333333333333,0.399444666666666,0.375,0.404444666666667}, + {0.375,0.404444666666667,0.376111333333332,0.410555333333334}, + {0.376111333333332,0.410555333333334,0.376666666666665,0.417778}, + {0.376666666666665,0.417778,0.376666666666665,0.425555333333334}, + {0.376666666666665,0.425555333333334,0.376666666666665,0.433333333333334}, + {0.376666666666665,0.433333333333334,0.376111333333332,0.440555333333334}, + {0.376111333333332,0.440555333333334,0.375,0.446666666666667}, + {0.375,0.446666666666667,0.37333333333333,0.451666666666667}, + {0.37333333333333,0.451666666666667,0.371111333333332,0.455555333333334}, + {0.549444666666664,0.633888666666667,0.553889333333331,0.637778}, + {0.553889333333331,0.637778,0.557777999999999,0.64}, + {0.557777999999999,0.64,0.562222666666666,0.642222}, + {0.562222666666666,0.642222,0.566666666666668,0.643333333333333}, + {0.566666666666668,0.643333333333333,0.570556000000001,0.644444666666667}, + {0.570556000000001,0.644444666666667,0.574999999999998,0.645}, + {0.583333333333333,0.645,0.587778,0.644444666666667}, + {0.587778,0.644444666666667,0.591666666666664,0.643333333333333}, + {0.591666666666664,0.643333333333333,0.596111333333331,0.642222}, + {0.596111333333331,0.642222,0.600555999999997,0.64}, + {0.600555999999997,0.64,0.604444666666666,0.637778}, + {0.604444666666666,0.637778,0.608889333333333,0.633888666666667}, + {0.608889333333333,0.633888666666667,0.613333333333334,0.628888666666667}, + {0.613333333333334,0.628888666666667,0.617777999999996,0.623333333333333}, + {0.617777999999996,0.623333333333333,0.622222666666663,0.616111333333333}, + {0.622222666666663,0.616111333333333,0.626666666666665,0.608888666666667}, + {0.626666666666665,0.608888666666667,0.631666666666665,0.600555333333334}, + {0.631666666666665,0.600555333333334,0.636666666666665,0.591666666666667}, + {0.636666666666665,0.591666666666667,0.641666666666666,0.582778}, + {0.641666666666666,0.582778,0.646111333333332,0.573333333333334}, + {0.646111333333332,0.573333333333334,0.651111333333333,0.563888666666667}, + {0.651111333333333,0.563888666666667,0.655555999999999,0.554444666666667}, + {0.655555999999999,0.554444666666667,0.659444666666663,0.545}, + {0.659444666666663,0.545,0.662777999999998,0.535555333333334}, + {0.662777999999998,0.535555333333334,0.666111333333333,0.525555333333333}, + {0.666111333333333,0.525555333333333,0.668333333333332,0.515}, + {0.668333333333332,0.515,0.669999999999997,0.505555333333334}, + {0.669999999999997,0.505555333333334,0.671111333333333,0.495}, + {0.671111333333333,0.495,0.672222666666665,0.484444666666667}, + {0.672222666666665,0.484444666666667,0.672777999999999,0.472778}, + {0.672777999999999,0.472778,0.673333333333332,0.46}, + {0.673333333333332,0.46,0.67388933333333,0.447222}, + {0.67388933333333,0.447222,0.67388933333333,0.433888666666667}, + {0.67388933333333,0.433888666666667,0.67388933333333,0.42}, + {0.67388933333333,0.42,0.67388933333333,0.406666666666667}, + {0.67388933333333,0.406666666666667,0.67388933333333,0.393888666666667}, + {0.67388933333333,0.393888666666667,0.673333333333332,0.381666666666667}, + {0.673333333333332,0.381666666666667,0.672777999999999,0.37}, + {0.672777999999999,0.37,0.672222666666665,0.36}, + {0.672222666666665,0.36,0.671111333333333,0.350555333333334}, + {0.671111333333333,0.350555333333334,0.669999999999997,0.342778}, + {0.669999999999997,0.342778,0.668333333333332,0.336666666666667}, + {0.668333333333332,0.336666666666667,0.666666666666667,0.332222}, + {0.666666666666667,0.332222,0.664444666666663,0.328888666666667}, + {0.664444666666663,0.328888666666667,0.661666666666666,0.326111333333333}, + {0.661666666666666,0.326111333333333,0.658333333333331,0.323888666666667}, + {0.658333333333331,0.323888666666667,0.655000000000001,0.322222}, + {0.655000000000001,0.322222,0.651111333333333,0.321111333333333}, + {0.651111333333333,0.321111333333333,0.647222666666664,0.320555333333333}, + {0.647222666666664,0.320555333333333,0.642777999999997,0.32}, + {0.634444666666667,0.32,0.63,0.320555333333333}, + {0.63,0.320555333333333,0.626111333333332,0.321111333333333}, + {0.626111333333332,0.321111333333333,0.622222666666663,0.322222}, + {0.622222666666663,0.322222,0.618889333333333,0.323888666666667}, + {0.618889333333333,0.323888666666667,0.615555999999998,0.326111333333333}, + {0.615555999999998,0.326111333333333,0.612778000000001,0.328888666666667}, + {0.612778000000001,0.328888666666667,0.610555999999998,0.332222}, + {0.610555999999998,0.332222,0.608889333333333,0.336666666666667}, + {0.608889333333333,0.336666666666667,0.607222666666667,0.342778}, + {0.607222666666667,0.342778,0.606111333333331,0.351111333333333}, + {0.606111333333331,0.351111333333333,0.605555999999998,0.360555333333333}, + {0.605555999999998,0.360555333333333,0.605555999999998,0.371111333333333}, + {0.605555999999998,0.371111333333333,0.606111333333331,0.383888666666667}, + {0.606111333333331,0.383888666666667,0.606666666666664,0.397222}, + {0.606666666666664,0.397222,0.607778000000001,0.411111333333333}, + {0.607778000000001,0.411111333333333,0.608889333333333,0.426111333333333}, + {0.608889333333333,0.426111333333333,0.609999999999999,0.440555333333334}, + {0.609999999999999,0.440555333333334,0.611111333333331,0.454444666666667}, + {0.611111333333331,0.454444666666667,0.611666666666665,0.467778}, + {0.611666666666665,0.467778,0.612222666666668,0.480555333333333}, + {0.612222666666668,0.480555333333333,0.612222666666668,0.491111333333333}, + {0.612222666666668,0.491111333333333,0.611666666666665,0.500555333333333}, + {0.611666666666665,0.500555333333333,0.610555999999998,0.508888666666667}, + {0.610555999999998,0.508888666666667,0.608889333333333,0.515}, + {0.608889333333333,0.515,0.607222666666667,0.519444666666667}, + {0.607222666666667,0.519444666666667,0.604999999999999,0.522778}, + {0.604999999999999,0.522778,0.602222666666667,0.525555333333333}, + {0.602222666666667,0.525555333333333,0.598889333333332,0.527778}, + {0.598889333333332,0.527778,0.595555999999997,0.529444666666667}, + {0.595555999999997,0.529444666666667,0.591666666666664,0.530555333333333}, + {0.591666666666664,0.530555333333333,0.587778,0.531111333333333}, + {0.587778,0.531111333333333,0.583333333333333,0.531666666666667}, + {0.574999999999998,0.531666666666667,0.570556000000001,0.531111333333333}, + {0.570556000000001,0.531111333333333,0.566666666666668,0.530555333333333}, + {0.566666666666668,0.530555333333333,0.562777999999999,0.529444666666667}, + {0.562777999999999,0.529444666666667,0.559444666666664,0.527778}, + {0.559444666666664,0.527778,0.556111333333334,0.525555333333333}, + {0.556111333333334,0.525555333333333,0.553333333333332,0.522778}, + {0.553333333333332,0.522778,0.551111333333334,0.519444666666667}, + {0.551111333333334,0.519444666666667,0.549444666666664,0.515}, + {0.549444666666664,0.515,0.547777999999999,0.508888666666667}, + {0.547777999999999,0.508888666666667,0.546666666666667,0.500555333333333}, + {0.546666666666667,0.500555333333333,0.546111333333333,0.491111333333333}, + {0.546111333333333,0.491111333333333,0.546111333333333,0.480555333333333}, + {0.546111333333333,0.480555333333333,0.546666666666667,0.467778}, + {0.546666666666667,0.467778,0.547222666666665,0.454444666666667}, + {0.547222666666665,0.454444666666667,0.548333333333332,0.440555333333334}, + {0.548333333333332,0.440555333333334,0.549444666666664,0.426111333333333}, + {0.549444666666664,0.426111333333333,0.550556,0.411111333333333}, + {0.550556,0.411111333333333,0.551666666666667,0.397222}, + {0.551666666666667,0.397222,0.552222666666665,0.383888666666667}, + {0.552222666666665,0.383888666666667,0.552777999999999,0.371111333333333}, + {0.552777999999999,0.371111333333333,0.552777999999999,0.360555333333333}, + {0.552777999999999,0.360555333333333,0.552222666666665,0.351111333333333}, + {0.552222666666665,0.351111333333333,0.551111333333334,0.342778}, + {0.551111333333334,0.342778,0.549444666666664,0.336666666666667}, + {0.549444666666664,0.336666666666667,0.547777999999999,0.332222}, + {0.547777999999999,0.332222,0.545556,0.328888666666667}, + {0.545556,0.328888666666667,0.542777999999998,0.326111333333333}, + {0.542777999999998,0.326111333333333,0.539444666666663,0.323888666666667}, + {0.539444666666663,0.323888666666667,0.536111333333333,0.322222}, + {0.536111333333333,0.322222,0.532222666666665,0.321111333333333}, + {0.532222666666665,0.321111333333333,0.528333333333331,0.320555333333333}, + {0.528333333333331,0.320555333333333,0.523889333333334,0.32}, + {0.515555999999999,0.32,0.511111333333332,0.320555333333333}, + {0.511111333333332,0.320555333333333,0.507222666666664,0.321111333333333}, + {0.507222666666664,0.321111333333333,0.50333333333333,0.322222}, + {0.50333333333333,0.322222,0.5,0.323888666666667}, + {0.5,0.323888666666667,0.496666666666665,0.326111333333333}, + {0.496666666666665,0.326111333333333,0.493889333333333,0.328888666666667}, + {0.493889333333333,0.328888666666667,0.491666666666665,0.332222}, + {0.491666666666665,0.332222,0.49,0.336666666666667}, + {0.49,0.336666666666667,0.488333333333334,0.342778}, + {0.488333333333334,0.342778,0.487222666666668,0.350555333333334}, + {0.487222666666668,0.350555333333334,0.486111333333331,0.36}, + {0.486111333333331,0.36,0.485555999999998,0.37}, + {0.485555999999998,0.37,0.484999999999999,0.381666666666667}, + {0.484999999999999,0.381666666666667,0.484444666666666,0.393888666666667}, + {0.484444666666666,0.393888666666667,0.484444666666666,0.406666666666667}, + {0.484444666666666,0.406666666666667,0.484444666666666,0.42}, + {0.484444666666666,0.42,0.484444666666666,0.433888666666667}, + {0.484444666666666,0.433888666666667,0.484444666666666,0.447222}, + {0.484444666666666,0.447222,0.484999999999999,0.46}, + {0.484999999999999,0.46,0.485555999999998,0.472778}, + {0.485555999999998,0.472778,0.486111333333331,0.484444666666667}, + {0.486111333333331,0.484444666666667,0.487222666666668,0.495}, + {0.487222666666668,0.495,0.488333333333334,0.505555333333334}, + {0.488333333333334,0.505555333333334,0.49,0.515}, + {0.49,0.515,0.492222666666663,0.525555333333333}, + {0.492222666666663,0.525555333333333,0.495555999999998,0.535555333333334}, + {0.495555999999998,0.535555333333334,0.498889333333333,0.545}, + {0.498889333333333,0.545,0.502777999999997,0.554444666666667}, + {0.502777999999997,0.554444666666667,0.507222666666664,0.563888666666667}, + {0.507222666666664,0.563888666666667,0.512222666666664,0.573333333333334}, + {0.512222666666664,0.573333333333334,0.516666666666666,0.582778}, + {0.516666666666666,0.582778,0.521666666666666,0.591666666666667}, + {0.521666666666666,0.591666666666667,0.526666666666666,0.600555333333334}, + {0.526666666666666,0.600555333333334,0.531666666666666,0.608888666666667}, + {0.531666666666666,0.608888666666667,0.536111333333333,0.616111333333333}, + {0.536111333333333,0.616111333333333,0.540556,0.623333333333333}, + {0.540556,0.623333333333333,0.544999999999997,0.628888666666667}, + {0.544999999999997,0.628888666666667,0.549444666666664,0.633888666666667}, + {0.728333333333334,0.633888666666667,0.734444666666666,0.642222}, + {0.734444666666666,0.642222,0.742222666666663,0.647778}, + {0.742222666666663,0.647778,0.751666666666665,0.651666666666667}, + {0.751666666666665,0.651666666666667,0.762777999999997,0.653888666666666}, + {0.762777999999997,0.653888666666666,0.775000000000001,0.655}, + {0.775000000000001,0.655,0.788333333333332,0.654444666666667}, + {0.788333333333332,0.654444666666667,0.802777999999999,0.652778}, + {0.802777999999999,0.652778,0.817222666666666,0.650555333333333}, + {0.817222666666666,0.650555333333333,0.831666666666663,0.648333333333333}, + {0.831666666666663,0.648333333333333,0.846111333333331,0.645555333333334}, + {0.846111333333331,0.645555333333334,0.859444666666666,0.643333333333333}, + {0.859444666666666,0.643333333333333,0.871666666666665,0.641111333333334}, + {0.871666666666665,0.641111333333334,0.882777999999997,0.638888666666666}, + {0.882777999999997,0.638888666666666,0.892222666666664,0.637222}, + {0.892222666666664,0.637222,0.900000000000001,0.635555333333333}, + {0.900000000000001,0.635555333333333,0.906111333333333,0.633888666666667}, + {0.906111333333333,0.633888666666667,0.911111333333333,0.631666666666667}, + {0.911111333333333,0.631666666666667,0.914444666666663,0.628888666666667}, + {0.914444666666663,0.628888666666667,0.917222666666665,0.626111333333334}, + {0.917222666666665,0.626111333333334,0.91888933333333,0.622222}, + {0.91888933333333,0.622222,0.919999999999997,0.618333333333334}, + {0.919999999999997,0.618333333333334,0.920556,0.613888666666667}, + {0.920556,0.613888666666667,0.920556,0.608888666666667}, + {0.920556,0.608888666666667,0.919999999999997,0.604444666666667}, + {0.919999999999997,0.604444666666667,0.919444666666664,0.599444666666667}, + {0.919444666666664,0.599444666666667,0.918333333333332,0.594444666666667}, + {0.918333333333332,0.594444666666667,0.917222666666665,0.59}, + {0.917222666666665,0.59,0.915556,0.586111333333333}, + {0.915556,0.586111333333333,0.91388933333333,0.582222}, + {0.91388933333333,0.582222,0.912222666666665,0.579444666666667}, + {0.912222666666665,0.579444666666667,0.909444666666663,0.576666666666667}, + {0.909444666666663,0.576666666666667,0.906111333333333,0.574444666666666}, + {0.906111333333333,0.574444666666666,0.901111333333333,0.572778}, + {0.901111333333333,0.572778,0.895000000000001,0.571666666666667}, + {0.895000000000001,0.571666666666667,0.887222666666664,0.571111333333333}, + {0.87833333333333,0.571111333333333,0.86833333333333,0.572222}, + {0.86833333333333,0.572222,0.857778000000001,0.573333333333334}, + {0.857778000000001,0.573333333333334,0.846666666666664,0.574444666666666}, + {0.846666666666664,0.574444666666666,0.835555999999997,0.575555333333333}, + {0.835555999999997,0.575555333333333,0.824999999999998,0.576666666666667}, + {0.824999999999998,0.576666666666667,0.814999999999998,0.577778}, + {0.806111333333334,0.577778,0.798333333333332,0.577222}, + {0.798333333333332,0.577222,0.792222666666665,0.576111333333333}, + {0.792222666666665,0.576111333333333,0.787222666666665,0.574444666666666}, + {0.787222666666665,0.574444666666666,0.783333333333331,0.571666666666667}, + {0.783333333333331,0.571666666666667,0.780555999999999,0.567778}, + {0.780555999999999,0.567778,0.778889333333334,0.562778}, + {0.778889333333334,0.562778,0.778333333333331,0.557222}, + {0.778333333333331,0.557222,0.778333333333331,0.551111333333333}, + {0.778333333333331,0.551111333333333,0.778889333333334,0.544444666666667}, + {0.778889333333334,0.544444666666667,0.780000000000001,0.538333333333333}, + {0.780000000000001,0.538333333333333,0.780555999999999,0.532222}, + {0.780555999999999,0.532222,0.782222666666665,0.526666666666667}, + {0.782222666666665,0.526666666666667,0.783333333333331,0.521666666666667}, + {0.783333333333331,0.521666666666667,0.784999999999997,0.517778}, + {0.784999999999997,0.517778,0.787222666666665,0.515}, + {0.787222666666665,0.515,0.791111333333333,0.512778}, + {0.791111333333333,0.512778,0.796111333333333,0.511666666666667}, + {0.796111333333333,0.511666666666667,0.802222666666665,0.512222}, + {0.802222666666665,0.512222,0.809444666666664,0.513333333333333}, + {0.809444666666664,0.513333333333333,0.817222666666666,0.515}, + {0.817222666666666,0.515,0.824999999999998,0.516666666666667}, + {0.824999999999998,0.516666666666667,0.832222666666667,0.517778}, + {0.832222666666667,0.517778,0.838333333333333,0.518333333333333}, + {0.838333333333333,0.518333333333333,0.843333333333334,0.517222}, + {0.843333333333334,0.517222,0.847222666666667,0.515}, + {0.847222666666667,0.515,0.849444666666666,0.511111333333333}, + {0.849444666666666,0.511111333333333,0.851111333333331,0.506666666666667}, + {0.851111333333331,0.506666666666667,0.852222666666667,0.5}, + {0.852222666666667,0.5,0.852778000000001,0.492778}, + {0.852778000000001,0.492778,0.852778000000001,0.485}, + {0.852778000000001,0.485,0.852778000000001,0.477778}, + {0.852778000000001,0.477778,0.852222666666667,0.470555333333333}, + {0.852222666666667,0.470555333333333,0.851111333333331,0.463888666666667}, + {0.851111333333331,0.463888666666667,0.849444666666666,0.459444666666667}, + {0.849444666666666,0.459444666666667,0.847222666666667,0.455555333333334}, + {0.847222666666667,0.455555333333334,0.843333333333334,0.453333333333333}, + {0.843333333333334,0.453333333333333,0.838333333333333,0.452222}, + {0.838333333333333,0.452222,0.832222666666667,0.452778}, + {0.832222666666667,0.452778,0.824999999999998,0.453888666666667}, + {0.824999999999998,0.453888666666667,0.817222666666666,0.455555333333334}, + {0.817222666666666,0.455555333333334,0.809444666666664,0.457222}, + {0.809444666666664,0.457222,0.802222666666665,0.458888666666667}, + {0.796111333333333,0.458888666666667,0.791111333333333,0.457778}, + {0.791111333333333,0.457778,0.787222666666665,0.455555333333334}, + {0.787222666666665,0.455555333333334,0.784999999999997,0.452778}, + {0.784999999999997,0.452778,0.783333333333331,0.448888666666667}, + {0.783333333333331,0.448888666666667,0.782222666666665,0.443888666666667}, + {0.782222666666665,0.443888666666667,0.780555999999999,0.438333333333333}, + {0.780555999999999,0.438333333333333,0.780000000000001,0.432222}, + {0.780000000000001,0.432222,0.778889333333334,0.425555333333334}, + {0.778889333333334,0.425555333333334,0.778333333333331,0.418888666666666}, + {0.778333333333331,0.418888666666666,0.778333333333331,0.412778}, + {0.778333333333331,0.412778,0.778889333333334,0.407222}, + {0.778889333333334,0.407222,0.780555999999999,0.402222}, + {0.780555999999999,0.402222,0.783333333333331,0.398333333333333}, + {0.783333333333331,0.398333333333333,0.787222666666665,0.395555333333334}, + {0.787222666666665,0.395555333333334,0.792222666666665,0.393888666666667}, + {0.792222666666665,0.393888666666667,0.798333333333332,0.392778}, + {0.798333333333332,0.392778,0.806111333333334,0.392222}, + {0.814999999999998,0.392222,0.824999999999998,0.393333333333333}, + {0.824999999999998,0.393333333333333,0.835555999999997,0.394444666666667}, + {0.835555999999997,0.394444666666667,0.846666666666664,0.395555333333334}, + {0.846666666666664,0.395555333333334,0.857778000000001,0.396666666666667}, + {0.857778000000001,0.396666666666667,0.86833333333333,0.397778}, + {0.86833333333333,0.397778,0.87833333333333,0.398888666666667}, + {0.887222666666664,0.398888666666667,0.895000000000001,0.398333333333333}, + {0.895000000000001,0.398333333333333,0.901111333333333,0.397222}, + {0.901111333333333,0.397222,0.906111333333333,0.395555333333334}, + {0.906111333333333,0.395555333333334,0.909444666666663,0.393333333333333}, + {0.909444666666663,0.393333333333333,0.912222666666665,0.391111333333334}, + {0.912222666666665,0.391111333333334,0.91388933333333,0.387778}, + {0.91388933333333,0.387778,0.915556,0.383888666666667}, + {0.915556,0.383888666666667,0.917222666666665,0.38}, + {0.917222666666665,0.38,0.918333333333332,0.375555333333333}, + {0.918333333333332,0.375555333333333,0.919444666666664,0.371111333333333}, + {0.919444666666664,0.371111333333333,0.919999999999997,0.366111333333333}, + {0.919999999999997,0.366111333333333,0.920556,0.361111333333334}, + {0.920556,0.361111333333334,0.920556,0.356666666666667}, + {0.920556,0.356666666666667,0.919999999999997,0.352222}, + {0.919999999999997,0.352222,0.91888933333333,0.348333333333333}, + {0.91888933333333,0.348333333333333,0.917222666666665,0.344444666666667}, + {0.917222666666665,0.344444666666667,0.914444666666663,0.341111333333333}, + {0.914444666666663,0.341111333333333,0.911111333333333,0.338888666666667}, + {0.911111333333333,0.338888666666667,0.906111333333333,0.336666666666667}, + {0.906111333333333,0.336666666666667,0.900000000000001,0.335}, + {0.900000000000001,0.335,0.892222666666664,0.333333333333333}, + {0.892222666666664,0.333333333333333,0.882777999999997,0.331666666666666}, + {0.882777999999997,0.331666666666666,0.871666666666665,0.33}, + {0.871666666666665,0.33,0.859444666666666,0.327222}, + {0.859444666666666,0.327222,0.846111333333331,0.325}, + {0.846111333333331,0.325,0.831666666666663,0.322222}, + {0.831666666666663,0.322222,0.817222666666666,0.32}, + {0.817222666666666,0.32,0.802777999999999,0.317778}, + {0.802777999999999,0.317778,0.788333333333332,0.316111333333333}, + {0.788333333333332,0.316111333333333,0.775000000000001,0.315555333333334}, + {0.775000000000001,0.315555333333334,0.762777999999997,0.316666666666666}, + {0.762777999999997,0.316666666666666,0.751666666666665,0.318888666666667}, + {0.751666666666665,0.318888666666667,0.742222666666663,0.322778}, + {0.742222666666663,0.322778,0.734444666666666,0.328333333333333}, + {0.734444666666666,0.328333333333333,0.728333333333334,0.336666666666667}, + {0.728333333333334,0.336666666666667,0.724444666666666,0.343888666666667}, + {0.724444666666666,0.343888666666667,0.721666666666664,0.352778}, + {0.721666666666664,0.352778,0.718889333333332,0.362778}, + {0.718889333333332,0.362778,0.717222666666667,0.374444666666667}, + {0.717222666666667,0.374444666666667,0.715555999999997,0.387222}, + {0.715555999999997,0.387222,0.714444666666665,0.401666666666667}, + {0.714444666666665,0.401666666666667,0.713333333333333,0.417222}, + {0.713333333333333,0.417222,0.712778,0.433333333333334}, + {0.712778,0.433333333333334,0.712222666666667,0.45}, + {0.712222666666667,0.45,0.711666666666664,0.467778}, + {0.711666666666664,0.467778,0.711666666666664,0.485555333333333}, + {0.711666666666664,0.485555333333333,0.711666666666664,0.502778}, + {0.711666666666664,0.502778,0.712222666666667,0.520555333333334}, + {0.712222666666667,0.520555333333334,0.712778,0.537222}, + {0.712778,0.537222,0.713333333333333,0.553333333333333}, + {0.713333333333333,0.553333333333333,0.714444666666665,0.568888666666667}, + {0.714444666666665,0.568888666666667,0.715555999999997,0.583333333333333}, + {0.715555999999997,0.583333333333333,0.717222666666667,0.596111333333334}, + {0.717222666666667,0.596111333333334,0.718889333333332,0.607778}, + {0.718889333333332,0.607778,0.721666666666664,0.617778}, + {0.721666666666664,0.617778,0.724444666666666,0.626666666666667}, + {0.724444666666666,0.626666666666667,0.728333333333334,0.633888666666667}, + {0,0,0,0} +}; + +double Icon37[][4] = { + {0.140555333333334,0.338888666666667,0.133333333333335,0.336111333333333}, + {0.147221999999999,0.342778,0.140555333333334,0.338888666666667}, + {0.153333333333336,0.346666666666666,0.147221999999999,0.342778}, + {0.159444000000003,0.351666666666667,0.153333333333336,0.346666666666666}, + {0.165000000000002,0.356666666666667,0.159444000000003,0.351666666666667}, + {0.170000000000002,0.362222,0.165000000000002,0.356666666666667}, + {0.175555333333335,0.367778,0.170000000000002,0.362222}, + {0.180000000000002,0.373333333333333,0.175555333333335,0.367778}, + {0.185000000000002,0.378888666666667,0.180000000000002,0.373333333333333}, + {0.188888666666666,0.384444666666666,0.185000000000002,0.378888666666667}, + {0.192777333333334,0.39,0.188888666666666,0.384444666666666}, + {0.195555333333336,0.395555333333334,0.192777333333334,0.39}, + {0.198333333333333,0.402222,0.195555333333336,0.395555333333334}, + {0.200000000000003,0.409444666666667,0.198333333333333,0.402222}, + {0.200555333333336,0.417222,0.200000000000003,0.409444666666667}, + {0.20111066666667,0.425555333333334,0.200555333333336,0.417222}, + {0.201666666666668,0.433333333333334,0.20111066666667,0.425555333333334}, + {0.20111066666667,0.441666666666666,0.201666666666668,0.433333333333334}, + {0.200555333333336,0.449444666666666,0.20111066666667,0.441666666666666}, + {0.200000000000003,0.456666666666666,0.200555333333336,0.449444666666666}, + {0.198333333333333,0.463888666666667,0.200000000000003,0.456666666666666}, + {0.195555333333336,0.47,0.198333333333333,0.463888666666667}, + {0.191666666666668,0.475555333333334,0.195555333333336,0.47}, + {0.186110666666669,0.480555333333333,0.191666666666668,0.475555333333334}, + {0.17888866666667,0.483888666666667,0.186110666666669,0.480555333333333}, + {0.170555333333335,0.487222,0.17888866666667,0.483888666666667}, + {0.161666666666666,0.49,0.170555333333335,0.487222}, + {0.152777333333333,0.492778,0.161666666666666,0.49}, + {0.144444000000002,0.496666666666667,0.152777333333333,0.492778}, + {0.138333333333335,0.501111333333334,0.144444000000002,0.496666666666667}, + {0.134444000000002,0.507222,0.138333333333335,0.501111333333334}, + {0.133333333333335,0.514444666666667,0.134444000000002,0.507222}, + {0.133888666666669,0.520555333333334,0.133333333333335,0.514444666666667}, + {0.136110666666667,0.527778,0.133888666666669,0.520555333333334}, + {0.139444000000002,0.536111333333333,0.136110666666667,0.527778}, + {0.144444000000002,0.545,0.139444000000002,0.536111333333333}, + {0.150555333333334,0.555,0.144444000000002,0.545}, + {0.157222,0.565555333333334,0.150555333333334,0.555}, + {0.164444000000003,0.576111333333333,0.157222,0.565555333333334}, + {0.171666666666667,0.586666666666667,0.164444000000003,0.576111333333333}, + {0.178333333333337,0.597222,0.171666666666667,0.586666666666667}, + {0.184443999999999,0.606666666666667,0.178333333333337,0.597222}, + {0.189443999999999,0.615555333333334,0.184443999999999,0.606666666666667}, + {0.192777333333334,0.622778,0.189443999999999,0.615555333333334}, + {0.195000000000003,0.628888666666667,0.192777333333334,0.622778}, + {0.195555333333336,0.633888666666667,0.195000000000003,0.628888666666667}, + {0.195000000000003,0.637778,0.195555333333336,0.633888666666667}, + {0.193333333333333,0.640555333333333,0.195000000000003,0.637778}, + {0.190000000000002,0.642222,0.193333333333333,0.640555333333333}, + {0.186110666666669,0.643333333333333,0.190000000000002,0.642222}, + {0.181110666666669,0.644444666666667,0.186110666666669,0.643333333333333}, + {0.176110666666669,0.645,0.181110666666669,0.644444666666667}, + {0.158333333333336,0.644444666666667,0.164444000000003,0.645}, + {0.152777333333333,0.643333333333333,0.158333333333336,0.644444666666667}, + {0.147777333333333,0.642222,0.152777333333333,0.643333333333333}, + {0.142777333333332,0.640555333333333,0.147777333333333,0.642222}, + {0.137777333333337,0.637778,0.142777333333332,0.640555333333333}, + {0.133333333333335,0.633888666666667,0.137777333333337,0.637778}, + {0.128888666666668,0.628888666666667,0.133333333333335,0.633888666666667}, + {0.124444000000002,0.622222,0.128888666666668,0.628888666666667}, + {0.119444000000001,0.614444666666667,0.124444000000002,0.622222}, + {0.114444000000001,0.604444666666667,0.119444000000001,0.614444666666667}, + {0.109444000000001,0.593333333333333,0.114444000000001,0.604444666666667}, + {0.104444000000001,0.581111333333334,0.109444000000001,0.593333333333333}, + {0.0994440000000007,0.568333333333333,0.104444000000001,0.581111333333334}, + {0.0944440000000005,0.556111333333333,0.0994440000000007,0.568333333333333}, + {0.0894440000000003,0.544444666666667,0.0944440000000005,0.556111333333333}, + {0.0850000000000032,0.534444666666667,0.0894440000000003,0.544444666666667}, + {0.0805553333333364,0.525555333333333,0.0850000000000032,0.534444666666667}, + {0.076666666666668,0.519444666666667,0.0805553333333364,0.525555333333333}, + {0.0738886666666663,0.515555333333333,0.076666666666668,0.519444666666667}, + {0.0711106666666694,0.514444666666667,0.0738886666666663,0.515555333333333}, + {0.0694439999999995,0.515555333333333,0.0711106666666694,0.514444666666667}, + {0.0677773333333344,0.519444666666667,0.0694439999999995,0.515555333333333}, + {0.0677773333333344,0.525555333333333,0.0677773333333344,0.519444666666667}, + {0.0677773333333344,0.534444666666667,0.0677773333333344,0.525555333333333}, + {0.0683333333333328,0.544444666666667,0.0677773333333344,0.534444666666667}, + {0.0700000000000026,0.556111333333333,0.0683333333333328,0.544444666666667}, + {0.0711106666666694,0.568333333333333,0.0700000000000026,0.556111333333333}, + {0.0722220000000012,0.581111333333334,0.0711106666666694,0.568333333333333}, + {0.0733333333333329,0.593333333333333,0.0722220000000012,0.581111333333334}, + {0.0744439999999997,0.604444666666667,0.0733333333333329,0.593333333333333}, + {0.0744439999999997,0.614444666666667,0.0744439999999997,0.604444666666667}, + {0.0738886666666663,0.622222,0.0744439999999997,0.614444666666667}, + {0.0727773333333346,0.628888666666667,0.0738886666666663,0.622222}, + {0.0711106666666694,0.633888666666667,0.0727773333333346,0.628888666666667}, + {0.0694439999999995,0.636666666666667,0.0711106666666694,0.633888666666667}, + {0.067222000000001,0.638888666666666,0.0694439999999995,0.636666666666667}, + {0.0650000000000025,0.641111333333334,0.067222000000001,0.638888666666666}, + {0.0622220000000008,0.642778,0.0650000000000025,0.641111333333334}, + {0.0588886666666658,0.645,0.0622220000000008,0.642778}, + {0.0555553333333355,0.646666666666667,0.0588886666666658,0.645}, + {0.0522220000000004,0.648333333333333,0.0555553333333355,0.646666666666667}, + {0.0483333333333367,0.65,0.0522220000000004,0.648333333333333}, + {0.0444440000000033,0.651666666666667,0.0483333333333367,0.65}, + {0.0400000000000015,0.653333333333334,0.0444440000000033,0.651666666666667}, + {0.0361106666666681,0.654444666666667,0.0400000000000015,0.653333333333334}, + {0.0322219999999997,0.655555333333333,0.0361106666666681,0.654444666666667}, + {0.028333333333336,0.656111333333333,0.0322219999999997,0.655555333333333}, + {0.0250000000000009,0.655555333333333,0.028333333333336,0.656111333333333}, + {0.0216666666666659,0.655,0.0250000000000009,0.655555333333333}, + {0.0183333333333356,0.652778,0.0216666666666659,0.655}, + {0.015555333333334,0.65,0.0183333333333356,0.652778}, + {0.0133333333333354,0.646111333333333,0.015555333333334,0.65}, + {0.0111106666666672,0.640555333333333,0.0133333333333354,0.646111333333333}, + {0.00944400000000201,0.633888666666667,0.0111106666666672,0.640555333333333}, + {0.00833333333333523,0.626666666666667,0.00944400000000201,0.633888666666667}, + {0.00722200000000347,0.617778,0.00833333333333523,0.626666666666667}, + {0.00611066666666697,0.607778,0.00722200000000347,0.617778}, + {0.00500000000000019,0.596111333333334,0.00611066666666697,0.607778}, + {0.00444400000000182,0.582778,0.00500000000000019,0.596111333333334}, + {0.00388866666666843,0.568888666666667,0.00444400000000182,0.582778}, + {0.00333333333333504,0.553333333333333,0.00388866666666843,0.568888666666667}, + {0.00222200000000328,0.537222,0.00333333333333504,0.553333333333333}, + {0.00166666666666989,0.52,0.00222200000000328,0.537222}, + {0.00111066666666678,0.502778,0.00166666666666989,0.52}, + {0.000555333333333389,0.485,0.00111066666666678,0.502778}, + {0.000555333333333389,0.467222,0.000555333333333389,0.485}, + {0,0.45,0.000555333333333389,0.467222}, + {0,0.432778,0,0.45}, + {0,0.416666666666667,0,0.432778}, + {0.000555333333333389,0.401111333333333,0,0.416666666666667}, + {0.00111066666666678,0.387222,0.000555333333333389,0.401111333333333}, + {0.00166666666666989,0.373888666666667,0.00111066666666678,0.387222}, + {0.00333333333333504,0.362222,0.00166666666666989,0.373888666666667}, + {0.00500000000000019,0.352222,0.00333333333333504,0.362222}, + {0.00666666666667008,0.343333333333333,0.00500000000000019,0.352222}, + {0.00944400000000201,0.336111333333333,0.00666666666667008,0.343333333333333}, + {0.0138886666666688,0.327778,0.00944400000000201,0.336111333333333}, + {0.0194440000000024,0.322222,0.0138886666666688,0.327778}, + {0.0255553333333343,0.317778,0.0194440000000024,0.322222}, + {0.0327773333333331,0.316111333333333,0.0255553333333343,0.317778}, + {0.0411106666666683,0.315,0.0327773333333331,0.316111333333333}, + {0.0500000000000019,0.315555333333334,0.0411106666666683,0.315}, + {0.0588886666666658,0.317222,0.0500000000000019,0.315555333333334}, + {0.0683333333333328,0.319444666666667,0.0588886666666658,0.317222}, + {0.0777773333333348,0.321666666666667,0.0683333333333328,0.319444666666667}, + {0.0872220000000018,0.324444666666666,0.0777773333333348,0.321666666666667}, + {0.0966666666666687,0.326666666666667,0.0872220000000018,0.324444666666666}, + {0.104999999999999,0.328888666666667,0.0966666666666687,0.326666666666667}, + {0.113333333333334,0.331111333333334,0.104999999999999,0.328888666666667}, + {0.120555333333333,0.332778,0.113333333333334,0.331111333333334}, + {0.127222000000003,0.334444666666667,0.120555333333333,0.332778}, + {0.133333333333335,0.336111333333333,0.127222000000003,0.334444666666667}, + {0.136110666666667,0.451666666666667,0.133333333333335,0.455555333333334}, + {0.137777333333337,0.446666666666667,0.136110666666667,0.451666666666667}, + {0.138333333333335,0.440555333333334,0.137777333333337,0.446666666666667}, + {0.138888666666669,0.433333333333334,0.138333333333335,0.440555333333334}, + {0.139444000000002,0.425555333333334,0.138888666666669,0.433333333333334}, + {0.138888666666669,0.417778,0.139444000000002,0.425555333333334}, + {0.138333333333335,0.410555333333334,0.138888666666669,0.417778}, + {0.137777333333337,0.404444666666667,0.138333333333335,0.410555333333334}, + {0.136110666666667,0.399444666666666,0.137777333333337,0.404444666666667}, + {0.133333333333335,0.395555333333334,0.136110666666667,0.399444666666666}, + {0.129444000000002,0.393333333333333,0.133333333333335,0.395555333333334}, + {0.124444000000002,0.391666666666667,0.129444000000002,0.393333333333333}, + {0.117777333333336,0.390555333333333,0.124444000000002,0.391666666666667}, + {0.110555333333333,0.39,0.117777333333336,0.390555333333333}, + {0.0866666666666684,0.390555333333333,0.0938886666666671,0.39}, + {0.080000000000003,0.391666666666667,0.0866666666666684,0.390555333333333}, + {0.0750000000000028,0.393333333333333,0.080000000000003,0.391666666666667}, + {0.0711106666666694,0.395555333333334,0.0750000000000028,0.393333333333333}, + {0.0683333333333328,0.399444666666666,0.0711106666666694,0.395555333333334}, + {0.0666666666666676,0.404444666666667,0.0683333333333328,0.399444666666666}, + {0.0661106666666692,0.410555333333334,0.0666666666666676,0.404444666666667}, + {0.0655553333333359,0.417778,0.0661106666666692,0.410555333333334}, + {0.0655553333333359,0.425555333333334,0.0655553333333359,0.417778}, + {0.0655553333333359,0.433333333333334,0.0655553333333359,0.425555333333334}, + {0.0661106666666692,0.440555333333334,0.0655553333333359,0.433333333333334}, + {0.0666666666666676,0.446666666666667,0.0661106666666692,0.440555333333334}, + {0.0683333333333328,0.451666666666667,0.0666666666666676,0.446666666666667}, + {0.0711106666666694,0.455555333333334,0.0683333333333328,0.451666666666667}, + {0.0750000000000028,0.457778,0.0711106666666694,0.455555333333334}, + {0.080000000000003,0.459444666666667,0.0750000000000028,0.457778}, + {0.0866666666666684,0.460555333333333,0.080000000000003,0.459444666666667}, + {0.0938886666666671,0.461111333333333,0.0866666666666684,0.460555333333333}, + {0.117777333333336,0.460555333333333,0.110555333333333,0.461111333333333}, + {0.124444000000002,0.459444666666667,0.117777333333336,0.460555333333333}, + {0.129444000000002,0.457778,0.124444000000002,0.459444666666667}, + {0.133333333333335,0.455555333333334,0.129444000000002,0.457778}, + {0.257222000000003,0.633888666666667,0.262777333333337,0.641111333333334}, + {0.262777333333337,0.641111333333334,0.270000000000001,0.646666666666667}, + {0.270000000000001,0.646666666666667,0.278333333333336,0.651111333333333}, + {0.278333333333336,0.651111333333333,0.288333333333336,0.653333333333334}, + {0.288333333333336,0.653333333333334,0.29888866666667,0.654444666666667}, + {0.29888866666667,0.654444666666667,0.311110666666669,0.655}, + {0.311110666666669,0.655,0.323333333333333,0.653888666666666}, + {0.323333333333333,0.653888666666666,0.336666666666668,0.652778}, + {0.336666666666668,0.652778,0.350555333333332,0.650555333333333}, + {0.350555333333332,0.650555333333333,0.363888666666668,0.648333333333333}, + {0.363888666666668,0.648333333333333,0.377222000000003,0.646111333333333}, + {0.377222000000003,0.646111333333333,0.389444000000002,0.643888666666667}, + {0.389444000000002,0.643888666666667,0.401666666666666,0.641666666666667}, + {0.401666666666666,0.641666666666667,0.412222,0.64}, + {0.412222,0.64,0.422222,0.638333333333333}, + {0.422222,0.638333333333333,0.430555333333335,0.636666666666667}, + {0.430555333333335,0.636666666666667,0.437777333333334,0.635555333333333}, + {0.437777333333334,0.635555333333333,0.443333333333333,0.633888666666667}, + {0.443333333333333,0.633888666666667,0.448333333333333,0.631666666666667}, + {0.448333333333333,0.631666666666667,0.452222000000001,0.628888666666667}, + {0.452222000000001,0.628888666666667,0.455000000000003,0.626111333333334}, + {0.455000000000003,0.626111333333334,0.456666666666668,0.622222}, + {0.456666666666668,0.622222,0.457777333333335,0.618333333333334}, + {0.457777333333335,0.618333333333334,0.458333333333333,0.613333333333333}, + {0.458333333333333,0.613333333333333,0.458333333333333,0.608888666666667}, + {0.458333333333333,0.608888666666667,0.457777333333335,0.603888666666667}, + {0.457777333333335,0.603888666666667,0.457222000000002,0.598888666666667}, + {0.457222000000002,0.598888666666667,0.45611066666667,0.594444666666667}, + {0.45611066666667,0.594444666666667,0.455000000000003,0.589444666666667}, + {0.455000000000003,0.589444666666667,0.453333333333333,0.585555333333333}, + {0.453333333333333,0.585555333333333,0.451666666666668,0.581666666666666}, + {0.451666666666668,0.581666666666666,0.449444,0.578888666666667}, + {0.449444,0.578888666666667,0.446666666666668,0.576111333333333}, + {0.446666666666668,0.576111333333333,0.443333333333333,0.573888666666667}, + {0.443333333333333,0.573888666666667,0.438333333333333,0.572222}, + {0.438333333333333,0.572222,0.431666666666667,0.571111333333333}, + {0.431666666666667,0.571111333333333,0.42388866666667,0.570555333333333}, + {0.414444000000003,0.570555333333333,0.403888666666669,0.571666666666667}, + {0.403888666666669,0.571666666666667,0.392777333333332,0.572778}, + {0.392777333333332,0.572778,0.381110666666667,0.573888666666667}, + {0.381110666666667,0.573888666666667,0.37,0.575}, + {0.37,0.575,0.358888666666668,0.576111333333333}, + {0.358888666666668,0.576111333333333,0.348333333333334,0.577222}, + {0.338888666666667,0.577222,0.33111066666667,0.576666666666667}, + {0.33111066666667,0.576666666666667,0.324444,0.575555333333333}, + {0.324444,0.575555333333333,0.319444,0.573888666666667}, + {0.319444,0.573888666666667,0.315000000000002,0.571111333333333}, + {0.315000000000002,0.571111333333333,0.312222000000001,0.567222}, + {0.312222000000001,0.567222,0.310555333333336,0.562222}, + {0.310555333333336,0.562222,0.310000000000002,0.556666666666667}, + {0.310000000000002,0.556666666666667,0.310000000000002,0.550555333333334}, + {0.310000000000002,0.550555333333334,0.310555333333336,0.543888666666666}, + {0.310555333333336,0.543888666666666,0.311666666666667,0.537778}, + {0.311666666666667,0.537778,0.312777333333334,0.531666666666667}, + {0.312777333333334,0.531666666666667,0.313888666666666,0.526111333333333}, + {0.313888666666666,0.526111333333333,0.315555333333336,0.521111333333333}, + {0.315555333333336,0.521111333333333,0.317222000000001,0.517222}, + {0.317222000000001,0.517222,0.319444,0.514444666666667}, + {0.319444,0.514444666666667,0.323333333333333,0.512222}, + {0.323333333333333,0.512222,0.328333333333333,0.511111333333333}, + {0.328333333333333,0.511111333333333,0.335000000000003,0.511666666666667}, + {0.335000000000003,0.511666666666667,0.342222000000002,0.512778}, + {0.342222000000002,0.512778,0.350555333333332,0.514444666666667}, + {0.350555333333332,0.514444666666667,0.358333333333334,0.516111333333334}, + {0.358333333333334,0.516111333333334,0.365555333333333,0.517222}, + {0.365555333333333,0.517222,0.372222000000003,0.517778}, + {0.372222000000003,0.517778,0.377222000000003,0.516666666666667}, + {0.377222000000003,0.516666666666667,0.381110666666667,0.514444666666667}, + {0.381110666666667,0.514444666666667,0.383888666666669,0.511111333333333}, + {0.383888666666669,0.511111333333333,0.385,0.506111333333333}, + {0.385,0.506111333333333,0.386110666666667,0.5}, + {0.386110666666667,0.5,0.38666666666667,0.492778}, + {0.38666666666667,0.492778,0.38666666666667,0.485}, + {0.38666666666667,0.485,0.38666666666667,0.477222}, + {0.38666666666667,0.477222,0.386110666666667,0.47}, + {0.386110666666667,0.47,0.385,0.463888666666667}, + {0.385,0.463888666666667,0.383888666666669,0.458888666666667}, + {0.383888666666669,0.458888666666667,0.381110666666667,0.455555333333334}, + {0.381110666666667,0.455555333333334,0.377222000000003,0.453333333333333}, + {0.377222000000003,0.453333333333333,0.372222000000003,0.452222}, + {0.372222000000003,0.452222,0.365555333333333,0.452778}, + {0.365555333333333,0.452778,0.358333333333334,0.453888666666667}, + {0.358333333333334,0.453888666666667,0.349999999999999,0.455555333333334}, + {0.349999999999999,0.455555333333334,0.342222000000002,0.457222}, + {0.342222000000002,0.457222,0.335000000000003,0.458888666666667}, + {0.328333333333333,0.458888666666667,0.323333333333333,0.457778}, + {0.323333333333333,0.457778,0.319444,0.455555333333334}, + {0.319444,0.455555333333334,0.317222000000001,0.452778}, + {0.317222000000001,0.452778,0.315555333333336,0.448888666666667}, + {0.315555333333336,0.448888666666667,0.313888666666666,0.443888666666667}, + {0.313888666666666,0.443888666666667,0.312777333333334,0.438333333333333}, + {0.312777333333334,0.438333333333333,0.311666666666667,0.432222}, + {0.311666666666667,0.432222,0.310555333333336,0.425555333333334}, + {0.310555333333336,0.425555333333334,0.310000000000002,0.418888666666666}, + {0.310000000000002,0.418888666666666,0.310000000000002,0.412778}, + {0.310000000000002,0.412778,0.310555333333336,0.407222}, + {0.310555333333336,0.407222,0.312222000000001,0.402222}, + {0.312222000000001,0.402222,0.315000000000002,0.398333333333333}, + {0.315000000000002,0.398333333333333,0.319444,0.395555333333334}, + {0.319444,0.395555333333334,0.324444,0.393888666666667}, + {0.324444,0.393888666666667,0.33111066666667,0.392778}, + {0.33111066666667,0.392778,0.338888666666667,0.392222}, + {0.348333333333334,0.392222,0.358888666666668,0.393333333333333}, + {0.358888666666668,0.393333333333333,0.37,0.394444666666667}, + {0.37,0.394444666666667,0.38166666666667,0.395555333333334}, + {0.38166666666667,0.395555333333334,0.392777333333332,0.396666666666667}, + {0.392777333333332,0.396666666666667,0.403888666666669,0.397778}, + {0.403888666666669,0.397778,0.414444000000003,0.398888666666667}, + {0.42388866666667,0.398888666666667,0.431666666666667,0.398333333333333}, + {0.431666666666667,0.398333333333333,0.438333333333333,0.397222}, + {0.438333333333333,0.397222,0.443333333333333,0.395555333333334}, + {0.443333333333333,0.395555333333334,0.446666666666668,0.393333333333333}, + {0.446666666666668,0.393333333333333,0.449444,0.390555333333333}, + {0.449444,0.390555333333333,0.451666666666668,0.387778}, + {0.451666666666668,0.387778,0.453333333333333,0.383888666666667}, + {0.453333333333333,0.383888666666667,0.455000000000003,0.38}, + {0.455000000000003,0.38,0.45611066666667,0.375555333333333}, + {0.45611066666667,0.375555333333333,0.457222000000002,0.370555333333333}, + {0.457222000000002,0.370555333333333,0.457777333333335,0.366111333333333}, + {0.457777333333335,0.366111333333333,0.458333333333333,0.361111333333334}, + {0.458333333333333,0.361111333333334,0.458333333333333,0.356111333333333}, + {0.458333333333333,0.356111333333333,0.457777333333335,0.351666666666667}, + {0.457777333333335,0.351666666666667,0.456666666666668,0.347778}, + {0.456666666666668,0.347778,0.455000000000003,0.343888666666667}, + {0.455000000000003,0.343888666666667,0.452222000000001,0.341111333333333}, + {0.452222000000001,0.341111333333333,0.448333333333333,0.338333333333334}, + {0.448333333333333,0.338333333333334,0.443333333333333,0.336111333333333}, + {0.443333333333333,0.336111333333333,0.437777333333334,0.334444666666667}, + {0.437777333333334,0.334444666666667,0.430555333333335,0.333333333333333}, + {0.430555333333335,0.333333333333333,0.422222,0.331666666666666}, + {0.422222,0.331666666666666,0.412222,0.33}, + {0.412222,0.33,0.401666666666666,0.328333333333333}, + {0.401666666666666,0.328333333333333,0.389444000000002,0.326111333333333}, + {0.389444000000002,0.326111333333333,0.377222000000003,0.323888666666667}, + {0.377222000000003,0.323888666666667,0.363888666666668,0.321666666666667}, + {0.363888666666668,0.321666666666667,0.349999999999999,0.319444666666667}, + {0.349999999999999,0.319444666666667,0.336666666666668,0.317222}, + {0.336666666666668,0.317222,0.323333333333333,0.316111333333333}, + {0.323333333333333,0.316111333333333,0.311110666666669,0.315555333333334}, + {0.29888866666667,0.315555333333334,0.288333333333336,0.316666666666666}, + {0.288333333333336,0.316666666666666,0.278333333333336,0.318888666666667}, + {0.278333333333336,0.318888666666667,0.270000000000001,0.323333333333334}, + {0.270000000000001,0.323333333333334,0.262777333333337,0.328888666666667}, + {0.262777333333337,0.328888666666667,0.257222000000003,0.336111333333333}, + {0.257222000000003,0.336111333333333,0.253333333333335,0.343333333333333}, + {0.253333333333335,0.343333333333333,0.25,0.352222}, + {0.25,0.352222,0.247777333333336,0.362222}, + {0.247777333333336,0.362222,0.245555333333333,0.373888666666667}, + {0.245555333333333,0.373888666666667,0.243888666666668,0.387222}, + {0.243888666666668,0.387222,0.242222000000003,0.401111333333333}, + {0.242222000000003,0.401111333333333,0.241666666666669,0.416666666666667}, + {0.241666666666669,0.416666666666667,0.240555333333333,0.432778}, + {0.240555333333333,0.432778,0.24,0.45}, + {0.24,0.45,0.24,0.467222}, + {0.24,0.467222,0.24,0.485}, + {0.24,0.485,0.24,0.502778}, + {0.24,0.502778,0.24,0.52}, + {0.24,0.52,0.240555333333333,0.537222}, + {0.240555333333333,0.537222,0.241666666666669,0.553333333333333}, + {0.241666666666669,0.553333333333333,0.242222000000003,0.568888666666667}, + {0.242222000000003,0.568888666666667,0.243888666666668,0.582778}, + {0.243888666666668,0.582778,0.245555333333333,0.596111333333334}, + {0.245555333333333,0.596111333333334,0.247777333333336,0.607778}, + {0.247777333333336,0.607778,0.25,0.617778}, + {0.25,0.617778,0.253333333333335,0.626666666666667}, + {0.253333333333335,0.626666666666667,0.257222000000003,0.633888666666667}, + {0.505,0.514444666666667,0.51,0.52}, + {0.51,0.52,0.516666666666666,0.523333333333333}, + {0.516666666666666,0.523333333333333,0.524444000000003,0.525555333333333}, + {0.53388866666667,0.525555333333333,0.544444000000003,0.524444666666666}, + {0.544444000000003,0.524444666666666,0.555555333333335,0.522778}, + {0.555555333333335,0.522778,0.567222000000001,0.52}, + {0.567222000000001,0.52,0.578333333333333,0.517222}, + {0.578333333333333,0.517222,0.589444,0.515}, + {0.589444,0.515,0.599999999999999,0.512778}, + {0.599999999999999,0.512778,0.609444000000001,0.511666666666667}, + {0.617222000000003,0.511666666666667,0.623888666666668,0.512778}, + {0.623888666666668,0.512778,0.628888666666668,0.514444666666667}, + {0.628888666666668,0.514444666666667,0.632777333333337,0.516666666666667}, + {0.632777333333337,0.516666666666667,0.635555333333334,0.52}, + {0.635555333333334,0.52,0.637777333333337,0.523888666666667}, + {0.637777333333337,0.523888666666667,0.638888666666669,0.528333333333334}, + {0.638888666666669,0.528333333333334,0.640000000000001,0.533333333333333}, + {0.640000000000001,0.533333333333333,0.640555333333334,0.538888666666667}, + {0.640555333333334,0.538888666666667,0.640555333333334,0.544444666666667}, + {0.640555333333334,0.544444666666667,0.640555333333334,0.549444666666667}, + {0.640555333333334,0.549444666666667,0.640000000000001,0.555}, + {0.640000000000001,0.555,0.638888666666669,0.56}, + {0.638888666666669,0.56,0.637777333333337,0.564444666666667}, + {0.637777333333337,0.564444666666667,0.635555333333334,0.568333333333333}, + {0.635555333333334,0.568333333333333,0.632777333333337,0.571666666666667}, + {0.632777333333337,0.571666666666667,0.628888666666668,0.573888666666667}, + {0.628888666666668,0.573888666666667,0.623888666666668,0.575555333333333}, + {0.623888666666668,0.575555333333333,0.617222000000003,0.576666666666667}, + {0.617222000000003,0.576666666666667,0.609444000000001,0.577222}, + {0.599999999999999,0.577222,0.589444,0.576111333333333}, + {0.589444,0.576111333333333,0.578333333333333,0.575}, + {0.578333333333333,0.575,0.566666666666668,0.573888666666667}, + {0.566666666666668,0.573888666666667,0.555555333333335,0.572778}, + {0.555555333333335,0.572778,0.544444000000003,0.571666666666667}, + {0.544444000000003,0.571666666666667,0.53388866666667,0.570555333333333}, + {0.524444000000003,0.570555333333333,0.516666666666666,0.571111333333333}, + {0.516666666666666,0.571111333333333,0.51,0.572222}, + {0.51,0.572222,0.505,0.573888666666667}, + {0.505,0.573888666666667,0.50166666666667,0.576111333333333}, + {0.50166666666667,0.576111333333333,0.498888666666668,0.578888666666667}, + {0.498888666666668,0.578888666666667,0.49666666666667,0.581666666666666}, + {0.49666666666667,0.581666666666666,0.495,0.585555333333333}, + {0.495,0.585555333333333,0.493333333333335,0.589444666666667}, + {0.493333333333335,0.589444666666667,0.492222000000003,0.594444666666667}, + {0.492222000000003,0.594444666666667,0.491110666666666,0.598888666666667}, + {0.491110666666666,0.598888666666667,0.490555333333333,0.603888666666667}, + {0.490555333333333,0.603888666666667,0.49,0.608888666666667}, + {0.49,0.608888666666667,0.49,0.613333333333333}, + {0.49,0.613333333333333,0.490555333333333,0.618333333333334}, + {0.490555333333333,0.618333333333334,0.491666666666669,0.622222}, + {0.491666666666669,0.622222,0.493333333333335,0.626111333333334}, + {0.493333333333335,0.626111333333334,0.496110666666667,0.628888666666667}, + {0.496110666666667,0.628888666666667,0.5,0.631666666666667}, + {0.5,0.631666666666667,0.505,0.633888666666667}, + {0.505,0.633888666666667,0.510555333333334,0.635555333333333}, + {0.510555333333334,0.635555333333333,0.517777333333332,0.636666666666667}, + {0.517777333333332,0.636666666666667,0.526110666666668,0.637778}, + {0.526110666666668,0.637778,0.536110666666668,0.638888666666666}, + {0.536110666666668,0.638888666666666,0.546666666666667,0.64}, + {0.546666666666667,0.64,0.558888666666666,0.641666666666667}, + {0.558888666666666,0.641666666666667,0.571110666666669,0.642778}, + {0.571110666666669,0.642778,0.584444,0.643888666666667}, + {0.584444,0.643888666666667,0.598333333333334,0.645}, + {0.598333333333334,0.645,0.611666666666669,0.646111333333333}, + {0.611666666666669,0.646111333333333,0.625,0.646666666666667}, + {0.649444000000003,0.646666666666667,0.660000000000001,0.645555333333334}, + {0.660000000000001,0.645555333333334,0.670000000000002,0.643888666666667}, + {0.670000000000002,0.643888666666667,0.678333333333337,0.641666666666667}, + {0.678333333333337,0.641666666666667,0.685555333333336,0.638333333333333}, + {0.685555333333336,0.638333333333333,0.691110666666669,0.633888666666667}, + {0.691110666666669,0.633888666666667,0.696110666666669,0.627778}, + {0.696110666666669,0.627778,0.700000000000003,0.619444666666666}, + {0.700000000000003,0.619444666666666,0.702777333333335,0.61}, + {0.702777333333335,0.61,0.704444,0.599444666666667}, + {0.704444,0.599444666666667,0.705555333333336,0.586666666666667}, + {0.705555333333336,0.586666666666667,0.70611066666667,0.573333333333334}, + {0.70611066666667,0.573333333333334,0.70611066666667,0.559444666666667}, + {0.70611066666667,0.559444666666667,0.705555333333336,0.545}, + {0.705555333333336,0.545,0.705000000000003,0.53}, + {0.705000000000003,0.53,0.703888666666666,0.516111333333334}, + {0.703888666666666,0.516111333333334,0.702777333333335,0.502778}, + {0.702777333333335,0.502778,0.70111066666667,0.49}, + {0.70111066666667,0.49,0.699444,0.479444666666667}, + {0.699444,0.479444666666667,0.697222000000001,0.47}, + {0.697222000000001,0.47,0.694444,0.461666666666667}, + {0.694444,0.461666666666667,0.691110666666669,0.455555333333334}, + {0.691110666666669,0.455555333333334,0.686110666666669,0.45}, + {0.686110666666669,0.45,0.679444000000004,0.446666666666667}, + {0.679444000000004,0.446666666666667,0.671666666666667,0.444444666666667}, + {0.662222,0.444444666666667,0.651666666666666,0.445555333333333}, + {0.651666666666666,0.445555333333333,0.640555333333334,0.447222}, + {0.640555333333334,0.447222,0.628888666666668,0.45}, + {0.628888666666668,0.45,0.617777333333336,0.452778}, + {0.617777333333336,0.452778,0.606666666666669,0.455}, + {0.606666666666669,0.455,0.59611066666667,0.457222}, + {0.59611066666667,0.457222,0.586666666666668,0.458333333333333}, + {0.578888666666666,0.458333333333333,0.572222000000001,0.457222}, + {0.572222000000001,0.457222,0.567222000000001,0.455555333333334}, + {0.567222000000001,0.455555333333334,0.563333333333333,0.453333333333333}, + {0.563333333333333,0.453333333333333,0.560555333333336,0.45}, + {0.560555333333336,0.45,0.558333333333332,0.446111333333333}, + {0.558333333333332,0.446111333333333,0.557222000000001,0.441666666666666}, + {0.557222000000001,0.441666666666666,0.556110666666669,0.436666666666667}, + {0.556110666666669,0.436666666666667,0.555555333333335,0.431111333333333}, + {0.555555333333335,0.431111333333333,0.555555333333335,0.425555333333334}, + {0.555555333333335,0.425555333333334,0.555555333333335,0.42}, + {0.555555333333335,0.42,0.556110666666669,0.414444666666667}, + {0.556110666666669,0.414444666666667,0.557222000000001,0.409444666666667}, + {0.557222000000001,0.409444666666667,0.558333333333332,0.405}, + {0.558333333333332,0.405,0.560555333333336,0.401111333333333}, + {0.560555333333336,0.401111333333333,0.563333333333333,0.397778}, + {0.563333333333333,0.397778,0.567222000000001,0.395555333333334}, + {0.567222000000001,0.395555333333334,0.572222000000001,0.393888666666667}, + {0.572222000000001,0.393888666666667,0.578888666666666,0.392778}, + {0.578888666666666,0.392778,0.586666666666668,0.392222}, + {0.59611066666667,0.392222,0.606666666666669,0.393333333333333}, + {0.606666666666669,0.393333333333333,0.617777333333336,0.394444666666667}, + {0.617777333333336,0.394444666666667,0.629444000000002,0.395555333333334}, + {0.629444000000002,0.395555333333334,0.640555333333334,0.396666666666667}, + {0.640555333333334,0.396666666666667,0.651666666666666,0.397778}, + {0.651666666666666,0.397778,0.662222,0.398888666666667}, + {0.671666666666667,0.398888666666667,0.679444000000004,0.398333333333333}, + {0.679444000000004,0.398333333333333,0.686110666666669,0.397222}, + {0.686110666666669,0.397222,0.691110666666669,0.395555333333334}, + {0.691110666666669,0.395555333333334,0.694444,0.393333333333333}, + {0.694444,0.393333333333333,0.697222000000001,0.390555333333333}, + {0.697222000000001,0.390555333333333,0.699444,0.387778}, + {0.699444,0.387778,0.70111066666667,0.383888666666667}, + {0.70111066666667,0.383888666666667,0.702777333333335,0.38}, + {0.702777333333335,0.38,0.703888666666666,0.375555333333333}, + {0.703888666666666,0.375555333333333,0.705000000000003,0.370555333333333}, + {0.705000000000003,0.370555333333333,0.705555333333336,0.366111333333333}, + {0.705555333333336,0.366111333333333,0.70611066666667,0.361111333333334}, + {0.70611066666667,0.361111333333334,0.70611066666667,0.356111333333333}, + {0.70611066666667,0.356111333333333,0.705555333333336,0.351666666666667}, + {0.705555333333336,0.351666666666667,0.704444,0.347778}, + {0.704444,0.347778,0.702777333333335,0.343888666666667}, + {0.702777333333335,0.343888666666667,0.700000000000003,0.341111333333333}, + {0.700000000000003,0.341111333333333,0.696110666666669,0.338333333333334}, + {0.696110666666669,0.338333333333334,0.691110666666669,0.336111333333333}, + {0.691110666666669,0.336111333333333,0.685555333333336,0.334444666666667}, + {0.685555333333336,0.334444666666667,0.678333333333337,0.333333333333333}, + {0.678333333333337,0.333333333333333,0.670000000000002,0.332222}, + {0.670000000000002,0.332222,0.660000000000001,0.331111333333334}, + {0.660000000000001,0.331111333333334,0.649444000000003,0.33}, + {0.649444000000003,0.33,0.637222000000004,0.328333333333333}, + {0.637222000000004,0.328333333333333,0.625,0.327222}, + {0.625,0.327222,0.611666666666669,0.326111333333333}, + {0.611666666666669,0.326111333333333,0.597777333333335,0.325}, + {0.597777333333335,0.325,0.584444,0.323888666666667}, + {0.584444,0.323888666666667,0.571110666666669,0.323333333333334}, + {0.546666666666667,0.323333333333334,0.536110666666668,0.324444666666666}, + {0.536110666666668,0.324444666666666,0.526110666666668,0.326111333333333}, + {0.526110666666668,0.326111333333333,0.517777333333332,0.328333333333333}, + {0.517777333333332,0.328333333333333,0.510555333333334,0.331666666666666}, + {0.510555333333334,0.331666666666666,0.505,0.336111333333333}, + {0.505,0.336111333333333,0.5,0.342222}, + {0.5,0.342222,0.496110666666667,0.350555333333334}, + {0.496110666666667,0.350555333333334,0.493333333333335,0.36}, + {0.493333333333335,0.36,0.491666666666669,0.370555333333333}, + {0.491666666666669,0.370555333333333,0.490555333333333,0.383333333333334}, + {0.490555333333333,0.383333333333334,0.49,0.396666666666667}, + {0.49,0.396666666666667,0.49,0.410555333333334}, + {0.49,0.410555333333334,0.490555333333333,0.425555333333334}, + {0.490555333333333,0.425555333333334,0.491110666666666,0.44}, + {0.491110666666666,0.44,0.492222000000003,0.453888666666667}, + {0.492222000000003,0.453888666666667,0.493333333333335,0.467222}, + {0.493333333333335,0.467222,0.495,0.48}, + {0.495,0.48,0.49666666666667,0.490555333333334}, + {0.49666666666667,0.490555333333334,0.498888666666668,0.5}, + {0.498888666666668,0.5,0.50166666666667,0.508333333333334}, + {0.50166666666667,0.508333333333334,0.505,0.514444666666667}, + {0.752777333333337,0.633888666666667,0.758333333333335,0.641111333333334}, + {0.758333333333335,0.641111333333334,0.765555333333334,0.646666666666667}, + {0.765555333333334,0.646666666666667,0.773888666666669,0.651111333333333}, + {0.773888666666669,0.651111333333333,0.78388866666667,0.653333333333334}, + {0.78388866666667,0.653333333333334,0.794444000000003,0.654444666666667}, + {0.794444000000003,0.654444666666667,0.806666666666667,0.655}, + {0.806666666666667,0.655,0.818888666666666,0.653888666666666}, + {0.818888666666666,0.653888666666666,0.832222000000002,0.652778}, + {0.832222000000002,0.652778,0.84611066666667,0.650555333333333}, + {0.84611066666667,0.650555333333333,0.859444000000001,0.648333333333333}, + {0.859444000000001,0.648333333333333,0.872777333333336,0.646111333333333}, + {0.872777333333336,0.646111333333333,0.885,0.643888666666667}, + {0.885,0.643888666666667,0.897221999999999,0.641666666666667}, + {0.897221999999999,0.641666666666667,0.907777333333333,0.64}, + {0.907777333333333,0.64,0.917777333333333,0.638333333333333}, + {0.917777333333333,0.638333333333333,0.926110666666669,0.636666666666667}, + {0.926110666666669,0.636666666666667,0.933333333333332,0.635555333333333}, + {0.933333333333332,0.635555333333333,0.938888666666666,0.633888666666667}, + {0.938888666666666,0.633888666666667,0.943888666666666,0.631666666666667}, + {0.943888666666666,0.631666666666667,0.947777333333335,0.628888666666667}, + {0.947777333333335,0.628888666666667,0.950555333333336,0.626111333333334}, + {0.950555333333336,0.626111333333334,0.952222000000001,0.622222}, + {0.952222000000001,0.622222,0.953333333333333,0.618333333333334}, + {0.953333333333333,0.618333333333334,0.953888666666666,0.613333333333333}, + {0.953888666666666,0.613333333333333,0.953888666666666,0.608888666666667}, + {0.953888666666666,0.608888666666667,0.953333333333333,0.603888666666667}, + {0.953333333333333,0.603888666666667,0.952777333333335,0.598888666666667}, + {0.952777333333335,0.598888666666667,0.951666666666668,0.594444666666667}, + {0.951666666666668,0.594444666666667,0.950555333333336,0.589444666666667}, + {0.950555333333336,0.589444666666667,0.948888666666666,0.585555333333333}, + {0.948888666666666,0.585555333333333,0.947222000000001,0.581666666666666}, + {0.947222000000001,0.581666666666666,0.945000000000003,0.578888666666667}, + {0.945000000000003,0.578888666666667,0.942222000000001,0.576111333333333}, + {0.942222000000001,0.576111333333333,0.938888666666666,0.573888666666667}, + {0.938888666666666,0.573888666666667,0.933888666666666,0.572222}, + {0.933888666666666,0.572222,0.927222,0.571111333333333}, + {0.927222,0.571111333333333,0.919444000000003,0.570555333333333}, + {0.910000000000001,0.570555333333333,0.899444000000003,0.571666666666667}, + {0.899444000000003,0.571666666666667,0.888333333333335,0.572778}, + {0.888333333333335,0.572778,0.87666666666667,0.573888666666667}, + {0.87666666666667,0.573888666666667,0.865555333333333,0.575}, + {0.865555333333333,0.575,0.854444000000001,0.576111333333333}, + {0.854444000000001,0.576111333333333,0.843888666666667,0.577222}, + {0.834444,0.577222,0.826666666666668,0.576666666666667}, + {0.826666666666668,0.576666666666667,0.820000000000003,0.575555333333333}, + {0.820000000000003,0.575555333333333,0.815000000000002,0.573888666666667}, + {0.815000000000002,0.573888666666667,0.810555333333336,0.571111333333333}, + {0.810555333333336,0.571111333333333,0.807777333333334,0.567222}, + {0.807777333333334,0.567222,0.806110666666669,0.562222}, + {0.806110666666669,0.562222,0.805555333333335,0.556666666666667}, + {0.805555333333335,0.556666666666667,0.805555333333335,0.550555333333334}, + {0.805555333333335,0.550555333333334,0.806110666666669,0.543888666666666}, + {0.806110666666669,0.543888666666666,0.807222000000001,0.537778}, + {0.807222000000001,0.537778,0.808333333333332,0.531666666666667}, + {0.808333333333332,0.531666666666667,0.809443999999999,0.526111333333333}, + {0.809443999999999,0.526111333333333,0.811110666666669,0.521111333333333}, + {0.811110666666669,0.521111333333333,0.812777333333334,0.517222}, + {0.812777333333334,0.517222,0.815000000000002,0.514444666666667}, + {0.815000000000002,0.514444666666667,0.818888666666666,0.512222}, + {0.818888666666666,0.512222,0.823888666666666,0.511111333333333}, + {0.823888666666666,0.511111333333333,0.830555333333336,0.511666666666667}, + {0.830555333333336,0.511666666666667,0.837777333333335,0.512778}, + {0.837777333333335,0.512778,0.84611066666667,0.514444666666667}, + {0.84611066666667,0.514444666666667,0.853888666666667,0.516111333333334}, + {0.853888666666667,0.516111333333334,0.861110666666666,0.517222}, + {0.861110666666666,0.517222,0.867777333333336,0.517778}, + {0.867777333333336,0.517778,0.872777333333336,0.516666666666667}, + {0.872777333333336,0.516666666666667,0.87666666666667,0.514444666666667}, + {0.87666666666667,0.514444666666667,0.879444000000002,0.511111333333333}, + {0.879444000000002,0.511111333333333,0.880555333333334,0.506111333333333}, + {0.880555333333334,0.506111333333333,0.88166666666667,0.5}, + {0.88166666666667,0.5,0.882222000000003,0.492778}, + {0.882222000000003,0.492778,0.882222000000003,0.485}, + {0.882222000000003,0.485,0.882222000000003,0.477222}, + {0.882222000000003,0.477222,0.88166666666667,0.47}, + {0.88166666666667,0.47,0.880555333333334,0.463888666666667}, + {0.880555333333334,0.463888666666667,0.879444000000002,0.458888666666667}, + {0.879444000000002,0.458888666666667,0.87666666666667,0.455555333333334}, + {0.87666666666667,0.455555333333334,0.872777333333336,0.453333333333333}, + {0.872777333333336,0.453333333333333,0.867777333333336,0.452222}, + {0.867777333333336,0.452222,0.861110666666666,0.452778}, + {0.861110666666666,0.452778,0.853888666666667,0.453888666666667}, + {0.853888666666667,0.453888666666667,0.845555333333337,0.455555333333334}, + {0.845555333333337,0.455555333333334,0.837777333333335,0.457222}, + {0.837777333333335,0.457222,0.830555333333336,0.458888666666667}, + {0.823888666666666,0.458888666666667,0.818888666666666,0.457778}, + {0.818888666666666,0.457778,0.815000000000002,0.455555333333334}, + {0.815000000000002,0.455555333333334,0.812777333333334,0.452778}, + {0.812777333333334,0.452778,0.811110666666669,0.448888666666667}, + {0.811110666666669,0.448888666666667,0.809443999999999,0.443888666666667}, + {0.809443999999999,0.443888666666667,0.808333333333332,0.438333333333333}, + {0.808333333333332,0.438333333333333,0.807222000000001,0.432222}, + {0.807222000000001,0.432222,0.806110666666669,0.425555333333334}, + {0.806110666666669,0.425555333333334,0.805555333333335,0.418888666666666}, + {0.805555333333335,0.418888666666666,0.805555333333335,0.412778}, + {0.805555333333335,0.412778,0.806110666666669,0.407222}, + {0.806110666666669,0.407222,0.807777333333334,0.402222}, + {0.807777333333334,0.402222,0.810555333333336,0.398333333333333}, + {0.810555333333336,0.398333333333333,0.815000000000002,0.395555333333334}, + {0.815000000000002,0.395555333333334,0.820000000000003,0.393888666666667}, + {0.820000000000003,0.393888666666667,0.826666666666668,0.392778}, + {0.826666666666668,0.392778,0.834444,0.392222}, + {0.843888666666667,0.392222,0.854444000000001,0.393333333333333}, + {0.854444000000001,0.393333333333333,0.865555333333333,0.394444666666667}, + {0.865555333333333,0.394444666666667,0.877222000000003,0.395555333333334}, + {0.877222000000003,0.395555333333334,0.888333333333335,0.396666666666667}, + {0.888333333333335,0.396666666666667,0.899444000000003,0.397778}, + {0.899444000000003,0.397778,0.910000000000001,0.398888666666667}, + {0.919444000000003,0.398888666666667,0.927222,0.398333333333333}, + {0.927222,0.398333333333333,0.933888666666666,0.397222}, + {0.933888666666666,0.397222,0.938888666666666,0.395555333333334}, + {0.938888666666666,0.395555333333334,0.942222000000001,0.393333333333333}, + {0.942222000000001,0.393333333333333,0.945000000000003,0.390555333333333}, + {0.945000000000003,0.390555333333333,0.947222000000001,0.387778}, + {0.947222000000001,0.387778,0.948888666666666,0.383888666666667}, + {0.948888666666666,0.383888666666667,0.950555333333336,0.38}, + {0.950555333333336,0.38,0.951666666666668,0.375555333333333}, + {0.951666666666668,0.375555333333333,0.952777333333335,0.370555333333333}, + {0.952777333333335,0.370555333333333,0.953333333333333,0.366111333333333}, + {0.953333333333333,0.366111333333333,0.953888666666666,0.361111333333334}, + {0.953888666666666,0.361111333333334,0.953888666666666,0.356111333333333}, + {0.953888666666666,0.356111333333333,0.953333333333333,0.351666666666667}, + {0.953333333333333,0.351666666666667,0.952222000000001,0.347778}, + {0.952222000000001,0.347778,0.950555333333336,0.343888666666667}, + {0.950555333333336,0.343888666666667,0.947777333333335,0.341111333333333}, + {0.947777333333335,0.341111333333333,0.943888666666666,0.338333333333334}, + {0.943888666666666,0.338333333333334,0.938888666666666,0.336111333333333}, + {0.938888666666666,0.336111333333333,0.933333333333332,0.334444666666667}, + {0.933333333333332,0.334444666666667,0.926110666666669,0.333333333333333}, + {0.926110666666669,0.333333333333333,0.917777333333333,0.331666666666666}, + {0.917777333333333,0.331666666666666,0.907777333333333,0.33}, + {0.907777333333333,0.33,0.897221999999999,0.328333333333333}, + {0.897221999999999,0.328333333333333,0.885,0.326111333333333}, + {0.885,0.326111333333333,0.872777333333336,0.323888666666667}, + {0.872777333333336,0.323888666666667,0.859444000000001,0.321666666666667}, + {0.859444000000001,0.321666666666667,0.845555333333337,0.319444666666667}, + {0.845555333333337,0.319444666666667,0.832222000000002,0.317222}, + {0.832222000000002,0.317222,0.818888666666666,0.316111333333333}, + {0.818888666666666,0.316111333333333,0.806666666666667,0.315555333333334}, + {0.794444000000003,0.315555333333334,0.78388866666667,0.316666666666666}, + {0.78388866666667,0.316666666666666,0.773888666666669,0.318888666666667}, + {0.773888666666669,0.318888666666667,0.765555333333334,0.323333333333334}, + {0.765555333333334,0.323333333333334,0.758333333333335,0.328888666666667}, + {0.758333333333335,0.328888666666667,0.752777333333337,0.336111333333333}, + {0.752777333333337,0.336111333333333,0.748888666666668,0.343333333333333}, + {0.748888666666668,0.343333333333333,0.745555333333333,0.352222}, + {0.745555333333333,0.352222,0.743333333333335,0.362222}, + {0.743333333333335,0.362222,0.741110666666666,0.373888666666667}, + {0.741110666666666,0.373888666666667,0.739444000000001,0.387222}, + {0.739444000000001,0.387222,0.737777333333336,0.401111333333333}, + {0.737777333333336,0.401111333333333,0.737222000000003,0.416666666666667}, + {0.737222000000003,0.416666666666667,0.736110666666666,0.432778}, + {0.736110666666666,0.432778,0.735555333333333,0.45}, + {0.735555333333333,0.45,0.735555333333333,0.467222}, + {0.735555333333333,0.467222,0.735555333333333,0.485}, + {0.735555333333333,0.485,0.735555333333333,0.502778}, + {0.735555333333333,0.502778,0.735555333333333,0.52}, + {0.735555333333333,0.52,0.736110666666666,0.537222}, + {0.736110666666666,0.537222,0.737222000000003,0.553333333333333}, + {0.737222000000003,0.553333333333333,0.737777333333336,0.568888666666667}, + {0.737777333333336,0.568888666666667,0.739444000000001,0.582778}, + {0.739444000000001,0.582778,0.741110666666666,0.596111333333334}, + {0.741110666666666,0.596111333333334,0.743333333333335,0.607778}, + {0.743333333333335,0.607778,0.745555333333333,0.617778}, + {0.745555333333333,0.617778,0.748888666666668,0.626666666666667}, + {0.748888666666668,0.626666666666667,0.752777333333337,0.633888666666667}, + {1.18388866666667,0.397778,1.18666666666667,0.395555333333334}, + {1.179444,0.398333333333333,1.18388866666667,0.397778}, + {1.174444,0.397222,1.179444,0.398333333333333}, + {1.16888866666667,0.394444666666667,1.174444,0.397222}, + {1.16277733333333,0.391111333333334,1.16888866666667,0.394444666666667}, + {1.15555533333333,0.387222,1.16277733333333,0.391111333333334}, + {1.14888866666667,0.383333333333334,1.15555533333333,0.387222}, + {1.14277733333333,0.381111333333333,1.14888866666667,0.383333333333334}, + {1.137222,0.380555333333334,1.14277733333333,0.381111333333333}, + {1.132222,0.382222,1.137222,0.380555333333334}, + {1.12777733333334,0.387222,1.132222,0.382222}, + {1.125,0.395555333333334,1.12777733333334,0.387222}, + {1.12388866666667,0.402222,1.125,0.395555333333334}, + {1.12277733333334,0.41,1.12388866666667,0.402222}, + {1.12166666666667,0.419444666666667,1.12277733333334,0.41}, + {1.12166666666667,0.43,1.12166666666667,0.419444666666667}, + {1.12166666666667,0.441666666666666,1.12166666666667,0.43}, + {1.12166666666667,0.455,1.12166666666667,0.441666666666666}, + {1.122222,0.468888666666667,1.12166666666667,0.455}, + {1.12333333333333,0.483888666666667,1.122222,0.468888666666667}, + {1.12388866666667,0.498888666666667,1.12333333333333,0.483888666666667}, + {1.125,0.515,1.12388866666667,0.498888666666667}, + {1.12611066666667,0.530555333333333,1.125,0.515}, + {1.12666666666667,0.545555333333333,1.12611066666667,0.530555333333333}, + {1.12777733333334,0.560555333333333,1.12666666666667,0.545555333333333}, + {1.12833333333333,0.574444666666666,1.12777733333334,0.560555333333333}, + {1.12833333333333,0.587778,1.12833333333333,0.574444666666666}, + {1.12833333333333,0.599444666666667,1.12833333333333,0.587778}, + {1.12833333333333,0.61,1.12833333333333,0.599444666666667}, + {1.127222,0.619444666666666,1.12833333333333,0.61}, + {1.12666666666667,0.627222,1.127222,0.619444666666666}, + {1.125,0.633888666666667,1.12666666666667,0.627222}, + {1.12333333333333,0.638888666666666,1.125,0.633888666666667}, + {1.12166666666667,0.642778,1.12333333333333,0.638888666666666}, + {1.119444,0.646111333333333,1.12166666666667,0.642778}, + {1.117222,0.648888666666667,1.119444,0.646111333333333}, + {1.114444,0.651111333333333,1.117222,0.648888666666667}, + {1.11166666666667,0.652778,1.114444,0.651111333333333}, + {1.10833333333333,0.653888666666666,1.11166666666667,0.652778}, + {1.105,0.655,1.10833333333333,0.653888666666666}, + {1.10111066666667,0.655555333333333,1.105,0.655}, + {1.09777733333334,0.656111333333333,1.10111066666667,0.655555333333333}, + {1.08666666666667,0.655555333333333,1.09,0.656111333333333}, + {1.08277733333333,0.655,1.08666666666667,0.655555333333333}, + {1.079444,0.653888666666666,1.08277733333333,0.655}, + {1.07611066666667,0.652778,1.079444,0.653888666666666}, + {1.07333333333333,0.651111333333333,1.07611066666667,0.652778}, + {1.07055533333334,0.648888666666667,1.07333333333333,0.651111333333333}, + {1.06833333333333,0.646111333333333,1.07055533333334,0.648888666666667}, + {1.06611066666667,0.642778,1.06833333333333,0.646111333333333}, + {1.064444,0.638888666666666,1.06611066666667,0.642778}, + {1.06277733333333,0.633888666666667,1.064444,0.638888666666666}, + {1.06111066666667,0.627222,1.06277733333333,0.633888666666667}, + {1.06055533333334,0.619444666666666,1.06111066666667,0.627222}, + {1.059444,0.61,1.06055533333334,0.619444666666666}, + {1.059444,0.599444666666667,1.059444,0.61}, + {1.059444,0.587778,1.059444,0.599444666666667}, + {1.059444,0.574444666666666,1.059444,0.587778}, + {1.06,0.560555333333333,1.059444,0.574444666666666}, + {1.06111066666667,0.545555333333333,1.06,0.560555333333333}, + {1.06166666666667,0.530555333333333,1.06111066666667,0.545555333333333}, + {1.06277733333333,0.514444666666667,1.06166666666667,0.530555333333333}, + {1.06388866666667,0.498888666666667,1.06277733333333,0.514444666666667}, + {1.064444,0.483888666666667,1.06388866666667,0.498888666666667}, + {1.06555533333334,0.468888666666667,1.064444,0.483888666666667}, + {1.06611066666667,0.455,1.06555533333334,0.468888666666667}, + {1.06611066666667,0.441666666666666,1.06611066666667,0.455}, + {1.06611066666667,0.43,1.06611066666667,0.441666666666666}, + {1.06611066666667,0.419444666666667,1.06611066666667,0.43}, + {1.065,0.41,1.06611066666667,0.419444666666667}, + {1.064444,0.402222,1.065,0.41}, + {1.06277733333333,0.395555333333334,1.064444,0.402222}, + {1.06,0.387222,1.06277733333333,0.395555333333334}, + {1.05555533333334,0.382222,1.06,0.387222}, + {1.05055533333334,0.380555333333334,1.05555533333334,0.382222}, + {1.045,0.381111333333333,1.05055533333334,0.380555333333334}, + {1.03833333333334,0.383333333333334,1.045,0.381111333333333}, + {1.03166666666667,0.387222,1.03833333333334,0.383333333333334}, + {1.025,0.391111333333334,1.03166666666667,0.387222}, + {1.01833333333334,0.394444666666667,1.025,0.391111333333334}, + {1.01277733333334,0.397222,1.01833333333334,0.394444666666667}, + {1.00777733333334,0.398333333333333,1.01277733333334,0.397222}, + {1.00333333333333,0.397778,1.00777733333334,0.398333333333333}, + {1.00055533333333,0.395555333333334,1.00333333333333,0.397778}, + {0.998333333333335,0.393333333333333,1.00055533333333,0.395555333333334}, + {0.99666666666667,0.39,0.998333333333335,0.393333333333333}, + {0.995555333333333,0.386111333333333,0.99666666666667,0.39}, + {0.993888666666668,0.381666666666667,0.995555333333333,0.386111333333333}, + {0.992222000000003,0.376666666666667,0.993888666666668,0.381666666666667}, + {0.990555333333333,0.371111333333333,0.992222000000003,0.376666666666667}, + {0.988888666666668,0.365555333333334,0.990555333333333,0.371111333333333}, + {0.987777333333336,0.360555333333333,0.988888666666668,0.365555333333334}, + {0.987222000000003,0.355,0.987777333333336,0.360555333333333}, + {0.987222000000003,0.35,0.987222000000003,0.355}, + {0.988333333333334,0.345555333333333,0.987222000000003,0.35}, + {0.991110666666666,0.341666666666667,0.988333333333334,0.345555333333333}, + {0.995,0.338333333333334,0.991110666666666,0.341666666666667}, + {1.00055533333333,0.336111333333333,0.995,0.338333333333334}, + {1.00611066666667,0.334444666666667,1.00055533333333,0.336111333333333}, + {1.01333333333334,0.333333333333333,1.00611066666667,0.334444666666667}, + {1.02166666666667,0.332778,1.01333333333334,0.333333333333333}, + {1.03166666666667,0.331666666666666,1.02166666666667,0.332778}, + {1.042222,0.331111333333334,1.03166666666667,0.331666666666666}, + {1.06666666666667,0.330555333333334,1.054444,0.331111333333334}, + {1.13277733333334,0.331111333333334,1.12055533333333,0.330555333333334}, + {1.15555533333333,0.331666666666666,1.145,0.331111333333334}, + {1.16555533333333,0.332778,1.15555533333333,0.331666666666666}, + {1.17388866666667,0.333333333333333,1.16555533333333,0.332778}, + {1.18111066666667,0.334444666666667,1.17388866666667,0.333333333333333}, + {1.18666666666667,0.336111333333333,1.18111066666667,0.334444666666667}, + {1.192222,0.338333333333334,1.18666666666667,0.336111333333333}, + {1.19611066666667,0.341666666666667,1.192222,0.338333333333334}, + {1.19888866666667,0.345555333333333,1.19611066666667,0.341666666666667}, + {1.2,0.35,1.19888866666667,0.345555333333333}, + {1.2,0.355,1.2,0.35}, + {1.199444,0.360555333333333,1.2,0.355}, + {1.19833333333333,0.366111333333333,1.199444,0.360555333333333}, + {1.19666666666667,0.371111333333333,1.19833333333333,0.366111333333333}, + {1.195,0.376666666666667,1.19666666666667,0.371111333333333}, + {1.19333333333333,0.381666666666667,1.195,0.376666666666667}, + {1.19166666666667,0.386111333333333,1.19333333333333,0.381666666666667}, + {1.19,0.39,1.19166666666667,0.386111333333333}, + {1.18888866666667,0.393333333333333,1.19,0.39}, + {1.18666666666667,0.395555333333334,1.18888866666667,0.393333333333333}, + {0,0,0,0} +}; + +double Icon38[][4] = { + {0.166666666666667,0,0,1}, + {0.166666666666667,1,0.333333333333333,0}, + {0,0,0,0} +}; + +double Icon39[][4] = +{ + {0.25,0.25,0,0.5}, + {0.5,0.5,0.25,0.25}, + {0.25,0.75,0.5,0.5}, + {0,0.5,0.25,0.75}, + + { 0, 0, .25, .001 }, // ----- + { .001, .25, .25, 0.249 }, // | + { .25, 0.249, 0, .25 }, // ----- + { 0, 0, 0, .25 }, // | +// { 0, .25, .25, .25 }, + {0,0,0,0} +}; + + +typedef double LineType[4]; +typedef LineType *IconType; +IconType Icons[] = { + Icon0, + Icon1, + Icon2, + Icon3, + Icon4, + Icon5, + Icon6, + Icon7, + Icon8, + Icon9, + Icon10, + Icon11, + Icon12, + Icon13, + Icon14, + Icon15, + Icon16, + Icon17, + Icon18, + Icon19, + Icon20, + Icon21, + Icon22, + Icon23, + Icon24, + Icon25, + Icon26, + Icon27, + Icon28, + Icon29, + Icon30, + Icon31, + Icon32, + Icon33, + Icon34, + Icon35, + Icon36, + Icon39, + Icon39, + Icon39, + Icon38 +}; + +double IconWidths[] = { + 0.5, + 0.5, + 0.333333333333333, + 0.5, + 0.5, + 0.541666666666667, + 0.541666666666667, + 0.166666666666667, + 0.5, + 0.5, + 0.707221999999999, + 0.75, + 0.318888666666666, + 0.106111333333333, + 0.312222, + 0.315555333333333, + 0.291666666666667, + 0.312777333333333, + 0.316111333333333, + 0.296666666666667, + 0.273333333333333, + 0.31, + 0.166666666666667, + 0.166666666666667, + 0.375, + 0.333333333333333, + 0.939999999999998, + 1, + 0.356111333333333, + 1, + 0.666666666666667, + 0.5, + 0.5, + 0.583333333333333, + 0.583333333333333, + 0.583333333333333, + 0.920556, + .5, + .5, + .5, +}; + + diff --git a/noatun-plugins/synaescope/main.cpp b/noatun-plugins/synaescope/main.cpp new file mode 100644 index 0000000..4b4a2a5 --- /dev/null +++ b/noatun-plugins/synaescope/main.cpp @@ -0,0 +1,196 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <pwd.h> +#include <string.h> +#include <math.h> + +#include "syna.h" + +void Core::allocOutput(int w,int h) +{ +#if 0 + delete[] output; + delete[] lastOutput; + delete[] lastLastOutput; + output = new unsigned char[w*h*2]; + lastOutput = new unsigned char[w*h*2]; + lastLastOutput = new unsigned char[w*h*2]; + memset(output,32,w*h*2); + memset(lastOutput,32,w*h*2); + outWidth = w; + outHeight = h; +#endif + + outputBmp.size(w,h); + lastOutputBmp.size(w,h); + lastLastOutputBmp.size(w,h); + polygonEngine.size(w,h); + outWidth = w; + outHeight = h; +} + +void Core::toDefaults() +{ + fadeMode = Stars; + pointsAreDiamonds = true; + + brightnessTwiddler = 0.33; //0.125; + starSize = 0.125; + + fgRedSlider=0.0; + fgGreenSlider=0.5; + bgRedSlider=1.0; + bgGreenSlider=0.2; +} + +Core::Core() : StereoScope(40) +{ + setSamples(NumSamples); + core = this; + int i; + + data = new sampleType[NumSamples*2+16]; + + for(i=0;i<NumSamples;i++) + { + negSinTable[i] = -sin(3.141592*2.0/NumSamples*i); + cosTable[i] = cos(3.141592*2.0/NumSamples*i); + bitReverse[i] = bitReverser(i); + } +} + +bool Core::init ( void ) +{ + windX = 1; + windY = 1; + + screen = new SdlScreen; + if (!screen->init(windX,windY,windWidth,windHeight,false)) + { + delete screen; + screen = 0; + return false; + } + + allocOutput(outWidth,outHeight); + + setStarSize(starSize); + + interface = new Interface; + return true; +} + +Core::~Core() +{ + delete interface; + + screen->end(); + delete screen; +} + +bool Core::go() +{ + time_t startTime = time(0); + time_t currentTime = time(0); + time_t lastTime = 0; + char fpsString[32]; + int frames = 0; + double fps=0; + +// printf("%u\n", static_cast<SdlScreen *>(screen)->winID()); +// fflush(stdout); + + while (1) + { + fade(); + + if (!calculate()) + break; + + if (!interface->go()) break; + + screen->show(); + + frames++; + currentTime = time(0) - startTime; + + if ((currentTime - lastTime) > 1) // update fps display every 2 seconds + { + fps = double(frames) / currentTime; + lastTime = currentTime; + snprintf(fpsString, 32, "Noatun - Synaescope: %.2f fps", fps); + screen->updateWindowCaption(&fpsString[0]); + } + if (fps>25.0) + usleep(5); + } + + return true; +} + +bool start() +{ + return true; +} + +void error(const char *str, bool) +{ + fprintf(stderr, "synaescope: Error %s\n",str); +// if (syscall) +// fprintf(stderr,"(reason for error: %s)\n",strerror(errno)); + exit(1); +} + +void warning(const char *str, bool) +{ + fprintf(stderr, "synaescope: Possible error %s\n",str); +// if (syscall) +// fprintf(stderr,"(reason for error: %s)\n",strerror(errno)); +} + +#include <kinstance.h> +#include <kglobal.h> +#include <kconfig.h> + +int main(void) +{ + KInstance in("noatunsynaescope"); + + core = new Core; + + KConfig mConfig("noatunrc"); + mConfig.setGroup("Synaescope"); + + core->windWidth = mConfig.readNumEntry("xResolution", 320); + core->windHeight = mConfig.readNumEntry("yResolution", 240); + + if ( core->init() ) + core->go(); + + delete core; + exit(0); +} diff --git a/noatun-plugins/synaescope/polygon.h b/noatun-plugins/synaescope/polygon.h new file mode 100644 index 0000000..5c10acd --- /dev/null +++ b/noatun-plugins/synaescope/polygon.h @@ -0,0 +1,106 @@ +#include <string.h> + +template<class Pixel> +struct Bitmap +{ + int width, height, extra; + Pixel *data; + + Bitmap(int e=0) : extra(e), data(0) { }; + ~Bitmap() { delete[] data; }; + + void size(int w,int h) { + delete[] data; + width = w; + height = h; + data = new Pixel[w*h+extra]; + clear(); + } + + void clear() { + memset(data,0,sizeof(Pixel)*(width*height+extra)); + } +}; + +template<class Pixel, class Combiner, int superSampleShift> +struct PolygonEngine : public Bitmap<Pixel> +{ + PolygonEngine() : Bitmap<Pixel>(1) { } + +#define super (1<<superSampleShift) + void apply(Pixel *dest) + { + Pixel sum=0; + int count = this->width*this->height; + Pixel *src = this->data; + while(count--) { + sum += *(src++); + if (sum) + *dest = Combiner::combine(sum,*dest); + dest++; + } + } + + void add(Pixel color,int x,int y) + { + if (y < 0) return; + if (y >= this->height) return; + if (x < 0) x = 0; + if (x > this->width) x = this->width; + this->data[x+y*this->width] += color; + } + + /* Color is char[layers] */ + + // zwoosh, yknow, it goes... zwoosh an all these bars and lines and + // crap intersect. + Pixel colorTable[2][super+1]; + void pen(Pixel color) { + for(int i=0;i<super+1;i++) + { + colorTable[0][i] = color*i; + colorTable[1][i] = -(color*i); + } + } + + void line(int x1,int y1,int x2,int y2) { + Pixel *colors; + if (y2 < y1) + { + int temp; + temp = x2; x2 = x1; x1 = temp; + temp = y2; y2 = y1; y1 = temp; + colors = colorTable[1]; + } + else + { + if (y1 == y2) return; + + colors= colorTable[0]; + } + + int slope = (x1-x2 << 16)/(y1-y2); + int x = x1<<16, y = y1; + while(y < y2) + { + add(colors[super-((x>>16)&(super-1))], + x>>(16+superSampleShift),y>>superSampleShift); + add(colors[(x>>16)&(super-1)], + 1+(x>>(16+superSampleShift)),y>>superSampleShift); + x += slope; + y++; + } + } + + void icon(double icon[][4], Pixel color, double x, double y, double scaleX, double scaleY) + { + pen(color); + x *= super; + y *= super; + scaleX *= super; + scaleY *= super; + for(int i=0;icon[i][1] != icon[i][3];i++) + line(int(icon[i][0]*scaleX+x),int(icon[i][1]*scaleY+y), int(icon[i][2]*scaleX+x), int(icon[i][3]*scaleY+y)); + } +#undef super +}; diff --git a/noatun-plugins/synaescope/sdlwrap.cpp b/noatun-plugins/synaescope/sdlwrap.cpp new file mode 100644 index 0000000..dc7ff63 --- /dev/null +++ b/noatun-plugins/synaescope/sdlwrap.cpp @@ -0,0 +1,207 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <string.h> +#include "syna.h" +#include <iostream> +#include <SDL_syswm.h> +#include "SDL.h" + +#ifdef Bool +#undef Bool +#endif + +static SDL_Surface *surface; + +SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) +{ + SDL_Surface *screen; + + /* Set the video mode */ + screen = SDL_SetVideoMode(w, h, bpp, flags); + + return screen; +} + +void SdlScreen::setPalette(unsigned char *palette) +{ + SDL_Color sdlPalette[256]; + + for(int i=0;i<256;i++) { + sdlPalette[i].r = palette[i*3+0]; + sdlPalette[i].g = palette[i*3+1]; + sdlPalette[i].b = palette[i*3+2]; + } + + SDL_SetColors(surface, sdlPalette, 0, 256); +} + +bool SdlScreen::init(int,int,int width,int height,bool fullscreen) +{ + Uint32 videoflags; + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) + { + fprintf(stderr, "Could not initialize SDL library: %s\n", SDL_GetError()); + return false; + } + + updateWindowCaption("Noatun - Synaescope"); + + /* See if we try to get a hardware colormap */ + videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0); + + surface = CreateScreen(width, height, 8, videoflags); + if (!surface) + { + error("requesting screen dimensions"); + } + + core->outWidth = width; + core->outHeight = height; + + SDL_EnableUNICODE(1); + SDL_ShowCursor(0); + + return true; +} + +void SdlScreen::end() +{ + SDL_Quit(); +} + +bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) +{ + SDL_Event event; + keyHit = 0; + mouseButtons=0; + + while ( SDL_PollEvent(&event) > 0 ) + { + switch (event.type) + { + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if ( event.button.state == SDL_PRESSED ) + mouseButtons |= 1 << event.button.button; + else + mouseButtons &= ~( 1 << event.button.button ); + + case SDL_MOUSEMOTION : + mouseX = event.motion.x; + mouseY = event.motion.y; + break; + + case SDL_KEYDOWN: + /* Ignore key releases */ + if ( event.key.state == SDL_RELEASED ) + break; + + if(event.key.keysym.sym == SDLK_SPACE) + { + mouseButtons=0; + fullscreen(); + } + + if (event.key.keysym.unicode > 255) + break; + + keyHit = event.key.keysym.unicode; + return true; + + case SDL_QUIT: + //keyHit = 'q'; + return false; + break; + } + } + return true; +} + +void SdlScreen::fullscreen() +{ + SDL_WM_ToggleFullScreen(surface); +} + +int SdlScreen::sizeUpdate() { return 0; } + +void SdlScreen::show() +{ + SDL_LockSurface(surface); + + register unsigned long *ptr2 = (unsigned long*)core->output(); + unsigned long *ptr1 = (unsigned long*)( surface->pixels ); + int i = core->outWidth*core->outHeight/4; + + do { + // Asger Alstrup Nielsen's (alstrup@diku.dk) + // optimized 32 bit screen loop + register unsigned int const r1 = *(ptr2++); + register unsigned int const r2 = *(ptr2++); + + //if (r1 || r2) { +#ifdef LITTLEENDIAN + register unsigned int const v = + ((r1 & 0x000000f0ul) >> 4) + | ((r1 & 0x0000f000ul) >> 8) + | ((r1 & 0x00f00000ul) >> 12) + | ((r1 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r2 & 0x000000f0ul) << 12) + | ((r2 & 0x0000f000ul) << 8) + | ((r2 & 0x00f00000ul) << 4) + | ((r2 & 0xf0000000ul))); +#else + register unsigned int const v = + ((r2 & 0x000000f0ul) >> 4) + | ((r2 & 0x0000f000ul) >> 8) + | ((r2 & 0x00f00000ul) >> 12) + | ((r2 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r1 & 0x000000f0ul) << 12) + | ((r1 & 0x0000f000ul) << 8) + | ((r1 & 0x00f00000ul) << 4) + | ((r1 & 0xf0000000ul))); +#endif + //} else ptr1++; + } while (--i); + + SDL_UnlockSurface(surface); + SDL_UpdateRect(surface, 0, 0, 0, 0); +} + +void SdlScreen::updateWindowCaption(const char *string) +{ + SDL_WM_SetCaption(string, "synaescope"); +} +/* +int SdlScreen::winID() +{ + SDL_SysWMinfo info; + info.version.major = SDL_MAJOR_VERSION; + info.subsystem = SDL_SYSWM_X11; + + SDL_GetWMInfo(&info); + return info.info.x11.wmwindow; +}*/ diff --git a/noatun-plugins/synaescope/symbol.h b/noatun-plugins/synaescope/symbol.h new file mode 100644 index 0000000..53137c0 --- /dev/null +++ b/noatun-plugins/synaescope/symbol.h @@ -0,0 +1,1021 @@ +#define SYMBOLSWIDTH 586 +#define SYMBOLSHEIGHT 50 +unsigned char Symbols[586*50] = { + 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,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,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,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,0,0,0,0,0,0,0,0,132,241,72,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,13,30,37,31,24,5,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,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,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,0,0,0, + 0,0,0,0,0,0,0,0,132,254,237,72,0,0,0,0,0,0,0,0,0,0,0,1,7,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,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,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,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,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,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,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,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,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,10,87, + 176,225,244,246,244,238,206,135,39,1,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,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,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,0,0,0,0,0,0,0,0,132,254, + 254,236,73,0,0,0,0,0,0,0,0,0,0,3,154,138,58,9,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,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,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,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,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,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,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,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,36,211,80,0,0,0,0,0,0,0,0,0,0,0,2,77,204,252,254,254,254, + 254,254,254,254,254,239,145,21,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,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,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,0,0,0,0,0,0,0,132,254,255,245, + 215,72,0,0,0,0,0,0,0,0,0,0,115,254,249,213,138,58,8,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,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,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,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,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,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,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,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,36,212,253,80,0,0,0,0,0,0,0,0,0,0,7,136,247,254,254,254,254, + 254,254,254,254,254,254,254,254,208,52,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,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,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,0,0,0,0,0,0,132,254, + 255,225,66,210,72,0,0,0,0,0,0,0,0,0,40,244,254,254,254,249,214,137,57,8, + 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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,37,212,254,254,80,0,0,0,0,0,0,0,0,0,4,150,253,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,227,50,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,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,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, + 0,0,0,0,0,132,254,255,225,10,55,217,71,0,0,0,0,0,0,0,0,4,194,254,255,255, + 255,255,254,250,214,137,57,10,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,80,0,0, + 0,0,0,0,0,0,0,100,250,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,203,17,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,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,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,0,0,0,0,132,254,255,225,10,1,196,187,1, + 0,0,0,0,0,0,0,0,115,254,255,255,255,255,255,254,254,254,249,212,137,57, + 10,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,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,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,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,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, + 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,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,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,36,211,254,254,254,254,80,0,0,0,0,0,0,0,0,29,230,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,130,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,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,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,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,41,244,255,255, + 255,255,255,255,255,255,254,254,254,249,212,137,58,8,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,35,212,254,254,254, + 254,254,80,0,0,0,0,0,0,0,0,134,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,232,26,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, + 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,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,0,0,0,132,254,255, + 225,10,1,196,190,1,0,0,0,0,0,0,0,0,4,196,254,255,255,255,255,255,255,255, + 255,255,255,255,254,254,249,212,137,57,8,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,0, + 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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, + 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,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,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,36,212,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,16,225,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,255,255,255,254,112,0,0,0,0,0,0,0,3,12,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,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,16, + 0,0,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,0,0,111,155,155,111,0,0,0,16,148,155, + 155,58,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,132,254, + 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,115,253,254,255,255,255,255,255, + 255,255,255,255,255,255,255,254,254,254,250,194,15,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,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,38,179, + 38,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,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,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,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,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, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,62,251,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,254,182,1,0,0,0,0,0,0,18,171,19,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,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,1,162,44,0,0,0,0,0,37,159,11,0,0,0,0,0,0,0,0,0,0,1,182,254, + 254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,0,23,136,1,0,0,0,0, + 0,68,92,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 40,244,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254, + 232,64,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,0,0,0,0,0,0,9,151,253,245,99,1,0,0, + 6,50,106,155,166,174,166,162,115,52,11,0,0,0,38,213,254,213,39,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,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,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,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,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,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,108,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,255,254,223,9,0,0,0,0,0,0,18,239,185,19,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,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,1,197,219,45,0,0,0,0,38,246,166,11,0,0,0,0,0,0,0,0,0,1,182,254,254, + 182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,23,192,196,1,0,0,0,0,68, + 233,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 4,196,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,232,65, + 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,0,0,0,0,0,0,20,180,252,255,254,244,95,10,97, + 197,248,254,254,255,255,255,254,254,248,210,118,20,36,212,254,255,254,213, + 39,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,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,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,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,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, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,254,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,117,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,255,228,11,0,0,0,0,0,0,18,240,254,185, + 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,0,0,0,0,0,0,0,1,197,254,218,44,0,0,0,38,247,253,165,11,0,0,0,0,0,0, + 0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,23,192, + 254,196,1,0,0,0,67,234,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190, + 1,0,0,0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,255, + 255,254,233,65,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,0,0,0,0,0,0,19,186,254,255, + 254,254,225,74,34,220,254,254,255,255,255,255,255,255,255,254,254,248,95, + 44,205,254,254,255,254,213,38,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254, + 254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,122,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,228, + 11,0,0,0,0,0,0,18,240,254,254,186,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 17,187,197,197,197,197,197,195,46,0,0,0,0,0,0,0,142,197,197,197,197,197, + 197,107,0,0,0,0,0,0,0,81,196,197,197,197,197,197,197,197,197,197,197,197, + 197,197,197,197,197,197,197,197,197,194,37,0,0,0,0,0,0,1,197,254,254,219, + 44,0,0,38,247,254,253,165,11,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,0,0,22,192,254,254,196,1,0,0,66,235,254,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,39,246, + 254,255,255,255,255,255,255,255,255,255,255,254,234,64,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,0,0,0,0,0,0,17,187,254,255,254,254,204,34,0,0,47,222,254,254, + 255,255,255,255,255,255,254,248,113,2,0,18,175,254,254,255,254,214,36,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,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,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,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,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,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,36,211,254,254,254,254,254,254,254,254,254,254, + 254,80,0,0,0,0,0,0,0,114,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,255,255,255,254,227,11,0,0,0,0,0,0,18,240,255,254,254, + 185,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,220,43,0,38,247,254,254,253,166, + 11,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0, + 22,193,254,254,254,196,1,0,67,234,254,255,254,111,0,0,0,0,0,0,0,132,254, + 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,3,196,254,255,255,255,255,255, + 255,255,255,255,255,236,64,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,0,0,0,0,0,0,0,29, + 211,254,255,254,204,30,0,0,0,0,47,221,254,255,255,255,255,255,254,243,112, + 2,0,0,0,14,175,253,255,254,231,54,0,0,0,0,0,0,1,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,4,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, + 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,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,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,2,5,5,5,1, + 0,0,0,0,0,0,0,0,0,0,0,5,5,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,255, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,74,253,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,254, + 194,2,0,0,0,0,0,0,18,240,255,255,255,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254, + 254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254, + 254,254,219,44,38,247,254,254,254,253,166,11,0,0,0,0,0,1,182,254,254,182, + 1,0,0,27,243,254,254,96,0,0,0,0,0,0,23,192,254,254,254,254,196,1,68,233, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,231,53, + 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,0,0,0,0,0,0,0,0,36,210,254,225,33,0,0,0,0,0, + 0,48,221,254,254,255,255,254,237,78,1,0,0,0,0,0,15,198,254,231,61,0,0,0, + 0,0,0,0,73,213,214,214,214,214,214,214,214,213,214,214,214,214,214,214, + 214,214,214,214,214,214,214,214,213,214,214,214,214,214,214,214,214,214, + 156,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,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,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,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,8,145,213,214,213,133,5,0,0,0,0,0,0,0,0,0,88,211,213, + 214,181,24,0,0,0,0,3,11,11,11,11,11,11,11,40,210,254,255,255,254,254,254, + 254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,26,235,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,131,0,0,0,0, + 0,0,0,18,240,255,255,255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, + 242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254, + 138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254, + 254,218,83,247,254,254,254,254,253,165,11,0,0,0,0,1,182,254,254,182,1,0, + 0,27,243,254,254,96,0,0,0,0,0,23,191,254,254,254,254,254,197,69,233,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,40,245,255,255,255,255,255,255,255,255,255,255,254,226, + 52,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,0,0,0,0,0,0,0,0,37,205,79,0,0,0,0,0,0,0, + 0,47,222,254,254,254,238,76,0,0,0,0,0,0,0,0,45,212,62,0,0,0,0,0,0,0,0,87, + 253,185,168,168,168,168,168,171,243,249,175,168,204,254,255,254,220,168, + 170,239,243,171,168,220,254,195,168,168,168,168,168,169,236,185,1,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,10,11,11,11,5, + 0,0,0,0,0,0,0,0,0,0,7,11,11,11,9,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,11,11,11,11,4,0,0,0,0,0,0,0,0,0,0,8,11,11,11,8,0,0,0,0,0, + 0,0,0,0,0,4,11,11,11,11,1,0,0,0,0,0,0,0,0,0,1,11,11,11,11,4,0,0,0,0,0,0, + 0,0,0,0,8,11,11,11,7,0,0,0,0,0,0,0,0,0,0,5,11,11,11,10,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,8,151,252,254,254,254,251,136,2,0, + 0,0,0,0,0,0,88,242,254,224,246,254,194,22,0,0,0,64,228,229,229,229,229, + 229,229,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,1,163,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,255,244,45,0,0,0,0,0,0,0,18,240,255,255,255,255,254, + 254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,237,253,254,254,254, + 254,254,253,165,11,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0, + 0,0,22,191,254,254,254,254,254,254,233,235,254,254,254,255,255,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,4,196, + 255,255,255,255,255,255,255,255,255,255,255,254,225,52,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,0,0,0,0,0,0,0,0,21,4,0,0,0,0,0,0,0,0,0,48,222,254,239,77,0, + 0,0,0,0,0,0,0,0,1,24,0,0,0,0,0,0,0,0,0,87,251,50,0,0,0,0,0,10,223,251,67, + 0,53,246,255,253,99,0,31,241,222,9,0,153,253,80,0,0,0,0,0,2,200,185,1,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,87,224,229, + 229,229,179,18,0,0,0,0,0,0,0,0,37,203,229,229,229,214,55,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,226,229,229,229,170,14,0,0,0,0,0,0, + 0,0,45,208,229,229,229,209,47,0,0,0,0,0,0,0,0,13,167,229,229,229,227,101, + 1,0,0,0,0,0,0,0,1,109,227,229,229,229,161,11,0,0,0,0,0,0,0,0,52,213,229, + 229,229,205,39,0,0,0,0,0,0,0,0,16,177,229,229,229,225,90,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,65,251,254,255,255,255,255,238,15, + 0,0,0,0,0,0,11,225,254,207,34,104,247,253,80,0,0,0,71,253,255,255,255,255, + 254,254,254,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,0,49,243,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,254,161,1,0,0,0,0,0,0,0,18,240,255,255,255,255,254, + 254,254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,253,165,11,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0, + 0,0,22,192,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0, + 0,116,253,254,255,255,255,254,235,219,254,255,255,255,254,226,53,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,21,21,21,21,21,21,21,21,21, + 21,21,21,21,21,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,114,2,0,0,0,0,0, + 0,0,0,0,47,207,76,0,0,0,0,0,0,0,0,0,0,80,130,0,0,0,0,0,0,0,0,0,87,251,50, + 0,0,0,0,0,9,223,254,161,0,5,193,254,235,28,0,116,254,222,9,0,153,254,79, + 0,0,0,0,0,1,200,185,1,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,88,242,254,254,255,255,254,185,18,0,0,0,0,0,0,37,214,254,254, + 255,255,254,228,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,246,254, + 254,255,255,254,175,14,0,0,0,0,0,0,44,220,254,254,255,255,254,222,47,0, + 0,0,0,0,0,13,172,254,254,255,255,254,246,101,1,0,0,0,0,0,1,109,248,254, + 254,255,255,253,165,11,0,0,0,0,0,0,53,226,254,254,255,255,254,216,39,0, + 0,0,0,0,0,17,182,254,254,255,255,254,243,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,69,253,254,255,255,255,255,239,16,0,0,0,0,0,0,12, + 230,212,32,0,1,113,253,81,0,0,0,71,253,254,255,255,255,254,255,255,255, + 255,254,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0, + 2,141,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 229,36,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,254,254,184,19,0, + 0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183, + 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0, + 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253, + 165,11,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,22,192,254,254,254, + 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,41,244,254,255,255,254, + 233,66,37,212,254,255,255,255,254,226,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,108,240,241,241,241,241,241,241,241,241,241,241,241,241, + 241,224,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,249,115,2,0,0,0,0,0,0,0, + 29,99,119,113,55,4,0,0,0,0,0,0,0,80,240,230,22,0,0,0,0,0,0,0,0,87,251,50, + 0,0,0,0,0,9,223,255,228,18,0,97,253,165,1,4,196,254,222,9,0,153,254,79, + 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,53,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,6,176,254,255,255,255,255,254,242,110,18,0,0,0,0,0,106,250,255, + 255,255,255,254,252,154,44,0,0,0,0,10,51,0,0,0,0,0,0,0,3,56,2,0,0,0,1,64, + 193,254,255,255,255,255,254,237,57,0,0,0,0,0,39,143,251,255,255,255,255, + 254,251,123,0,0,0,0,0,0,54,236,254,255,255,255,254,254,196,66,1,0,0,0,2, + 69,202,254,255,255,255,255,254,234,98,11,0,0,0,0,43,151,252,255,255,255, + 255,254,251,137,35,0,0,0,0,17,108,241,254,255,255,255,254,254,187,61,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255, + 255,254,255,255,254,255,254,255,254,254,254,254,254,254,254,254,254,254, + 80,0,0,0,0,0,0,0,0,0,13,192,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,244,84,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,253,165,11,1,182,254,254,182,1,0,0,27,243,254,254,96, + 0,23,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 0,0,0,4,196,254,255,254,233,66,0,0,37,211,254,255,255,255,254,225,34,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53, + 248,254,248,115,2,0,0,0,0,3,112,186,152,158,153,173,163,23,0,0,0,0,0,80, + 240,254,253,85,0,0,0,0,0,0,0,0,87,251,50,0,5,36,37,37,45,228,255,252,79, + 0,20,226,73,0,40,244,254,222,9,0,153,253,105,37,15,0,1,32,38,208,185,1, + 0,0,0,0,0,0,0,0,0,0,0,0,8,150,240,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,186, + 253,253,253,253,242,144,228,183,19,0,0,0,0,3,126,249,253,253,253,251,170, + 192,227,55,0,0,10,161,237,76,0,0,0,0,0,3,123,243,112,2,0,1,98,241,163,201, + 253,253,253,253,238,78,0,0,0,0,0,45,219,201,162,250,253,253,253,250,140, + 6,0,0,0,0,0,0,0,75,237,253,253,253,253,203,161,242,102,1,0,2,109,243,157, + 207,253,253,253,253,234,143,236,164,11,0,0,52,225,194,169,251,253,253,253, + 250,158,206,214,40,0,0,17,181,229,143,241,253,253,253,253,196,167,240,91, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255, + 255,254,254,255,254,255,254,254,254,254,254,254,254,254,254,254,254,254, + 80,0,0,0,0,0,0,0,0,0,0,24,188,253,254,254,254,254,254,254,254,254,254,254, + 254,254,237,97,1,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,254, + 254,254,184,18,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0, + 0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,253,164,12,182,254,254,182,1,0,0,27,243,254,254,96, + 22,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255, + 255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,116,254,254,233,66,0,0,0,0,37,212,254,255,254,253,161,9,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,253,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,234,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109, + 254,254,254,248,115,2,0,0,0,113,161,193,249,253,252,224,149,171,14,0,0, + 0,80,239,254,255,254,154,0,0,0,0,0,0,0,0,87,251,50,0,38,240,247,247,247, + 253,255,254,165,1,0,115,12,0,121,254,255,222,9,0,153,254,249,247,102,0, + 8,214,247,253,185,1,0,0,0,0,0,0,0,0,0,0,0,2,145,252,254,241,58,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,17,67,68,68,68,93,228,254,254,171,2,0,0,0,0,3,59,68, + 68,68,73,190,254,254,226,27,3,156,253,254,237,48,0,0,0,0,115,250,254,247, + 86,0,87,245,254,251,135,67,68,68,68,46,0,0,0,0,0,34,219,254,254,192,67, + 68,68,68,62,6,0,0,0,0,0,0,0,0,0,45,68,68,68,68,149,251,254,245,74,0,99, + 247,254,250,126,67,68,68,68,105,237,254,253,146,0,41,225,254,254,182,66, + 68,68,68,78,205,254,254,211,15,7,179,254,254,229,78,68,68,68,68,158,252, + 254,243,63,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,69,253,254,254,254, + 254,254,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254, + 255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,0,0,0,0,11,133,239,254,254,254,254,254,254,254, + 254,254,252,200,55,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,255,255,254,254,185,17,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253, + 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,253,165,193,254,254,182,1,0,0,27,243,254, + 254,118,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,41,244,234,65,0,0,0,0,0,0,36,213,254,253,161,10,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 159,254,255,255,254,248,115,2,0,31,186,194,254,255,255,254,254,238,162, + 105,0,0,80,239,254,255,255,255,201,3,0,0,0,0,0,0,0,87,251,50,0,16,102,116, + 246,254,255,255,255,236,26,0,10,0,7,208,254,255,222,9,0,153,255,255,254, + 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,254,255,254,88,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0, + 0,0,23,241,254,255,250,46,9,223,254,255,253,75,0,0,0,1,184,254,255,254, + 122,0,152,254,255,255,154,0,0,0,0,0,0,0,0,0,0,73,253,254,255,224,10,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,254,255,254,108,0,166,254,255,254, + 140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,254, + 255,243,26,20,240,254,255,252,49,0,0,0,3,208,254,255,254,95,0,0,0,0,0,0, + 0,0,0,68,189,198,107,5,0,0,0,0,0,0,0,0,69,252,144,104,105,104,183,239,16, + 0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254, + 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,0,0,0,0,0,0,37,147,225,249,254,254,253,252,242,193,87,8,0,0,0, + 0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,254,254, + 184,18,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183, + 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0, + 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,252,254,254,182,1,0,0,27,243,254,254,242,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0, + 0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,176, + 65,0,0,0,0,0,0,0,0,36,211,160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,109,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,233,29,0,0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,249,115, + 2,103,151,250,255,255,255,255,255,254,169,172,3,80,240,254,255,255,255, + 255,211,5,0,0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,253,94,0, + 0,0,53,248,255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0, + 0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,9, + 223,255,255,253,75,0,0,0,1,184,255,255,254,122,0,153,255,255,255,154,0, + 0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,197,255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255, + 187,1,87,254,255,255,214,6,0,0,0,43,249,255,255,243,26,20,240,255,255,252, + 49,0,0,0,3,209,255,255,254,95,0,0,0,0,0,0,0,0,34,233,254,254,251,82,0,0, + 0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55, + 252,81,0,0,0,71,253,254,255,255,254,254,254,255,254,255,254,254,254,254, + 254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,52, + 83,84,84,73,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255, + 255,255,255,255,255,254,254,254,156,2,0,0,0,0,0,0,23,242,255,255,255,255, + 255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0, + 104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,182,1,0,0,27, + 243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,26,10,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,218,254,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0, + 1,178,255,255,255,255,255,255,249,112,123,158,254,255,255,255,255,255,254, + 187,177,81,240,254,255,255,255,255,255,211,5,0,0,0,0,0,0,0,87,251,50,0, + 0,0,19,240,255,255,255,255,254,161,0,0,0,116,254,255,255,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,255,255,254, + 88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0, + 0,0,0,0,23,242,255,255,250,46,9,223,255,255,253,75,0,0,0,1,184,255,255, + 254,122,0,153,255,255,255,154,0,0,0,0,0,0,0,0,0,0,74,253,255,255,224,10, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,0,166,255,255, + 254,140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249, + 255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,0,0, + 0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,121,73,73,73,168, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,255,255,255, + 255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254, + 80,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,18,240,255,255,255,255,255,255,255,255,255,255,255,254,218,43,0,0, + 0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254, + 254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,182,1,0,0,27,243,254,254,252,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,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,108,251,253,253,253, + 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,230,29, + 0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,254,248,112,120,153,253, + 255,255,255,255,255,254,181,176,81,240,254,255,255,255,255,255,211,5,0, + 0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,254,113,0,0,0,69,251, + 255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0, + 0,0,0,0,5,211,254,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,89,254, + 255,255,211,4,0,0,0,0,0,0,1,1,1,23,240,255,255,250,45,9,221,254,255,253, + 75,1,1,1,2,181,254,255,254,122,0,150,254,255,254,154,1,1,1,1,0,0,0,0,0, + 0,71,253,255,255,224,10,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,194,254,255, + 254,108,0,163,254,255,254,140,1,1,1,1,116,254,255,254,187,1,84,253,255, + 255,214,7,1,1,1,42,248,255,255,242,26,19,238,255,255,252,49,0,0,0,3,206, + 254,255,254,94,0,0,0,0,0,0,0,0,47,244,254,254,253,104,0,0,0,0,0,0,0,0,69, + 253,252,252,252,252,253,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0, + 0,0,71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254, + 254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,3,81,94,94,94,94,94, + 94,94,94,94,93,19,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253, + 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,205,208,254,254,182,1,0,0,27,243,254, + 254,145,224,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,11,134,158,158,158,158,158,158,158,158,158,158,158,158, + 158,158,158,158,158,158,158,158,158,66,0,0,0,0,0,0,0,0,0,0,0,0,167,254, + 255,255,255,254,248,115,2,62,170,229,254,254,255,255,255,251,159,145,1, + 80,240,254,255,255,255,255,208,4,0,0,0,0,0,0,0,87,251,50,0,14,91,106,245, + 254,255,255,255,243,39,0,2,0,14,222,255,255,222,9,0,153,255,255,254,106, + 0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,90,243,254,214,32,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,54,184,190,190,190,155,195,254,250,124,1,0,0,0,0,17, + 161,190,190,190,176,157,250,254,187,14,1,101,246,254,210,142,190,190,190, + 188,140,235,254,229,52,0,46,222,254,240,136,187,190,190,190,127,4,0,0,0, + 0,14,174,254,252,162,169,190,190,190,167,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 75,239,254,224,43,0,54,227,254,236,135,187,190,190,190,148,208,254,247, + 100,0,17,184,254,251,156,173,190,190,190,169,168,253,253,167,7,2,123,250, + 254,190,15,0,0,0,0,85,242,254,218,35,0,0,0,0,0,0,0,0,1,115,233,237,163, + 14,0,0,0,0,0,0,0,0,69,252,114,63,63,63,164,239,16,0,0,0,0,0,0,12,230,146, + 0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,255,254,255,254,255, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,217, + 250,250,250,250,250,250,250,250,250,248,51,0,0,0,0,0,0,0,0,0,0,0,0,18,240, + 255,255,255,255,255,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,204,31,182,254,254, + 182,1,0,0,27,243,254,254,96,49,223,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10, + 1,196,190,1,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,31,245,252,250,250,250,250,250,250, + 250,250,250,250,250,250,250,250,250,250,250,250,250,254,127,0,0,0,0,0,0, + 0,0,0,0,0,0,121,254,255,255,254,248,115,2,0,5,170,149,242,254,254,254,252, + 181,184,44,0,0,80,239,254,254,255,254,166,0,0,0,0,0,0,0,0,87,251,50,0,38, + 243,250,250,250,254,254,254,187,4,0,82,6,0,144,254,254,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,90,204,37,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,55,227,254,254,255,255,253,168,191,126,3,0,0, + 0,0,17,184,254,254,255,255,254,207,157,184,19,0,0,1,101,203,155,250,254, + 254,255,254,238,141,211,57,0,0,0,47,207,142,233,254,254,255,255,252,137, + 5,0,0,0,0,14,173,164,199,254,254,255,255,254,195,24,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,76,208,49,0,0,0,55,210,141,237,254,254,255,254,250,157,202,104, + 1,0,0,17,182,159,205,254,254,255,255,254,194,168,166,12,0,0,3,123,186,21, + 0,0,0,0,0,0,86,205,41,0,0,0,0,0,0,0,0,0,0,0,15,16,1,0,0,0,0,0,0,0,0,0,69, + 252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71, + 253,254,255,254,254,254,254,254,254,255,254,254,254,254,254,254,254,254, + 254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,1,38,44,44,44,44,44,44,44,44, + 44,44,9,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255, + 254,218,44,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0, + 0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,251, + 47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,204,30,1,182,254,254,182,1,0,0,27,243,254,254,96,0,49,223, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,31, + 245,137,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,62,243,127, + 0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,254,248,115,2,0,0,0,27,177,159,174,192, + 185,159,183,80,0,0,0,0,80,239,254,254,254,99,0,0,0,0,0,0,0,0,87,251,50, + 0,6,43,44,44,52,229,254,253,98,0,11,209,53,0,56,249,254,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,37,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,31,192,254,255,255,255,255,254,248,85,3,0,0,0,0,0, + 118,253,255,255,255,255,254,254,159,31,0,0,0,0,1,63,241,254,255,255,255, + 254,254,215,54,0,0,0,0,0,24,201,254,255,255,255,255,254,245,85,5,0,0,0, + 0,26,146,253,255,255,255,255,254,253,144,18,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 38,0,0,0,0,0,53,212,254,255,255,255,255,254,242,89,5,0,0,0,0,11,148,254, + 255,255,255,255,254,253,139,24,0,0,0,0,9,31,0,0,0,0,0,0,0,2,37,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0, + 0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255, + 255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,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,18,240, + 255,255,255,255,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,23,242,255, + 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0, + 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,204,30,0,1,182,254,254,182, + 1,0,0,27,243,254,254,96,0,0,49,223,254,254,254,254,254,254,254,254,254, + 254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196, + 190,1,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,31,245,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,21,241,127,0,0,0,0,0,0,0,0,0,0,0,0,14,216,254,248,115,2,0,0,0,0,0, + 18,115,175,181,180,148,47,0,0,0,0,0,0,80,239,254,239,36,0,0,0,0,0,0,0,0, + 87,251,50,0,0,0,0,0,9,223,255,238,28,0,75,252,146,0,8,212,254,222,9,0,153, + 255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,2,111,220, + 52,0,0,0,0,0,0,0,0,0,0,0,0,54,220,151,217,254,254,254,254,250,127,3,0,0, + 0,0,0,0,11,165,253,254,254,254,254,194,168,201,29,0,0,0,0,1,102,245,254, + 254,254,254,230,143,225,75,0,0,0,0,0,47,221,254,254,254,254,248,153,210, + 137,5,0,0,23,191,177,186,254,254,254,254,254,188,175,194,24,0,0,0,0,0,0, + 0,0,0,0,0,1,96,223,66,0,0,0,72,224,144,228,254,254,254,254,246,149,215, + 126,3,0,0,0,0,19,184,254,254,254,254,253,181,181,185,20,0,0,6,144,203,32, + 0,0,0,0,0,2,106,221,57,0,0,0,0,0,0,0,0,0,0,2,34,41,5,0,0,0,0,0,0,0,0,0, + 69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0, + 71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,254, + 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,4,118,137,137,137,137,137, + 137,137,137,137,135,28,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255, + 255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,204,31,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0, + 0,0,50,224,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,31,245,112,0,44,136,137,137,137,137,137,137,137,137,137,137,137,137,137, + 120,6,20,241,127,0,0,0,0,0,0,0,0,0,0,0,0,0,126,248,115,2,0,0,0,0,0,0,0, + 0,5,43,9,0,0,0,0,0,0,0,0,0,80,240,169,2,0,0,0,0,0,0,0,0,87,251,50,0,0,0, + 0,0,9,223,254,179,2,2,172,254,222,17,0,135,254,222,9,0,153,255,255,254, + 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,1,109,247,254,225,41,0, + 0,0,0,0,0,0,0,0,0,51,226,254,247,138,115,116,116,116,90,3,0,0,0,0,0,0,0, + 0,11,105,116,116,116,116,167,252,254,202,18,0,0,0,0,1,78,116,116,116,116, + 134,241,254,237,64,0,0,0,0,0,43,116,116,116,116,118,214,254,251,129,0,20, + 191,254,253,172,111,116,116,116,116,174,253,254,193,14,0,0,0,0,0,0,0,0, + 0,0,93,244,254,233,54,0,69,236,254,242,127,116,116,116,116,120,219,254, + 250,117,0,0,0,0,0,19,110,116,116,116,116,181,254,254,184,10,4,143,252,254, + 205,20,0,0,0,0,104,246,254,228,45,0,0,0,0,0,0,0,0,3,136,242,246,185,20, + 0,0,0,0,0,0,0,0,69,252,168,137,137,137,198,239,16,0,0,0,0,0,0,12,230,146, + 0,0,0,55,252,81,0,0,0,66,236,237,237,237,237,237,237,247,254,255,254,254, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,206, + 237,237,237,237,237,237,237,237,237,235,49,0,0,0,0,0,0,0,0,0,0,0,0,18,240, + 255,255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255, + 255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0, + 0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254, + 251,254,254,254,254,254,254,254,205,31,0,0,0,1,182,254,254,182,1,0,0,27, + 243,254,254,96,0,0,0,0,50,224,254,254,254,254,254,254,245,249,254,254,254, + 255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,29,228,104,2,170,254,254,254,254,253,252,251,249,251,252, + 254,254,254,254,250,76,19,224,118,0,0,0,0,0,0,0,0,0,0,0,0,0,22,76,2,0,0, + 0,0,0,0,0,0,0,78,233,114,2,0,0,0,0,0,0,0,0,0,57,43,0,0,0,0,0,0,0,0,0,87, + 251,50,0,0,0,0,0,9,223,253,89,0,36,240,254,252,80,0,48,247,222,9,0,153, + 254,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,212,254,255, + 254,88,0,0,0,0,0,0,0,0,0,0,138,254,255,254,167,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,23,241,254,255,250,46,0,0,0,0,0,0,0,0,0,1,183,254,255,254, + 122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,200,1,73,253,254,255,224,10,0,0, + 0,32,245,254,255,247,36,0,0,0,0,0,0,0,0,0,1,196,254,255,254,108,0,165,254, + 255,254,140,0,0,0,0,117,254,255,254,187,1,0,0,0,0,0,0,0,0,0,42,249,254, + 255,243,26,19,239,254,255,252,49,0,0,0,3,207,254,255,254,94,0,0,0,0,0,0, + 0,0,53,248,255,254,254,112,0,0,0,0,0,0,0,0,69,253,241,237,237,237,246,239, + 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,4,14,14,14,14,14,14,14, + 72,235,254,254,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0, + 0,0,0,0,0,0,0,0,12,14,14,14,14,14,14,14,14,14,14,2,0,0,0,0,0,0,0,0,0,0, + 0,0,18,240,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 240,119,248,254,254,254,254,254,204,30,0,0,0,0,1,182,254,254,182,1,0,0, + 27,243,254,254,96,0,0,0,0,0,50,223,254,254,254,254,254,198,112,247,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,1,14,6,54,246,255,253,219,141,82,49,48,42,49,55,102,172, + 241,254,254,194,7,14,7,0,0,0,0,0,0,0,0,0,0,0,0,0,59,43,0,0,0,0,0,0,0,0, + 0,79,240,254,249,114,2,0,0,0,0,0,0,0,0,23,78,1,0,0,0,0,0,0,0,0,87,253,177, + 158,158,158,158,158,161,242,251,170,158,189,254,254,254,206,158,162,242, + 242,161,158,216,254,255,254,198,158,161,241,255,255,185,1,0,0,0,0,0,0,0, + 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0, + 0,0,1,184,255,255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74, + 253,255,255,224,10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197, + 255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0, + 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255, + 255,254,95,0,0,0,0,0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252, + 78,14,14,14,140,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0, + 0,0,0,0,0,0,0,70,235,254,255,254,254,254,254,254,254,254,254,254,254,80, + 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,18,240,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255, + 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0, + 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,240, + 81,38,247,254,254,254,254,205,30,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,50,223,254,254,254,254,196,4,111,247,254,255,255, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,2,171,254,254,177,18,0,0,0,0,0,0,0,0,1,59,238,255,251,76,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,64,232,199,14,0,0,0,0,0,0,0,78,239,254,255,255, + 248,113,2,0,0,0,0,0,0,4,163,244,96,1,0,0,0,0,0,0,0,75,221,221,221,221,221, + 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, + 221,221,221,221,221,221,221,221,221,221,161,1,0,0,0,0,0,0,0,0,0,0,0,5,213, + 255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,0,0,1,184,255, + 255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,253,255,255,224, + 10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108, + 0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,0,0,0,0,0,0,0,43, + 249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0, + 0,0,0,0,0,0,27,224,254,254,248,71,0,0,0,0,0,0,0,0,69,252,68,0,0,0,134,239, + 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,70, + 235,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0, + 0,0,5,155,179,179,179,179,179,179,179,179,179,177,36,0,0,0,0,0,0,0,0,0, + 0,0,0,18,240,255,255,254,219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,241,81, + 0,38,247,254,254,254,204,31,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,0,50,224,254,254,254,196,1,2,111,248,254,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,54,246,254,254,129,1,0,0,0,0,0,0,0,0,0,15,223,255,254,193,6,0,0,0, + 0,0,0,0,0,0,0,0,0,64,232,254,253,165,11,0,0,0,0,0,78,239,254,255,255,255, + 254,248,113,2,0,0,0,0,4,129,251,254,244,96,1,0,0,0,0,0,0,2,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,6,0,0,0,0,0,0,0,0, + 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,241,255,255,250,46,0,0,0,0,0,0,0, + 0,0,1,183,254,255,254,122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,201,1,73, + 253,255,255,224,10,0,0,0,33,245,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197, + 255,255,254,108,0,166,254,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0, + 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,208,255, + 255,254,95,0,0,0,0,0,0,0,0,0,51,162,167,84,2,0,0,0,0,0,0,0,0,69,253,199, + 179,179,179,218,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,0,0,0,0,0,6,179,206,206,206,206,206,206,206,206,206,204,42,0, + 0,0,0,0,0,0,0,0,0,0,0,18,240,255,254,220,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,18,196,206,206,206,206,206,204,48,0,0,0,0,0,0,0,148,206,206,206,206, + 206,206,112,0,0,0,0,0,0,0,84,206,206,206,206,206,206,206,206,206,206,206, + 206,206,206,206,206,206,206,206,206,206,203,38,0,0,0,0,0,0,1,197,254,254, + 241,82,0,0,38,247,254,254,205,31,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0, + 27,243,254,254,96,0,0,0,0,0,0,0,0,50,224,254,254,196,1,0,2,111,248,254, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,2,170,254,255,255,242,137,48,10,1,1,1,1,3,19,76,187,253,255,255, + 250,75,0,0,0,0,0,0,0,0,0,0,0,39,231,254,254,254,253,164,11,0,0,0,78,238, + 254,255,255,255,255,255,254,248,113,2,0,0,4,129,250,255,255,254,244,72, + 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,0,0,0,1,127,251,254,234,49,0,0,0,0,0,0,0,0, + 0,0,63,236,254,250,143,136,142,142,141,91,1,0,0,0,0,0,0,0,0,6,113,142,142, + 142,131,178,253,254,215,23,0,0,0,0,0,0,0,0,0,0,98,246,254,243,75,0,0,0, + 0,0,34,138,142,142,141,126,224,254,253,145,0,26,206,254,254,182,123,142, + 142,142,130,185,254,254,207,17,0,0,0,0,0,0,0,0,0,0,109,249,254,240,64,0, + 84,242,254,247,130,139,142,142,141,128,229,254,252,132,0,0,0,0,0,0,0,0, + 0,0,13,185,254,254,198,12,5,161,253,254,220,114,141,142,142,137,152,250, + 254,237,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255, + 255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,3,3,3,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,254, + 219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,3,3,2,0,0,0,0,0,0, + 0,0,2,3,3,3,3,3,2,1,0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,2,0,0,0,0,0,0,0,1,197,254,240,82,0,0,0,38,247,254,205,30,0,0,0,0, + 0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,50, + 224,254,196,1,0,0,1,111,248,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1, + 196,190,1,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,54,245,255,255,255,254,254,247,225, + 200,199,199,199,204,237,252,254,255,255,255,254,192,6,0,0,0,0,0,0,0,0,0, + 0,7,151,252,254,255,254,253,188,37,0,75,239,254,255,255,255,255,255,255, + 255,254,248,113,2,22,160,251,254,255,255,254,185,17,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,0,0,0,0,4,130,231,66,0,0,0,0,0,0,0,0,0,0,0,0,68,232,158,207,254, + 254,254,254,248,108,1,0,0,0,0,0,0,6,147,252,254,254,254,254,183,179,215, + 40,0,0,0,0,0,0,0,0,0,0,0,1,102,236,92,1,0,0,0,0,35,211,254,254,254,254, + 245,146,222,155,8,0,0,31,206,188,174,253,254,254,254,253,176,186,208,33, + 0,0,0,0,0,0,0,0,0,0,0,2,113,234,81,0,0,0,88,235,148,220,254,254,254,254, + 242,144,227,144,6,0,0,0,0,0,0,0,0,0,0,0,18,186,200,28,0,0,10,162,219,148, + 247,254,254,254,254,209,156,232,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,146,0,0, + 0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,235,254,254,254,254,254, + 254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,6,6,6,6,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,18,240,218,44,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,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,1,197,240,82,0,0,0,0,38, + 247,205,30,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96, + 0,0,0,0,0,0,0,0,0,0,50,224,196,1,0,0,0,2,111,247,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,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,1,117,193,193,193,193, + 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,189,44, + 0,0,0,0,0,0,0,0,0,0,0,7,151,252,254,255,255,254,223,38,128,235,254,254, + 255,255,255,255,255,254,254,241,169,19,178,254,254,255,255,254,190,18,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,0,0,0,0,0,0,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 43,190,254,255,255,255,255,254,246,72,0,0,0,0,0,0,114,252,255,255,255,255, + 254,253,155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,0,0,0,0,0,10,196,254,255, + 255,255,255,254,243,93,8,0,0,0,0,25,142,253,255,255,255,255,254,253,145, + 26,0,0,0,0,0,0,0,0,0,0,0,0,0,2,37,0,0,0,0,0,51,209,254,255,255,255,255, + 254,240,85,6,0,0,0,0,0,0,0,0,0,0,0,0,0,17,23,0,0,0,0,10,99,245,255,255, + 255,255,254,254,193,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,147,0,0,0,55,252,81, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,205,216,216,216,215,147,7,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,18,204,45,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,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,1,183,82,0,0,0,0,0,38,198,31, + 0,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0, + 0,0,0,0,0,0,50,167,1,0,0,0,0,2,112,104,0,0,0,0,0,0,0,132,254,255,225,10, + 1,196,190,1,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,26,209,217,217,217,217,217,217,217, + 217,217,217,217,217,217,217,217,217,217,217,217,217,217,108,0,0,0,0,0,0, + 0,0,0,0,0,0,8,151,252,254,254,245,99,1,1,28,104,164,209,218,218,218,214, + 173,106,40,2,0,38,212,254,254,254,213,37,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,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,234,254,255,255,255,253, + 166,11,0,0,0,0,0,0,26,198,254,255,255,255,254,215,41,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,79,239,254,255,255,255,253,155,9,0,0,0,0,0,0, + 32,206,254,255,255,255,254,208,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,89,243,254,255,255,255,252,144,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,10,162,253,255,255,255,254,236,73,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,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12, + 230,222,45,0,3,131,253,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,236,254, + 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,86,165,166,166,147, + 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,35,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,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,41,0,0,0,0, + 0,0,15,27,0,0,0,0,0,0,0,0,0,0,0,0,119,166,166,118,0,0,0,17,158,166,165, + 62,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,2,17,0,0,0,0,0,0,0,132,254,255, + 225,10,1,196,190,1,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,20,159,166,166,166,166,166, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,82,0,0, + 0,0,0,0,0,0,0,0,0,0,0,8,151,252,245,99,1,0,0,0,0,0,6,7,7,7,7,1,0,0,0,0, + 0,38,213,254,213,39,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,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,67,164,166,166,166,137,11,0,0,0,0,0,0,0,0,26, + 153,166,166,166,160,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 75,165,166,166,166,130,9,0,0,0,0,0,0,0,0,32,156,166,166,166,157,34,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,165,166,166,166,123,7,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,135,166,166,166,165,70,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,61,250,255,255,255,255, + 255,237,15,0,0,0,0,0,0,10,221,254,219,49,124,250,253,79,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,70,237,254,254,254,254,254,80,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,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,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,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,132,254,255,225, + 10,1,196,190,1,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,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,7,147,99,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,38,179,38,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,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,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,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,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,4,131,251, + 254,254,254,249,116,1,0,0,0,0,0,0,0,69,237,254,236,250,254,178,15,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,80,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,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,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, + 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,132,254, + 255,225,10,1,196,190,1,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,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,2,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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,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,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,4,105,144, + 145,144,96,2,0,0,0,0,0,0,0,0,0,64,144,145,145,129,14,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,80,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,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,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,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,132,254,255,225,10, + 1,196,190,1,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,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,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,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,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,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,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,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,72, + 236,254,253,80,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,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, + 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,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,132,254,255,225,10,12,209,141,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,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,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,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,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,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,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,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,71,237,254,80,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,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,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,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,132,254,255, + 224,21,163,155,8,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,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,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,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,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,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,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,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,71,236,80,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,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,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,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,132,254,255,233,173,155,8,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,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,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,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,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,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,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,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,71,63,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,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,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,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,132,254,255, + 252,155,9,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,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,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,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,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,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,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,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,1,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,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,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,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,132,254,253,155,9,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,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,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,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,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,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,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,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,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, + 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,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,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,132,253,156,9,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,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,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, + 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,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,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,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,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,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,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,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,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, + 132,160,8,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,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,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,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,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,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,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,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,}; diff --git a/noatun-plugins/synaescope/syna.h b/noatun-plugins/synaescope/syna.h new file mode 100644 index 0000000..0b58ae8 --- /dev/null +++ b/noatun-plugins/synaescope/syna.h @@ -0,0 +1,253 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#ifndef SYNA_H +#define SYNA_H + +#include "config.h" +#include <qptrlist.h> +#include "polygon.h" +#include <noatun/plugin.h> + +//************************************** +// For the incurably fiddle prone: + +// log2 of sample size +#define LogSize 9 + +// overlap amount between samples. Set to 1 or 2 if you have a fast computer +#define Overlap 1 + +// Brightness +#define Brightness 150 + +// Sample frequency +#define Frequency 22050 + +//*************************************** + +#define DefaultWidth 260 +#define DefaultHeight 260 + +#define NumSamples (1<<LogSize) +#define RecSize (1<<LogSize-Overlap) + +#ifndef __linux__ +#warning This target has not been tested! +#endif + +#ifdef __FreeBSD__ +#include <machine/endian.h> +typedef unsigned short sampleType; +#else +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_ENDIAN_H +#include <endian.h> +#elif defined(_BIG_ENDIAN) +#define BIG_ENDIAN 1 +#define BYTE_ORDER BIG_ENDIAN +#endif +typedef short sampleType; +#endif + +#if BYTE_ORDER == BIG_ENDIAN +#define BIGENDIAN +#else +#define LITTLEENDIAN +#endif + +void error(const char *str, bool syscall=false); +void warning(const char *str, bool syscall=false); + +enum SymbolID +{ + Speaker, Bulb, + Play, Pause, Stop, SkipFwd, SkipBack, + Handle, Pointer, Open, NoCD, Exit, + Zero, One, Two, Three, Four, + Five, Six, Seven, Eight, Nine, + Slider, Selector, Plug, Loop, Box, Bar, + Flame, Wave, Stars, Star, Diamond, Size, FgColor, BgColor, + Save, Reset, TrackSelect, FullScreen, + NotASymbol +}; + +// wrap +struct BaseScreen +{ + virtual bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen) = 0; + virtual void setPalette(unsigned char *palette) = 0; + virtual void end() = 0; + virtual void fullscreen()=0; + virtual int sizeUpdate() = 0; + virtual bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) = 0; + virtual void show() = 0; + virtual void updateWindowCaption(const char *string)=0; +}; + +struct SdlScreen : public BaseScreen +{ + bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen); + void setPalette(unsigned char *palette); + void end(); + void fullscreen(); + int sizeUpdate(); + bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit); + void show(); +// int winID(); + void updateWindowCaption(const char *string); +}; + +// core +class Combiner +{ +public: + static unsigned short combine(unsigned short a,unsigned short b) + { + //Not that i want to give the compiler a hint or anything... + unsigned char ah = a>>8, al = a&255, bh = b>>8, bl = b&255; + if (ah < 64) ah *= 4; else ah = 255; + if (al < 64) al *= 4; else al = 255; + if (bh > ah) ah = bh; + if (bl > al) al = bl; + return ah*256+al; + } +}; + +class Interface; + +class Core : public StereoScope +{ +public: + Core(); + ~Core(); + + inline unsigned char *output() { return (unsigned char*)outputBmp.data; } + inline unsigned char *lastOutput() { return (unsigned char*)lastOutputBmp.data; } + inline unsigned char *lastLastOutput() { return (unsigned char*)lastLastOutputBmp.data; } + + void allocOutput(int w,int h); + void interfaceInit(); + //void coreInit(); + void setStarSize(double size); + void setupPalette(double); + + bool init ( void ); + + bool go(); + bool calculate(); + + void toDefaults(); + void fade(); + void fadeFade(); + void fadePixelWave(int x, int y, int where, int step); + void fadeWave(); + void fadePixelHeat(int x,int y,int where,int step); + void fadeHeat(); + + void fft(double*, double*); + + void addPixel(int x, int y, int br1, int br2); + void addPixelFast(unsigned char *p, int br1, int br2); + unsigned char getPixel(int x, int y, int where); + + static int bitReverser(int); + +protected: + void scopeEvent(float *, float *, int) {} + +public: + BaseScreen *screen; + Interface *interface; + sampleType *data; + Bitmap<unsigned short> outputBmp, lastOutputBmp, lastLastOutputBmp; + PolygonEngine<unsigned short,Combiner,2> polygonEngine; + + double cosTable[NumSamples], negSinTable[NumSamples]; + int bitReverse[NumSamples]; + int scaleDown[256]; + int maxStarRadius; + + +public: + int outWidth, outHeight; + SymbolID fadeMode; + bool pointsAreDiamonds; + + double brightnessTwiddler; + double starSize; + + double fgRedSlider, fgGreenSlider, bgRedSlider, bgGreenSlider; + SymbolID state; + + int windX, windY, windWidth, windHeight; +}; + +extern Core *core; + +inline unsigned char Core::getPixel(int x,int y,int where) +{ + if (x < 0 || y < 0 || x >= outWidth || y >= outHeight) return 0; + return lastOutput()[where]; +} + +struct Button; + +struct UIObject +{ + int visibleMask, activeMask; + double x,y,width,height; + bool active; + + virtual int go(bool mouseDown,bool mouseClick,bool mouseOver, + double x, double y, double scale, char &hotKey, int &action) + = 0; + + virtual void handleKey(char key, int &action) = 0; + void changed(); +}; + +class Interface +{ +public: + Interface(); + ~Interface(); + bool go(); + void syncToState(); + void setupPalette(); + + void putString(char *string,int x,int y,int red,int blue); + +protected: + void addUI(UIObject *obj); + void changeState(int transitionSymbol); + +private: + QPtrList<UIObject> uiObjects; + Button *stateButton, *starsButton, *waveButton, *flameButton, *starButton, *diamondButton; + int mouseButtons; + + int visibleMask; + int mouseX, mouseY, lastX, lastY, countDown; + +}; + +#endif diff --git a/noatun-plugins/synaescope/synaescope.cpp b/noatun-plugins/synaescope/synaescope.cpp new file mode 100644 index 0000000..7e4df1c --- /dev/null +++ b/noatun-plugins/synaescope/synaescope.cpp @@ -0,0 +1,110 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + this file is X11 source + */ + +#include "synaescope.h" +#include "cmodule.h" + +#include <kdebug.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kstandarddirs.h> + +extern "C" +{ + Plugin *create_plugin() + { + KGlobal::locale()->insertCatalogue("synaescope"); + return new SynaeScope(); + } +} + +SynaeScope::SynaeScope() : Plugin(), scopeExePath(0) +{ + kdDebug(66666) << k_funcinfo << endl; + restarting=false; + connect(&process, SIGNAL(processExited(KProcess *)), + this, SLOT(processExited(KProcess *))); + connect(&process, SIGNAL(receivedStdout(KProcess *,char *,int)), + this, SLOT(receivedStdout(KProcess *,char *,int))); + connect(&process, SIGNAL(receivedStderr(KProcess *,char *,int)), + this, SLOT(receivedStderr(KProcess *,char *,int))); +} + +SynaeScope::~SynaeScope() +{ + kdDebug(66666) << k_funcinfo << endl; + process.kill(); +} + +void SynaeScope::init() +{ + kdDebug(66666) << k_funcinfo << endl; + mPrefs = new SynaePrefs(this); + mPrefs->reopen(); + mPrefs->save(); + connect(mPrefs, SIGNAL(configChanged()), this, SLOT(readConfig())); + + scopeExePath = KStandardDirs::findExe("noatunsynaescope.bin"); + if (scopeExePath.isEmpty()) + { + KMessageBox::error(0, i18n("Unable to locate noatunsynaescope.bin in your path. Check your installation.")); + unload(); + } + + process << scopeExePath; + + runScope(); +} + +void SynaeScope::runScope() +{ + kdDebug(66666) << k_funcinfo << endl; + if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout))) + { + KMessageBox::error(0, i18n("Unable to start noatunsynaescope. Check your installation.")); + unload(); + } +} + + +void SynaeScope::readConfig() +{ + kdDebug(66666) << k_funcinfo << endl; + if (!process.isRunning()) + return; + + restarting=true; + process.kill(); +} + +void SynaeScope::processExited(KProcess *) +{ + kdDebug(66666) << k_funcinfo << endl; + if(restarting) + { + restarting=false; + runScope(); + } + else + { + unload(); + } +} + +void SynaeScope::receivedStdout(KProcess *, char *buf, int len) +{ + QCString debugString(buf,len); + kdDebug(66666) << k_funcinfo << debugString << endl; +} + +void SynaeScope::receivedStderr(KProcess *, char *buf, int len) +{ + QCString debugString(buf,len); + kdDebug(66666) << k_funcinfo << debugString << endl; +} + +#include "synaescope.moc" diff --git a/noatun-plugins/synaescope/synaescope.h b/noatun-plugins/synaescope/synaescope.h new file mode 100644 index 0000000..718c2b9 --- /dev/null +++ b/noatun-plugins/synaescope/synaescope.h @@ -0,0 +1,41 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + this file is X11 source + */ + +#ifndef SYNABLEH_H +#define SYNABLEH_H + +#include "syna.h" +#include <kprocess.h> + +class SynaePrefs; +class KProcess; + +class SynaeScope : public QObject, public Plugin +{ +Q_OBJECT + +public: + SynaeScope(); + virtual ~SynaeScope(); + + void init(); + void runScope(); + +private slots: + void processExited(KProcess *); + void readConfig(); + void receivedStdout(KProcess *, char *buf, int len); + void receivedStderr(KProcess *, char *buf, int len); + +private: + KProcess process; + QString scopeExePath; + bool restarting; + SynaePrefs *mPrefs; +}; + +#endif diff --git a/noatun-plugins/synaescope/synaescope.plugin b/noatun-plugins/synaescope/synaescope.plugin new file mode 100644 index 0000000..b400dd4 --- /dev/null +++ b/noatun-plugins/synaescope/synaescope.plugin @@ -0,0 +1,80 @@ +Filename=noatunsynaescope.la +Author=Charles Samuels, et al +Site=http://noatun.kde.org/ +Email=charles@kde.org +Type=visualization +License=GPL +Name=Synaescope +Name[da]=Synaeskop +Name[de]=Synaeskop +Name[eo]=Sinaeskopo +Name[fy]=Synaeskoop +Name[hi]=सिनेस्कोप +Name[hr]=Sinaeskop +Name[ne]=साइनेस्कोप +Name[nl]=Synaescoop +Name[ru]=Зрительный образ Synaescope +Name[sv]=Synaeskop +Name[ta]=ஸ்னஸ்வரையெல்லை +Name[tg]=Намуди тамошобини Synaescope +Name[tr]=Sineskop +Comment=Noatun visualization +Comment[af]=Noatun visualiseering +Comment[ar]=مرئيات Noatun +Comment[az]=Noatun əyani efekti +Comment[bg]=Приставка за визуализация за Noatun +Comment[bs]=Noatun vizualizacija +Comment[ca]=Visualització en el Noatun +Comment[cs]=Vizualizace pro Noatun +Comment[cy]=Dychmygydd Noatun +Comment[da]=Noatun-visualisering +Comment[de]=Visualisierung für Noatun +Comment[el]=Οπτικοποίηση του Noatun +Comment[en_GB]=Noatun visualisation +Comment[eo]=Noatuna vidado +Comment[es]=Visualización con Noatun +Comment[et]=Noatuni ostsilloskoop +Comment[eu]=Noatun bisualizazioa +Comment[fa]=تجسم Noatun +Comment[fi]=Noatun visualisaatio +Comment[fr]=Affichage de Noatun +Comment[fy]=Noatun-fisualisaasje +Comment[ga]=Amharcléiriú Noatun +Comment[gl]=Visualización de Noatun +Comment[he]=המחשה של Noatun +Comment[hi]=नोआट्यून विज़ुअलाइज़ेशन +Comment[hr]=Vizualizacija za Noatun +Comment[hu]=Noatun vizuális modul +Comment[is]=Sjónræn brella fyrir Noatun +Comment[it]=Visualizzazione di Noatun +Comment[ja]=Noatun の視覚効果 +Comment[ka]=Noatun ვიზუალიზაცია +Comment[kk]=Noatun визуализациясы +Comment[km]= រូបភាពមើលឃើញរបស់ Noatun +Comment[lt]=Noatun vizualizacija +Comment[mk]=Визуелизација за Noatun +Comment[ms]=Visualisasi Noatun +Comment[nb]=Noatun visualisering +Comment[nds]=Noatun-Filmmaker +Comment[ne]=नउटन दृष्टीकरण +Comment[nl]=Noatun-visualisatie +Comment[nn]=Noatun visualisering +Comment[pa]=ਨੌਟਮ ਝਲਕੀਆਂ +Comment[pl]=Wizualizacja dla Noatun +Comment[pt]=Visualização do Noatun +Comment[pt_BR]=A visualização do Noatun +Comment[ro]=Vizualizare Noatun +Comment[ru]=Визуализация Noatun +Comment[sk]=Vizualizácia pre Noatun +Comment[sl]=Vizualizacija za Noatun +Comment[sr]=Noatun-ова визуелизација +Comment[sr@Latn]=Noatun-ova vizuelizacija +Comment[sv]=Noatun-visualisering +Comment[ta]=நோடன் காட்சியமைப்பு +Comment[tg]=Визулизатсиякунонии Noatun +Comment[tr]=Noatun görselleştirme +Comment[uk]=Візуалізація Noatun +Comment[vi]=Ô xem Noatun +Comment[xh]=Umboniso wengqondo weNoatun +Comment[zh_CN]=Noatun 视觉化显示 +Comment[zh_TW]=Noatun 視覺化 diff --git a/noatun-plugins/synaescope/ui.cpp b/noatun-plugins/synaescope/ui.cpp new file mode 100644 index 0000000..d02bfb7 --- /dev/null +++ b/noatun-plugins/synaescope/ui.cpp @@ -0,0 +1,609 @@ +#include "font.h" +#include "icons.h" +#include "syna.h" +#include <math.h> +#include <stdlib.h> +#include <kconfig.h> +#include <dcopclient.h> +#include <unistd.h> + +#define output core->output() + +static void putChar(unsigned char character,int x,int y,int red,int blue) +{ + unsigned short *ptr = ((unsigned short *)output) + x + y*core->outWidth; + unsigned short put = (blue<<8)+red; + int i,j; + for(i=0;i<8;i++,ptr += core->outWidth-8) + for(j=0;j<8;j++,ptr++) + if (font[character*8+i] & (128>>j)) + *ptr = put; +} + +void Interface::putString(char *string,int x,int y,int red,int blue) +{ + if (x < 0 || y < 0 || y >= core->outHeight-8) + return; + for(;*string && x <= core->outWidth-8;string++,x+=8) + putChar((unsigned char)(*string),x,y,red,blue); +} + +void UIObject::changed() +{ +} + +struct Button : public UIObject +{ + int icon; + char hotKey; + + bool passive, bright; + + Button(int _am,int _vm,double _x,double _y, + double _size,int _icon,char _key = 0, + bool _passive = false, bool _bright = false) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = height = _size; + icon = _icon; hotKey = _key; passive = _passive; bright = _bright; + } + + virtual int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseDown; + (void)_x; + (void)_y; + core->polygonEngine.icon( + Icons[icon], + (bright ? 0x0202 : 0x0100), + x*scale,y*scale,width*scale,height*scale); + + if (mouseOver && !passive) + core->polygonEngine.icon( + Icons[icon], + 0x0002, + (x-IconWidths[icon]*width/2)*scale, + (y-height/2)*scale,width*scale*2,height*scale*2); + + if (mouseOver && mouseClick && !passive) + action = icon; + + if (mouseOver && !passive && hotKey) + _hotKey = hotKey; + + return 0; + } + + void handleKey(char key, int &action) + { + if (key == hotKey && !passive) + action = icon; + } +}; + +struct FullScreenButton : public Button +{ + FullScreenButton(int _bleh, int _vm,double _x,double _y, + double _size,int _icon,char _key = 0, + bool _passive = false, bool _bright = false) + : Button(_bleh, _vm, _x, _y, _size, _icon, _key, _passive, _bright) + { + } + + int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &a, int &b) + { + int bleh; + char bleh2; + Button::go(mouseDown, mouseClick, mouseOver, _x, _y, scale, bleh2, bleh); + a=0; + b=0; + if (mouseOver && mouseClick && !passive) + { + core->screen->fullscreen(); + } + + return 0; + } +}; + +struct NoatunActionButton : public Button +{ + NoatunActionButton(int _bleh, int _vm,double _x,double _y, + double _size,int _icon,char _key = 0, + bool _passive = false, bool _bright = false) + : Button(_bleh, _vm, _x, _y, _size, _icon, _key, _passive, _bright) + { + } + + int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &a, int &b) + { + Button::go(mouseDown, mouseClick, mouseOver, _x, _y, scale, a, b); + + if (mouseOver && mouseClick && !passive) + { + QCString action; + switch (icon) + { + case Play: + action="playpause"; + break; + case Stop: + action="stop"; + break; + case SkipFwd: + action="fastForward"; + break; + case SkipBack: + action="back"; + break; + default: + action=""; + } + + if (action) + { + action+="()"; + DCOPClient c; + c.attach(); + QCString appName("noatun"); + if (c.isApplicationRegistered(appName)) + { + c.send(appName, "Noatun", action, QByteArray()); + } + else + { + appName.setNum(getppid()); + appName.prepend("noatun"); + if (c.isApplicationRegistered(appName)) + c.send(appName, "Noatun", action, QByteArray()); + } + } + } + return 0; + } +}; + +#define BarWidth 0.1 +struct SliderBar : public UIObject +{ + double *value; + char leftKey, rightKey; + + typedef void (Core::*Callback)(double v); + Callback callback; + + SliderBar(int _am,int _vm,double _x,double _y, + double _width,double _height, double *_value, + Callback _callback, char _leftKey, char _rightKey) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = _width; height = _height; + value = _value; callback = _callback; + leftKey = _leftKey; rightKey = _rightKey; + } + + int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseClick; + (void)_y; + (void)action; + core->polygonEngine.icon( + Icons[Bar], + 0x0100, + x*scale,y*scale,width*scale,height*scale); + core->polygonEngine.icon( + Icons[Slider], + 0x0200, + (x+*value*width-IconWidths[Slider]*height/2)*scale, + y*scale,height*scale,height*scale); + + if (mouseOver) + { + double newValue = (_x)/(width); + if (newValue < 0.0) newValue = 0.0; + if (newValue > 1.0) newValue = 1.0; + + core->polygonEngine.icon( + Icons[Selector], + 0x0002, + (x+newValue*width-IconWidths[Selector]*height/2)*scale, + y*scale,height*scale,height*scale); + + if (mouseDown) + { + *value = newValue; + + if (callback) + (core->*callback)(*value); + changed(); + } + + if (mouseOver) + _hotKey = (newValue < *value ? leftKey : rightKey); + } + + return 0; + } + void handleKey(char key, int &action) + { + (void)action; + if (key == leftKey || key == rightKey) + { + if (key == leftKey) + { + if (*value == 0.0) return; + *value -= 0.05; + if (*value < 0.0) *value = 0.0; + } + else + { + if (*value == 1.0) return; + *value += 0.05; + if (*value > 1.0) *value = 1.0; + } + + if (callback) + (core->*callback)(*value); + changed(); + } + } +}; +#undef BarWidth + + +struct PopperUpper : public UIObject +{ + int maskAdd; + + PopperUpper(int _am,int _vm,double _x,double _y, + double _width,double _height, int _maskAdd) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = _width; height = _height; + maskAdd = _maskAdd; + } + + int go(bool mouseDown,bool mouseClick, bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseDown; + (void)mouseClick; + (void)_x; + (void)_y; + (void)_hotKey; + (void)action; + + core->polygonEngine.icon( + Icons[Box], + 0x0200, + x*scale,y*scale,width*scale,height*scale); + + return mouseOver ? maskAdd : 0; + } + + void handleKey(char key, int &action) + { + (void)key; + (void)action; + } +}; + +void Interface::setupPalette() +{ +#define BOUND(x) ((x) > 255 ? 255 : (x)) +#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + int i; + unsigned char palette[768]; + + double scale, fgRed, fgGreen, fgBlue, bgRed, bgGreen, bgBlue; + fgRed = core->fgRedSlider; + fgGreen = core->fgGreenSlider; + fgBlue = 1.0 - MAX(core->fgRedSlider,core->fgGreenSlider); + scale = MAX(MAX(fgRed,fgGreen),fgBlue); + fgRed /= scale; + fgGreen /= scale; + fgBlue /= scale; + + bgRed = core->bgRedSlider; + bgGreen = core->bgGreenSlider; + bgBlue = 1.0 - MAX(core->bgRedSlider, core->bgGreenSlider); + scale = MAX(MAX(bgRed, bgGreen), bgBlue); + bgRed /= scale; + bgGreen /= scale; + bgBlue /= scale; + + for(i=0;i<256;i++) + { + int f = i&15, b = i/16; + palette[i*3+0] = PEAKIFY(b*bgRed*16+f*fgRed*16); + palette[i*3+1] = PEAKIFY(b*bgGreen*16+f*fgGreen*16); + palette[i*3+2] = PEAKIFY(b*bgBlue*16+f*fgBlue*16); + } + core->screen->setPalette(palette); +#undef BOUND +#undef PEAKIFY +#undef MAX +} + +//Visible mask +#define ALL 1 +#define BUTTONBAR 2 +#define TRACKBAR 4 +#define DIALBAR 8 +#define VOLUMEBAR 16 + +//Active mask +//#define ALL 1 +#define PLAYING 2 +#define PAUSED 4 +#define STOPPED 8 +#define NOCD 32 +#define OPEN 64 + + +// TODO Lay things out with parents and a stack, like QT +Interface::Interface() +{ + static const float IconSize=0.2; + static const float SliderSize=0.125; + + { + KConfig config("noatun/synaescope", false, false, "data"); + core->fadeMode=(SymbolID)config.readNumEntry("mode", (int)Stars); + core->pointsAreDiamonds=config.readBoolEntry("diamonds", false); + core->brightnessTwiddler=config.readDoubleNumEntry("brightness", .4); + core->starSize=config.readDoubleNumEntry("starsize", .1); + core->fgRedSlider=config.readDoubleNumEntry("FGRed", 0.0); + core->fgGreenSlider=config.readDoubleNumEntry("FGgreen", 1.0); + core->bgRedSlider=config.readDoubleNumEntry("BGRed", 0.0); + core->bgGreenSlider=config.readDoubleNumEntry("BGGreen", 0.0); + } + + uiObjects.setAutoDelete(true); + + double x,y; + y = 0.025; + + addUI(new PopperUpper(ALL, ALL, 0, 0, 0.25, 0.25, TRACKBAR)); + addUI(new Button(ALL, ALL, 0.07, y, IconSize, Speaker, 0, true, false)); + + addUI(new PopperUpper(ALL,TRACKBAR,x=0.25,y=0.0,.9,.25, TRACKBAR)); + x += 0.1; + + addUI(new NoatunActionButton(ALL,TRACKBAR,x,y,IconSize, SkipBack, 0)); + addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*1,y,IconSize, Stop, 0)); + addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*2,y,IconSize, Play, 0)); + addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*2.8,y,IconSize, SkipFwd, 0)); + + +// addUI(new Button(ALL,0.025,0.525,IconSize, 0, 'x')); +// addUI(new PopperUpper(ALL,ALL,0,0,0.25,0.25, BUTTONBAR)); +// addUI(stateButton = new Button(ALL,ALL,0.05,0.025,IconSize, 0, 0, true, false)); + + addUI(new PopperUpper(ALL,BUTTONBAR,x=0.25,y=0,1.375,0.25, BUTTONBAR)); +// x += 0.1; y += 0.025; + +// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, ALL,0,0.25,0.25,0.25, TRACKBAR)); +// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, TRACKBAR,x=0.25,y=0.25,1.0,0.625, TRACKBAR)); +// x += 0.1; y += 0.1; + + addUI(new PopperUpper(ALL,ALL,0,0.25,0.25,0.25, DIALBAR)); + addUI(new Button(ALL,ALL,0.075,IconSize+0.05*1.7,IconSize, Bulb, 0, true, false)); + + addUI(new PopperUpper(ALL, ALL, 0, 0.50, 0.25, 0.25, 0)); + addUI(new FullScreenButton(ALL, ALL, 0.075, 2*IconSize+0.05*2.5, IconSize, Plug, 0)); + + addUI(new PopperUpper(ALL,DIALBAR,x=0.25,y=0.0,1.25,1.0, DIALBAR)); + x += 0.05; y += 0.025; + + addUI(starsButton = new Button(ALL,DIALBAR,x,y,IconSize, Stars, 'd')); + addUI(waveButton = new Button(ALL,DIALBAR,x+IconSize,y,IconSize, Wave, 'f')); + addUI(flameButton = new Button(ALL,DIALBAR,x+IconSize*2.5,y,IconSize, Flame, 'g')); + + addUI(starButton = new Button(ALL,DIALBAR,x+IconSize*3.5,y,IconSize, Star, 'h')); + addUI(diamondButton = new Button(ALL,DIALBAR,x+IconSize*4.5,y,IconSize, Diamond, 'j')); + + y += IconSize*1.3; + + addUI(new Button(ALL,DIALBAR,x,y-0.05,IconSize, Bulb, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x+IconSize,y, 0.75, SliderSize, &core->brightnessTwiddler, /*&Core::setBrightness,*/0, 'z', 'x')); + + addUI(new Button(ALL,DIALBAR,x,y+SliderSize*1,IconSize, Size, 'x', true)); + addUI(new SliderBar(ALL,DIALBAR, + x+IconSize,y+SliderSize, 0.75, SliderSize, &core->starSize, &Core::setStarSize, 'c','v')); + + addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*2-0.025,IconSize, FgColor, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x,y+SliderSize*2, 0.45, SliderSize, &(core->fgRedSlider), &Core::setupPalette, 'b','n')); + addUI(new SliderBar(ALL,DIALBAR, + x+0.5+SliderSize,y+SliderSize*2, 0.45, SliderSize, &core->fgGreenSlider, &Core::setupPalette, 'm',',')); + + addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*3,IconSize, BgColor, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x,y+SliderSize*3, 0.45, SliderSize, &core->bgRedSlider, &Core::setupPalette, 'B','N')); + addUI(new SliderBar(ALL,DIALBAR, + x+0.5+SliderSize,y+SliderSize*3, 0.45, SliderSize, &core->bgGreenSlider, &Core::setupPalette, 'M','<')); + + x += 0.1;// y += 0.0625; + //static double value = 0.5; + //addUI(new SliderBar(ALL,0,0.75,1.0,0.25,&value)); + + //addUI(new Button(BUTTONBAR,x,y,IconSize, 1, 'x')); + //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 2, 'x')); + //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 3, 'x')); + + visibleMask = ALL; + mouseX = -1; + mouseY = -1; + lastY = -1; + lastY = -1; + countDown = 0; + mouseButtons = 0; + + syncToState(); + +} + +Interface::~Interface() +{ + KConfig config("noatun/synaescope", false, false, "data"); + config.writeEntry("mode",core->fadeMode); + config.writeEntry("diamonds", core->pointsAreDiamonds); + config.writeEntry("brightness", core->brightnessTwiddler); + config.writeEntry("starsize", core->starSize); + config.writeEntry("FGRed", core->fgRedSlider); + config.writeEntry("FGgreen", core->fgGreenSlider); + config.writeEntry("BGRed", core->bgRedSlider); + config.writeEntry("BGGreen", core->bgGreenSlider); +} + +void Interface::addUI(UIObject *obj) +{ + uiObjects.append(obj); +} + +void Interface::syncToState() +{ + starsButton->bright = (core->fadeMode == Stars); + flameButton->bright = (core->fadeMode == Flame); + waveButton->bright = (core->fadeMode == Wave); + + starButton->bright = !core->pointsAreDiamonds; + diamondButton->bright = core->pointsAreDiamonds; + + setupPalette(); +} + +void Interface::changeState(int transitionSymbol) +{ + if (transitionSymbol < 0) + { + return ; + } + + int retVal = 0; + switch(transitionSymbol) + { + case Flame : + starsButton->bright = false; + flameButton->bright = true; + waveButton->bright = false; + core->fadeMode = Flame; + core->setStarSize(core->starSize); + break; + case Wave : + starsButton->bright = false; + flameButton->bright = false; + waveButton->bright = true; + core->fadeMode = Wave; + core->setStarSize(core->starSize); + break; + case Stars : + starsButton->bright = true; + flameButton->bright = false; + waveButton->bright = false; + core->fadeMode = Stars; + core->setStarSize(core->starSize); + break; + + case Star : + core->pointsAreDiamonds = false; + starButton->bright = true; + diamondButton->bright = false; + break; + case Diamond : + core->pointsAreDiamonds = true; + starButton->bright = false; + diamondButton->bright = true; + break; + + case Exit : + retVal = 1; break; + } +// return retVal; +} + +bool Interface::go() +{ + int newVisibleMask = ALL; + char keyHit; + int action = NotASymbol; + int oldButtons = mouseButtons; + + core->screen->sizeUpdate(); + if (!core->screen->inputUpdate(mouseX,mouseY,mouseButtons,keyHit)) + return false; + + bool mouseClick = (mouseButtons && !oldButtons); + + if ((mouseX != lastX || mouseY != lastY) && + lastX > 0 && lastY > 0 && + lastX < core->outWidth && lastY < core->outHeight) + countDown = 40; + + int activeMask = ALL; + + if (countDown) + { + countDown--; + + double scale = + (core->outWidth*0.625 < core->outHeight ? core->outWidth*0.625 : core->outHeight); + double scaledX = mouseX / scale; + double scaledY = mouseY / scale; + + char hotKey = 0; + + core->polygonEngine.clear(); + +// stateButton->icon = core->state; + + + for (UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next()) + { + if ((i->visibleMask & visibleMask) && (i->activeMask & activeMask)) + newVisibleMask |= i->go(mouseButtons,mouseClick, + (scaledX >= i->x && + scaledY >= i->y && + scaledX < i->x+i->width && + scaledY < i->y+i->height), + scaledX - i->x, + scaledY - i->y, + scale, + hotKey, + action); + } + + visibleMask = newVisibleMask; + if (visibleMask != 1) + countDown = 20; + + core->polygonEngine.icon(Icons[Pointer],0x0303,mouseX,mouseY,50,50); + + core->polygonEngine.apply(core->outputBmp.data); + + char hint[2] = " "; + hint[0] = hotKey; + putString(hint,mouseX+6,mouseY+7,0,0); + } + + if (keyHit) + for(UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next()) + if (i->activeMask & activeMask) + i->handleKey(keyHit,action); + + + lastX = mouseX; + lastY = mouseY; + + changeState(action); + + return true; +} + diff --git a/noatun-plugins/tippercanoe/Makefile.am b/noatun-plugins/tippercanoe/Makefile.am new file mode 100644 index 0000000..b557d10 --- /dev/null +++ b/noatun-plugins/tippercanoe/Makefile.am @@ -0,0 +1,21 @@ +INCLUDES= $(all_includes) $(SDL_CFLAGS) + +METASOURCES = AUTO + +kde_module_LTLIBRARIES = noatuntippecanoe.la + +noatuntippecanoe_la_SOURCES = synaescope.cpp +noatuntippecanoe_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatuntippecanoe_la_LIBADD = $(LIB_KFILE) -lnoatun -lm + +bin_PROGRAMS = noatuntippecanoe.bin + +noatuntippecanoe_bin_SOURCES = core.cpp main.cpp ui.cpp sdlwrap.cpp +noatuntippecanoe_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH) +noatuntippecanoe_bin_LDADD = $(LIB_KDEUI) -lm $(SDL_LIBS) + +noatun_DATA = tippecanoe.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/tippecanoe.pot diff --git a/noatun-plugins/tippercanoe/core.cpp b/noatun-plugins/tippercanoe/core.cpp new file mode 100644 index 0000000..0fb6fa2 --- /dev/null +++ b/noatun-plugins/tippercanoe/core.cpp @@ -0,0 +1,425 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include "syna.h" +#include <unistd.h> +Core *core; + +#define outputs unsigned char *Dlo=(unsigned char*)lastOutputBmp.data; \ +unsigned char *Dllo=(unsigned char*)lastLastOutputBmp.data; \ +unsigned char *Do=(unsigned char*)outputBmp.data; + +void Core::setupPalette(double) { interface->setupPalette(); } + +int Core::bitReverser(int i) +{ + int sum=0,j; + for(j=0;j<LogSize;j++) + { + sum = (i&1)+sum*2; + i >>= 1; + } + return sum; +} + +void Core::fft(double *x,double *y) +{ + int n2 = NumSamples, n1; + int twoToTheK; + for(twoToTheK=1;twoToTheK<NumSamples;twoToTheK*=2) + { + n1 = n2; + n2 /= 2; + for(int j=0;j<n2;j++) + { + double c = cosTable[j*twoToTheK&(NumSamples-1)], + s = negSinTable[j*twoToTheK&(NumSamples-1)]; + for(int i=j;i<NumSamples;i+=n1) + { + int l = i+n2; + double xt = x[i] - x[l]; + x[i] = (x[i] + x[l]); + double yt = y[i] - y[l]; + y[i] = (y[i] + y[l]); + x[l] = xt*c - yt*s; + y[l] = xt*s + yt*c; + } + } + } +} + +void Core::setStarSize(double size) +{ + //int factor = (fadeMode == Flame ? 100 : + // (fadeMode == Wave ? 150 : 200)); + + double fadeModeFudge = (fadeMode == Wave ? 0.4 : + (fadeMode == Flame ? 0.6 : 0.78)); + + int factor; + if (size > 0.0) + factor = int(exp(log(fadeModeFudge) / (size*8.0))*255); + else + factor = 0; + + if (factor > 255) factor = 255; + + for(int i=0;i<256;i++) + scaleDown[i] = i*factor>>8; + + maxStarRadius = 1; + for(int i=255;i;i = scaleDown[i]) + maxStarRadius++; +} + +inline void Core::addPixel(int x,int y,int br1,int br2) +{ + if (x < 0 || x >= outWidth || y < 0 || y >= outHeight) return; + + unsigned char *p = output()+x*2+y*outWidth*2; + if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; + //p += lastOutput()-output(); + //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; +} + +inline void Core::addPixelFast(unsigned char *p,int br1,int br2) +{ + if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; + //p += lastOutput()-output(); + //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255; + //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255; +} + +void Core::fadeFade() +{ + register unsigned long *ptr = (unsigned long*)output(); + int i = outWidth*outHeight*2/4; + do { + //Bytewize version was: *(ptr++) -= *ptr+(*ptr>>1)>>4; + if (*ptr) { + //if (*ptr & 0xf0f0f0f0ul) + *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5); + ptr++; + } + + //else { + // *(ptr++) = (*ptr * 14 >> 4) & 0x0f0f0f0ful; + //} + else + ptr++; + } while(--i > 0); +} + +inline void Core::fadePixelWave(int x,int y,int where,int step) +{ +outputs + short j = + ( short(getPixel(x-1,y,where-2))+ + getPixel(x+1,y,where+2)+ + getPixel(x,y-1,where-step)+ + getPixel(x,y+1,where+step) + >> 2) + +Dlo[where]; + if (!j) { Do[where] = 0; return; } + j = j + -Dllo[where] + -1; + if (j < 0) Do[where] = 0; + else if (j & (255*256)) Do[where] = 255; + else Do[where] = j; +} + +void Core::fadeWave() +{ + unsigned short *t = lastLastOutputBmp.data; + lastLastOutputBmp.data = lastOutputBmp.data; + lastOutputBmp.data = outputBmp.data; + outputBmp.data = t; + + int x,y,i,j,start,end; + int step = outWidth*2; + for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) { + fadePixelWave(x,0,i,step); + fadePixelWave(x,0,i+1,step); + fadePixelWave(x,outHeight-1,j,step); + fadePixelWave(x,outHeight-1,j+1,step); + } + + for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) { + fadePixelWave(0,y,i,step); + fadePixelWave(0,y,i+1,step); + fadePixelWave(outWidth-1,y,j,step); + fadePixelWave(outWidth-1,y,j+1,step); + } +outputs + + for(y=1, + start=outWidth*2+2, + end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) { + int i = start; + do { + short j = + ( short(Dlo[i-2])+ + Dlo[i+2]+ + Dlo[i-step]+ + Dlo[i+step] + >> 2) + +Dlo[i]; + if (!j) { + Do[i] = 0; + } else { + j = j + -Dllo[i] + -1; + if (j < 0) Do[i] = 0; + else if (j & (255*256)) Do[i] = 255; + else Do[i] = j; + } + } while(++i < end); + } +} + +inline void Core::fadePixelHeat(int x,int y,int where,int step) +{ +outputs + short j = + ( short(getPixel(x-1,y,where-2))+ + getPixel(x+1,y,where+2)+ + getPixel(x,y-1,where-step)+ + getPixel(x,y+1,where+step) + >> 2) + +Dlo[where]; + if (!j) { Do[where] = 0; return; } + j = j + -Dllo[where] + -1; + if (j < 0) Do[where] = 0; + else if (j & (255*256)) Do[where] = 255; + else Do[where] = j; +} + +void Core::fadeHeat() +{ + unsigned short *t = lastLastOutputBmp.data; + lastLastOutputBmp.data = lastOutputBmp.data; + lastOutputBmp.data = outputBmp.data; + outputBmp.data = t; + + int x,y,i,j,start,end; + int step = outWidth*2; + for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) + { + fadePixelHeat(x,0,i,step); + fadePixelHeat(x,0,i+1,step); + fadePixelHeat(x,outHeight-1,j,step); + fadePixelHeat(x,outHeight-1,j+1,step); + } + + for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) + { + fadePixelHeat(0,y,i,step); + fadePixelHeat(0,y,i+1,step); + fadePixelHeat(outWidth-1,y,j,step); + fadePixelHeat(outWidth-1,y,j+1,step); + } + +outputs + for(y=1,start=outWidth*2+2, + end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) + { + int i = start; + do + { + short j = + ( short(Dlo[i-2])+ + Dlo[i+2]+ + +Dlo[i-step] + +Dlo[i+step] + >> 2) + +Dlo[i]; + if (!j) { + Do[i] = 0; + } + else + { + j = j + -Dllo[i] + +(Dllo[i] + -Dlo[i]>>2) + -1; + if (j < 0) Do[i] = 0; + else if (j & (255*256)) Do[i] = 255; + else Do[i] = j; + } + } while(++i < end); + } +} + +void Core::fade() +{ + switch(fadeMode) + { + case Stars : + fadeFade(); + break; + case Flame : + fadeHeat(); + break; + case Wave : + fadeWave(); + break; + default: + break; + } +} + +bool Core::calculate() +{ + double x[NumSamples], y[NumSamples]; + double a[NumSamples], b[NumSamples]; + int clarity[NumSamples]; //Surround sound + int i,j,k; +#ifndef LITTLEENDIAN + register sampleType temp; +#endif + + int brightFactor = int(Brightness * brightnessTwiddler /(starSize+0.01)); + + int num; + if ((num=read(0, data, NumSamples))==0) + return false; + + for(i=0;i<NumSamples;i++) + { +# ifdef LITTLEENDIAN + x[i] = data[i*2]; + y[i] = data[i*2+1]; +# else + // Need to convert to big-endian + temp = data[i*2]; + temp = (temp >> 8) | (temp << 8); + x[i] = temp; + temp = data[i*2+1]; + temp = (temp << 8) | (temp >> 8); + y[i] = temp; +# endif + } + + fft(x,y); + + for(i=0 +1;i<NumSamples;i++) + { + double x1 = x[bitReverse[i]], + y1 = y[bitReverse[i]], + x2 = x[bitReverse[NumSamples-i]], + y2 = y[bitReverse[NumSamples-i]], + aa,bb; + a[i] = sqrt(aa= (x1+x2)*(x1+x2) + (y1-y2)*(y1-y2) ); + b[i] = sqrt(bb= (x1-x2)*(x1-x2) + (y1+y2)*(y1+y2) ); + if (aa+bb != 0.0) + clarity[i] = (int)( + ( (x1+x2) * (x1-x2) + (y1+y2) * (y1-y2) )/(aa+bb) * 256 ); + else + clarity[i] = 0; + } + + int heightFactor = NumSamples/2 / outHeight + 1; + int actualHeight = NumSamples/2/heightFactor; + int heightAdd = outHeight + actualHeight >> 1; + + // Correct for window size + double brightFactor2 = (brightFactor/65536.0/NumSamples)* + sqrt(actualHeight*outWidth/(320.0*200.0)); + + for(i=1;i<NumSamples/2;i++) { + //int h = (int)( b[i]*280 / (a[i]+b[i]+0.0001)+20 ); + if (a[i] > 0 || b[i] > 0) { + int h = (int)( b[i]*outWidth / (a[i]+b[i]) ); + int br1, br2, br = (int)( + (a[i]+b[i])*i*brightFactor2 ); + br1 = br*(clarity[i]+128)>>8; + br2 = br*(128-clarity[i])>>8; + if (br1 < 0) br1 = 0; else if (br1 > 255) br1 = 255; + if (br2 < 0) br2 = 0; else if (br2 > 255) br2 = 255; + //unsigned char *p = output+ h*2+(164-((i<<8)>>m))*(outWidth*2); + int px = h, + py = heightAdd - i / heightFactor; + + if (pointsAreDiamonds) + { + addPixel(px,py,br1,br2); + br1=scaleDown[br1];br2=scaleDown[br2]; + + //TODO: Use addpixelfast + for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2]) + { + for(k=0;k<j;k++) + { + addPixel(px-j+k,py-k,br1,br2); + addPixel(px+k,py-j+k,br1,br2); + addPixel(px+j-k,py+k,br1,br2); + addPixel(px-k,py+j-k,br1,br2); + } + } + } + else + { + if (px < maxStarRadius || py < maxStarRadius || + px > outWidth-maxStarRadius || py > outHeight-maxStarRadius) + { + addPixel(px,py,br1,br2); + for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2]) + { + addPixel(px+j,py,br1,br2); + addPixel(px,py+j,br1,br2); + addPixel(px-j,py,br1,br2); + addPixel(px,py-j,br1,br2); + } + } + else + { + unsigned char *p = output()+px*2+py*outWidth*2, *p1=p, *p2=p, *p3=p, *p4=p; + addPixelFast(p,br1,br2); + for(;br1>0||br2>0;br1=scaleDown[br1],br2=scaleDown[br2]) + { + p1 += 2; + addPixelFast(p1,br1,br2); + p2 -= 2; + addPixelFast(p2,br1,br2); + p3 += outWidth*2; + addPixelFast(p3,br1,br2); + p4 -= outWidth*2; + addPixelFast(p4,br1,br2); + } + } + } + } + } + return true; +} + +#undef outputs + diff --git a/noatun-plugins/tippercanoe/font.h b/noatun-plugins/tippercanoe/font.h new file mode 100644 index 0000000..94d2627 --- /dev/null +++ b/noatun-plugins/tippercanoe/font.h @@ -0,0 +1,258 @@ +unsigned char font[] = { + 0,0,0,0,0,0,0,0, + 126,129,165,129,189,129,126,0, + 126,255,219,255,195,255,126,0, + 54,127,127,127,62,28,8,0, + 8,28,62,127,62,28,8,0, + 28,28,8,107,127,107,8,28, + 8,28,62,127,62,8,28,62, + 0,0,24,60,60,24,0,0, + 255,255,231,195,195,231,255,255, + 0,60,102,66,66,102,60,0, + 255,195,153,189,189,153,195,255, + 15,7,13,60,102,102,102,60, + 60,102,102,102,60,24,126,24, + 48,56,60,54,52,112,240,224, + 127,99,127,99,99,103,230,192, + 24,219,126,102,102,126,219,24, + 64,112,124,127,124,112,64,0, + 1,7,31,127,31,7,1,0, + 24,60,126,24,24,126,60,24, + 102,102,102,102,102,0,102,0, + 63,122,122,58,10,10,10,0, + 30,51,28,54,54,28,102,60, + 0,0,0,0,126,126,126,0, + 24,60,126,24,126,60,24,126, + 24,60,126,24,24,24,24,0, + 24,24,24,24,126,60,24,0, + 0,12,14,127,14,12,0,0, + 0,24,56,127,56,24,0,0, + 0,0,96,96,96,127,0,0, + 0,36,102,255,102,36,0,0, + 0,24,60,126,255,255,0,0, + 0,255,255,126,60,24,0,0, + 0,0,0,0,0,0,0,0, + 24,24,24,24,24,0,24,0, + 102,102,102,0,0,0,0,0, + 108,108,254,108,254,108,108,0, + 16,124,208,124,22,124,16,0, + 0,198,204,24,48,102,198,0, + 56,108,56,118,220,204,118,0, + 24,24,48,0,0,0,0,0, + 12,24,48,48,48,24,12,0, + 48,24,12,12,12,24,48,0, + 0,108,56,254,56,108,0,0, + 0,24,24,126,24,24,0,0, + 0,0,0,0,0,24,24,48, + 0,0,0,126,0,0,0,0, + 0,0,0,0,0,48,48,0, + 0,6,12,24,48,96,192,0, + 60,102,110,126,118,102,60,0, + 12,28,60,12,12,12,12,0, + 60,102,6,28,48,96,126,0, + 60,102,6,28,6,102,60,0, + 28,60,108,204,254,12,12,0, + 126,96,96,124,6,102,60,0, + 60,96,96,124,102,102,60,0, + 126,6,6,12,24,48,48,0, + 60,102,102,60,102,102,60,0, + 60,102,102,62,6,6,60,0, + 0,48,48,0,0,48,48,0, + 0,24,24,0,0,24,24,48, + 12,24,48,96,48,24,12,0, + 0,0,126,0,0,126,0,0, + 48,24,12,6,12,24,48,0, + 60,102,6,12,24,0,24,0, + 60,102,110,110,108,96,60,0, + 24,60,102,102,126,102,102,0, + 124,102,102,124,102,102,124,0, + 60,102,96,96,96,102,60,0, + 124,102,102,102,102,102,124,0, + 126,96,96,124,96,96,126,0, + 126,96,96,124,96,96,96,0, + 60,102,96,110,102,102,60,0, + 102,102,102,126,102,102,102,0, + 60,24,24,24,24,24,60,0, + 6,6,6,6,102,102,60,0, + 102,108,120,112,120,108,102,0, + 96,96,96,96,96,96,126,0, + 198,238,254,214,198,198,198,0, + 102,118,126,110,102,102,102,0, + 60,102,102,102,102,102,60,0, + 124,102,102,124,96,96,96,0, + 60,102,102,102,102,110,60,6, + 124,102,102,124,102,102,102,0, + 60,102,96,60,6,102,60,0, + 126,24,24,24,24,24,24,0, + 102,102,102,102,102,102,60,0, + 102,102,102,102,102,60,24,0, + 198,198,198,214,254,238,198,0, + 102,102,60,24,60,102,102,0, + 102,102,102,60,24,24,24,0, + 126,6,12,24,48,96,126,0, + 60,48,48,48,48,48,60,0, + 0,192,96,48,24,12,6,0, + 60,12,12,12,12,12,60,0, + 24,60,102,0,0,0,0,0, + 0,0,0,0,0,0,0,255, + 24,24,12,0,0,0,0,0, + 0,0,60,6,62,102,62,0, + 96,96,96,124,102,102,124,0, + 0,0,60,102,96,102,60,0, + 6,6,6,62,102,102,62,0, + 0,0,60,102,126,96,62,0, + 28,54,48,124,48,48,48,0, + 0,0,62,102,102,62,6,60, + 96,96,124,102,102,102,102,0, + 24,0,24,24,24,24,24,0, + 12,0,12,12,12,12,108,56, + 96,96,102,108,120,108,102,0, + 48,48,48,48,48,48,24,0, + 0,0,236,254,214,214,198,0, + 0,0,124,102,102,102,102,0, + 0,0,60,102,102,102,60,0, + 0,0,124,102,102,124,96,96, + 0,0,62,102,102,62,6,6, + 0,0,124,102,96,96,96,0, + 0,0,62,96,60,6,124,0, + 48,48,124,48,48,54,28,0, + 0,0,102,102,102,102,62,0, + 0,0,102,102,102,60,24,0, + 0,0,198,214,254,238,68,0, + 0,0,102,60,24,60,102,0, + 0,0,102,102,102,62,6,60, + 0,0,126,12,24,48,126,0, + 28,48,48,96,48,48,28,0, + 24,24,24,24,24,24,24,0, + 56,12,12,6,12,12,56,0, + 118,220,0,0,0,0,0,0, + 0,0,24,60,102,102,126,0, + 60,102,96,96,102,60,24,48, + 102,0,102,102,102,102,62,0, + 14,0,60,102,126,96,60,0, + 60,102,60,6,62,102,62,0, + 102,0,60,6,62,102,62,0, + 112,0,60,6,62,102,62,0, + 24,24,60,6,62,102,62,0, + 0,0,62,96,96,62,24,48, + 60,102,60,102,126,96,60,0, + 102,0,60,102,126,96,60,0, + 112,0,60,102,126,96,60,0, + 102,0,24,24,24,24,24,0, + 60,102,24,24,24,24,24,0, + 112,0,24,24,24,24,24,0, + 198,56,108,198,254,198,198,0, + 24,24,0,60,102,126,102,0, + 14,0,124,96,120,96,124,0, + 0,0,126,26,126,216,126,0, + 62,120,216,222,248,216,222,0, + 60,102,60,102,102,102,60,0, + 102,0,60,102,102,102,60,0, + 112,0,60,102,102,102,60,0, + 60,102,0,102,102,102,62,0, + 112,0,102,102,102,102,62,0, + 102,0,102,102,102,62,6,60, + 102,60,102,102,102,102,60,0, + 102,0,102,102,102,102,60,0, + 12,12,62,96,96,62,12,12, + 56,108,96,240,96,102,252,0, + 102,102,60,24,126,24,126,24, + 124,102,102,124,102,111,102,99, + 14,27,24,60,24,24,120,48, + 14,0,60,6,62,102,62,0, + 14,0,24,24,24,24,24,0, + 14,0,60,102,102,102,60,0, + 14,0,102,102,102,102,62,0, + 118,220,0,124,102,102,102,0, + 126,0,102,118,126,110,102,0, + 62,102,102,62,0,126,0,0, + 60,102,102,60,0,126,0,0, + 24,0,24,48,96,102,60,0, + 0,0,0,126,96,96,0,0, + 0,0,0,126,6,6,0,0, + 198,204,216,62,99,198,12,31, + 198,204,216,54,110,214,31,6, + 24,0,24,24,24,24,24,0, + 0,54,108,216,108,54,0,0, + 0,216,108,54,108,216,0,0, + 34,136,34,136,34,136,34,136, + 85,170,85,170,85,170,85,170, + 221,119,221,119,221,119,221,119, + 8,8,8,8,8,8,8,8, + 8,8,8,8,248,8,8,8, + 8,8,8,248,248,8,8,8, + 28,28,28,28,252,28,28,28, + 0,0,0,0,252,28,28,28, + 0,0,0,248,248,8,8,8, + 28,28,28,252,252,28,28,28, + 28,28,28,28,28,28,28,28, + 0,0,0,252,252,28,28,28, + 28,28,28,252,252,0,0,0, + 28,28,28,28,252,0,0,0, + 8,8,8,248,248,0,0,0, + 0,0,0,0,248,8,8,8, + 8,8,8,8,15,0,0,0, + 8,8,8,8,255,0,0,0, + 0,0,0,0,255,8,8,8, + 8,8,8,8,15,8,8,8, + 0,0,0,0,255,0,0,0, + 8,8,8,8,255,8,8,8, + 8,8,8,15,15,8,8,8, + 28,28,28,28,31,28,28,28, + 28,28,28,31,31,0,0,0, + 0,0,0,31,31,28,28,28, + 28,28,28,255,255,0,0,0, + 0,0,0,255,255,28,28,28, + 28,28,28,31,31,28,28,28, + 0,0,0,255,255,0,0,0, + 28,28,28,255,255,28,28,28, + 8,8,8,255,255,0,0,0, + 28,28,28,28,255,0,0,0, + 0,0,0,255,255,8,8,8, + 0,0,0,0,255,28,28,28, + 28,28,28,28,31,0,0,0, + 8,8,8,15,15,0,0,0, + 0,0,0,15,15,8,8,8, + 0,0,0,0,31,28,28,28, + 28,28,28,28,255,28,28,28, + 8,8,8,255,255,8,8,8, + 8,8,8,8,248,0,0,0, + 0,0,0,0,15,8,8,8, + 255,255,255,255,255,255,255,255, + 0,0,0,0,255,255,255,255, + 240,240,240,240,240,240,240,240, + 15,15,15,15,15,15,15,15, + 255,255,255,255,0,0,0,0, + 0,0,118,204,204,204,118,0, + 60,102,102,124,102,102,124,96, + 126,102,96,96,96,96,96,0, + 0,0,254,108,108,108,102,0, + 126,102,48,24,48,102,126,0, + 0,0,62,108,108,108,56,0, + 0,0,102,102,102,102,127,192, + 0,0,126,216,24,24,12,0, + 124,56,124,214,214,124,56,124, + 124,198,198,254,198,198,124,0, + 124,198,198,198,108,108,238,0, + 30,48,24,60,102,102,60,0, + 0,0,126,219,219,126,0,0, + 3,6,62,107,115,62,96,192, + 30,48,96,126,96,48,30,0, + 124,198,198,198,198,198,198,0, + 0,126,0,126,0,126,0,0, + 24,24,126,24,24,0,126,0, + 48,24,12,24,48,0,126,0, + 12,24,48,24,12,0,126,0, + 14,27,27,24,24,24,24,24, + 24,24,24,24,24,216,216,112, + 24,24,0,126,0,24,24,0, + 0,118,220,0,118,220,0,0, + 60,102,102,60,0,0,0,0, + 0,0,0,24,24,0,0,0, + 0,0,0,0,24,0,0,0, + 30,24,24,24,24,216,120,56, + 120,108,108,108,108,0,0,0, + 56,12,24,48,60,0,0,0, + 0,0,60,60,60,60,0,0, + 0,0,0,0,0,0,0,0 +}; diff --git a/noatun-plugins/tippercanoe/icons.h b/noatun-plugins/tippercanoe/icons.h new file mode 100644 index 0000000..2056e19 --- /dev/null +++ b/noatun-plugins/tippercanoe/icons.h @@ -0,0 +1,4847 @@ +double Icon0[][4] = { + {0.5,0,0.166666666666667,0.333333333333333}, + {0.5,1,0.5,0}, + {0.166666666666667,0.666666666666667,0.5,1}, + {0,0.333333333333333,0,0.666666666666667}, + {0,0,0,0} +}; + +double Icon1[][4] = { + {0.5,0.262222,0.487778,0.185}, + {0.487778,0.185,0.452222666666667,0.115}, + {0.452222666666667,0.115,0.397222666666667,0.0599999999999999}, + {0.397222666666667,0.0599999999999999,0.327222666666667,0.0244446666666664}, + {0.327222666666667,0.0244446666666664,0.25,0.0122220000000002}, + {0.25,0.0122220000000002,0.172778,0.0244446666666664}, + {0.172778,0.0244446666666664,0.102778,0.0599999999999999}, + {0.102778,0.0599999999999999,0.047778,0.115}, + {0.047778,0.115,0.0122226666666666,0.185}, + {0.0122226666666666,0.185,0,0.262222}, + {0,0.262222,0.0122226666666666,0.339444666666667}, + {0.0122226666666666,0.339444666666667,0.047778,0.409444666666667}, + {0.047778,0.409444666666667,0.102778,0.464444666666667}, + {0.102778,0.464444666666667,0.172778,0.5}, + {0.172778,0.5,0.25,0.512222}, + {0.25,0.512222,0.327222666666667,0.5}, + {0.327222666666667,0.5,0.397222666666667,0.464444666666667}, + {0.397222666666667,0.464444666666667,0.452222666666667,0.409444666666667}, + {0.452222666666667,0.409444666666667,0.487778,0.339444666666667}, + {0.487778,0.339444666666667,0.5,0.262222}, + {0.381111333333333,0.583333333333333,0.381111333333333,0.541666666666667}, + {0.131111333333333,0.541666666666667,0.131111333333333,0.583333333333333}, + {0.381111333333333,0.666666666666667,0.381111333333333,0.625}, + {0.131111333333333,0.625,0.131111333333333,0.666666666666667}, + {0.381111333333333,0.75,0.381111333333333,0.708333333333333}, + {0.131111333333333,0.708333333333333,0.131111333333333,0.75}, + {0.297778,0.833333333333333,0.339444666666667,0.791666666666667}, + {0.172778,0.791666666666667,0.214444666666667,0.833333333333333}, + {0,0,0,0} +}; + +double Icon2[][4] = { + {0,0.166666666666667,0,0.833333333333333}, + {0,0.833333333333333,0.333333333333333,0.5}, + {0.333333333333333,0.5,0,0.166666666666667}, + {0,0,0,0} +}; + +double Icon3[][4] = { + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0,0.25,0,0.75}, + {0.5,0.75,0.5,0.25}, + {0.333333333333333,0.25,0.333333333333333,0.75}, + {0,0,0,0} +}; + +double Icon4[][4] = { + {0.5,0.75,0.5,0.25}, + {0,0.25,0,0.75}, + {0,0,0,0} +}; + +double Icon5[][4] = { + {0,0.166666666666667,0,0.833333333333333}, + {0,0.833333333333333,0.166666666666667,0.666666666666667}, + {0.166666666666667,0.666666666666667,0.166666666666667,0.833333333333333}, + {0.166666666666667,0.833333333333333,0.458333333333333,0.541666666666667}, + {0.458333333333333,0.541666666666667,0.458333333333333,0.833333333333333}, + {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667}, + {0.458333333333333,0.166666666666667,0.458333333333333,0.458333333333333}, + {0.458333333333333,0.458333333333333,0.166666666666667,0.166666666666667}, + {0.166666666666667,0.166666666666667,0.166666666666667,0.333333333333333}, + {0.166666666666667,0.333333333333333,0,0.166666666666667}, + {0,0,0,0} +}; + +double Icon6[][4] = { + {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667}, + {0.541666666666667,0.166666666666667,0.375,0.333333333333333}, + {0.375,0.333333333333333,0.375,0.166666666666667}, + {0.375,0.166666666666667,0.0833333333333333,0.458333333333333}, + {0.0833333333333333,0.458333333333333,0.0833333333333333,0.166666666666667}, + {0,0.166666666666667,0,0.833333333333333}, + {0.0833333333333333,0.833333333333333,0.0833333333333333,0.541666666666667}, + {0.0833333333333333,0.541666666666667,0.375,0.833333333333333}, + {0.375,0.833333333333333,0.375,0.666666666666667}, + {0.375,0.666666666666667,0.541666666666667,0.833333333333333}, + {0,0,0,0} +}; + +double Icon7[][4] = { + {0,0,0,1}, + {0,1,0.166666666666667,0.833333333333333}, + {0.166666666666667,0.833333333333333,0.166666666666667,0.166666666666667}, + {0.166666666666667,0.166666666666667,0,0}, + {0.125,0.166666666666667,0.125,0.833333333333333}, + {0.125,0.833333333333333,0.0833333333333333,0.875}, + {0.0833333333333333,0.875,0.0833333333333333,0.125}, + {0.0833333333333333,0.125,0.125,0.166666666666667}, + {0,0,0,0} +}; + +double Icon8[][4] = { + {0,0,0.166666666666667,0.5}, + {0.166666666666667,0.5,0.291666666666667,0.375}, + {0.291666666666667,0.375,0.416666666666667,0.5}, + {0.416666666666667,0.5,0.5,0.416666666666667}, + {0.5,0.416666666666667,0.375,0.291666666666667}, + {0.375,0.291666666666667,0.5,0.166666666666667}, + {0.5,0.166666666666667,0,0}, + {0,0,0,0} +}; + +double Icon9[][4] = { + {0.5,0.833333333333333,0.5,0.791666666666667}, + {0,0.791666666666667,0,0.833333333333333}, + {0.0833333333333333,0.625,0,0.791666666666667}, + {0.5,0.791666666666667,0.416666666666667,0.625}, + {0.5,0.541666666666667,0.416666666666667,0.375}, + {0.0833333333333333,0.375,0,0.541666666666667}, + {0,0.541666666666667,0,0.666666666666667}, + {0.0416666666666667,0.666666666666667,0.0416666666666667,0.583333333333333}, + {0.458333333333333,0.583333333333333,0.458333333333333,0.666666666666667}, + {0.5,0.666666666666667,0.5,0.541666666666667}, + {0.166666666666667,0.666666666666667,0.173888666666667,0.664444666666667}, + {0.173888666666667,0.664444666666667,0.181666666666667,0.662778}, + {0.181666666666667,0.662778,0.191111333333333,0.661111333333333}, + {0.191111333333333,0.661111333333333,0.201111333333333,0.660555333333334}, + {0.201111333333333,0.660555333333334,0.212778,0.659444666666667}, + {0.224444666666667,0.659444666666667,0.237222,0.658888666666667}, + {0.262778,0.658888666666667,0.275555333333333,0.659444666666667}, + {0.287222,0.659444666666667,0.298888666666667,0.660555333333334}, + {0.298888666666667,0.660555333333334,0.308888666666667,0.661111333333333}, + {0.308888666666667,0.661111333333333,0.318333333333333,0.662778}, + {0.318333333333333,0.662778,0.326111333333333,0.664444666666667}, + {0.326111333333333,0.664444666666667,0.333333333333333,0.666666666666667}, + {0.333333333333333,0.666666666666667,0.339444666666666,0.669444666666667}, + {0.339444666666666,0.669444666666667,0.345,0.673333333333333}, + {0.345,0.673333333333333,0.35,0.677778}, + {0.35,0.677778,0.355,0.682778}, + {0.355,0.682778,0.359999999999999,0.688888666666667}, + {0.359999999999999,0.688888666666667,0.364444666666666,0.695}, + {0.364444666666666,0.695,0.369444666666666,0.701666666666667}, + {0.369444666666666,0.701666666666667,0.373888666666667,0.708333333333333}, + {0.373888666666667,0.708333333333333,0.377778,0.715}, + {0.377778,0.715,0.381111333333333,0.721666666666666}, + {0.381111333333333,0.721666666666666,0.383888666666666,0.727778}, + {0.383888666666666,0.727778,0.385,0.733888666666667}, + {0.385,0.733888666666667,0.385,0.738888666666667}, + {0.385,0.738888666666667,0.383888666666666,0.743333333333334}, + {0.383888666666666,0.743333333333334,0.380555333333334,0.747222}, + {0.380555333333334,0.747222,0.375,0.75}, + {0.375,0.75,0.368888666666667,0.751666666666667}, + {0.368888666666667,0.751666666666667,0.361666666666667,0.753333333333333}, + {0.361666666666667,0.753333333333333,0.352222,0.754444666666667}, + {0.352222,0.754444666666667,0.341111333333333,0.755555333333334}, + {0.341111333333333,0.755555333333334,0.328888666666666,0.756111333333333}, + {0.328888666666666,0.756111333333333,0.315,0.756666666666667}, + {0.315,0.756666666666667,0.299444666666666,0.757222}, + {0.299444666666666,0.757222,0.283888666666667,0.757778}, + {0.216111333333333,0.757778,0.200555333333334,0.757222}, + {0.200555333333334,0.757222,0.185,0.756666666666667}, + {0.185,0.756666666666667,0.171111333333333,0.756111333333333}, + {0.171111333333333,0.756111333333333,0.158888666666667,0.755555333333334}, + {0.158888666666667,0.755555333333334,0.147778,0.754444666666667}, + {0.147778,0.754444666666667,0.138333333333333,0.753333333333333}, + {0.138333333333333,0.753333333333333,0.131111333333333,0.751666666666667}, + {0.131111333333333,0.751666666666667,0.125,0.75}, + {0.125,0.75,0.119444666666666,0.747222}, + {0.119444666666666,0.747222,0.116111333333334,0.743333333333334}, + {0.116111333333334,0.743333333333334,0.115,0.738888666666667}, + {0.115,0.738888666666667,0.115,0.733888666666667}, + {0.115,0.733888666666667,0.116111333333334,0.727778}, + {0.116111333333334,0.727778,0.118888666666667,0.721666666666666}, + {0.118888666666667,0.721666666666666,0.122222,0.715}, + {0.122222,0.715,0.126111333333333,0.708333333333333}, + {0.126111333333333,0.708333333333333,0.130555333333334,0.701666666666667}, + {0.130555333333334,0.701666666666667,0.135555333333334,0.695}, + {0.135555333333334,0.695,0.140000000000001,0.688888666666667}, + {0.140000000000001,0.688888666666667,0.145,0.682778}, + {0.145,0.682778,0.15,0.677778}, + {0.15,0.677778,0.155,0.673333333333333}, + {0.155,0.673333333333333,0.160555333333334,0.669444666666667}, + {0.160555333333334,0.669444666666667,0.166666666666667,0.666666666666667}, + {0,0,0,0} +}; + +double Icon10[][4] = { + {0.707221999999999,0.271111333333333,0.589444666666666,0.153333333333334}, + {0.471111333333333,0.507222,0.707221999999999,0.271111333333333}, + {0.707221999999999,0.742778,0.471111333333333,0.507222}, + {0.589444666666666,0.860555333333333,0.707221999999999,0.742778}, + {0.353333333333333,0.625,0.589444666666666,0.860555333333333}, + {0.117778,0.860555333333333,0.353333333333333,0.625}, + {0,0.742778,0.117778,0.860555333333333}, + {0.235555333333333,0.507222,0,0.742778}, + {0,0.271111333333333,0.235555333333333,0.507222}, + {0.117778,0.153333333333334,0,0.271111333333333}, + {0.353333333333333,0.388888666666666,0.117778,0.153333333333334}, + {0.589444666666666,0.153333333333334,0.353333333333333,0.388888666666666}, + {0,0,0,0} +}; + +double Icon11[][4] = { + {0.75,0.708333333333333,0.75,0.291666666666667}, + {0,0.291666666666667,0,0.708333333333333}, + {0.184444666666667,0.333333333333333,0.184444666666667,0.416666666666667}, + {0.0894446666666665,0.416666666666667,0.0894446666666665,0.458333333333333}, + {0.136666666666667,0.458333333333333,0.136666666666667,0.541666666666667}, + {0.0894446666666665,0.541666666666667,0.0894446666666665,0.583333333333333}, + {0.184444666666667,0.583333333333333,0.184444666666667,0.666666666666667}, + {0.0416666666666667,0.666666666666667,0.0416666666666667,0.333333333333333}, + {0.28,0.333333333333333,0.327778,0.458333333333333}, + {0.327778,0.458333333333333,0.375,0.333333333333333}, + {0.422222,0.333333333333333,0.363333333333333,0.5}, + {0.363333333333333,0.5,0.422222,0.666666666666667}, + {0.375,0.666666666666667,0.327778,0.541666666666667}, + {0.327778,0.541666666666667,0.28,0.666666666666667}, + {0.232222,0.666666666666667,0.291666666666667,0.5}, + {0.291666666666667,0.5,0.232222,0.333333333333333}, + {0.517778,0.333333333333333,0.517778,0.666666666666667}, + {0.47,0.666666666666667,0.47,0.333333333333333}, + {0.708333333333333,0.333333333333333,0.708333333333333,0.416666666666667}, + {0.660555333333333,0.416666666666667,0.660555333333333,0.666666666666667}, + {0.613333333333333,0.666666666666667,0.613333333333333,0.416666666666667}, + {0.565555333333333,0.416666666666667,0.565555333333333,0.333333333333333}, + {0,0,0,0} +}; + +double Icon12[][4] = { + {0.298333333333333,0.31,0.293888666666666,0.301666666666667}, + {0.302221999999999,0.32,0.298333333333333,0.31}, + {0.305555333333333,0.331111333333334,0.302221999999999,0.32}, + {0.308333333333334,0.343888666666667,0.305555333333333,0.331111333333334}, + {0.310555333333333,0.357222,0.308333333333334,0.343888666666667}, + {0.312777333333333,0.372778,0.310555333333333,0.357222}, + {0.314443999999999,0.388888666666666,0.312777333333333,0.372778}, + {0.315555333333333,0.406111333333333,0.314443999999999,0.388888666666666}, + {0.316666666666666,0.424444666666667,0.315555333333333,0.406111333333333}, + {0.317777333333333,0.443888666666667,0.316666666666666,0.424444666666667}, + {0.318333333333333,0.463333333333334,0.317777333333333,0.443888666666667}, + {0.318888666666666,0.483888666666667,0.318333333333333,0.463333333333334}, + {0.318888666666666,0.505,0.318888666666666,0.483888666666667}, + {0.318888666666666,0.526111333333333,0.318888666666666,0.505}, + {0.318888666666666,0.546666666666667,0.318888666666666,0.526111333333333}, + {0.318888666666666,0.567778,0.318888666666666,0.546666666666667}, + {0.318333333333333,0.588333333333334,0.318888666666666,0.567778}, + {0.317777333333333,0.607778,0.318333333333333,0.588333333333334}, + {0.316666666666666,0.627222,0.317777333333333,0.607778}, + {0.315555333333333,0.645555333333334,0.316666666666666,0.627222}, + {0.314443999999999,0.662778,0.315555333333333,0.645555333333334}, + {0.312777333333333,0.678888666666667,0.314443999999999,0.662778}, + {0.310555333333333,0.694444666666667,0.312777333333333,0.678888666666667}, + {0.308333333333334,0.707778,0.310555333333333,0.694444666666667}, + {0.305555333333333,0.720555333333333,0.308333333333334,0.707778}, + {0.302221999999999,0.731666666666667,0.305555333333333,0.720555333333333}, + {0.298333333333333,0.741666666666667,0.302221999999999,0.731666666666667}, + {0.293888666666666,0.75,0.298333333333333,0.741666666666667}, + {0.287777333333333,0.758333333333334,0.293888666666666,0.75}, + {0.280555333333333,0.765555333333333,0.287777333333333,0.758333333333334}, + {0.272777333333333,0.771666666666667,0.280555333333333,0.765555333333333}, + {0.263333333333333,0.776666666666667,0.272777333333333,0.771666666666667}, + {0.252777333333333,0.781111333333333,0.263333333333333,0.776666666666667}, + {0.241666666666666,0.783888666666667,0.252777333333333,0.781111333333333}, + {0.229444,0.786666666666667,0.241666666666666,0.783888666666667}, + {0.216666666666666,0.788888666666667,0.229444,0.786666666666667}, + {0.202777333333334,0.79,0.216666666666666,0.788888666666667}, + {0.188888666666666,0.791111333333333,0.202777333333334,0.79}, + {0.173888666666667,0.791666666666667,0.188888666666666,0.791111333333333}, + {0.159443999999999,0.792222,0.173888666666667,0.791666666666667}, + {0.145,0.791666666666667,0.159443999999999,0.792222}, + {0.13,0.791111333333333,0.145,0.791666666666667}, + {0.116110666666666,0.79,0.13,0.791111333333333}, + {0.102222,0.788888666666667,0.116110666666666,0.79}, + {0.0894440000000003,0.786666666666667,0.102222,0.788888666666667}, + {0.0772220000000002,0.783888666666667,0.0894440000000003,0.786666666666667}, + {0.0661106666666669,0.781111333333333,0.0772220000000002,0.783888666666667}, + {0.0555553333333331,0.776666666666667,0.0661106666666669,0.781111333333333}, + {0.0461106666666661,0.771666666666667,0.0555553333333331,0.776666666666667}, + {0.0383333333333328,0.765555333333333,0.0461106666666661,0.771666666666667}, + {0.0311106666666667,0.758333333333334,0.0383333333333328,0.765555333333333}, + {0.0249999999999998,0.75,0.0311106666666667,0.758333333333334}, + {0.020555333333333,0.741666666666667,0.0249999999999998,0.75}, + {0.0166666666666669,0.731666666666667,0.020555333333333,0.741666666666667}, + {0.013333333333333,0.720555333333333,0.0166666666666669,0.731666666666667}, + {0.0105553333333326,0.707778,0.013333333333333,0.720555333333333}, + {0.00833333333333286,0.694444666666667,0.0105553333333326,0.707778}, + {0.00611066666666697,0.678888666666667,0.00833333333333286,0.694444666666667}, + {0.00444399999999945,0.662778,0.00611066666666697,0.678888666666667}, + {0.00333333333333267,0.645555333333334,0.00444399999999945,0.662778}, + {0.00222199999999972,0.627222,0.00333333333333267,0.645555333333334}, + {0.00111066666666678,0.607778,0.00222199999999972,0.627222}, + {0.000555333333333389,0.588333333333334,0.00111066666666678,0.607778}, + {0,0.567778,0.000555333333333389,0.588333333333334}, + {0,0.546666666666667,0,0.567778}, + {0,0.525555333333333,0,0.546666666666667}, + {0,0.505,0,0.525555333333333}, + {0,0.483888666666667,0,0.505}, + {0.000555333333333389,0.463333333333334,0,0.483888666666667}, + {0.00111066666666678,0.443888666666667,0.000555333333333389,0.463333333333334}, + {0.00222199999999972,0.424444666666667,0.00111066666666678,0.443888666666667}, + {0.00333333333333267,0.406111333333333,0.00222199999999972,0.424444666666667}, + {0.00444399999999945,0.388888666666666,0.00333333333333267,0.406111333333333}, + {0.00611066666666697,0.372778,0.00444399999999945,0.388888666666666}, + {0.00833333333333286,0.357222,0.00611066666666697,0.372778}, + {0.0105553333333326,0.343888666666667,0.00833333333333286,0.357222}, + {0.013333333333333,0.331111333333334,0.0105553333333326,0.343888666666667}, + {0.0166666666666669,0.32,0.013333333333333,0.331111333333334}, + {0.020555333333333,0.31,0.0166666666666669,0.32}, + {0.0249999999999998,0.301666666666667,0.020555333333333,0.31}, + {0.0311106666666667,0.293333333333334,0.0249999999999998,0.301666666666667}, + {0.0383333333333328,0.286111333333333,0.0311106666666667,0.293333333333334}, + {0.0461106666666661,0.28,0.0383333333333328,0.286111333333333}, + {0.0555553333333331,0.275,0.0461106666666661,0.28}, + {0.0661106666666669,0.270555333333334,0.0555553333333331,0.275}, + {0.0772220000000002,0.267778,0.0661106666666669,0.270555333333334}, + {0.0894440000000003,0.265,0.0772220000000002,0.267778}, + {0.102222,0.262778,0.0894440000000003,0.265}, + {0.116110666666666,0.261666666666667,0.102222,0.262778}, + {0.13,0.260555333333333,0.116110666666666,0.261666666666667}, + {0.145,0.26,0.13,0.260555333333333}, + {0.159443999999999,0.259444666666666,0.145,0.26}, + {0.173888666666667,0.26,0.159443999999999,0.259444666666666}, + {0.188888666666666,0.260555333333333,0.173888666666667,0.26}, + {0.202777333333334,0.261666666666667,0.188888666666666,0.260555333333333}, + {0.216666666666666,0.262778,0.202777333333334,0.261666666666667}, + {0.229444,0.265,0.216666666666666,0.262778}, + {0.241666666666666,0.267778,0.229444,0.265}, + {0.252777333333333,0.270555333333334,0.241666666666666,0.267778}, + {0.263333333333333,0.275,0.252777333333333,0.270555333333334}, + {0.272777333333333,0.28,0.263333333333333,0.275}, + {0.280555333333333,0.286111333333333,0.272777333333333,0.28}, + {0.287777333333333,0.293333333333334,0.280555333333333,0.286111333333333}, + {0.293888666666666,0.301666666666667,0.287777333333333,0.293333333333334}, + {0.210555333333333,0.397222,0.212221999999999,0.403888666666666}, + {0.212221999999999,0.403888666666666,0.213888666666667,0.411666666666667}, + {0.213888666666667,0.411666666666667,0.215,0.421111333333334}, + {0.215,0.421111333333334,0.216110666666667,0.431666666666667}, + {0.216110666666667,0.431666666666667,0.217222,0.443333333333333}, + {0.217222,0.443333333333333,0.217777333333333,0.456111333333334}, + {0.217777333333333,0.456111333333334,0.218333333333333,0.47}, + {0.218333333333333,0.47,0.218333333333333,0.485}, + {0.218333333333333,0.485,0.218888666666666,0.5}, + {0.218888666666666,0.5,0.218888666666666,0.516111333333334}, + {0.218888666666666,0.516111333333334,0.218888666666666,0.532222}, + {0.218888666666666,0.532222,0.218888666666666,0.547778}, + {0.218888666666666,0.547778,0.218888666666666,0.563888666666667}, + {0.218888666666666,0.563888666666667,0.218333333333333,0.578888666666667}, + {0.218333333333333,0.578888666666667,0.218333333333333,0.593888666666667}, + {0.218333333333333,0.593888666666667,0.217777333333333,0.607778}, + {0.217777333333333,0.607778,0.217222,0.620555333333333}, + {0.217222,0.620555333333333,0.216110666666667,0.632222}, + {0.216110666666667,0.632222,0.215,0.642778}, + {0.215,0.642778,0.213888666666667,0.652222}, + {0.213888666666667,0.652222,0.212221999999999,0.66}, + {0.212221999999999,0.66,0.210555333333333,0.666666666666667}, + {0.210555333333333,0.666666666666667,0.208333333333333,0.672778}, + {0.208333333333333,0.672778,0.204999999999999,0.677778}, + {0.204999999999999,0.677778,0.201666666666667,0.681666666666667}, + {0.201666666666667,0.681666666666667,0.197777333333333,0.685}, + {0.197777333333333,0.685,0.193333333333333,0.687222}, + {0.193333333333333,0.687222,0.188333333333333,0.688888666666667}, + {0.188333333333333,0.688888666666667,0.182777333333333,0.690555333333334}, + {0.182777333333333,0.690555333333334,0.177221999999999,0.691111333333333}, + {0.177221999999999,0.691111333333333,0.171666666666667,0.691666666666666}, + {0.159443999999999,0.691666666666666,0.153888666666666,0.691111333333333}, + {0.153888666666666,0.691111333333333,0.148333333333333,0.690555333333334}, + {0.148333333333333,0.690555333333334,0.142777333333332,0.688888666666667}, + {0.142777333333332,0.688888666666667,0.137777333333333,0.687222}, + {0.137777333333333,0.687222,0.133333333333333,0.685}, + {0.133333333333333,0.685,0.129443999999999,0.681666666666667}, + {0.129443999999999,0.681666666666667,0.126110666666667,0.677778}, + {0.126110666666667,0.677778,0.122777333333333,0.672778}, + {0.122777333333333,0.672778,0.120555333333333,0.666666666666667}, + {0.120555333333333,0.666666666666667,0.118888666666667,0.66}, + {0.118888666666667,0.66,0.117221999999999,0.652222}, + {0.117221999999999,0.652222,0.116110666666666,0.642778}, + {0.116110666666666,0.642778,0.115,0.632222}, + {0.115,0.632222,0.113888666666667,0.620555333333333}, + {0.113888666666667,0.620555333333333,0.113333333333333,0.607778}, + {0.113333333333333,0.607778,0.112777333333333,0.593888666666667}, + {0.112777333333333,0.593888666666667,0.112777333333333,0.578888666666667}, + {0.112777333333333,0.578888666666667,0.112221999999999,0.563888666666667}, + {0.112221999999999,0.563888666666667,0.112221999999999,0.547778}, + {0.112221999999999,0.547778,0.112221999999999,0.531666666666667}, + {0.112221999999999,0.531666666666667,0.112221999999999,0.516111333333334}, + {0.112221999999999,0.516111333333334,0.112221999999999,0.5}, + {0.112221999999999,0.5,0.112777333333333,0.485}, + {0.112777333333333,0.485,0.112777333333333,0.47}, + {0.112777333333333,0.47,0.113333333333333,0.456111333333334}, + {0.113333333333333,0.456111333333334,0.113888666666667,0.443333333333333}, + {0.113888666666667,0.443333333333333,0.115,0.431666666666667}, + {0.115,0.431666666666667,0.116110666666666,0.421111333333334}, + {0.116110666666666,0.421111333333334,0.117221999999999,0.411666666666667}, + {0.117221999999999,0.411666666666667,0.118888666666667,0.403888666666666}, + {0.118888666666667,0.403888666666666,0.120555333333333,0.397222}, + {0.120555333333333,0.397222,0.122777333333333,0.391111333333334}, + {0.122777333333333,0.391111333333334,0.126110666666667,0.386111333333333}, + {0.126110666666667,0.386111333333333,0.129443999999999,0.382222}, + {0.129443999999999,0.382222,0.133333333333333,0.378888666666667}, + {0.133333333333333,0.378888666666667,0.137777333333333,0.376666666666667}, + {0.137777333333333,0.376666666666667,0.142777333333332,0.375}, + {0.142777333333332,0.375,0.148333333333333,0.373333333333333}, + {0.148333333333333,0.373333333333333,0.153888666666666,0.372778}, + {0.153888666666666,0.372778,0.159443999999999,0.372222}, + {0.171666666666667,0.372222,0.177221999999999,0.372778}, + {0.177221999999999,0.372778,0.182777333333333,0.373333333333333}, + {0.182777333333333,0.373333333333333,0.188333333333333,0.375}, + {0.188333333333333,0.375,0.193333333333333,0.376666666666667}, + {0.193333333333333,0.376666666666667,0.197777333333333,0.378888666666667}, + {0.197777333333333,0.378888666666667,0.201666666666667,0.382222}, + {0.201666666666667,0.382222,0.204999999999999,0.386111333333333}, + {0.204999999999999,0.386111333333333,0.208333333333333,0.391111333333334}, + {0.208333333333333,0.391111333333334,0.210555333333333,0.397222}, + {0,0,0,0} +}; + +double Icon13[][4] = { + {0.0994446666666668,0.297222,0.0977779999999993,0.288888666666667}, + {0.100555333333332,0.307222,0.0994446666666668,0.297222}, + {0.101666666666667,0.318333333333333,0.100555333333332,0.307222}, + {0.102778,0.331111333333334,0.101666666666667,0.318333333333333}, + {0.103333333333333,0.344444666666667,0.102778,0.331111333333334}, + {0.103888666666666,0.36,0.103333333333333,0.344444666666667}, + {0.104444666666666,0.376111333333334,0.103888666666666,0.36}, + {0.104999999999999,0.393333333333333,0.104444666666666,0.376111333333334}, + {0.105555333333333,0.411666666666667,0.104999999999999,0.393333333333333}, + {0.105555333333333,0.431111333333333,0.105555333333333,0.411666666666667}, + {0.106111333333333,0.450555333333333,0.105555333333333,0.431111333333333}, + {0.106111333333333,0.471111333333334,0.106111333333333,0.450555333333333}, + {0.106111333333333,0.492222,0.106111333333333,0.471111333333334}, + {0.106111333333333,0.513333333333333,0.106111333333333,0.492222}, + {0.106111333333333,0.533888666666667,0.106111333333333,0.513333333333333}, + {0.106111333333333,0.555,0.106111333333333,0.533888666666667}, + {0.106111333333333,0.575555333333333,0.106111333333333,0.555}, + {0.105555333333333,0.595,0.106111333333333,0.575555333333333}, + {0.105555333333333,0.614444666666667,0.105555333333333,0.595}, + {0.104999999999999,0.632778,0.105555333333333,0.614444666666667}, + {0.104444666666666,0.65,0.104999999999999,0.632778}, + {0.103888666666666,0.666111333333333,0.104444666666666,0.65}, + {0.103333333333333,0.681666666666667,0.103888666666666,0.666111333333333}, + {0.102778,0.695,0.103333333333333,0.681666666666667}, + {0.101666666666667,0.707778,0.102778,0.695}, + {0.100555333333332,0.718888666666667,0.101666666666667,0.707778}, + {0.0994446666666668,0.728888666666667,0.100555333333332,0.718888666666667}, + {0.0977779999999993,0.737222,0.0994446666666668,0.728888666666667}, + {0.096111333333333,0.744444666666666,0.0977779999999993,0.737222}, + {0.0944446666666666,0.750555333333333,0.096111333333333,0.744444666666666}, + {0.0922219999999996,0.755555333333334,0.0944446666666666,0.750555333333333}, + {0.0899999999999999,0.76,0.0922219999999996,0.755555333333334}, + {0.0877780000000001,0.763888666666666,0.0899999999999999,0.76}, + {0.0849999999999997,0.767222,0.0877780000000001,0.763888666666666}, + {0.0816666666666658,0.77,0.0849999999999997,0.767222}, + {0.0788886666666665,0.772222,0.0816666666666658,0.77}, + {0.0755553333333327,0.774444666666666,0.0788886666666665,0.772222}, + {0.072222,0.776111333333333,0.0755553333333327,0.774444666666666}, + {0.0683333333333328,0.777222,0.072222,0.776111333333333}, + {0.0644446666666667,0.778333333333334,0.0683333333333328,0.777222}, + {0.0611113333333329,0.778888666666666,0.0644446666666667,0.778333333333334}, + {0.052778,0.779444666666667,0.0572219999999994,0.778888666666666}, + {0.0488886666666666,0.778888666666666,0.052778,0.779444666666667}, + {0.0416666666666667,0.778333333333334,0.0449999999999993,0.778888666666666}, + {0.0377779999999994,0.777222,0.0416666666666667,0.778333333333334}, + {0.033888666666666,0.776111333333333,0.0377779999999994,0.777222}, + {0.0305553333333333,0.774444666666666,0.033888666666666,0.776111333333333}, + {0.0272219999999995,0.772222,0.0305553333333333,0.774444666666666}, + {0.0244446666666664,0.77,0.0272219999999995,0.772222}, + {0.0211113333333325,0.767222,0.0244446666666664,0.77}, + {0.0183333333333332,0.763888666666666,0.0211113333333325,0.767222}, + {0.0161113333333335,0.76,0.0183333333333332,0.763888666666666}, + {0.0138886666666664,0.755555333333334,0.0161113333333335,0.76}, + {0.0116666666666667,0.750555333333333,0.0138886666666664,0.755555333333334}, + {0.00999999999999919,0.744444666666666,0.0116666666666667,0.750555333333333}, + {0.00833333333333286,0.737222,0.00999999999999919,0.744444666666666}, + {0.00666666666666652,0.728888666666667,0.00833333333333286,0.737222}, + {0.00555533333333358,0.718888666666667,0.00666666666666652,0.728888666666667}, + {0.0044446666666668,0.707778,0.00555533333333358,0.718888666666667}, + {0.00333333333333267,0.695,0.0044446666666668,0.707778}, + {0.00277799999999928,0.681666666666667,0.00333333333333267,0.695}, + {0.00222199999999972,0.666111333333333,0.00277799999999928,0.681666666666667}, + {0.00166666666666634,0.65,0.00222199999999972,0.666111333333333}, + {0.00111133333333295,0.632778,0.00166666666666634,0.65}, + {0.000555333333333389,0.614444666666667,0.00111133333333295,0.632778}, + {0.000555333333333389,0.595,0.000555333333333389,0.614444666666667}, + {0,0.575555333333333,0.000555333333333389,0.595}, + {0,0.555,0,0.575555333333333}, + {0,0.533888666666667,0,0.555}, + {0,0.512778,0,0.533888666666667}, + {0,0.492222,0,0.512778}, + {0,0.471111333333334,0,0.492222}, + {0,0.450555333333333,0,0.471111333333334}, + {0.000555333333333389,0.431111333333333,0,0.450555333333333}, + {0.000555333333333389,0.411666666666667,0.000555333333333389,0.431111333333333}, + {0.00111133333333295,0.393333333333333,0.000555333333333389,0.411666666666667}, + {0.00166666666666634,0.376111333333334,0.00111133333333295,0.393333333333333}, + {0.00222199999999972,0.36,0.00166666666666634,0.376111333333334}, + {0.00277799999999928,0.344444666666667,0.00222199999999972,0.36}, + {0.00333333333333267,0.331111333333334,0.00277799999999928,0.344444666666667}, + {0.0044446666666668,0.318333333333333,0.00333333333333267,0.331111333333334}, + {0.00555533333333358,0.307222,0.0044446666666668,0.318333333333333}, + {0.00666666666666652,0.297222,0.00555533333333358,0.307222}, + {0.00833333333333286,0.288888666666667,0.00666666666666652,0.297222}, + {0.00999999999999919,0.281666666666667,0.00833333333333286,0.288888666666667}, + {0.0116666666666667,0.275555333333333,0.00999999999999919,0.281666666666667}, + {0.0138886666666664,0.270555333333334,0.0116666666666667,0.275555333333333}, + {0.0161113333333335,0.266111333333334,0.0138886666666664,0.270555333333334}, + {0.0183333333333332,0.262222,0.0161113333333335,0.266111333333334}, + {0.0211113333333325,0.258888666666667,0.0183333333333332,0.262222}, + {0.0244446666666664,0.256111333333333,0.0211113333333325,0.258888666666667}, + {0.0272219999999995,0.253888666666667,0.0244446666666664,0.256111333333333}, + {0.0305553333333333,0.251666666666667,0.0272219999999995,0.253888666666667}, + {0.033888666666666,0.25,0.0305553333333333,0.251666666666667}, + {0.0377779999999994,0.248888666666667,0.033888666666666,0.25}, + {0.0416666666666667,0.247778,0.0377779999999994,0.248888666666667}, + {0.0449999999999993,0.247222,0.0416666666666667,0.247778}, + {0.0533333333333334,0.246666666666667,0.0488886666666666,0.247222}, + {0.0572219999999994,0.247222,0.0533333333333334,0.246666666666667}, + {0.0644446666666667,0.247778,0.0611113333333329,0.247222}, + {0.0683333333333328,0.248888666666667,0.0644446666666667,0.247778}, + {0.072222,0.25,0.0683333333333328,0.248888666666667}, + {0.0755553333333327,0.251666666666667,0.072222,0.25}, + {0.0788886666666665,0.253888666666667,0.0755553333333327,0.251666666666667}, + {0.0816666666666658,0.256111333333333,0.0788886666666665,0.253888666666667}, + {0.0849999999999997,0.258888666666667,0.0816666666666658,0.256111333333333}, + {0.0877780000000001,0.262222,0.0849999999999997,0.258888666666667}, + {0.0899999999999999,0.266111333333334,0.0877780000000001,0.262222}, + {0.0922219999999996,0.270555333333334,0.0899999999999999,0.266111333333334}, + {0.0944446666666666,0.275555333333333,0.0922219999999996,0.270555333333334}, + {0.096111333333333,0.281666666666667,0.0944446666666666,0.275555333333333}, + {0.0977779999999993,0.288888666666667,0.096111333333333,0.281666666666667}, + {0,0,0,0} +}; + +double Icon14[][4] = { + {0.296110666666666,0.295555333333333,0.290555333333332,0.288888666666667}, + {0.300555333333333,0.303333333333333,0.296110666666666,0.295555333333333}, + {0.304444,0.312778,0.300555333333333,0.303333333333333}, + {0.307221999999999,0.323333333333334,0.304444,0.312778}, + {0.309443999999999,0.335,0.307221999999999,0.323333333333334}, + {0.310555333333333,0.347778,0.309443999999999,0.335}, + {0.311666666666666,0.361666666666667,0.310555333333333,0.347778}, + {0.312222,0.376111333333334,0.311666666666666,0.361666666666667}, + {0.312222,0.391666666666667,0.312222,0.376111333333334}, + {0.312222,0.407222,0.312222,0.391666666666667}, + {0.311666666666666,0.423333333333333,0.312222,0.407222}, + {0.310555333333333,0.439444666666667,0.311666666666666,0.423333333333333}, + {0.31,0.455,0.310555333333333,0.439444666666667}, + {0.308888666666667,0.470555333333333,0.31,0.455}, + {0.307221999999999,0.485,0.308888666666667,0.470555333333333}, + {0.306110666666666,0.498888666666667,0.307221999999999,0.485}, + {0.304444,0.511666666666667,0.306110666666666,0.498888666666667}, + {0.302221999999999,0.523333333333333,0.304444,0.511666666666667}, + {0.299999999999999,0.533888666666667,0.302221999999999,0.523333333333333}, + {0.297222,0.543333333333334,0.299999999999999,0.533888666666667}, + {0.294444,0.551111333333333,0.297222,0.543333333333334}, + {0.290555333333332,0.557778,0.294444,0.551111333333333}, + {0.284443999999999,0.565,0.290555333333332,0.557778}, + {0.276110666666667,0.570555333333333,0.284443999999999,0.565}, + {0.266666666666667,0.573333333333334,0.276110666666667,0.570555333333333}, + {0.255555333333334,0.574444666666666,0.266666666666667,0.573333333333334}, + {0.243333333333333,0.573888666666667,0.255555333333334,0.574444666666666}, + {0.229999999999999,0.572222,0.243333333333333,0.573888666666667}, + {0.215555333333333,0.569444666666667,0.229999999999999,0.572222}, + {0.201110666666666,0.566111333333333,0.215555333333333,0.569444666666667}, + {0.186110666666667,0.562778,0.201110666666666,0.566111333333333}, + {0.171666666666667,0.559444666666667,0.186110666666667,0.562778}, + {0.158333333333333,0.556666666666667,0.171666666666667,0.559444666666667}, + {0.146110666666666,0.554444666666667,0.158333333333333,0.556666666666667}, + {0.134999999999999,0.553888666666667,0.146110666666666,0.554444666666667}, + {0.117221999999999,0.555555333333333,0.125555333333333,0.553888666666667}, + {0.111110666666666,0.557778,0.117221999999999,0.555555333333333}, + {0.106110666666666,0.561111333333334,0.111110666666666,0.557778}, + {0.102222,0.565,0.106110666666666,0.561111333333334}, + {0.0994439999999995,0.569444666666667,0.102222,0.565}, + {0.0972219999999998,0.575,0.0994439999999995,0.569444666666667}, + {0.0961106666666668,0.581666666666666,0.0972219999999998,0.575}, + {0.095,0.588333333333334,0.0961106666666668,0.581666666666666}, + {0.0944439999999993,0.595555333333333,0.095,0.588333333333334}, + {0.0944439999999993,0.602778,0.0944439999999993,0.595555333333333}, + {0.0944439999999993,0.61,0.0944439999999993,0.602778}, + {0.095,0.617222,0.0944439999999993,0.61}, + {0.0961106666666668,0.623888666666667,0.095,0.617222}, + {0.0972219999999998,0.630555333333334,0.0961106666666668,0.623888666666667}, + {0.0994439999999995,0.636111333333333,0.0972219999999998,0.630555333333334}, + {0.102222,0.640555333333333,0.0994439999999995,0.636111333333333}, + {0.106110666666666,0.644444666666667,0.102222,0.640555333333333}, + {0.111110666666666,0.647778,0.106110666666666,0.644444666666667}, + {0.117221999999999,0.65,0.111110666666666,0.647778}, + {0.125555333333333,0.651666666666667,0.117221999999999,0.65}, + {0.134999999999999,0.652778,0.125555333333333,0.651666666666667}, + {0.158333333333333,0.652222,0.146110666666666,0.652778}, + {0.171666666666667,0.651111333333333,0.158333333333333,0.652222}, + {0.186110666666667,0.649444666666666,0.171666666666667,0.651111333333333}, + {0.201110666666666,0.647778,0.186110666666667,0.649444666666666}, + {0.215555333333333,0.646111333333333,0.201110666666666,0.647778}, + {0.229999999999999,0.644444666666667,0.215555333333333,0.646111333333333}, + {0.243333333333333,0.643333333333333,0.229999999999999,0.644444666666667}, + {0.255555333333334,0.642778,0.243333333333333,0.643333333333333}, + {0.276110666666667,0.643888666666667,0.266666666666667,0.642778}, + {0.284443999999999,0.645555333333334,0.276110666666667,0.643888666666667}, + {0.290555333333332,0.647778,0.284443999999999,0.645555333333334}, + {0.294999999999999,0.650555333333333,0.290555333333332,0.647778}, + {0.298888666666667,0.653888666666666,0.294999999999999,0.650555333333333}, + {0.301666666666666,0.657778,0.298888666666667,0.653888666666666}, + {0.303888666666667,0.662778,0.301666666666666,0.657778}, + {0.306110666666666,0.667778,0.303888666666667,0.662778}, + {0.307777333333333,0.673333333333333,0.306110666666666,0.667778}, + {0.309443999999999,0.679444666666667,0.307777333333333,0.673333333333333}, + {0.310555333333333,0.686111333333334,0.309443999999999,0.679444666666667}, + {0.311666666666666,0.692778,0.310555333333333,0.686111333333334}, + {0.312222,0.698888666666667,0.311666666666666,0.692778}, + {0.312222,0.705555333333334,0.312222,0.698888666666667}, + {0.312222,0.711666666666667,0.312222,0.705555333333334}, + {0.311110666666667,0.717222,0.312222,0.711666666666667}, + {0.308888666666667,0.722222,0.311110666666667,0.717222}, + {0.306110666666666,0.727222,0.308888666666667,0.722222}, + {0.302221999999999,0.731111333333333,0.306110666666666,0.727222}, + {0.297222,0.734444666666667,0.302221999999999,0.731111333333333}, + {0.290555333333332,0.737222,0.297222,0.734444666666667}, + {0.283888666666666,0.738888666666667,0.290555333333332,0.737222}, + {0.276110666666667,0.740555333333334,0.283888666666666,0.738888666666667}, + {0.266666666666667,0.742222,0.276110666666667,0.740555333333334}, + {0.256110666666667,0.743888666666667,0.266666666666667,0.742222}, + {0.244444,0.745,0.256110666666667,0.743888666666667}, + {0.231666666666667,0.746666666666667,0.244444,0.745}, + {0.217777333333333,0.748333333333333,0.231666666666667,0.746666666666667}, + {0.203333333333333,0.749444666666667,0.217777333333333,0.748333333333333}, + {0.187777333333333,0.751111333333334,0.203333333333333,0.749444666666667}, + {0.172222,0.752778,0.187777333333333,0.751111333333334}, + {0.156110666666667,0.753888666666667,0.172222,0.752778}, + {0.139999999999999,0.755,0.156110666666667,0.753888666666667}, + {0.124443999999999,0.756111333333333,0.139999999999999,0.755}, + {0.108888666666666,0.756666666666667,0.124443999999999,0.756111333333333}, + {0.0805553333333329,0.756111333333333,0.0944439999999993,0.756666666666667}, + {0.0677773333333332,0.755,0.0805553333333329,0.756111333333333}, + {0.0561106666666665,0.753333333333333,0.0677773333333332,0.755}, + {0.0455553333333327,0.750555333333333,0.0561106666666665,0.753333333333333}, + {0.0361106666666669,0.747222,0.0455553333333327,0.750555333333333}, + {0.0283333333333336,0.742778,0.0361106666666669,0.747222}, + {0.0216666666666659,0.737222,0.0283333333333336,0.742778}, + {0.0161106666666662,0.730555333333333,0.0216666666666659,0.737222}, + {0.0116666666666667,0.722778,0.0161106666666662,0.730555333333333}, + {0.0077773333333333,0.713333333333334,0.0116666666666667,0.722778}, + {0.00500000000000019,0.702778,0.0077773333333333,0.713333333333334}, + {0.00277733333333311,0.691111333333333,0.00500000000000019,0.702778}, + {0.00166666666666634,0.678333333333333,0.00277733333333311,0.691111333333333}, + {0.000555333333333389,0.664444666666667,0.00166666666666634,0.678333333333333}, + {0,0.65,0.000555333333333389,0.664444666666667}, + {0,0.634444666666666,0,0.65}, + {0,0.618888666666667,0,0.634444666666666}, + {0.000555333333333389,0.602778,0,0.618888666666667}, + {0.00166666666666634,0.586666666666667,0.000555333333333389,0.602778}, + {0.00222199999999972,0.571111333333333,0.00166666666666634,0.586666666666667}, + {0.00333333333333267,0.555555333333333,0.00222199999999972,0.571111333333333}, + {0.00500000000000019,0.541111333333333,0.00333333333333267,0.555555333333333}, + {0.00611066666666697,0.527222,0.00500000000000019,0.541111333333333}, + {0.0077773333333333,0.514444666666667,0.00611066666666697,0.527222}, + {0.00999999999999919,0.502778,0.0077773333333333,0.514444666666667}, + {0.0122220000000001,0.492222,0.00999999999999919,0.502778}, + {0.0149999999999994,0.482778,0.0122220000000001,0.492222}, + {0.0177773333333325,0.475,0.0149999999999994,0.482778}, + {0.0216666666666659,0.468333333333333,0.0177773333333325,0.475}, + {0.0277773333333329,0.461111333333333,0.0216666666666659,0.468333333333333}, + {0.0361106666666669,0.455555333333334,0.0277773333333329,0.461111333333333}, + {0.0455553333333327,0.452778,0.0361106666666669,0.455555333333334}, + {0.056666666666666,0.451666666666667,0.0455553333333327,0.452778}, + {0.0688886666666662,0.452222,0.056666666666666,0.451666666666667}, + {0.0822219999999992,0.453888666666667,0.0688886666666662,0.452222}, + {0.0966666666666664,0.456666666666666,0.0822219999999992,0.453888666666667}, + {0.111666666666667,0.46,0.0966666666666664,0.456666666666666}, + {0.126110666666667,0.463333333333334,0.111666666666667,0.46}, + {0.140555333333333,0.466666666666667,0.126110666666667,0.463333333333334}, + {0.153888666666666,0.469444666666667,0.140555333333333,0.466666666666667}, + {0.166110666666666,0.471666666666666,0.153888666666666,0.469444666666667}, + {0.177221999999999,0.472222,0.166110666666666,0.471666666666666}, + {0.195,0.470555333333333,0.186666666666666,0.472222}, + {0.201110666666666,0.468333333333333,0.195,0.470555333333333}, + {0.206110666666666,0.465,0.201110666666666,0.468333333333333}, + {0.21,0.461111333333333,0.206110666666666,0.465}, + {0.212777333333333,0.456666666666666,0.21,0.461111333333333}, + {0.215,0.451111333333333,0.212777333333333,0.456666666666666}, + {0.216110666666667,0.444444666666667,0.215,0.451111333333333}, + {0.217222,0.437778,0.216110666666667,0.444444666666667}, + {0.217777333333333,0.430555333333333,0.217222,0.437778}, + {0.217777333333333,0.423333333333333,0.217777333333333,0.430555333333333}, + {0.217777333333333,0.416111333333333,0.217777333333333,0.423333333333333}, + {0.217222,0.408888666666667,0.217777333333333,0.416111333333333}, + {0.216110666666667,0.402222,0.217222,0.408888666666667}, + {0.215,0.395555333333334,0.216110666666667,0.402222}, + {0.212777333333333,0.39,0.215,0.395555333333334}, + {0.21,0.385555333333333,0.212777333333333,0.39}, + {0.206110666666666,0.381666666666667,0.21,0.385555333333333}, + {0.201110666666666,0.378333333333333,0.206110666666666,0.381666666666667}, + {0.195,0.376111333333334,0.201110666666666,0.378333333333333}, + {0.186666666666666,0.374444666666667,0.195,0.376111333333334}, + {0.177221999999999,0.373333333333333,0.186666666666666,0.374444666666667}, + {0.153888666666666,0.373888666666667,0.166110666666666,0.373333333333333}, + {0.140555333333333,0.375,0.153888666666666,0.373888666666667}, + {0.126110666666667,0.376666666666667,0.140555333333333,0.375}, + {0.111666666666667,0.378333333333333,0.126110666666667,0.376666666666667}, + {0.0966666666666664,0.38,0.111666666666667,0.378333333333333}, + {0.0822219999999992,0.381666666666667,0.0966666666666664,0.38}, + {0.0688886666666662,0.382778,0.0822219999999992,0.381666666666667}, + {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778}, + {0.0361106666666669,0.382222,0.0455553333333327,0.383333333333334}, + {0.0277773333333329,0.380555333333334,0.0361106666666669,0.382222}, + {0.0216666666666659,0.378333333333333,0.0277773333333329,0.380555333333334}, + {0.0172220000000003,0.375555333333333,0.0216666666666659,0.378333333333333}, + {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333}, + {0.0105553333333326,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105553333333326,0.368333333333334}, + {0.00611066666666697,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.00444399999999945,0.352778,0.00611066666666697,0.358333333333333}, + {0.00277733333333311,0.346666666666666,0.00444399999999945,0.352778}, + {0.00166666666666634,0.34,0.00277733333333311,0.346666666666666}, + {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555333333333389,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111066666666678,0.308888666666667,0,0.314444666666667}, + {0.00333333333333267,0.303888666666667,0.00111066666666678,0.308888666666667}, + {0.00611066666666697,0.298888666666667,0.00333333333333267,0.303888666666667}, + {0.00999999999999919,0.295,0.00611066666666697,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.00999999999999919,0.295}, + {0.0216666666666659,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666659,0.288888666666667}, + {0.0361106666666669,0.285555333333334,0.0283333333333336,0.287222}, + {0.0455553333333327,0.283888666666667,0.0361106666666669,0.285555333333334}, + {0.0561106666666665,0.282222,0.0455553333333327,0.283888666666667}, + {0.0677773333333332,0.281111333333333,0.0561106666666665,0.282222}, + {0.0805553333333329,0.279444666666667,0.0677773333333332,0.281111333333333}, + {0.0944439999999993,0.277778,0.0805553333333329,0.279444666666667}, + {0.108888666666666,0.276666666666667,0.0944439999999993,0.277778}, + {0.124443999999999,0.275,0.108888666666666,0.276666666666667}, + {0.139999999999999,0.273333333333333,0.124443999999999,0.275}, + {0.156110666666667,0.272222,0.139999999999999,0.273333333333333}, + {0.172222,0.271111333333333,0.156110666666667,0.272222}, + {0.187777333333333,0.27,0.172222,0.271111333333333}, + {0.203333333333333,0.269444666666667,0.187777333333333,0.27}, + {0.231666666666667,0.27,0.217777333333333,0.269444666666667}, + {0.244444,0.271111333333333,0.231666666666667,0.27}, + {0.256110666666667,0.272778,0.244444,0.271111333333333}, + {0.266666666666667,0.275555333333333,0.256110666666667,0.272778}, + {0.276110666666667,0.278888666666666,0.266666666666667,0.275555333333333}, + {0.283888666666666,0.283333333333333,0.276110666666667,0.278888666666666}, + {0.290555333333332,0.288888666666667,0.283888666666666,0.283333333333333}, + {0,0,0,0} +}; + +double Icon15[][4] = { + {0.294999999999999,0.297222,0.290555333333334,0.288888666666667}, + {0.298888666666667,0.307222,0.294999999999999,0.297222}, + {0.302222,0.318333333333333,0.298888666666667,0.307222}, + {0.305,0.331111333333334,0.302222,0.318333333333333}, + {0.307221999999999,0.344444666666667,0.305,0.331111333333334}, + {0.309444666666666,0.36,0.307221999999999,0.344444666666667}, + {0.311111333333333,0.376111333333334,0.309444666666666,0.36}, + {0.312222,0.393333333333333,0.311111333333333,0.376111333333334}, + {0.313333333333334,0.411666666666667,0.312222,0.393333333333333}, + {0.314444666666667,0.431111333333333,0.313333333333334,0.411666666666667}, + {0.315,0.450555333333333,0.314444666666667,0.431111333333333}, + {0.315555333333333,0.471111333333334,0.315,0.450555333333333}, + {0.315555333333333,0.492222,0.315555333333333,0.471111333333334}, + {0.315555333333333,0.513333333333333,0.315555333333333,0.492222}, + {0.315555333333333,0.533888666666667,0.315555333333333,0.513333333333333}, + {0.315555333333333,0.555,0.315555333333333,0.533888666666667}, + {0.315,0.575555333333333,0.315555333333333,0.555}, + {0.314444666666667,0.595,0.315,0.575555333333333}, + {0.313333333333334,0.614444666666667,0.314444666666667,0.595}, + {0.312222,0.632778,0.313333333333334,0.614444666666667}, + {0.311111333333333,0.65,0.312222,0.632778}, + {0.309444666666666,0.666111333333333,0.311111333333333,0.65}, + {0.307221999999999,0.681666666666667,0.309444666666666,0.666111333333333}, + {0.305,0.695,0.307221999999999,0.681666666666667}, + {0.302222,0.707778,0.305,0.695}, + {0.298888666666667,0.718888666666667,0.302222,0.707778}, + {0.294999999999999,0.728888666666667,0.298888666666667,0.718888666666667}, + {0.290555333333334,0.737222,0.294999999999999,0.728888666666667}, + {0.283888666666666,0.746666666666667,0.290555333333334,0.737222}, + {0.276111333333333,0.753888666666667,0.283888666666666,0.746666666666667}, + {0.266666666666667,0.76,0.276111333333333,0.753888666666667}, + {0.256111333333333,0.763888666666666,0.266666666666667,0.76}, + {0.244444666666666,0.766666666666667,0.256111333333333,0.763888666666666}, + {0.231666666666667,0.768333333333333,0.244444666666666,0.766666666666667}, + {0.217778,0.768888666666667,0.231666666666667,0.768333333333333}, + {0.203333333333333,0.768333333333333,0.217778,0.768888666666667}, + {0.187778,0.766666666666667,0.203333333333333,0.768333333333333}, + {0.172222,0.765,0.187778,0.766666666666667}, + {0.156111333333333,0.762222,0.172222,0.765}, + {0.139999999999999,0.76,0.156111333333333,0.762222}, + {0.124444666666667,0.757222,0.139999999999999,0.76}, + {0.108888666666666,0.753888666666667,0.124444666666667,0.757222}, + {0.0944446666666666,0.751666666666667,0.108888666666666,0.753888666666667}, + {0.0805553333333329,0.748888666666667,0.0944446666666666,0.751666666666667}, + {0.0677779999999994,0.746666666666667,0.0805553333333329,0.748888666666667}, + {0.0561113333333327,0.744444666666666,0.0677779999999994,0.746666666666667}, + {0.0455553333333327,0.742778,0.0561113333333327,0.744444666666666}, + {0.0361113333333331,0.741111333333333,0.0455553333333327,0.742778}, + {0.0283333333333336,0.738888666666667,0.0361113333333331,0.741111333333333}, + {0.0216666666666671,0.737222,0.0283333333333336,0.738888666666667}, + {0.0149999999999994,0.734444666666667,0.0216666666666671,0.737222}, + {0.0100000000000004,0.731111333333333,0.0149999999999994,0.734444666666667}, + {0.00611133333333314,0.727222,0.0100000000000004,0.731111333333333}, + {0.00333333333333267,0.722222,0.00611133333333314,0.727222}, + {0.00111133333333295,0.717222,0.00333333333333267,0.722222}, + {0,0.711666666666667,0.00111133333333295,0.717222}, + {0,0.705555333333334,0,0.711666666666667}, + {0,0.698888666666667,0,0.705555333333334}, + {0.000555333333333389,0.692222,0,0.698888666666667}, + {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222}, + {0.00277800000000046,0.679444666666667,0.00166666666666634,0.686111333333334}, + {0.0044446666666668,0.673333333333333,0.00277800000000046,0.679444666666667}, + {0.00611133333333314,0.667778,0.0044446666666668,0.673333333333333}, + {0.00833333333333286,0.662778,0.00611133333333314,0.667778}, + {0.0105553333333338,0.657778,0.00833333333333286,0.662778}, + {0.013333333333333,0.653888666666666,0.0105553333333338,0.657778}, + {0.0172220000000003,0.650555333333333,0.013333333333333,0.653888666666666}, + {0.0216666666666671,0.647778,0.0172220000000003,0.650555333333333}, + {0.0277780000000002,0.645555333333334,0.0216666666666671,0.647778}, + {0.0361113333333331,0.643888666666667,0.0277780000000002,0.645555333333334}, + {0.0455553333333327,0.642778,0.0361113333333331,0.643888666666667}, + {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778}, + {0.0822220000000004,0.644444666666667,0.0688886666666662,0.643333333333333}, + {0.0966666666666664,0.646111333333333,0.0822220000000004,0.644444666666667}, + {0.111666666666667,0.647778,0.0966666666666664,0.646111333333333}, + {0.126111333333333,0.649444666666666,0.111666666666667,0.647778}, + {0.140555333333333,0.651111333333333,0.126111333333333,0.649444666666666}, + {0.153888666666667,0.652222,0.140555333333333,0.651111333333333}, + {0.166111333333333,0.652778,0.153888666666667,0.652222}, + {0.186666666666666,0.651666666666667,0.177222,0.652778}, + {0.195,0.65,0.186666666666666,0.651666666666667}, + {0.201111333333333,0.647778,0.195,0.65}, + {0.206666666666667,0.643888666666667,0.201111333333333,0.647778}, + {0.210555333333333,0.639444666666667,0.206666666666667,0.643888666666667}, + {0.213333333333334,0.633333333333334,0.210555333333333,0.639444666666667}, + {0.214444666666666,0.626666666666667,0.213333333333334,0.633333333333334}, + {0.215,0.619444666666666,0.214444666666666,0.626666666666667}, + {0.214444666666666,0.611111333333334,0.215,0.619444666666666}, + {0.213888666666667,0.602778,0.214444666666666,0.611111333333334}, + {0.212778,0.594444666666667,0.213888666666667,0.602778}, + {0.211111333333334,0.586111333333333,0.212778,0.594444666666667}, + {0.209444666666666,0.578888666666667,0.211111333333334,0.586111333333333}, + {0.207778,0.572222,0.209444666666666,0.578888666666667}, + {0.206111333333334,0.566111333333333,0.207778,0.572222}, + {0.203888666666667,0.561666666666667,0.206111333333334,0.566111333333333}, + {0.201111333333333,0.557778,0.203888666666667,0.561666666666667}, + {0.196666666666667,0.554444666666667,0.201111333333333,0.557778}, + {0.191111333333333,0.552778,0.196666666666667,0.554444666666667}, + {0.175,0.553888666666667,0.183888666666667,0.552778}, + {0.166111333333333,0.555555333333333,0.175,0.553888666666667}, + {0.156111333333333,0.557778,0.166111333333333,0.555555333333333}, + {0.146111333333334,0.56,0.156111333333333,0.557778}, + {0.137222,0.561666666666667,0.146111333333334,0.56}, + {0.128333333333333,0.562778,0.137222,0.561666666666667}, + {0.121111333333333,0.562222,0.128333333333333,0.562778}, + {0.115555333333333,0.561111333333334,0.121111333333333,0.562222}, + {0.111111333333334,0.557778,0.115555333333333,0.561111333333334}, + {0.107778,0.553333333333333,0.111111333333334,0.557778}, + {0.105555333333334,0.547778,0.107778,0.553333333333333}, + {0.104444666666667,0.540555333333333,0.105555333333334,0.547778}, + {0.103333333333333,0.532222,0.104444666666667,0.540555333333333}, + {0.102778,0.522778,0.103333333333333,0.532222}, + {0.102778,0.512778,0.102778,0.522778}, + {0.102778,0.503333333333333,0.102778,0.512778}, + {0.103333333333333,0.493888666666667,0.102778,0.503333333333333}, + {0.104444666666667,0.485555333333333,0.103333333333333,0.493888666666667}, + {0.105555333333334,0.478333333333333,0.104444666666667,0.485555333333333}, + {0.107778,0.472778,0.105555333333334,0.478333333333333}, + {0.111111333333334,0.468333333333333,0.107778,0.472778}, + {0.115555333333333,0.465,0.111111333333334,0.468333333333333}, + {0.121111333333333,0.463888666666667,0.115555333333333,0.465}, + {0.128333333333333,0.463333333333334,0.121111333333333,0.463888666666667}, + {0.137222,0.464444666666667,0.128333333333333,0.463333333333334}, + {0.146111333333334,0.466111333333333,0.137222,0.464444666666667}, + {0.156111333333333,0.468333333333333,0.146111333333334,0.466111333333333}, + {0.166111333333333,0.470555333333333,0.156111333333333,0.468333333333333}, + {0.175,0.472222,0.166111333333333,0.470555333333333}, + {0.183888666666667,0.473333333333333,0.175,0.472222}, + {0.196666666666667,0.471666666666666,0.191111333333333,0.473333333333333}, + {0.201111333333333,0.468333333333333,0.196666666666667,0.471666666666666}, + {0.203888666666667,0.464444666666667,0.201111333333333,0.468333333333333}, + {0.206111333333334,0.46,0.203888666666667,0.464444666666667}, + {0.207778,0.453888666666667,0.206111333333334,0.46}, + {0.209444666666666,0.447222,0.207778,0.453888666666667}, + {0.211111333333334,0.44,0.209444666666666,0.447222}, + {0.212778,0.431666666666667,0.211111333333334,0.44}, + {0.213888666666667,0.423333333333333,0.212778,0.431666666666667}, + {0.214444666666666,0.415,0.213888666666667,0.423333333333333}, + {0.215,0.406666666666667,0.214444666666666,0.415}, + {0.214444666666666,0.399444666666666,0.215,0.406666666666667}, + {0.213333333333334,0.392778,0.214444666666666,0.399444666666666}, + {0.210555333333333,0.386666666666667,0.213333333333334,0.392778}, + {0.206666666666667,0.382222,0.210555333333333,0.386666666666667}, + {0.201111333333333,0.378333333333333,0.206666666666667,0.382222}, + {0.195,0.376111333333334,0.201111333333333,0.378333333333333}, + {0.186666666666666,0.374444666666667,0.195,0.376111333333334}, + {0.177222,0.373333333333333,0.186666666666666,0.374444666666667}, + {0.153888666666667,0.373888666666667,0.166111333333333,0.373333333333333}, + {0.140555333333333,0.375,0.153888666666667,0.373888666666667}, + {0.126111333333333,0.376666666666667,0.140555333333333,0.375}, + {0.111666666666667,0.378333333333333,0.126111333333333,0.376666666666667}, + {0.0966666666666664,0.38,0.111666666666667,0.378333333333333}, + {0.0822220000000004,0.381666666666667,0.0966666666666664,0.38}, + {0.0688886666666662,0.382778,0.0822220000000004,0.381666666666667}, + {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778}, + {0.0361113333333331,0.382222,0.0455553333333327,0.383333333333334}, + {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222}, + {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334}, + {0.0172220000000003,0.375555333333333,0.0216666666666671,0.378333333333333}, + {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333}, + {0.0105553333333338,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105553333333338,0.368333333333334}, + {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333}, + {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778}, + {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666}, + {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555333333333389,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111133333333295,0.308888666666667,0,0.314444666666667}, + {0.00333333333333267,0.303888666666667,0.00111133333333295,0.308888666666667}, + {0.00611133333333314,0.298888666666667,0.00333333333333267,0.303888666666667}, + {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295}, + {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667}, + {0.0361113333333331,0.285,0.0283333333333336,0.287222}, + {0.0455553333333327,0.283333333333333,0.0361113333333331,0.285}, + {0.0561113333333327,0.281666666666667,0.0455553333333327,0.283333333333333}, + {0.0677779999999994,0.279444666666667,0.0561113333333327,0.281666666666667}, + {0.0805553333333329,0.277222,0.0677779999999994,0.279444666666667}, + {0.0944446666666666,0.274444666666666,0.0805553333333329,0.277222}, + {0.108888666666666,0.272222,0.0944446666666666,0.274444666666666}, + {0.124444666666667,0.268888666666667,0.108888666666666,0.272222}, + {0.139999999999999,0.266111333333334,0.124444666666667,0.268888666666667}, + {0.156111333333333,0.263888666666666,0.139999999999999,0.266111333333334}, + {0.172222,0.261111333333333,0.156111333333333,0.263888666666666}, + {0.187778,0.259444666666666,0.172222,0.261111333333333}, + {0.203333333333333,0.257778,0.187778,0.259444666666666}, + {0.217778,0.257222,0.203333333333333,0.257778}, + {0.231666666666667,0.257778,0.217778,0.257222}, + {0.244444666666666,0.259444666666666,0.231666666666667,0.257778}, + {0.256111333333333,0.262222,0.244444666666666,0.259444666666666}, + {0.266666666666667,0.266111333333334,0.256111333333333,0.262222}, + {0.276111333333333,0.272222,0.266666666666667,0.266111333333334}, + {0.283888666666666,0.279444666666667,0.276111333333333,0.272222}, + {0.290555333333334,0.288888666666667,0.283888666666666,0.279444666666667}, + {0,0,0,0} +}; + +double Icon16[][4] = { + {0.105555333333333,0.295,0.103333333333333,0.288888666666667}, + {0.107221999999999,0.303333333333333,0.105555333333333,0.295}, + {0.108333333333333,0.312778,0.107221999999999,0.303333333333333}, + {0.108333333333333,0.323888666666667,0.108333333333333,0.312778}, + {0.107778,0.336111333333333,0.108333333333333,0.323888666666667}, + {0.106666666666666,0.349444666666667,0.107778,0.336111333333333}, + {0.104999999999999,0.363888666666667,0.106666666666666,0.349444666666667}, + {0.103333333333333,0.378888666666667,0.104999999999999,0.363888666666667}, + {0.101666666666667,0.393333333333333,0.103333333333333,0.378888666666667}, + {0.099999999999999,0.407778,0.101666666666667,0.393333333333333}, + {0.0988886666666661,0.421111333333334,0.099999999999999,0.407778}, + {0.0983333333333327,0.433333333333334,0.0988886666666661,0.421111333333334}, + {0.0983333333333327,0.444444666666667,0.0983333333333327,0.433333333333334}, + {0.0994446666666657,0.453888666666667,0.0983333333333327,0.444444666666667}, + {0.101111333333333,0.462222,0.0994446666666657,0.453888666666667}, + {0.103333333333333,0.468333333333333,0.101111333333333,0.462222}, + {0.106666666666666,0.473333333333333,0.103333333333333,0.468333333333333}, + {0.110555333333333,0.477222,0.106666666666666,0.473333333333333}, + {0.115,0.48,0.110555333333333,0.477222}, + {0.120555333333333,0.482222,0.115,0.48}, + {0.127222,0.483333333333333,0.120555333333333,0.482222}, + {0.133888666666666,0.484444666666667,0.127222,0.483333333333333}, + {0.141111333333332,0.485,0.133888666666666,0.484444666666667}, + {0.162777999999999,0.484444666666667,0.155555333333333,0.485}, + {0.169444666666666,0.483333333333333,0.162777999999999,0.484444666666667}, + {0.176111333333332,0.482222,0.169444666666666,0.483333333333333}, + {0.181666666666666,0.48,0.176111333333332,0.482222}, + {0.186111333333333,0.477222,0.181666666666666,0.48}, + {0.189999999999999,0.473333333333333,0.186111333333333,0.477222}, + {0.193333333333333,0.468333333333333,0.189999999999999,0.473333333333333}, + {0.195555333333332,0.462222,0.193333333333333,0.468333333333333}, + {0.197222,0.453888666666667,0.195555333333332,0.462222}, + {0.198333333333333,0.444444666666667,0.197222,0.453888666666667}, + {0.198333333333333,0.433333333333334,0.198333333333333,0.444444666666667}, + {0.197778,0.421111333333334,0.198333333333333,0.433333333333334}, + {0.196666666666667,0.407778,0.197778,0.421111333333334}, + {0.194999999999999,0.393333333333333,0.196666666666667,0.407778}, + {0.193333333333333,0.378888666666667,0.194999999999999,0.393333333333333}, + {0.191666666666666,0.363888666666667,0.193333333333333,0.378888666666667}, + {0.189999999999999,0.349444666666667,0.191666666666666,0.363888666666667}, + {0.188888666666666,0.336111333333333,0.189999999999999,0.349444666666667}, + {0.188333333333333,0.323888666666667,0.188888666666666,0.336111333333333}, + {0.188333333333333,0.312778,0.188333333333333,0.323888666666667}, + {0.189444666666666,0.303333333333333,0.188333333333333,0.312778}, + {0.191111333333333,0.295,0.189444666666666,0.303333333333333}, + {0.193333333333333,0.288888666666667,0.191111333333333,0.295}, + {0.195555333333332,0.285,0.193333333333333,0.288888666666667}, + {0.198333333333333,0.281666666666667,0.195555333333332,0.285}, + {0.201111333333332,0.278888666666666,0.198333333333333,0.281666666666667}, + {0.204999999999999,0.276111333333333,0.201111333333332,0.278888666666666}, + {0.208888666666666,0.273888666666667,0.204999999999999,0.276111333333333}, + {0.212777999999999,0.271111333333333,0.208888666666666,0.273888666666667}, + {0.217777999999999,0.268888666666667,0.212777999999999,0.271111333333333}, + {0.222777999999999,0.266111333333334,0.217777999999999,0.268888666666667}, + {0.227778,0.263888666666666,0.222777999999999,0.266111333333334}, + {0.232778,0.261666666666667,0.227778,0.263888666666666}, + {0.238333333333333,0.259444666666666,0.232778,0.261666666666667}, + {0.243888666666666,0.257778,0.238333333333333,0.259444666666666}, + {0.248888666666666,0.256666666666667,0.243888666666666,0.257778}, + {0.253888666666666,0.255555333333334,0.248888666666666,0.256666666666667}, + {0.263888666666666,0.256666666666667,0.258888666666666,0.255555333333334}, + {0.267778,0.258333333333334,0.263888666666666,0.256666666666667}, + {0.271666666666666,0.261666666666667,0.267778,0.258333333333334}, + {0.275555333333333,0.266111333333334,0.271666666666666,0.261666666666667}, + {0.278333333333332,0.272222,0.275555333333333,0.266111333333334}, + {0.281111333333333,0.279444666666667,0.278333333333332,0.272222}, + {0.283333333333333,0.288888666666667,0.281111333333333,0.279444666666667}, + {0.284999999999999,0.297222,0.283333333333333,0.288888666666667}, + {0.286111333333333,0.307222,0.284999999999999,0.297222}, + {0.287222,0.318333333333333,0.286111333333333,0.307222}, + {0.288333333333333,0.331111333333334,0.287222,0.318333333333333}, + {0.288888666666666,0.344444666666667,0.288333333333333,0.331111333333334}, + {0.289444666666666,0.36,0.288888666666666,0.344444666666667}, + {0.289999999999999,0.376111333333334,0.289444666666666,0.36}, + {0.290555333333332,0.393333333333333,0.289999999999999,0.376111333333334}, + {0.291111333333333,0.411666666666667,0.290555333333332,0.393333333333333}, + {0.291111333333333,0.431111333333333,0.291111333333333,0.411666666666667}, + {0.291666666666667,0.450555333333333,0.291111333333333,0.431111333333333}, + {0.291666666666667,0.471111333333334,0.291666666666667,0.450555333333333}, + {0.291666666666667,0.492222,0.291666666666667,0.471111333333334}, + {0.291666666666667,0.513333333333333,0.291666666666667,0.492222}, + {0.291666666666667,0.533888666666667,0.291666666666667,0.513333333333333}, + {0.291666666666667,0.555,0.291666666666667,0.533888666666667}, + {0.291666666666667,0.575555333333333,0.291666666666667,0.555}, + {0.291111333333333,0.595,0.291666666666667,0.575555333333333}, + {0.291111333333333,0.614444666666667,0.291111333333333,0.595}, + {0.290555333333332,0.632778,0.291111333333333,0.614444666666667}, + {0.289999999999999,0.65,0.290555333333332,0.632778}, + {0.289444666666666,0.666111333333333,0.289999999999999,0.65}, + {0.288888666666666,0.681666666666667,0.289444666666666,0.666111333333333}, + {0.288333333333333,0.695,0.288888666666666,0.681666666666667}, + {0.287222,0.707778,0.288333333333333,0.695}, + {0.286111333333333,0.718888666666667,0.287222,0.707778}, + {0.284999999999999,0.728888666666667,0.286111333333333,0.718888666666667}, + {0.283333333333333,0.737222,0.284999999999999,0.728888666666667}, + {0.281111333333333,0.746666666666667,0.283333333333333,0.737222}, + {0.278333333333332,0.753888666666667,0.281111333333333,0.746666666666667}, + {0.275555333333333,0.76,0.278333333333332,0.753888666666667}, + {0.271666666666666,0.764444666666667,0.275555333333333,0.76}, + {0.267778,0.767778,0.271666666666666,0.764444666666667}, + {0.263888666666666,0.769444666666667,0.267778,0.767778}, + {0.258888666666666,0.770555333333334,0.263888666666666,0.769444666666667}, + {0.248888666666666,0.769444666666667,0.253888666666666,0.770555333333334}, + {0.243888666666666,0.768333333333333,0.248888666666666,0.769444666666667}, + {0.238333333333333,0.766666666666667,0.243888666666666,0.768333333333333}, + {0.232778,0.764444666666667,0.238333333333333,0.766666666666667}, + {0.227778,0.762222,0.232778,0.764444666666667}, + {0.222777999999999,0.76,0.227778,0.762222}, + {0.217777999999999,0.757222,0.222777999999999,0.76}, + {0.212777999999999,0.755,0.217777999999999,0.757222}, + {0.208888666666666,0.752222,0.212777999999999,0.755}, + {0.204999999999999,0.75,0.208888666666666,0.752222}, + {0.201111333333332,0.747222,0.204999999999999,0.75}, + {0.198333333333333,0.744444666666666,0.201111333333332,0.747222}, + {0.195555333333332,0.741111333333333,0.198333333333333,0.744444666666666}, + {0.193333333333333,0.737222,0.195555333333332,0.741111333333333}, + {0.191111333333333,0.731111333333333,0.193333333333333,0.737222}, + {0.189444666666666,0.722778,0.191111333333333,0.731111333333333}, + {0.188888666666666,0.713333333333334,0.189444666666666,0.722778}, + {0.189444666666666,0.702222,0.188888666666666,0.713333333333334}, + {0.190555333333332,0.69,0.189444666666666,0.702222}, + {0.192222,0.676666666666667,0.190555333333332,0.69}, + {0.194999999999999,0.662222,0.192222,0.676666666666667}, + {0.197778,0.647778,0.194999999999999,0.662222}, + {0.199999999999999,0.632778,0.197778,0.647778}, + {0.202221999999999,0.618333333333334,0.199999999999999,0.632778}, + {0.203888666666667,0.605,0.202221999999999,0.618333333333334}, + {0.204444666666666,0.592778,0.203888666666667,0.605}, + {0.203888666666667,0.581666666666666,0.204444666666666,0.592778}, + {0.201666666666666,0.572222,0.203888666666667,0.581666666666666}, + {0.198333333333333,0.563888666666667,0.201666666666666,0.572222}, + {0.193333333333333,0.557778,0.198333333333333,0.563888666666667}, + {0.187222,0.552778,0.193333333333333,0.557778}, + {0.178888666666666,0.55,0.187222,0.552778}, + {0.169444666666666,0.548333333333333,0.178888666666666,0.55}, + {0.158333333333333,0.548888666666667,0.169444666666666,0.548333333333333}, + {0.146111333333333,0.550555333333334,0.158333333333333,0.548888666666667}, + {0.132777999999999,0.553888666666667,0.146111333333333,0.550555333333334}, + {0.118333333333332,0.557778,0.132777999999999,0.553888666666667}, + {0.103888666666666,0.562222,0.118333333333332,0.557778}, + {0.0888886666666657,0.566111333333333,0.103888666666666,0.562222}, + {0.0744446666666659,0.57,0.0888886666666657,0.566111333333333}, + {0.0611113333333329,0.572778,0.0744446666666659,0.57}, + {0.0488886666666666,0.573888666666667,0.0611113333333329,0.572778}, + {0.0377779999999994,0.572778,0.0488886666666666,0.573888666666667}, + {0.0283333333333324,0.57,0.0377779999999994,0.572778}, + {0.0199999999999996,0.565,0.0283333333333324,0.57}, + {0.0138886666666664,0.557778,0.0199999999999996,0.565}, + {0.00999999999999919,0.551111333333333,0.0138886666666664,0.557778}, + {0.00722199999999991,0.543333333333334,0.00999999999999919,0.551111333333333}, + {0.00499999999999901,0.533888666666667,0.00722199999999991,0.543333333333334}, + {0.00277799999999928,0.523333333333333,0.00499999999999901,0.533888666666667}, + {0.00166666666666634,0.511666666666667,0.00277799999999928,0.523333333333333}, + {0.000555333333332205,0.498888666666667,0.00166666666666634,0.511666666666667}, + {0.000555333333332205,0.485,0.000555333333332205,0.498888666666667}, + {0,0.470555333333333,0.000555333333332205,0.485}, + {0.000555333333332205,0.455,0,0.470555333333333}, + {0.000555333333332205,0.439444666666667,0.000555333333332205,0.455}, + {0.00111133333333295,0.423333333333333,0.000555333333332205,0.439444666666667}, + {0.00222199999999972,0.407222,0.00111133333333295,0.423333333333333}, + {0.00277799999999928,0.391666666666667,0.00222199999999972,0.407222}, + {0.00388866666666606,0.376111333333334,0.00277799999999928,0.391666666666667}, + {0.00444466666666562,0.361666666666667,0.00388866666666606,0.376111333333334}, + {0.00555533333333239,0.347778,0.00444466666666562,0.361666666666667}, + {0.00666666666666652,0.335,0.00555533333333239,0.347778}, + {0.00777799999999947,0.323333333333334,0.00666666666666652,0.335}, + {0.00888866666666625,0.312778,0.00777799999999947,0.323333333333334}, + {0.0105553333333326,0.303333333333333,0.00888866666666625,0.312778}, + {0.0122219999999989,0.295555333333333,0.0105553333333326,0.303333333333333}, + {0.0138886666666664,0.288888666666667,0.0122219999999989,0.295555333333333}, + {0.0166666666666657,0.282222,0.0138886666666664,0.288888666666667}, + {0.0199999999999996,0.277222,0.0166666666666657,0.282222}, + {0.0238886666666656,0.273333333333333,0.0199999999999996,0.277222}, + {0.0288886666666658,0.270555333333334,0.0238886666666656,0.273333333333333}, + {0.033888666666666,0.268333333333333,0.0288886666666658,0.270555333333334}, + {0.0394446666666658,0.267222,0.033888666666666,0.268333333333333}, + {0.0588886666666658,0.267778,0.0522219999999992,0.267222}, + {0.0649999999999989,0.268888666666667,0.0588886666666658,0.267778}, + {0.0716666666666666,0.27,0.0649999999999989,0.268888666666667}, + {0.0777779999999998,0.271666666666667,0.0716666666666666,0.27}, + {0.0833333333333333,0.273333333333333,0.0777779999999998,0.271666666666667}, + {0.0883333333333323,0.275555333333333,0.0833333333333333,0.273333333333333}, + {0.0933333333333325,0.277778,0.0883333333333323,0.275555333333333}, + {0.0972219999999998,0.280555333333333,0.0933333333333325,0.277778}, + {0.100555333333332,0.284444666666667,0.0972219999999998,0.280555333333333}, + {0.103333333333333,0.288888666666667,0.100555333333332,0.284444666666667}, + {0,0,0,0} +}; + +double Icon17[][4] = { + {0.297777333333332,0.291666666666667,0.291110666666666,0.288888666666667}, + {0.302777333333333,0.295,0.297777333333332,0.291666666666667}, + {0.306666666666666,0.298888666666667,0.302777333333333,0.295}, + {0.309443999999999,0.303888666666667,0.306666666666666,0.298888666666667}, + {0.311666666666666,0.308888666666667,0.309443999999999,0.303888666666667}, + {0.312777333333333,0.314444666666667,0.311666666666666,0.308888666666667}, + {0.312777333333333,0.320555333333333,0.312777333333333,0.314444666666667}, + {0.312777333333333,0.327222,0.312777333333333,0.320555333333333}, + {0.312222,0.333888666666667,0.312777333333333,0.327222}, + {0.311110666666667,0.34,0.312222,0.333888666666667}, + {0.31,0.346666666666666,0.311110666666667,0.34}, + {0.308333333333332,0.352778,0.31,0.346666666666666}, + {0.306666666666666,0.358333333333333,0.308333333333332,0.352778}, + {0.304444,0.363333333333333,0.306666666666666,0.358333333333333}, + {0.302221999999999,0.368333333333334,0.304444,0.363333333333333}, + {0.299444,0.372222,0.302221999999999,0.368333333333334}, + {0.295555333333333,0.375555333333333,0.299444,0.372222}, + {0.291110666666666,0.378333333333333,0.295555333333333,0.375555333333333}, + {0.285,0.380555333333334,0.291110666666666,0.378333333333333}, + {0.276666666666666,0.382222,0.285,0.380555333333334}, + {0.267221999999999,0.383333333333334,0.276666666666666,0.382222}, + {0.243888666666666,0.382778,0.256110666666666,0.383333333333334}, + {0.230555333333333,0.381666666666667,0.243888666666666,0.382778}, + {0.216110666666667,0.38,0.230555333333333,0.381666666666667}, + {0.201666666666667,0.378333333333333,0.216110666666667,0.38}, + {0.186666666666666,0.376666666666667,0.201666666666667,0.378333333333333}, + {0.172221999999999,0.375,0.186666666666666,0.376666666666667}, + {0.158888666666666,0.373888666666667,0.172221999999999,0.375}, + {0.146666666666666,0.373333333333333,0.158888666666666,0.373888666666667}, + {0.126110666666667,0.374444666666667,0.135555333333333,0.373333333333333}, + {0.117777333333333,0.376111333333334,0.126110666666667,0.374444666666667}, + {0.111666666666666,0.378333333333333,0.117777333333333,0.376111333333334}, + {0.106666666666667,0.381666666666667,0.111666666666666,0.378333333333333}, + {0.102777333333333,0.385555333333333,0.106666666666667,0.381666666666667}, + {0.099999999999999,0.39,0.102777333333333,0.385555333333333}, + {0.0977773333333332,0.395555333333334,0.099999999999999,0.39}, + {0.0966666666666664,0.402222,0.0977773333333332,0.395555333333334}, + {0.0955553333333334,0.408888666666667,0.0966666666666664,0.402222}, + {0.095,0.416111333333333,0.0955553333333334,0.408888666666667}, + {0.095,0.423333333333333,0.095,0.416111333333333}, + {0.095,0.430555333333333,0.095,0.423333333333333}, + {0.0955553333333334,0.437778,0.095,0.430555333333333}, + {0.0966666666666664,0.444444666666667,0.0955553333333334,0.437778}, + {0.0977773333333332,0.451111333333333,0.0966666666666664,0.444444666666667}, + {0.099999999999999,0.456666666666666,0.0977773333333332,0.451111333333333}, + {0.102777333333333,0.461111333333333,0.099999999999999,0.456666666666666}, + {0.106666666666667,0.465,0.102777333333333,0.461111333333333}, + {0.111666666666666,0.468333333333333,0.106666666666667,0.465}, + {0.117777333333333,0.470555333333333,0.111666666666666,0.468333333333333}, + {0.126110666666667,0.472222,0.117777333333333,0.470555333333333}, + {0.146666666666666,0.471666666666666,0.135555333333333,0.472222}, + {0.158888666666666,0.469444666666667,0.146666666666666,0.471666666666666}, + {0.172221999999999,0.466666666666667,0.158888666666666,0.469444666666667}, + {0.186666666666666,0.463333333333334,0.172221999999999,0.466666666666667}, + {0.201666666666667,0.46,0.186666666666666,0.463333333333334}, + {0.216110666666667,0.456666666666666,0.201666666666667,0.46}, + {0.230555333333333,0.453888666666667,0.216110666666667,0.456666666666666}, + {0.243888666666666,0.452222,0.230555333333333,0.453888666666667}, + {0.256110666666666,0.451666666666667,0.243888666666666,0.452222}, + {0.267221999999999,0.452778,0.256110666666666,0.451666666666667}, + {0.276666666666666,0.455555333333334,0.267221999999999,0.452778}, + {0.285,0.461111333333333,0.276666666666666,0.455555333333334}, + {0.291110666666666,0.468333333333333,0.285,0.461111333333333}, + {0.294999999999999,0.475,0.291110666666666,0.468333333333333}, + {0.297777333333332,0.482778,0.294999999999999,0.475}, + {0.300555333333333,0.492222,0.297777333333332,0.482778}, + {0.302777333333333,0.502778,0.300555333333333,0.492222}, + {0.305,0.514444666666667,0.302777333333333,0.502778}, + {0.306666666666666,0.527222,0.305,0.514444666666667}, + {0.307777333333333,0.541111333333333,0.306666666666666,0.527222}, + {0.309443999999999,0.555555333333333,0.307777333333333,0.541111333333333}, + {0.310555333333333,0.571111333333333,0.309443999999999,0.555555333333333}, + {0.311666666666666,0.586666666666667,0.310555333333333,0.571111333333333}, + {0.312222,0.602778,0.311666666666666,0.586666666666667}, + {0.312777333333333,0.618888666666667,0.312222,0.602778}, + {0.312777333333333,0.634444666666666,0.312777333333333,0.618888666666667}, + {0.312777333333333,0.65,0.312777333333333,0.634444666666666}, + {0.312222,0.664444666666667,0.312777333333333,0.65}, + {0.311110666666667,0.678333333333333,0.312222,0.664444666666667}, + {0.31,0.691111333333333,0.311110666666667,0.678333333333333}, + {0.307777333333333,0.702778,0.31,0.691111333333333}, + {0.305,0.713333333333334,0.307777333333333,0.702778}, + {0.301110666666666,0.722778,0.305,0.713333333333334}, + {0.296666666666666,0.730555333333333,0.301110666666666,0.722778}, + {0.291110666666666,0.737222,0.296666666666666,0.730555333333333}, + {0.284443999999999,0.742778,0.291110666666666,0.737222}, + {0.276666666666666,0.747222,0.284443999999999,0.742778}, + {0.267221999999999,0.750555333333333,0.276666666666666,0.747222}, + {0.256666666666666,0.753333333333333,0.267221999999999,0.750555333333333}, + {0.245,0.755,0.256666666666666,0.753333333333333}, + {0.232222,0.756111333333333,0.245,0.755}, + {0.218333333333333,0.756666666666667,0.232222,0.756111333333333}, + {0.188333333333333,0.756111333333333,0.203333333333333,0.756666666666667}, + {0.172221999999999,0.755,0.188333333333333,0.756111333333333}, + {0.156110666666667,0.753888666666667,0.172221999999999,0.755}, + {0.140555333333333,0.752778,0.156110666666667,0.753888666666667}, + {0.124443999999999,0.751111333333334,0.140555333333333,0.752778}, + {0.109444,0.749444666666667,0.124443999999999,0.751111333333334}, + {0.0944439999999993,0.748333333333333,0.109444,0.749444666666667}, + {0.0805553333333329,0.746666666666667,0.0944439999999993,0.748333333333333}, + {0.0677773333333332,0.745,0.0805553333333329,0.746666666666667}, + {0.0561106666666665,0.743888666666667,0.0677773333333332,0.745}, + {0.0455553333333327,0.742222,0.0561106666666665,0.743888666666667}, + {0.0361106666666657,0.740555333333334,0.0455553333333327,0.742222}, + {0.0283333333333324,0.738888666666667,0.0361106666666657,0.740555333333334}, + {0.0216666666666659,0.737222,0.0283333333333324,0.738888666666667}, + {0.0149999999999994,0.734444666666667,0.0216666666666659,0.737222}, + {0.00999999999999919,0.731111333333333,0.0149999999999994,0.734444666666667}, + {0.00611066666666578,0.727222,0.00999999999999919,0.731111333333333}, + {0.00333333333333267,0.722222,0.00611066666666578,0.727222}, + {0.00111066666666678,0.717222,0.00333333333333267,0.722222}, + {0,0.711666666666667,0.00111066666666678,0.717222}, + {0,0.705555333333334,0,0.711666666666667}, + {0,0.698888666666667,0,0.705555333333334}, + {0.000555333333333389,0.692222,0,0.698888666666667}, + {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222}, + {0.00277733333333311,0.679444666666667,0.00166666666666634,0.686111333333334}, + {0.00444399999999945,0.673333333333333,0.00277733333333311,0.679444666666667}, + {0.00611066666666578,0.667778,0.00444399999999945,0.673333333333333}, + {0.00833333333333286,0.662778,0.00611066666666578,0.667778}, + {0.0105553333333326,0.657778,0.00833333333333286,0.662778}, + {0.013333333333333,0.653888666666666,0.0105553333333326,0.657778}, + {0.0172219999999991,0.650555333333333,0.013333333333333,0.653888666666666}, + {0.0216666666666659,0.647778,0.0172219999999991,0.650555333333333}, + {0.0277773333333329,0.645555333333334,0.0216666666666659,0.647778}, + {0.0361106666666657,0.643888666666667,0.0277773333333329,0.645555333333334}, + {0.0455553333333327,0.642778,0.0361106666666657,0.643888666666667}, + {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778}, + {0.0822219999999992,0.644444666666667,0.0688886666666662,0.643333333333333}, + {0.0966666666666664,0.646111333333333,0.0822219999999992,0.644444666666667}, + {0.111666666666666,0.647778,0.0966666666666664,0.646111333333333}, + {0.126110666666667,0.649444666666666,0.111666666666666,0.647778}, + {0.140555333333333,0.651111333333333,0.126110666666667,0.649444666666666}, + {0.153888666666666,0.652222,0.140555333333333,0.651111333333333}, + {0.166110666666666,0.652778,0.153888666666666,0.652222}, + {0.186666666666666,0.651666666666667,0.177221999999999,0.652778}, + {0.194999999999999,0.65,0.186666666666666,0.651666666666667}, + {0.201110666666666,0.647778,0.194999999999999,0.65}, + {0.206110666666666,0.644444666666667,0.201110666666666,0.647778}, + {0.21,0.640555333333333,0.206110666666666,0.644444666666667}, + {0.212777333333333,0.636111333333333,0.21,0.640555333333333}, + {0.215,0.630555333333334,0.212777333333333,0.636111333333333}, + {0.216110666666667,0.623888666666667,0.215,0.630555333333334}, + {0.217222,0.617222,0.216110666666667,0.623888666666667}, + {0.217777333333333,0.61,0.217222,0.617222}, + {0.217777333333333,0.602778,0.217777333333333,0.61}, + {0.217777333333333,0.595555333333333,0.217777333333333,0.602778}, + {0.217222,0.588333333333334,0.217777333333333,0.595555333333333}, + {0.216110666666667,0.581666666666666,0.217222,0.588333333333334}, + {0.215,0.575,0.216110666666667,0.581666666666666}, + {0.212777333333333,0.569444666666667,0.215,0.575}, + {0.21,0.565,0.212777333333333,0.569444666666667}, + {0.206110666666666,0.561111333333334,0.21,0.565}, + {0.201110666666666,0.557778,0.206110666666666,0.561111333333334}, + {0.194999999999999,0.555555333333333,0.201110666666666,0.557778}, + {0.186666666666666,0.553888666666667,0.194999999999999,0.555555333333333}, + {0.166110666666666,0.554444666666667,0.177221999999999,0.553888666666667}, + {0.153888666666666,0.556666666666667,0.166110666666666,0.554444666666667}, + {0.140555333333333,0.559444666666667,0.153888666666666,0.556666666666667}, + {0.126110666666667,0.562778,0.140555333333333,0.559444666666667}, + {0.111666666666666,0.566111333333333,0.126110666666667,0.562778}, + {0.0966666666666664,0.569444666666667,0.111666666666666,0.566111333333333}, + {0.0822219999999992,0.572222,0.0966666666666664,0.569444666666667}, + {0.0688886666666662,0.573888666666667,0.0822219999999992,0.572222}, + {0.056666666666666,0.574444666666666,0.0688886666666662,0.573888666666667}, + {0.0455553333333327,0.573333333333334,0.056666666666666,0.574444666666666}, + {0.0361106666666657,0.570555333333333,0.0455553333333327,0.573333333333334}, + {0.0277773333333329,0.565,0.0361106666666657,0.570555333333333}, + {0.0216666666666659,0.557778,0.0277773333333329,0.565}, + {0.0177773333333325,0.551111333333333,0.0216666666666659,0.557778}, + {0.0149999999999994,0.543333333333334,0.0177773333333325,0.551111333333333}, + {0.0122220000000001,0.533888666666667,0.0149999999999994,0.543333333333334}, + {0.00999999999999919,0.523333333333333,0.0122220000000001,0.533888666666667}, + {0.0077773333333333,0.511666666666667,0.00999999999999919,0.523333333333333}, + {0.00611066666666578,0.498888666666667,0.0077773333333333,0.511666666666667}, + {0.00499999999999901,0.485,0.00611066666666578,0.498888666666667}, + {0.00333333333333267,0.470555333333333,0.00499999999999901,0.485}, + {0.00222199999999972,0.455,0.00333333333333267,0.470555333333333}, + {0.00111066666666678,0.439444666666667,0.00222199999999972,0.455}, + {0.000555333333333389,0.423333333333333,0.00111066666666678,0.439444666666667}, + {0,0.407222,0.000555333333333389,0.423333333333333}, + {0,0.391666666666667,0,0.407222}, + {0,0.376111333333334,0,0.391666666666667}, + {0.000555333333333389,0.361666666666667,0,0.376111333333334}, + {0.00166666666666634,0.347778,0.000555333333333389,0.361666666666667}, + {0.00277733333333311,0.335,0.00166666666666634,0.347778}, + {0.00499999999999901,0.323333333333334,0.00277733333333311,0.335}, + {0.0077773333333333,0.312778,0.00499999999999901,0.323333333333334}, + {0.0116666666666667,0.303333333333333,0.0077773333333333,0.312778}, + {0.0161106666666662,0.295555333333333,0.0116666666666667,0.303333333333333}, + {0.0216666666666659,0.288888666666667,0.0161106666666662,0.295555333333333}, + {0.0283333333333324,0.283333333333333,0.0216666666666659,0.288888666666667}, + {0.0361106666666657,0.278888666666666,0.0283333333333324,0.283333333333333}, + {0.0455553333333327,0.275555333333333,0.0361106666666657,0.278888666666666}, + {0.0561106666666665,0.272778,0.0455553333333327,0.275555333333333}, + {0.0677773333333332,0.271111333333333,0.0561106666666665,0.272778}, + {0.0805553333333329,0.27,0.0677773333333332,0.271111333333333}, + {0.0944439999999993,0.269444666666667,0.0805553333333329,0.27}, + {0.124443999999999,0.27,0.109444,0.269444666666667}, + {0.140555333333333,0.271111333333333,0.124443999999999,0.27}, + {0.156666666666666,0.272222,0.140555333333333,0.271111333333333}, + {0.172221999999999,0.273333333333333,0.156666666666666,0.272222}, + {0.188333333333333,0.275,0.172221999999999,0.273333333333333}, + {0.203333333333333,0.276666666666667,0.188333333333333,0.275}, + {0.218333333333333,0.277778,0.203333333333333,0.276666666666667}, + {0.232222,0.279444666666667,0.218333333333333,0.277778}, + {0.245,0.281111333333333,0.232222,0.279444666666667}, + {0.256666666666666,0.282222,0.245,0.281111333333333}, + {0.267221999999999,0.283888666666667,0.256666666666666,0.282222}, + {0.276666666666666,0.285555333333334,0.267221999999999,0.283888666666667}, + {0.284443999999999,0.287222,0.276666666666666,0.285555333333334}, + {0.291110666666666,0.288888666666667,0.284443999999999,0.287222}, + {0,0,0,0} +}; + +double Icon18[][4] = { + {0.0249999999999998,0.288888666666667,0.0205553333333341,0.297222}, + {0.0205553333333341,0.297222,0.0166666666666669,0.307222}, + {0.0166666666666669,0.307222,0.013333333333333,0.318333333333333}, + {0.013333333333333,0.318333333333333,0.0105553333333338,0.331111333333334}, + {0.0105553333333338,0.331111333333334,0.00833333333333404,0.344444666666667}, + {0.00833333333333404,0.344444666666667,0.00611133333333314,0.36}, + {0.00611133333333314,0.36,0.0044446666666668,0.376111333333334}, + {0.0044446666666668,0.376111333333334,0.00333333333333385,0.393333333333333}, + {0.00333333333333385,0.393333333333333,0.00222199999999972,0.411666666666667}, + {0.00222199999999972,0.411666666666667,0.00111133333333413,0.431111333333333}, + {0.00111133333333413,0.431111333333333,0.000555333333333389,0.450555333333333}, + {0.000555333333333389,0.450555333333333,0,0.471111333333334}, + {0,0.471111333333334,0,0.492222}, + {0,0.492222,0,0.513333333333333}, + {0,0.513333333333333,0,0.533888666666667}, + {0,0.533888666666667,0,0.555}, + {0,0.555,0.000555333333333389,0.575555333333333}, + {0.000555333333333389,0.575555333333333,0.00111133333333413,0.595}, + {0.00111133333333413,0.595,0.00222199999999972,0.614444666666667}, + {0.00222199999999972,0.614444666666667,0.00333333333333385,0.632778}, + {0.00333333333333385,0.632778,0.0044446666666668,0.65}, + {0.0044446666666668,0.65,0.00611133333333314,0.666111333333333}, + {0.00611133333333314,0.666111333333333,0.00833333333333404,0.681666666666667}, + {0.00833333333333404,0.681666666666667,0.0105553333333338,0.695}, + {0.0105553333333338,0.695,0.013333333333333,0.707778}, + {0.013333333333333,0.707778,0.0166666666666669,0.718888666666667}, + {0.0166666666666669,0.718888666666667,0.0205553333333341,0.728888666666667}, + {0.0205553333333341,0.728888666666667,0.0249999999999998,0.737222}, + {0.0249999999999998,0.737222,0.0311113333333341,0.745555333333333}, + {0.0311113333333341,0.745555333333333,0.038333333333334,0.752778}, + {0.038333333333334,0.752778,0.0466666666666669,0.758888666666667}, + {0.0466666666666669,0.758888666666667,0.0555553333333331,0.763333333333333}, + {0.0555553333333331,0.763333333333333,0.066111333333333,0.767222}, + {0.066111333333333,0.767222,0.0772220000000002,0.769444666666667}, + {0.0772220000000002,0.769444666666667,0.0894446666666665,0.771111333333333}, + {0.0894446666666665,0.771111333333333,0.102778000000001,0.772222}, + {0.102778000000001,0.772222,0.116111333333334,0.772778}, + {0.116111333333334,0.772778,0.130555333333334,0.772222}, + {0.130555333333334,0.772222,0.145000000000001,0.771666666666667}, + {0.145000000000001,0.771666666666667,0.16,0.771111333333333}, + {0.16,0.771111333333333,0.174444666666667,0.769444666666667}, + {0.174444666666667,0.769444666666667,0.188888666666667,0.767778}, + {0.188888666666667,0.767778,0.203333333333333,0.766111333333334}, + {0.203333333333333,0.766111333333334,0.216666666666667,0.763888666666666}, + {0.216666666666667,0.763888666666666,0.23,0.762222}, + {0.23,0.762222,0.242222000000001,0.759444666666666}, + {0.242222000000001,0.759444666666666,0.253333333333334,0.756666666666667}, + {0.253333333333334,0.756666666666667,0.263888666666666,0.753888666666667}, + {0.263888666666666,0.753888666666667,0.272778,0.750555333333333}, + {0.272778,0.750555333333333,0.281111333333334,0.746666666666667}, + {0.281111333333334,0.746666666666667,0.288333333333334,0.742222}, + {0.288333333333334,0.742222,0.294444666666667,0.737222}, + {0.294444666666667,0.737222,0.300000000000001,0.730555333333333}, + {0.300000000000001,0.730555333333333,0.304444666666667,0.722778}, + {0.304444666666667,0.722778,0.308333333333334,0.713333333333334}, + {0.308333333333334,0.713333333333334,0.311111333333334,0.702778}, + {0.311111333333334,0.702778,0.313333333333334,0.691111333333333}, + {0.313333333333334,0.691111333333333,0.314444666666667,0.678333333333333}, + {0.314444666666667,0.678333333333333,0.315555333333333,0.664444666666667}, + {0.315555333333333,0.664444666666667,0.316111333333333,0.65}, + {0.316111333333333,0.65,0.316111333333333,0.634444666666666}, + {0.316111333333333,0.634444666666666,0.316111333333333,0.618888666666667}, + {0.316111333333333,0.618888666666667,0.315555333333333,0.602778}, + {0.315555333333333,0.602778,0.315,0.586666666666667}, + {0.315,0.586666666666667,0.313888666666667,0.571111333333333}, + {0.313888666666667,0.571111333333333,0.312778,0.555555333333333}, + {0.312778,0.555555333333333,0.311111333333334,0.541111333333333}, + {0.311111333333334,0.541111333333333,0.31,0.527222}, + {0.31,0.527222,0.308333333333334,0.514444666666667}, + {0.308333333333334,0.514444666666667,0.306111333333334,0.502778}, + {0.306111333333334,0.502778,0.303888666666667,0.492222}, + {0.303888666666667,0.492222,0.301111333333334,0.482778}, + {0.301111333333334,0.482778,0.298333333333333,0.475}, + {0.298333333333333,0.475,0.294444666666667,0.468333333333333}, + {0.294444666666667,0.468333333333333,0.288333333333334,0.461111333333333}, + {0.288333333333334,0.461111333333333,0.28,0.455555333333334}, + {0.28,0.455555333333334,0.270555333333334,0.452778}, + {0.270555333333334,0.452778,0.259444666666667,0.451666666666667}, + {0.259444666666667,0.451666666666667,0.247222000000001,0.452222}, + {0.247222000000001,0.452222,0.233888666666666,0.453888666666667}, + {0.233888666666666,0.453888666666667,0.219444666666667,0.456666666666666}, + {0.219444666666667,0.456666666666666,0.205000000000001,0.46}, + {0.205000000000001,0.46,0.19,0.463333333333334}, + {0.19,0.463333333333334,0.175555333333334,0.466666666666667}, + {0.175555333333334,0.466666666666667,0.162222,0.469444666666667}, + {0.162222,0.469444666666667,0.15,0.471666666666666}, + {0.15,0.471666666666666,0.138888666666666,0.472222}, + {0.129444666666667,0.472222,0.121111333333334,0.470555333333333}, + {0.121111333333334,0.470555333333333,0.115000000000001,0.468333333333333}, + {0.115000000000001,0.468333333333333,0.110000000000001,0.465}, + {0.110000000000001,0.465,0.106111333333333,0.461111333333333}, + {0.106111333333333,0.461111333333333,0.103333333333334,0.456666666666666}, + {0.103333333333334,0.456666666666666,0.101111333333333,0.451111333333333}, + {0.101111333333333,0.451111333333333,0.1,0.444444666666667}, + {0.1,0.444444666666667,0.0988886666666673,0.437778}, + {0.0988886666666673,0.437778,0.0983333333333339,0.430555333333333}, + {0.0983333333333339,0.430555333333333,0.0983333333333339,0.423333333333333}, + {0.0983333333333339,0.423333333333333,0.0983333333333339,0.416111333333333}, + {0.0983333333333339,0.416111333333333,0.0988886666666673,0.408888666666667}, + {0.0988886666666673,0.408888666666667,0.1,0.402222}, + {0.1,0.402222,0.101111333333333,0.395555333333334}, + {0.101111333333333,0.395555333333334,0.103333333333334,0.39}, + {0.103333333333334,0.39,0.106111333333333,0.385555333333333}, + {0.106111333333333,0.385555333333333,0.110000000000001,0.381666666666667}, + {0.110000000000001,0.381666666666667,0.115000000000001,0.378333333333333}, + {0.115000000000001,0.378333333333333,0.121111333333334,0.376111333333334}, + {0.121111333333334,0.376111333333334,0.129444666666667,0.374444666666667}, + {0.129444666666667,0.374444666666667,0.138888666666666,0.373333333333333}, + {0.15,0.373333333333333,0.162222,0.373888666666667}, + {0.162222,0.373888666666667,0.175555333333334,0.375}, + {0.175555333333334,0.375,0.19,0.376666666666667}, + {0.19,0.376666666666667,0.205000000000001,0.378333333333333}, + {0.205000000000001,0.378333333333333,0.219444666666667,0.38}, + {0.219444666666667,0.38,0.233888666666666,0.381666666666667}, + {0.233888666666666,0.381666666666667,0.247222000000001,0.382778}, + {0.247222000000001,0.382778,0.259444666666667,0.383333333333334}, + {0.270555333333334,0.383333333333334,0.28,0.382222}, + {0.28,0.382222,0.288333333333334,0.380555333333334}, + {0.288333333333334,0.380555333333334,0.294444666666667,0.378333333333333}, + {0.294444666666667,0.378333333333333,0.298888666666667,0.375555333333333}, + {0.298888666666667,0.375555333333333,0.302778,0.372222}, + {0.302778,0.372222,0.305555333333333,0.368333333333334}, + {0.305555333333333,0.368333333333334,0.307778,0.363333333333333}, + {0.307778,0.363333333333333,0.31,0.358333333333333}, + {0.31,0.358333333333333,0.311666666666667,0.352778}, + {0.311666666666667,0.352778,0.313333333333334,0.346666666666666}, + {0.313333333333334,0.346666666666666,0.314444666666667,0.34}, + {0.314444666666667,0.34,0.315555333333333,0.333333333333333}, + {0.315555333333333,0.333333333333333,0.316111333333333,0.327222}, + {0.316111333333333,0.327222,0.316111333333333,0.320555333333333}, + {0.316111333333333,0.320555333333333,0.316111333333333,0.314444666666667}, + {0.316111333333333,0.314444666666667,0.315,0.308888666666667}, + {0.315,0.308888666666667,0.312778,0.303888666666667}, + {0.312778,0.303888666666667,0.31,0.298888666666667}, + {0.31,0.298888666666667,0.306111333333334,0.295}, + {0.306111333333334,0.295,0.301111333333334,0.291666666666667}, + {0.301111333333334,0.291666666666667,0.294444666666667,0.288888666666667}, + {0.294444666666667,0.288888666666667,0.287778000000001,0.287222}, + {0.287778000000001,0.287222,0.28,0.285}, + {0.28,0.285,0.270555333333334,0.283333333333333}, + {0.270555333333334,0.283333333333333,0.26,0.281666666666667}, + {0.26,0.281666666666667,0.248333333333334,0.279444666666667}, + {0.248333333333334,0.279444666666667,0.235555333333334,0.277222}, + {0.235555333333334,0.277222,0.221666666666666,0.274444666666666}, + {0.221666666666666,0.274444666666666,0.206666666666667,0.272222}, + {0.206666666666667,0.272222,0.191666666666666,0.268888666666667}, + {0.191666666666666,0.268888666666667,0.175555333333334,0.266111333333334}, + {0.175555333333334,0.266111333333334,0.159444666666667,0.263888666666666}, + {0.159444666666667,0.263888666666666,0.143888666666667,0.261111333333333}, + {0.143888666666667,0.261111333333333,0.127778,0.259444666666666}, + {0.127778,0.259444666666666,0.112778,0.257778}, + {0.112778,0.257778,0.0977780000000005,0.257222}, + {0.0977780000000005,0.257222,0.0838886666666667,0.257778}, + {0.0838886666666667,0.257778,0.0711113333333332,0.259444666666666}, + {0.0711113333333332,0.259444666666666,0.0594446666666665,0.262222}, + {0.0594446666666665,0.262222,0.0488886666666666,0.266111333333334}, + {0.0488886666666666,0.266111333333334,0.0394446666666669,0.272222}, + {0.0394446666666669,0.272222,0.0316666666666675,0.279444666666667}, + {0.0316666666666675,0.279444666666667,0.0249999999999998,0.288888666666667}, + {0.204444666666667,0.557778,0.207778,0.562222}, + {0.207778,0.562222,0.210000000000001,0.567778}, + {0.210000000000001,0.567778,0.211111333333334,0.575}, + {0.211111333333334,0.575,0.212222000000001,0.583888666666667}, + {0.212222000000001,0.583888666666667,0.212778,0.592778}, + {0.212778,0.592778,0.212778,0.602778}, + {0.212778,0.602778,0.212778,0.612778}, + {0.212778,0.612778,0.212222000000001,0.621666666666667}, + {0.212222000000001,0.621666666666667,0.211111333333334,0.630555333333334}, + {0.211111333333334,0.630555333333334,0.210000000000001,0.637778}, + {0.210000000000001,0.637778,0.207778,0.643333333333333}, + {0.207778,0.643333333333333,0.204444666666667,0.647778}, + {0.204444666666667,0.647778,0.2,0.651111333333333}, + {0.2,0.651111333333333,0.194444666666667,0.653333333333334}, + {0.194444666666667,0.653333333333334,0.187222000000001,0.654444666666667}, + {0.187222000000001,0.654444666666667,0.178888666666667,0.655555333333333}, + {0.178888666666667,0.655555333333333,0.169444666666667,0.656111333333333}, + {0.15,0.656111333333333,0.140555333333334,0.655555333333333}, + {0.140555333333334,0.655555333333333,0.132222,0.654444666666667}, + {0.132222,0.654444666666667,0.125,0.653333333333334}, + {0.125,0.653333333333334,0.119444666666666,0.651111333333333}, + {0.119444666666666,0.651111333333333,0.115000000000001,0.647778}, + {0.115000000000001,0.647778,0.111666666666667,0.643333333333333}, + {0.111666666666667,0.643333333333333,0.109444666666667,0.637778}, + {0.109444666666667,0.637778,0.108333333333333,0.630555333333334}, + {0.108333333333333,0.630555333333334,0.107222,0.621666666666667}, + {0.107222,0.621666666666667,0.106666666666667,0.612778}, + {0.106666666666667,0.612778,0.106666666666667,0.602778}, + {0.106666666666667,0.602778,0.106666666666667,0.592778}, + {0.106666666666667,0.592778,0.107222,0.583888666666667}, + {0.107222,0.583888666666667,0.108333333333333,0.575}, + {0.108333333333333,0.575,0.109444666666667,0.567778}, + {0.109444666666667,0.567778,0.111666666666667,0.562222}, + {0.111666666666667,0.562222,0.115000000000001,0.557778}, + {0.115000000000001,0.557778,0.119444666666666,0.554444666666667}, + {0.119444666666666,0.554444666666667,0.125,0.552222}, + {0.125,0.552222,0.132222,0.551111333333333}, + {0.132222,0.551111333333333,0.140555333333334,0.55}, + {0.140555333333334,0.55,0.15,0.549444666666667}, + {0.169444666666667,0.549444666666667,0.178888666666667,0.55}, + {0.178888666666667,0.55,0.187222000000001,0.551111333333333}, + {0.187222000000001,0.551111333333333,0.194444666666667,0.552222}, + {0.194444666666667,0.552222,0.2,0.554444666666667}, + {0.2,0.554444666666667,0.204444666666667,0.557778}, + {0,0,0,0} +}; + +double Icon19[][4] = { + {0.293889333333333,0.297222,0.291111333333333,0.288888666666667}, + {0.295556,0.307222,0.293889333333333,0.297222}, + {0.296666666666667,0.318333333333333,0.295556,0.307222}, + {0.296666666666667,0.331111333333334,0.296666666666667,0.318333333333333}, + {0.296111333333333,0.344444666666667,0.296666666666667,0.331111333333334}, + {0.294444666666666,0.36,0.296111333333333,0.344444666666667}, + {0.292222666666667,0.376111333333334,0.294444666666666,0.36}, + {0.289444666666666,0.393333333333333,0.292222666666667,0.376111333333334}, + {0.286111333333333,0.411666666666667,0.289444666666666,0.393333333333333}, + {0.282222666666667,0.431111333333333,0.286111333333333,0.411666666666667}, + {0.277778,0.450555333333333,0.282222666666667,0.431111333333333}, + {0.272778,0.471111333333334,0.277778,0.450555333333333}, + {0.268333333333333,0.492222,0.272778,0.471111333333334}, + {0.262778,0.513333333333333,0.268333333333333,0.492222}, + {0.257777999999999,0.533888666666667,0.262778,0.513333333333333}, + {0.252222666666666,0.555,0.257777999999999,0.533888666666667}, + {0.247222666666666,0.575555333333333,0.252222666666666,0.555}, + {0.241666666666667,0.595,0.247222666666666,0.575555333333333}, + {0.236666666666667,0.614444666666667,0.241666666666667,0.595}, + {0.231666666666667,0.632778,0.236666666666667,0.614444666666667}, + {0.227222666666667,0.65,0.231666666666667,0.632778}, + {0.222778000000001,0.666111333333333,0.227222666666667,0.65}, + {0.218889333333334,0.681666666666667,0.222778000000001,0.666111333333333}, + {0.215000000000001,0.695,0.218889333333334,0.681666666666667}, + {0.211111333333333,0.707778,0.215000000000001,0.695}, + {0.207778,0.718888666666667,0.211111333333333,0.707778}, + {0.204444666666667,0.728888666666667,0.207778,0.718888666666667}, + {0.201111333333332,0.737222,0.204444666666667,0.728888666666667}, + {0.197778,0.744444666666666,0.201111333333332,0.737222}, + {0.194444666666667,0.751111333333334,0.197778,0.744444666666666}, + {0.191111333333334,0.756666666666667,0.194444666666667,0.751111333333334}, + {0.187777999999999,0.761111333333333,0.191111333333334,0.756666666666667}, + {0.184444666666667,0.765,0.187777999999999,0.761111333333333}, + {0.180556,0.767778,0.184444666666667,0.765}, + {0.176666666666667,0.770555333333334,0.180556,0.767778}, + {0.172778000000001,0.772222,0.176666666666667,0.770555333333334}, + {0.168889333333333,0.773888666666667,0.172778000000001,0.772222}, + {0.164999999999999,0.774444666666666,0.168889333333333,0.773888666666667}, + {0.160556,0.775555333333333,0.164999999999999,0.774444666666666}, + {0.147778,0.775,0.152222666666667,0.775555333333333}, + {0.143889333333334,0.774444666666666,0.147778,0.775}, + {0.140000000000001,0.773333333333333,0.143889333333334,0.774444666666666}, + {0.136111333333332,0.772222,0.140000000000001,0.773333333333333}, + {0.132222666666666,0.771111333333333,0.136111333333332,0.772222}, + {0.128333333333333,0.769444666666667,0.132222666666666,0.771111333333333}, + {0.125,0.767778,0.128333333333333,0.769444666666667}, + {0.122222666666666,0.765555333333333,0.125,0.767778}, + {0.119444666666666,0.762778,0.122222666666666,0.765555333333333}, + {0.117222666666666,0.76,0.119444666666666,0.762778}, + {0.115,0.756666666666667,0.117222666666666,0.76}, + {0.113889333333333,0.752778,0.115,0.756666666666667}, + {0.112778000000001,0.748333333333333,0.113889333333333,0.752778}, + {0.111666666666667,0.743333333333334,0.112778000000001,0.748333333333333}, + {0.111666666666667,0.737222,0.111666666666667,0.743333333333334}, + {0.112222666666668,0.728888666666667,0.111666666666667,0.737222}, + {0.112778000000001,0.719444666666667,0.112222666666668,0.728888666666667}, + {0.115,0.708888666666667,0.112778000000001,0.719444666666667}, + {0.117222666666666,0.696111333333333,0.115,0.708888666666667}, + {0.121111333333334,0.682778,0.117222666666666,0.696111333333333}, + {0.125,0.667222,0.121111333333334,0.682778}, + {0.13,0.651111333333333,0.125,0.667222}, + {0.135,0.633888666666667,0.13,0.651111333333333}, + {0.141111333333332,0.615555333333334,0.135,0.633888666666667}, + {0.147222666666667,0.596666666666666,0.141111333333332,0.615555333333334}, + {0.153889333333334,0.577222,0.147222666666667,0.596666666666666}, + {0.160556,0.557778,0.153889333333334,0.577222}, + {0.167222666666667,0.538333333333333,0.160556,0.557778}, + {0.173889333333333,0.518888666666667,0.167222666666667,0.538333333333333}, + {0.179444666666666,0.5,0.173889333333333,0.518888666666667}, + {0.185556000000001,0.481666666666667,0.179444666666666,0.5}, + {0.190556000000001,0.464444666666667,0.185556000000001,0.481666666666667}, + {0.194444666666667,0.448333333333334,0.190556000000001,0.464444666666667}, + {0.198333333333333,0.432778,0.194444666666667,0.448333333333334}, + {0.200555999999999,0.419444666666667,0.198333333333333,0.432778}, + {0.202222666666666,0.406666666666667,0.200555999999999,0.419444666666667}, + {0.202778,0.396111333333333,0.202222666666666,0.406666666666667}, + {0.202778,0.386666666666667,0.202778,0.396111333333333}, + {0.201111333333332,0.378333333333333,0.202778,0.386666666666667}, + {0.197222666666666,0.368333333333334,0.201111333333332,0.378333333333333}, + {0.191111333333334,0.361666666666667,0.197222666666666,0.368333333333334}, + {0.182777999999999,0.357222,0.191111333333334,0.361666666666667}, + {0.172222666666668,0.355555333333333,0.182777999999999,0.357222}, + {0.159999999999999,0.356111333333333,0.172222666666668,0.355555333333333}, + {0.146111333333333,0.358333333333333,0.159999999999999,0.356111333333333}, + {0.131111333333334,0.361666666666667,0.146111333333333,0.358333333333333}, + {0.115556,0.365555333333334,0.131111333333334,0.361666666666667}, + {0.099999999999999,0.37,0.115556,0.365555333333334}, + {0.0850000000000009,0.374444666666667,0.099999999999999,0.37}, + {0.070556000000001,0.377778,0.0850000000000009,0.374444666666667}, + {0.0572226666666656,0.380555333333334,0.070556000000001,0.377778}, + {0.0461113333333335,0.381666666666667,0.0572226666666656,0.380555333333334}, + {0.0361113333333331,0.382222,0.0461113333333335,0.381666666666667}, + {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222}, + {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334}, + {0.0172226666666665,0.375555333333333,0.0216666666666671,0.378333333333333}, + {0.013333333333333,0.372222,0.0172226666666665,0.375555333333333}, + {0.0105559999999999,0.368333333333334,0.013333333333333,0.372222}, + {0.00833333333333286,0.363333333333333,0.0105559999999999,0.368333333333334}, + {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333}, + {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333}, + {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778}, + {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666}, + {0.000555999999999557,0.333333333333333,0.00166666666666634,0.34}, + {0,0.327222,0.000555999999999557,0.333333333333333}, + {0,0.320555333333333,0,0.327222}, + {0,0.314444666666667,0,0.320555333333333}, + {0.00111133333333295,0.308888666666667,0,0.314444666666667}, + {0.00333333333333385,0.303888666666667,0.00111133333333295,0.308888666666667}, + {0.00611133333333314,0.298888666666667,0.00333333333333385,0.303888666666667}, + {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667}, + {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295}, + {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667}, + {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667}, + {0.0361113333333331,0.285,0.0283333333333336,0.287222}, + {0.0455560000000001,0.283333333333333,0.0361113333333331,0.285}, + {0.0566666666666672,0.281666666666667,0.0455560000000001,0.283333333333333}, + {0.0683333333333328,0.279444666666667,0.0566666666666672,0.281666666666667}, + {0.0816666666666658,0.277222,0.0683333333333328,0.279444666666667}, + {0.096111333333333,0.274444666666666,0.0816666666666658,0.277222}, + {0.111666666666667,0.272222,0.096111333333333,0.274444666666666}, + {0.127222666666666,0.268888666666667,0.111666666666667,0.272222}, + {0.143889333333334,0.266111333333334,0.127222666666666,0.268888666666667}, + {0.160556,0.263888666666666,0.143889333333334,0.266111333333334}, + {0.177222666666668,0.261111333333333,0.160556,0.263888666666666}, + {0.193333333333333,0.259444666666666,0.177222666666668,0.261111333333333}, + {0.209444666666667,0.257778,0.193333333333333,0.259444666666666}, + {0.224444666666666,0.257222,0.209444666666667,0.257778}, + {0.238333333333332,0.257778,0.224444666666666,0.257222}, + {0.251111333333334,0.259444666666666,0.238333333333332,0.257778}, + {0.262222666666666,0.262222,0.251111333333334,0.259444666666666}, + {0.271666666666666,0.266111333333334,0.262222666666666,0.262222}, + {0.279999999999999,0.272222,0.271666666666666,0.266111333333334}, + {0.286111333333333,0.279444666666667,0.279999999999999,0.272222}, + {0.291111333333333,0.288888666666667,0.286111333333333,0.279444666666667}, + {0,0,0,0} +}; + +double Icon20[][4] = { + {0.0988886666666673,0.285555333333334,0.0916666666666662,0.288888666666667}, + {0.106666666666667,0.283333333333333,0.0988886666666673,0.285555333333334}, + {0.113888666666665,0.282222,0.106666666666667,0.283333333333333}, + {0.121666666666667,0.281111333333333,0.113888666666665,0.282222}, + {0.128888666666666,0.280555333333333,0.121666666666667,0.281111333333333}, + {0.151666666666666,0.281111333333333,0.144444,0.280555333333333}, + {0.159444000000001,0.282222,0.151666666666666,0.281111333333333}, + {0.166666666666667,0.283333333333333,0.159444000000001,0.282222}, + {0.174443999999999,0.285555333333334,0.166666666666667,0.283333333333333}, + {0.181666666666667,0.288888666666667,0.174443999999999,0.285555333333334}, + {0.188333333333333,0.292778,0.181666666666667,0.288888666666667}, + {0.195,0.297222,0.188333333333333,0.292778}, + {0.201666666666666,0.302222,0.195,0.297222}, + {0.208888666666667,0.307778,0.201666666666666,0.302222}, + {0.216110666666665,0.313888666666667,0.208888666666667,0.307778}, + {0.223888666666667,0.320555333333333,0.216110666666665,0.313888666666667}, + {0.231666666666667,0.327222,0.223888666666667,0.320555333333333}, + {0.239443999999999,0.334444666666667,0.231666666666667,0.327222}, + {0.246110666666667,0.341111333333333,0.239443999999999,0.334444666666667}, + {0.252777333333334,0.348333333333333,0.246110666666667,0.341111333333333}, + {0.258888666666666,0.355555333333333,0.252777333333334,0.348333333333333}, + {0.263888666666666,0.362778,0.258888666666666,0.355555333333333}, + {0.268333333333333,0.370555333333333,0.263888666666666,0.362778}, + {0.271110666666667,0.378333333333333,0.268333333333333,0.370555333333333}, + {0.272777333333333,0.386666666666667,0.271110666666667,0.378333333333333}, + {0.273333333333333,0.395555333333334,0.272777333333333,0.386666666666667}, + {0.273333333333333,0.404444666666667,0.273333333333333,0.395555333333334}, + {0.271666666666666,0.413888666666667,0.273333333333333,0.404444666666667}, + {0.269444,0.423888666666667,0.271666666666666,0.413888666666667}, + {0.266666666666666,0.433333333333334,0.269444,0.423888666666667}, + {0.263333333333333,0.443888666666667,0.266666666666666,0.433333333333334}, + {0.26,0.453888666666667,0.263333333333333,0.443888666666667}, + {0.256666666666668,0.463888666666667,0.26,0.453888666666667}, + {0.253888666666666,0.473888666666667,0.256666666666668,0.463888666666667}, + {0.251666666666667,0.483888666666667,0.253888666666666,0.473888666666667}, + {0.25,0.493888666666667,0.251666666666667,0.483888666666667}, + {0.248888666666666,0.503888666666667,0.25,0.493888666666667}, + {0.248888666666666,0.513333333333333,0.248888666666666,0.503888666666667}, + {0.248888666666666,0.522778,0.248888666666666,0.513333333333333}, + {0.25,0.532778,0.248888666666666,0.522778}, + {0.251666666666667,0.542222,0.25,0.532778}, + {0.253888666666666,0.552222,0.251666666666667,0.542222}, + {0.256666666666668,0.562222,0.253888666666666,0.552222}, + {0.26,0.572778,0.256666666666668,0.562222}, + {0.263333333333333,0.582778,0.26,0.572778}, + {0.266666666666666,0.592778,0.263333333333333,0.582778}, + {0.269444,0.602778,0.266666666666666,0.592778}, + {0.271666666666666,0.612222,0.269444,0.602778}, + {0.273333333333333,0.621666666666667,0.271666666666666,0.612222}, + {0.273333333333333,0.631111333333333,0.273333333333333,0.621666666666667}, + {0.272777333333333,0.639444666666667,0.273333333333333,0.631111333333333}, + {0.271110666666667,0.647778,0.272777333333333,0.639444666666667}, + {0.268333333333333,0.655555333333333,0.271110666666667,0.647778}, + {0.263888666666666,0.663333333333333,0.268333333333333,0.655555333333333}, + {0.258888666666666,0.670555333333333,0.263888666666666,0.663333333333333}, + {0.252777333333334,0.677778,0.258888666666666,0.670555333333333}, + {0.246110666666667,0.685,0.252777333333334,0.677778}, + {0.239443999999999,0.691666666666666,0.246110666666667,0.685}, + {0.231666666666667,0.698888666666667,0.239443999999999,0.691666666666666}, + {0.223888666666667,0.705555333333334,0.231666666666667,0.698888666666667}, + {0.216110666666665,0.712222,0.223888666666667,0.705555333333334}, + {0.208888666666667,0.718333333333333,0.216110666666665,0.712222}, + {0.201666666666666,0.723888666666667,0.208888666666667,0.718333333333333}, + {0.195,0.728888666666667,0.201666666666666,0.723888666666667}, + {0.188333333333333,0.733333333333333,0.195,0.728888666666667}, + {0.181666666666667,0.737222,0.188333333333333,0.733333333333333}, + {0.174443999999999,0.740555333333334,0.181666666666667,0.737222}, + {0.166666666666667,0.742778,0.174443999999999,0.740555333333334}, + {0.159444000000001,0.743888666666667,0.166666666666667,0.742778}, + {0.151666666666666,0.745,0.159444000000001,0.743888666666667}, + {0.144444,0.745555333333333,0.151666666666666,0.745}, + {0.121666666666667,0.745,0.128888666666666,0.745555333333333}, + {0.113888666666665,0.743888666666667,0.121666666666667,0.745}, + {0.106666666666667,0.742778,0.113888666666665,0.743888666666667}, + {0.0988886666666673,0.740555333333334,0.106666666666667,0.742778}, + {0.0916666666666662,0.737222,0.0988886666666673,0.740555333333334}, + {0.0850000000000009,0.733333333333333,0.0916666666666662,0.737222}, + {0.0783333333333331,0.728888666666667,0.0850000000000009,0.733333333333333}, + {0.0716666666666654,0.723888666666667,0.0783333333333331,0.728888666666667}, + {0.0644439999999993,0.718333333333333,0.0716666666666654,0.723888666666667}, + {0.0572220000000006,0.712222,0.0644439999999993,0.718333333333333}, + {0.0494439999999988,0.705555333333334,0.0572220000000006,0.712222}, + {0.0416666666666667,0.698888666666667,0.0494439999999988,0.705555333333334}, + {0.0338886666666672,0.691666666666666,0.0416666666666667,0.698888666666667}, + {0.0272219999999995,0.685,0.0338886666666672,0.691666666666666}, + {0.0205553333333341,0.677778,0.0272219999999995,0.685}, + {0.0144439999999998,0.670555333333333,0.0205553333333341,0.677778}, + {0.00944399999999964,0.663333333333333,0.0144439999999998,0.670555333333333}, + {0.00500000000000019,0.655555333333333,0.00944399999999964,0.663333333333333}, + {0.00222200000000091,0.647778,0.00500000000000019,0.655555333333333}, + {0.000555333333333389,0.639444666666667,0.00222200000000091,0.647778}, + {0,0.631111333333333,0.000555333333333389,0.639444666666667}, + {0,0.621666666666667,0,0.631111333333333}, + {0.00166666666666752,0.612222,0,0.621666666666667}, + {0.00388866666666606,0.602778,0.00166666666666752,0.612222}, + {0.00666666666666771,0.592778,0.00388866666666606,0.602778}, + {0.0100000000000004,0.582778,0.00666666666666771,0.592778}, + {0.013333333333333,0.572778,0.0100000000000004,0.582778}, + {0.0166666666666657,0.562222,0.013333333333333,0.572778}, + {0.019444,0.552222,0.0166666666666657,0.562222}, + {0.0216666666666659,0.542222,0.019444,0.552222}, + {0.0233333333333334,0.532778,0.0216666666666659,0.542222}, + {0.0244440000000002,0.522778,0.0233333333333334,0.532778}, + {0.0244440000000002,0.513333333333333,0.0244440000000002,0.522778}, + {0.0244440000000002,0.503888666666667,0.0244440000000002,0.513333333333333}, + {0.0233333333333334,0.493888666666667,0.0244440000000002,0.503888666666667}, + {0.0216666666666659,0.483888666666667,0.0233333333333334,0.493888666666667}, + {0.019444,0.473888666666667,0.0216666666666659,0.483888666666667}, + {0.0166666666666657,0.463888666666667,0.019444,0.473888666666667}, + {0.013333333333333,0.453888666666667,0.0166666666666657,0.463888666666667}, + {0.0100000000000004,0.443888666666667,0.013333333333333,0.453888666666667}, + {0.00666666666666771,0.433333333333334,0.0100000000000004,0.443888666666667}, + {0.00388866666666606,0.423888666666667,0.00666666666666771,0.433333333333334}, + {0.00166666666666752,0.413888666666667,0.00388866666666606,0.423888666666667}, + {0,0.404444666666667,0.00166666666666752,0.413888666666667}, + {0,0.395555333333334,0,0.404444666666667}, + {0.000555333333333389,0.386666666666667,0,0.395555333333334}, + {0.00222200000000091,0.378333333333333,0.000555333333333389,0.386666666666667}, + {0.00500000000000019,0.370555333333333,0.00222200000000091,0.378333333333333}, + {0.00944399999999964,0.362778,0.00500000000000019,0.370555333333333}, + {0.0144439999999998,0.355555333333333,0.00944399999999964,0.362778}, + {0.0205553333333341,0.348333333333333,0.0144439999999998,0.355555333333333}, + {0.0272219999999995,0.341111333333333,0.0205553333333341,0.348333333333333}, + {0.0338886666666672,0.334444666666667,0.0272219999999995,0.341111333333333}, + {0.0416666666666667,0.327222,0.0338886666666672,0.334444666666667}, + {0.0494439999999988,0.320555333333333,0.0416666666666667,0.327222}, + {0.0572220000000006,0.313888666666667,0.0494439999999988,0.320555333333333}, + {0.0644439999999993,0.307778,0.0572220000000006,0.313888666666667}, + {0.0716666666666654,0.302222,0.0644439999999993,0.307778}, + {0.0783333333333331,0.297222,0.0716666666666654,0.302222}, + {0.0850000000000009,0.292778,0.0783333333333331,0.297222}, + {0.0916666666666662,0.288888666666667,0.0850000000000009,0.292778}, + {0.181666666666667,0.557778,0.185,0.562222}, + {0.185,0.562222,0.187222000000001,0.567778}, + {0.187222000000001,0.567778,0.188333333333333,0.575}, + {0.188333333333333,0.575,0.189443999999999,0.583888666666667}, + {0.189443999999999,0.583888666666667,0.19,0.592778}, + {0.19,0.592778,0.19,0.602778}, + {0.19,0.602778,0.19,0.612778}, + {0.19,0.612778,0.189443999999999,0.621666666666667}, + {0.189443999999999,0.621666666666667,0.188333333333333,0.630555333333334}, + {0.188333333333333,0.630555333333334,0.187222000000001,0.637778}, + {0.187222000000001,0.637778,0.185,0.643333333333333}, + {0.185,0.643333333333333,0.181666666666667,0.647778}, + {0.181666666666667,0.647778,0.177222,0.651111333333333}, + {0.177222,0.651111333333333,0.171666666666667,0.653333333333334}, + {0.171666666666667,0.653333333333334,0.164444000000001,0.654444666666667}, + {0.164444000000001,0.654444666666667,0.155555333333332,0.655555333333333}, + {0.155555333333332,0.655555333333333,0.146666666666666,0.656111333333333}, + {0.126666666666668,0.656111333333333,0.117777333333334,0.655555333333333}, + {0.117777333333334,0.655555333333333,0.108888666666668,0.654444666666667}, + {0.108888666666668,0.654444666666667,0.101666666666667,0.653333333333334}, + {0.101666666666667,0.653333333333334,0.0961106666666656,0.651111333333333}, + {0.0961106666666656,0.651111333333333,0.0916666666666662,0.647778}, + {0.0916666666666662,0.647778,0.0883333333333335,0.643333333333333}, + {0.0883333333333335,0.643333333333333,0.0861106666666676,0.637778}, + {0.0861106666666676,0.637778,0.0850000000000009,0.630555333333334}, + {0.0850000000000009,0.630555333333334,0.0838886666666667,0.621666666666667}, + {0.0838886666666667,0.621666666666667,0.0833333333333333,0.612778}, + {0.0833333333333333,0.612778,0.0833333333333333,0.602778}, + {0.0833333333333333,0.602778,0.0833333333333333,0.592778}, + {0.0833333333333333,0.592778,0.0838886666666667,0.583888666666667}, + {0.0838886666666667,0.583888666666667,0.0850000000000009,0.575}, + {0.0850000000000009,0.575,0.0861106666666676,0.567778}, + {0.0861106666666676,0.567778,0.0883333333333335,0.562222}, + {0.0883333333333335,0.562222,0.0916666666666662,0.557778}, + {0.0916666666666662,0.557778,0.0961106666666656,0.554444666666667}, + {0.0961106666666656,0.554444666666667,0.101666666666667,0.552222}, + {0.101666666666667,0.552222,0.108888666666668,0.551111333333333}, + {0.108888666666668,0.551111333333333,0.117777333333334,0.55}, + {0.117777333333334,0.55,0.126666666666668,0.549444666666667}, + {0.146666666666666,0.549444666666667,0.155555333333332,0.55}, + {0.155555333333332,0.55,0.164444000000001,0.551111333333333}, + {0.164444000000001,0.551111333333333,0.171666666666667,0.552222}, + {0.171666666666667,0.552222,0.177222,0.554444666666667}, + {0.177222,0.554444666666667,0.181666666666667,0.557778}, + {0.181666666666667,0.378333333333333,0.185,0.382778}, + {0.185,0.382778,0.187222000000001,0.388333333333333}, + {0.187222000000001,0.388333333333333,0.188333333333333,0.395555333333334}, + {0.188333333333333,0.395555333333334,0.189443999999999,0.404444666666667}, + {0.189443999999999,0.404444666666667,0.19,0.413333333333333}, + {0.19,0.413333333333333,0.19,0.423333333333333}, + {0.19,0.423333333333333,0.19,0.433333333333334}, + {0.19,0.433333333333334,0.189443999999999,0.442222}, + {0.189443999999999,0.442222,0.188333333333333,0.451111333333333}, + {0.188333333333333,0.451111333333333,0.187222000000001,0.458333333333333}, + {0.187222000000001,0.458333333333333,0.185,0.463888666666667}, + {0.185,0.463888666666667,0.181666666666667,0.468333333333333}, + {0.181666666666667,0.468333333333333,0.177222,0.471666666666666}, + {0.177222,0.471666666666666,0.171666666666667,0.473888666666667}, + {0.171666666666667,0.473888666666667,0.164444000000001,0.475}, + {0.164444000000001,0.475,0.155555333333332,0.476111333333333}, + {0.155555333333332,0.476111333333333,0.146666666666666,0.476666666666667}, + {0.126666666666668,0.476666666666667,0.117777333333334,0.476111333333333}, + {0.117777333333334,0.476111333333333,0.108888666666668,0.475}, + {0.108888666666668,0.475,0.101666666666667,0.473888666666667}, + {0.101666666666667,0.473888666666667,0.0961106666666656,0.471666666666666}, + {0.0961106666666656,0.471666666666666,0.0916666666666662,0.468333333333333}, + {0.0916666666666662,0.468333333333333,0.0883333333333335,0.463888666666667}, + {0.0883333333333335,0.463888666666667,0.0861106666666676,0.458333333333333}, + {0.0861106666666676,0.458333333333333,0.0850000000000009,0.451111333333333}, + {0.0850000000000009,0.451111333333333,0.0838886666666667,0.442222}, + {0.0838886666666667,0.442222,0.0833333333333333,0.433333333333334}, + {0.0833333333333333,0.433333333333334,0.0833333333333333,0.423333333333333}, + {0.0833333333333333,0.423333333333333,0.0833333333333333,0.413333333333333}, + {0.0833333333333333,0.413333333333333,0.0838886666666667,0.404444666666667}, + {0.0838886666666667,0.404444666666667,0.0850000000000009,0.395555333333334}, + {0.0850000000000009,0.395555333333334,0.0861106666666676,0.388333333333333}, + {0.0861106666666676,0.388333333333333,0.0883333333333335,0.382778}, + {0.0883333333333335,0.382778,0.0916666666666662,0.378333333333333}, + {0.0916666666666662,0.378333333333333,0.0961106666666656,0.375}, + {0.0961106666666656,0.375,0.101666666666667,0.372778}, + {0.101666666666667,0.372778,0.108888666666668,0.371666666666667}, + {0.108888666666668,0.371666666666667,0.117777333333334,0.370555333333333}, + {0.117777333333334,0.370555333333333,0.126666666666668,0.37}, + {0.146666666666666,0.37,0.155555333333332,0.370555333333333}, + {0.155555333333332,0.370555333333333,0.164444000000001,0.371666666666667}, + {0.164444000000001,0.371666666666667,0.171666666666667,0.372778}, + {0.171666666666667,0.372778,0.177222,0.375}, + {0.177222,0.375,0.181666666666667,0.378333333333333}, + {0,0,0,0} +}; + +double Icon21[][4] = { + {0.0277780000000002,0.283888666666667,0.0216666666666659,0.288888666666667}, + {0.034999999999999,0.279444666666667,0.0277780000000002,0.283888666666667}, + {0.0427779999999984,0.275555333333333,0.034999999999999,0.279444666666667}, + {0.0522226666666654,0.272222,0.0427779999999984,0.275555333333333}, + {0.0627779999999992,0.269444666666667,0.0522226666666654,0.272222}, + {0.0738893333333337,0.266666666666667,0.0627779999999992,0.269444666666667}, + {0.0861113333333326,0.263888666666666,0.0738893333333337,0.266666666666667}, + {0.0988893333333323,0.262222,0.0861113333333326,0.263888666666666}, + {0.112777999999999,0.26,0.0988893333333323,0.262222}, + {0.126666666666665,0.258333333333334,0.112777999999999,0.26}, + {0.141666666666666,0.256666666666667,0.126666666666665,0.258333333333334}, + {0.156111333333333,0.255,0.141666666666666,0.256666666666667}, + {0.170556,0.254444666666667,0.156111333333333,0.255}, + {0.185556000000001,0.253888666666667,0.170556,0.254444666666667}, + {0.199444666666667,0.253333333333333,0.185556000000001,0.253888666666667}, + {0.213333333333334,0.253888666666667,0.199444666666667,0.253333333333333}, + {0.226111333333333,0.255,0.213333333333334,0.253888666666667}, + {0.238333333333332,0.256666666666667,0.226111333333333,0.255}, + {0.249444666666667,0.258888666666667,0.238333333333332,0.256666666666667}, + {0.26,0.262778,0.249444666666667,0.258888666666667}, + {0.269444666666667,0.267222,0.26,0.262778}, + {0.277222666666667,0.273333333333333,0.269444666666667,0.267222}, + {0.284444666666666,0.280555333333333,0.277222666666667,0.273333333333333}, + {0.290556,0.288888666666667,0.284444666666666,0.280555333333333}, + {0.294999999999999,0.297222,0.290556,0.288888666666667}, + {0.298889333333333,0.307222,0.294999999999999,0.297222}, + {0.302222666666665,0.318333333333333,0.298889333333333,0.307222}, + {0.304444666666666,0.331111333333334,0.302222666666665,0.318333333333333}, + {0.306666666666667,0.344444666666667,0.304444666666666,0.331111333333334}, + {0.308333333333332,0.36,0.306666666666667,0.344444666666667}, + {0.309444666666666,0.376111333333334,0.308333333333332,0.36}, + {0.31,0.393333333333333,0.309444666666666,0.376111333333334}, + {0.31,0.411666666666667,0.31,0.393333333333333}, + {0.31,0.431111333333333,0.31,0.411666666666667}, + {0.309444666666666,0.450555333333333,0.31,0.431111333333333}, + {0.308889333333333,0.471111333333334,0.309444666666666,0.450555333333333}, + {0.308333333333332,0.492222,0.308889333333333,0.471111333333334}, + {0.307222666666666,0.513333333333333,0.308333333333332,0.492222}, + {0.306111333333334,0.533888666666667,0.307222666666666,0.513333333333333}, + {0.305,0.555,0.306111333333334,0.533888666666667}, + {0.303889333333333,0.575555333333333,0.305,0.555}, + {0.302777999999999,0.595,0.303889333333333,0.575555333333333}, + {0.301666666666667,0.614444666666667,0.302777999999999,0.595}, + {0.300556,0.632778,0.301666666666667,0.614444666666667}, + {0.299444666666666,0.65,0.300556,0.632778}, + {0.298333333333332,0.666111333333333,0.299444666666666,0.65}, + {0.296666666666667,0.681666666666667,0.298333333333332,0.666111333333333}, + {0.295556,0.695,0.296666666666667,0.681666666666667}, + {0.294444666666666,0.707778,0.295556,0.695}, + {0.293333333333332,0.718888666666667,0.294444666666666,0.707778}, + {0.292222666666667,0.728888666666667,0.293333333333332,0.718888666666667}, + {0.290556,0.737222,0.292222666666667,0.728888666666667}, + {0.288333333333334,0.745555333333333,0.290556,0.737222}, + {0.286111333333333,0.752778,0.288333333333334,0.745555333333333}, + {0.283333333333334,0.758888666666667,0.286111333333333,0.752778}, + {0.280555999999999,0.763333333333333,0.283333333333334,0.758888666666667}, + {0.276666666666666,0.766111333333334,0.280555999999999,0.763333333333333}, + {0.273333333333333,0.768888666666667,0.276666666666666,0.766111333333334}, + {0.268889333333334,0.77,0.273333333333333,0.768888666666667}, + {0.265000000000001,0.770555333333334,0.268889333333334,0.77}, + {0.26,0.77,0.265000000000001,0.770555333333334}, + {0.255555999999999,0.769444666666667,0.26,0.77}, + {0.250556000000001,0.768333333333333,0.255555999999999,0.769444666666667}, + {0.245556000000001,0.766666666666667,0.250556000000001,0.768333333333333}, + {0.241111333333334,0.765,0.245556000000001,0.766666666666667}, + {0.236111333333334,0.762778,0.241111333333334,0.765}, + {0.231666666666667,0.760555333333333,0.236111333333334,0.762778}, + {0.226666666666667,0.758333333333334,0.231666666666667,0.760555333333333}, + {0.222778000000001,0.756111333333333,0.226666666666667,0.758333333333334}, + {0.218333333333334,0.753888666666667,0.222778000000001,0.756111333333333}, + {0.214999999999999,0.751111333333334,0.218333333333334,0.753888666666667}, + {0.211111333333333,0.748888666666667,0.214999999999999,0.751111333333334}, + {0.208333333333333,0.746666666666667,0.211111333333333,0.748888666666667}, + {0.205555999999999,0.743888666666667,0.208333333333333,0.746666666666667}, + {0.203333333333333,0.740555333333334,0.205555999999999,0.743888666666667}, + {0.201111333333332,0.737222,0.203333333333333,0.740555333333334}, + {0.198889333333334,0.731111333333333,0.201111333333332,0.737222}, + {0.197222666666666,0.722778,0.198889333333334,0.731111333333333}, + {0.196666666666665,0.713333333333334,0.197222666666666,0.722778}, + {0.197222666666666,0.702222,0.196666666666665,0.713333333333334}, + {0.198333333333333,0.69,0.197222666666666,0.702222}, + {0.200555999999999,0.676666666666667,0.198333333333333,0.69}, + {0.202778,0.662222,0.200555999999999,0.676666666666667}, + {0.205555999999999,0.647778,0.202778,0.662222}, + {0.207778,0.632778,0.205555999999999,0.647778}, + {0.209999999999998,0.618333333333334,0.207778,0.632778}, + {0.211666666666666,0.605,0.209999999999998,0.618333333333334}, + {0.212222666666667,0.592778,0.211666666666666,0.605}, + {0.211666666666666,0.581666666666666,0.212222666666667,0.592778}, + {0.209444666666665,0.572222,0.211666666666666,0.581666666666666}, + {0.206111333333332,0.563888666666667,0.209444666666665,0.572222}, + {0.201111333333332,0.557778,0.206111333333332,0.563888666666667}, + {0.195,0.552778,0.201111333333332,0.557778}, + {0.186666666666665,0.55,0.195,0.552778}, + {0.177222666666665,0.548333333333333,0.186666666666665,0.55}, + {0.166111333333333,0.548888666666667,0.177222666666665,0.548333333333333}, + {0.153889333333332,0.550555333333334,0.166111333333333,0.548888666666667}, + {0.140555999999999,0.553888666666667,0.153889333333332,0.550555333333334}, + {0.126111333333332,0.557778,0.140555999999999,0.553888666666667}, + {0.111666666666667,0.562222,0.126111333333332,0.557778}, + {0.0966666666666664,0.566111333333333,0.111666666666667,0.562222}, + {0.0822226666666666,0.57,0.0966666666666664,0.566111333333333}, + {0.0688893333333335,0.572778,0.0822226666666666,0.57}, + {0.0566666666666672,0.573888666666667,0.0688893333333335,0.572778}, + {0.0455560000000001,0.572778,0.0566666666666672,0.573888666666667}, + {0.0361113333333331,0.57,0.0455560000000001,0.572778}, + {0.0277780000000002,0.565,0.0361113333333331,0.57}, + {0.0216666666666659,0.557778,0.0277780000000002,0.565}, + {0.0177779999999998,0.551111333333333,0.0216666666666659,0.557778}, + {0.0150000000000006,0.543333333333334,0.0177779999999998,0.551111333333333}, + {0.0122226666666663,0.533888666666667,0.0150000000000006,0.543333333333334}, + {0.0100000000000004,0.523333333333333,0.0122226666666663,0.533888666666667}, + {0.00777799999999947,0.511666666666667,0.0100000000000004,0.523333333333333}, + {0.00611133333333195,0.498888666666667,0.00777799999999947,0.511666666666667}, + {0.00500000000000019,0.485,0.00611133333333195,0.498888666666667}, + {0.00333333333333267,0.470555333333333,0.00500000000000019,0.485}, + {0.00222266666666589,0.455,0.00333333333333267,0.470555333333333}, + {0.00166666666666515,0.439444666666667,0.00222266666666589,0.455}, + {0.000556000000000741,0.423333333333333,0.00166666666666515,0.439444666666667}, + {0,0.407222,0.000556000000000741,0.423333333333333}, + {0,0.391666666666667,0,0.407222}, + {0,0.376111333333334,0,0.391666666666667}, + {0.000556000000000741,0.361666666666667,0,0.376111333333334}, + {0.00166666666666515,0.347778,0.000556000000000741,0.361666666666667}, + {0.00277799999999928,0.335,0.00166666666666515,0.347778}, + {0.00500000000000019,0.323333333333334,0.00277799999999928,0.335}, + {0.00777799999999947,0.312778,0.00500000000000019,0.323333333333334}, + {0.0116666666666655,0.303333333333333,0.00777799999999947,0.312778}, + {0.0161113333333323,0.295555333333333,0.0116666666666655,0.303333333333333}, + {0.0216666666666659,0.288888666666667,0.0161113333333323,0.295555333333333}, + {0.201111333333332,0.378333333333333,0.204444666666667,0.382778}, + {0.204444666666667,0.382778,0.206666666666666,0.388333333333333}, + {0.206666666666666,0.388333333333333,0.207778,0.395555333333334}, + {0.207778,0.395555333333334,0.208889333333334,0.404444666666667}, + {0.208889333333334,0.404444666666667,0.209444666666665,0.413333333333333}, + {0.209444666666665,0.413333333333333,0.209444666666665,0.423333333333333}, + {0.209444666666665,0.423333333333333,0.209444666666665,0.433333333333334}, + {0.209444666666665,0.433333333333334,0.208889333333334,0.442222}, + {0.208889333333334,0.442222,0.207778,0.451111333333333}, + {0.207778,0.451111333333333,0.206666666666666,0.458333333333333}, + {0.206666666666666,0.458333333333333,0.204444666666667,0.463888666666667}, + {0.204444666666667,0.463888666666667,0.201111333333332,0.468333333333333}, + {0.201111333333332,0.468333333333333,0.196666666666665,0.471666666666666}, + {0.196666666666665,0.471666666666666,0.191111333333332,0.473888666666667}, + {0.191111333333332,0.473888666666667,0.183889333333333,0.475}, + {0.183889333333333,0.475,0.175,0.476111333333333}, + {0.175,0.476111333333333,0.166111333333333,0.476666666666667}, + {0.146111333333333,0.476666666666667,0.137222666666666,0.476111333333333}, + {0.137222666666666,0.476111333333333,0.128333333333333,0.475}, + {0.128333333333333,0.475,0.121111333333334,0.473888666666667}, + {0.121111333333334,0.473888666666667,0.115556,0.471666666666666}, + {0.115556,0.471666666666666,0.111111333333334,0.468333333333333}, + {0.111111333333334,0.468333333333333,0.107777999999999,0.463888666666667}, + {0.107777999999999,0.463888666666667,0.105556,0.458333333333333}, + {0.105556,0.458333333333333,0.104444666666666,0.451111333333333}, + {0.104444666666666,0.451111333333333,0.103333333333332,0.442222}, + {0.103333333333332,0.442222,0.102778000000001,0.433333333333334}, + {0.102778000000001,0.433333333333334,0.102778000000001,0.423333333333333}, + {0.102778000000001,0.423333333333333,0.102778000000001,0.413333333333333}, + {0.102778000000001,0.413333333333333,0.103333333333332,0.404444666666667}, + {0.103333333333332,0.404444666666667,0.104444666666666,0.395555333333334}, + {0.104444666666666,0.395555333333334,0.105556,0.388333333333333}, + {0.105556,0.388333333333333,0.107777999999999,0.382778}, + {0.107777999999999,0.382778,0.111111333333334,0.378333333333333}, + {0.111111333333334,0.378333333333333,0.115556,0.375}, + {0.115556,0.375,0.121111333333334,0.372778}, + {0.121111333333334,0.372778,0.128333333333333,0.371666666666667}, + {0.128333333333333,0.371666666666667,0.137222666666666,0.370555333333333}, + {0.137222666666666,0.370555333333333,0.146111333333333,0.37}, + {0.166111333333333,0.37,0.175,0.370555333333333}, + {0.175,0.370555333333333,0.183889333333333,0.371666666666667}, + {0.183889333333333,0.371666666666667,0.191111333333332,0.372778}, + {0.191111333333332,0.372778,0.196666666666665,0.375}, + {0.196666666666665,0.375,0.201111333333332,0.378333333333333}, + {0,0,0,0} +}; + +double Icon22[][4] = { + {0.0416666666666667,0.208333333333333,0,0.25}, + {0.166666666666667,0.25,0.125,0.208333333333333}, + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0.125,0.791666666666667,0.166666666666667,0.75}, + {0,0.75,0.0416666666666667,0.791666666666667}, + {0,0.25,0,0.75}, + {0.125,0.375,0.125,0.416666666666667}, + {0.0416666666666667,0.416666666666667,0.0416666666666667,0.375}, + {0.125,0.458333333333333,0.125,0.541666666666667}, + {0.0416666666666667,0.541666666666667,0.0416666666666667,0.458333333333333}, + {0.125,0.583333333333333,0.125,0.625}, + {0.0416666666666667,0.625,0.0416666666666667,0.583333333333333}, + {0,0,0,0} +}; + +double Icon23[][4] = { + {0.0416666666666667,0.208333333333333,0,0.25}, + {0.166666666666667,0.25,0.125,0.208333333333333}, + {0.166666666666667,0.75,0.166666666666667,0.25}, + {0.125,0.791666666666667,0.166666666666667,0.75}, + {0,0.75,0.0416666666666667,0.791666666666667}, + {0,0.25,0,0.75}, + {0.0416666666666667,0.291666666666667,0.0833333333333333,0.25}, + {0.0833333333333333,0.25,0.125,0.291666666666667}, + {0.125,0.291666666666667,0.125,0.708333333333333}, + {0.125,0.708333333333333,0.0833333333333333,0.75}, + {0.0833333333333333,0.75,0.0416666666666667,0.708333333333333}, + {0.0416666666666667,0.708333333333333,0.0416666666666667,0.291666666666667}, + {0,0,0,0} +}; + +double Icon24[][4] = { + {0.0377780000000006,0.191666666666666,0.0377780000000006,0.341666666666667}, + {0.0377780000000006,0.153888666666666,0.0750000000000005,0.191666666666666}, + {0.112778000000001,0.0416666666666667,0.0377780000000006,0.153888666666666}, + {0.187777999999999,0.153888666666666,0.112778000000001,0.0416666666666667}, + {0.150000000000001,0.191666666666666,0.187777999999999,0.153888666666666}, + {0.187777999999999,0.341666666666667,0.187777999999999,0.191666666666666}, + {0.224999999999999,0.678888666666667,0.224999999999999,0.341666666666667}, + {0,0.341666666666667,0,0.678888666666667}, + {0.0750000000000005,0.678888666666667,0.112778000000001,0.941666666666666}, + {0.112778000000001,0.941666666666666,0.150000000000001,0.978888666666667}, + {0.375,0.978888666666667,0.375,0.866666666666667}, + {0.224999999999999,0.866666666666667,0.187777999999999,0.828888666666667}, + {0.187777999999999,0.828888666666667,0.150000000000001,0.678888666666667}, + {0,0,0,0} +}; + +double Icon25[][4] = { + {0.166666666666667,0.583333333333333,0.333333333333333,0.416666666666667}, + {0,0.416666666666667,0.166666666666667,0.583333333333333}, + {0,0,0,0} +}; + +double Icon26[][4] = { + {0.148888666666664,0.0399999999999998,0.136666666666666,0.0416666666666667}, + {0.161666666666666,0.0383333333333334,0.148888666666664,0.0399999999999998}, + {0.176111333333331,0.0372219999999999,0.161666666666666,0.0383333333333334}, + {0.191111333333332,0.0361113333333332,0.176111333333331,0.0372219999999999}, + {0.207778,0.0350000000000001,0.191111333333332,0.0361113333333332}, + {0.224999999999999,0.0338886666666667,0.207778,0.0350000000000001}, + {0.243888666666666,0.0333333333333332,0.224999999999999,0.0338886666666667}, + {0.263333333333333,0.0322220000000003,0.243888666666666,0.0333333333333332}, + {0.283333333333331,0.031666666666667,0.263333333333333,0.0322220000000003}, + {0.305,0.0311113333333335,0.283333333333331,0.031666666666667}, + {0.349444666666666,0.0305553333333334,0.326666666666666,0.0311113333333335}, + {0.396666666666666,0.03,0.372777999999999,0.0305553333333334}, + {0.567221999999999,0.0305553333333334,0.543333333333332,0.03}, + {0.613333333333332,0.0311113333333335,0.590555333333332,0.0305553333333334}, + {0.656666666666666,0.031666666666667,0.634999999999998,0.0311113333333335}, + {0.676666666666665,0.0322220000000003,0.656666666666666,0.031666666666667}, + {0.696111333333332,0.0333333333333332,0.676666666666665,0.0322220000000003}, + {0.714999999999999,0.0338886666666667,0.696111333333332,0.0333333333333332}, + {0.732221999999998,0.0350000000000001,0.714999999999999,0.0338886666666667}, + {0.748888666666666,0.0361113333333332,0.732221999999998,0.0350000000000001}, + {0.763888666666666,0.0372219999999999,0.748888666666666,0.0361113333333332}, + {0.778333333333331,0.0383333333333334,0.763888666666666,0.0372219999999999}, + {0.791111333333333,0.0399999999999998,0.778333333333331,0.0383333333333334}, + {0.803333333333332,0.0416666666666667,0.791111333333333,0.0399999999999998}, + {0.818888666666666,0.0444446666666666,0.803333333333332,0.0416666666666667}, + {0.832778,0.0472220000000003,0.818888666666666,0.0444446666666666}, + {0.844444666666665,0.0505553333333335,0.832778,0.0472220000000003}, + {0.854999999999999,0.0533333333333335,0.844444666666665,0.0505553333333335}, + {0.863888666666665,0.0566666666666666,0.854999999999999,0.0533333333333335}, + {0.871666666666665,0.058888666666667,0.863888666666665,0.0566666666666666}, + {0.877777999999999,0.0616666666666669,0.871666666666665,0.058888666666667}, + {0.883333333333333,0.0638886666666666,0.877777999999999,0.0616666666666669}, + {0.887778,0.0661113333333331,0.883333333333333,0.0638886666666666}, + {0.891111333333332,0.0683333333333334,0.887778,0.0661113333333331}, + {0.894444666666665,0.0705553333333331,0.891111333333332,0.0683333333333334}, + {0.897221999999999,0.0727780000000002,0.894444666666665,0.0705553333333331}, + {0.899444666666665,0.0755553333333333,0.897221999999999,0.0727780000000002}, + {0.901666666666666,0.0788886666666666,0.899444666666665,0.0755553333333333}, + {0.903888666666665,0.0822219999999998,0.901666666666666,0.0788886666666666}, + {0.906111333333333,0.0866666666666667,0.903888666666665,0.0822219999999998}, + {0.908333333333331,0.0922220000000002,0.906111333333333,0.0866666666666667}, + {0.911111333333333,0.0983333333333334,0.908333333333331,0.0922220000000002}, + {0.913333333333332,0.106111333333333,0.911111333333333,0.0983333333333334}, + {0.916666666666667,0.115,0.913333333333332,0.106111333333333}, + {0.919444666666666,0.125555333333333,0.916666666666667,0.115}, + {0.922777999999999,0.137222,0.919444666666666,0.125555333333333}, + {0.925555333333333,0.151111333333333,0.922777999999999,0.137222}, + {0.928333333333332,0.166666666666667,0.925555333333333,0.151111333333333}, + {0.93,0.178888666666667,0.928333333333332,0.166666666666667}, + {0.931666666666665,0.191666666666666,0.93,0.178888666666667}, + {0.932777999999999,0.206111333333334,0.931666666666665,0.191666666666666}, + {0.933888666666666,0.221111333333334,0.932777999999999,0.206111333333334}, + {0.935,0.237778,0.933888666666666,0.221111333333334}, + {0.936111333333332,0.255,0.935,0.237778}, + {0.936666666666665,0.273888666666667,0.936111333333332,0.255}, + {0.937777999999999,0.293333333333334,0.936666666666665,0.273888666666667}, + {0.938333333333333,0.313333333333333,0.937777999999999,0.293333333333334}, + {0.938888666666666,0.335,0.938333333333333,0.313333333333333}, + {0.938888666666666,0.356666666666667,0.938888666666666,0.335}, + {0.939444666666667,0.379444666666667,0.938888666666666,0.356666666666667}, + {0.939444666666667,0.402778,0.939444666666667,0.379444666666667}, + {0.939999999999998,0.426666666666667,0.939444666666667,0.402778}, + {0.939999999999998,0.451111333333333,0.939999999999998,0.426666666666667}, + {0.939999999999998,0.475555333333334,0.939999999999998,0.451111333333333}, + {0.939999999999998,0.5,0.939999999999998,0.475555333333334}, + {0.939999999999998,0.524444666666666,0.939999999999998,0.5}, + {0.939999999999998,0.548888666666667,0.939999999999998,0.524444666666666}, + {0.939999999999998,0.573333333333334,0.939999999999998,0.548888666666667}, + {0.939444666666667,0.597222,0.939999999999998,0.573333333333334}, + {0.939444666666667,0.620555333333333,0.939444666666667,0.597222}, + {0.938888666666666,0.643333333333333,0.939444666666667,0.620555333333333}, + {0.938888666666666,0.665,0.938888666666666,0.643333333333333}, + {0.938333333333333,0.686666666666667,0.938888666666666,0.665}, + {0.937777999999999,0.706666666666666,0.938333333333333,0.686666666666667}, + {0.936666666666665,0.726111333333333,0.937777999999999,0.706666666666666}, + {0.936111333333332,0.745,0.936666666666665,0.726111333333333}, + {0.935,0.762222,0.936111333333332,0.745}, + {0.933888666666666,0.778888666666666,0.935,0.762222}, + {0.932777999999999,0.793888666666666,0.933888666666666,0.778888666666666}, + {0.931666666666665,0.808333333333334,0.932777999999999,0.793888666666666}, + {0.93,0.821111333333333,0.931666666666665,0.808333333333334}, + {0.928333333333332,0.833333333333333,0.93,0.821111333333333}, + {0.925555333333333,0.848888666666667,0.928333333333332,0.833333333333333}, + {0.922777999999999,0.862778,0.925555333333333,0.848888666666667}, + {0.919444666666666,0.874444666666667,0.922777999999999,0.862778}, + {0.916666666666667,0.885,0.919444666666666,0.874444666666667}, + {0.913333333333332,0.893888666666667,0.916666666666667,0.885}, + {0.911111333333333,0.901666666666667,0.913333333333332,0.893888666666667}, + {0.908333333333331,0.907778,0.911111333333333,0.901666666666667}, + {0.906111333333333,0.913333333333333,0.908333333333331,0.907778}, + {0.903888666666665,0.917778,0.906111333333333,0.913333333333333}, + {0.901666666666666,0.921111333333334,0.903888666666665,0.917778}, + {0.899444666666665,0.924444666666667,0.901666666666666,0.921111333333334}, + {0.897221999999999,0.927222,0.899444666666665,0.924444666666667}, + {0.894444666666665,0.929444666666667,0.897221999999999,0.927222}, + {0.891111333333332,0.931666666666667,0.894444666666665,0.929444666666667}, + {0.887778,0.933888666666667,0.891111333333332,0.931666666666667}, + {0.883333333333333,0.936111333333333,0.887778,0.933888666666667}, + {0.877777999999999,0.938333333333333,0.883333333333333,0.936111333333333}, + {0.871666666666665,0.941111333333333,0.877777999999999,0.938333333333333}, + {0.863888666666665,0.943333333333333,0.871666666666665,0.941111333333333}, + {0.854999999999999,0.946666666666667,0.863888666666665,0.943333333333333}, + {0.844444666666665,0.949444666666666,0.854999999999999,0.946666666666667}, + {0.832778,0.952778,0.844444666666665,0.949444666666666}, + {0.818888666666666,0.955555333333333,0.832778,0.952778}, + {0.803333333333332,0.958333333333333,0.818888666666666,0.955555333333333}, + {0.791111333333333,0.96,0.803333333333332,0.958333333333333}, + {0.778333333333331,0.961666666666667,0.791111333333333,0.96}, + {0.763888666666666,0.962778,0.778333333333331,0.961666666666667}, + {0.748888666666666,0.963888666666667,0.763888666666666,0.962778}, + {0.732221999999998,0.965,0.748888666666666,0.963888666666667}, + {0.714999999999999,0.966111333333333,0.732221999999998,0.965}, + {0.696111333333332,0.966666666666667,0.714999999999999,0.966111333333333}, + {0.676666666666665,0.967778,0.696111333333332,0.966666666666667}, + {0.656666666666666,0.968333333333333,0.676666666666665,0.967778}, + {0.634999999999998,0.968888666666667,0.656666666666666,0.968333333333333}, + {0.590555333333332,0.969444666666667,0.613333333333332,0.968888666666667}, + {0.543333333333332,0.97,0.567221999999999,0.969444666666667}, + {0.372777999999999,0.969444666666667,0.396666666666666,0.97}, + {0.326666666666666,0.968888666666667,0.349444666666666,0.969444666666667}, + {0.283333333333331,0.968333333333333,0.305,0.968888666666667}, + {0.263333333333333,0.967778,0.283333333333331,0.968333333333333}, + {0.243888666666666,0.966666666666667,0.263333333333333,0.967778}, + {0.224999999999999,0.966111333333333,0.243888666666666,0.966666666666667}, + {0.207778,0.965,0.224999999999999,0.966111333333333}, + {0.191111333333332,0.963888666666667,0.207778,0.965}, + {0.176111333333331,0.962778,0.191111333333332,0.963888666666667}, + {0.161666666666666,0.961666666666667,0.176111333333331,0.962778}, + {0.148888666666664,0.96,0.161666666666666,0.961666666666667}, + {0.136666666666666,0.958333333333333,0.148888666666664,0.96}, + {0.121111333333332,0.955555333333333,0.136666666666666,0.958333333333333}, + {0.107221999999998,0.952778,0.121111333333332,0.955555333333333}, + {0.0955553333333322,0.949444666666666,0.107221999999998,0.952778}, + {0.0849999999999985,0.946666666666667,0.0955553333333322,0.949444666666666}, + {0.0761113333333322,0.943333333333333,0.0849999999999985,0.946666666666667}, + {0.0683333333333328,0.941111333333333,0.0761113333333322,0.943333333333333}, + {0.0622219999999984,0.938333333333333,0.0683333333333328,0.941111333333333}, + {0.0566666666666649,0.936111333333333,0.0622219999999984,0.938333333333333}, + {0.0522219999999981,0.933888666666667,0.0566666666666649,0.936111333333333}, + {0.0488886666666654,0.931666666666667,0.0522219999999981,0.933888666666667}, + {0.0455553333333327,0.929444666666667,0.0488886666666654,0.931666666666667}, + {0.0427779999999984,0.927222,0.0455553333333327,0.929444666666667}, + {0.0405553333333325,0.924444666666667,0.0427779999999984,0.927222}, + {0.0383333333333316,0.921111333333334,0.0405553333333325,0.924444666666667}, + {0.0361113333333331,0.917778,0.0383333333333316,0.921111333333334}, + {0.0338886666666648,0.913333333333333,0.0361113333333331,0.917778}, + {0.0316666666666663,0.907778,0.0338886666666648,0.913333333333333}, + {0.0288886666666646,0.901666666666667,0.0316666666666663,0.907778}, + {0.0266666666666661,0.893888666666667,0.0288886666666646,0.901666666666667}, + {0.0233333333333311,0.885,0.0266666666666661,0.893888666666667}, + {0.0205553333333318,0.874444666666667,0.0233333333333311,0.885}, + {0.0172219999999991,0.862778,0.0205553333333318,0.874444666666667}, + {0.0144446666666648,0.848888666666667,0.0172219999999991,0.862778}, + {0.0116666666666655,0.833333333333333,0.0144446666666648,0.848888666666667}, + {0.00999999999999801,0.821111333333333,0.0116666666666655,0.833333333333333}, + {0.00833333333333286,0.808333333333334,0.00999999999999801,0.821111333333333}, + {0.00722199999999873,0.793888666666666,0.00833333333333286,0.808333333333334}, + {0.00611133333333195,0.778888666666666,0.00722199999999873,0.793888666666666}, + {0.00499999999999782,0.762222,0.00611133333333195,0.778888666666666}, + {0.00388866666666606,0.745,0.00499999999999782,0.762222}, + {0.00333333333333267,0.726111333333333,0.00388866666666606,0.745}, + {0.00222199999999854,0.706666666666666,0.00333333333333267,0.726111333333333}, + {0.00166666666666515,0.686666666666667,0.00222199999999854,0.706666666666666}, + {0.00111133333333176,0.665,0.00166666666666515,0.686666666666667}, + {0.00111133333333176,0.643333333333333,0.00111133333333176,0.665}, + {0.000555333333331021,0.620555333333333,0.00111133333333176,0.643333333333333}, + {0.000555333333331021,0.597222,0.000555333333331021,0.620555333333333}, + {0,0.573333333333334,0.000555333333331021,0.597222}, + {0,0.548888666666667,0,0.573333333333334}, + {0,0.524444666666666,0,0.548888666666667}, + {0,0.5,0,0.524444666666666}, + {0,0.475555333333334,0,0.5}, + {0,0.451111333333333,0,0.475555333333334}, + {0,0.426666666666667,0,0.451111333333333}, + {0.000555333333331021,0.402778,0,0.426666666666667}, + {0.000555333333331021,0.379444666666667,0.000555333333331021,0.402778}, + {0.00111133333333176,0.356666666666667,0.000555333333331021,0.379444666666667}, + {0.00111133333333176,0.335,0.00111133333333176,0.356666666666667}, + {0.00166666666666515,0.313333333333333,0.00111133333333176,0.335}, + {0.00222199999999854,0.293333333333334,0.00166666666666515,0.313333333333333}, + {0.00333333333333267,0.273888666666667,0.00222199999999854,0.293333333333334}, + {0.00388866666666606,0.255,0.00333333333333267,0.273888666666667}, + {0.00499999999999782,0.237778,0.00388866666666606,0.255}, + {0.00611133333333195,0.221111333333334,0.00499999999999782,0.237778}, + {0.00722199999999873,0.206111333333334,0.00611133333333195,0.221111333333334}, + {0.00833333333333286,0.191666666666666,0.00722199999999873,0.206111333333334}, + {0.00999999999999801,0.178888666666667,0.00833333333333286,0.191666666666666}, + {0.0116666666666655,0.166666666666667,0.00999999999999801,0.178888666666667}, + {0.0144446666666648,0.151111333333333,0.0116666666666655,0.166666666666667}, + {0.0172219999999991,0.137222,0.0144446666666648,0.151111333333333}, + {0.0205553333333318,0.125555333333333,0.0172219999999991,0.137222}, + {0.0233333333333311,0.115,0.0205553333333318,0.125555333333333}, + {0.0266666666666661,0.106111333333333,0.0233333333333311,0.115}, + {0.0288886666666646,0.0983333333333334,0.0266666666666661,0.106111333333333}, + {0.0316666666666663,0.0922220000000002,0.0288886666666646,0.0983333333333334}, + {0.0338886666666648,0.0866666666666667,0.0316666666666663,0.0922220000000002}, + {0.0361113333333331,0.0822219999999998,0.0338886666666648,0.0866666666666667}, + {0.0383333333333316,0.0788886666666666,0.0361113333333331,0.0822219999999998}, + {0.0405553333333325,0.0755553333333333,0.0383333333333316,0.0788886666666666}, + {0.0427779999999984,0.0727780000000002,0.0405553333333325,0.0755553333333333}, + {0.0455553333333327,0.0705553333333331,0.0427779999999984,0.0727780000000002}, + {0.0488886666666654,0.0683333333333334,0.0455553333333327,0.0705553333333331}, + {0.0522219999999981,0.0661113333333331,0.0488886666666654,0.0683333333333334}, + {0.0566666666666649,0.0638886666666666,0.0522219999999981,0.0661113333333331}, + {0.0622219999999984,0.0616666666666669,0.0566666666666649,0.0638886666666666}, + {0.0683333333333328,0.058888666666667,0.0622219999999984,0.0616666666666669}, + {0.0761113333333322,0.0566666666666666,0.0683333333333328,0.058888666666667}, + {0.0849999999999985,0.0533333333333335,0.0761113333333322,0.0566666666666666}, + {0.0955553333333322,0.0505553333333335,0.0849999999999985,0.0533333333333335}, + {0.107221999999998,0.0472220000000003,0.0955553333333322,0.0505553333333335}, + {0.121111333333332,0.0444446666666666,0.107221999999998,0.0472220000000003}, + {0.136666666666666,0.0416666666666667,0.121111333333332,0.0444446666666666}, + {0,0,0,0} +}; + +double Icon27[][4] = { + {0,0.458333333333333,0,0.541666666666667}, + {1,0.541666666666667,1,0.458333333333333}, + {0,0,0,0} +}; + +double Icon28[][4] = { + {0.0838893333333317,0.25,0.0822226666666666,0.251111333333334}, + {0.0822226666666666,0.251111333333334,0.0794446666666649,0.253333333333333}, + {0.0794446666666649,0.253333333333333,0.0738893333333337,0.256666666666667}, + {0.0738893333333337,0.256666666666667,0.0661113333333319,0.262222}, + {0.0661113333333319,0.262222,0.0572226666666656,0.268888666666667}, + {0.0572226666666656,0.268888666666667,0.0472226666666652,0.276666666666667}, + {0.0472226666666652,0.276666666666667,0.0366666666666665,0.284444666666667}, + {0.0366666666666665,0.284444666666667,0.0272226666666668,0.292778}, + {0.0272226666666668,0.292778,0.0188893333333316,0.300555333333334}, + {0.0188893333333316,0.300555333333334,0.0116666666666655,0.308888666666667}, + {0.0116666666666655,0.308888666666667,0.00666666666666534,0.316666666666666}, + {0.00666666666666534,0.316666666666666,0.00277799999999928,0.325}, + {0.00277799999999928,0.325,0.000555999999998373,0.333333333333333}, + {0.000555999999998373,0.333333333333333,0,0.341666666666667}, + {0,0.341666666666667,0,0.350555333333334}, + {0,0.350555333333334,0.00111133333333176,0.360555333333333}, + {0.00111133333333176,0.360555333333333,0.00277799999999928,0.371111333333333}, + {0.00277799999999928,0.371111333333333,0.00500000000000019,0.382778}, + {0.00500000000000019,0.382778,0.00833333333333286,0.395}, + {0.00833333333333286,0.395,0.0116666666666655,0.407778}, + {0.0116666666666655,0.407778,0.0155559999999989,0.420555333333333}, + {0.0155559999999989,0.420555333333333,0.019444666666665,0.433333333333334}, + {0.019444666666665,0.433333333333334,0.0233333333333334,0.445555333333333}, + {0.0233333333333334,0.445555333333333,0.0272226666666668,0.457778}, + {0.0272226666666668,0.457778,0.0305559999999995,0.468333333333333}, + {0.0305559999999995,0.468333333333333,0.0338893333333322,0.478333333333333}, + {0.0338893333333322,0.478333333333333,0.0366666666666665,0.486666666666667}, + {0.0366666666666665,0.486666666666667,0.0394446666666658,0.493888666666667}, + {0.0394446666666658,0.493888666666667,0.042222666666665,0.5}, + {0.042222666666665,0.5,0.0449999999999993,0.505}, + {0.0449999999999993,0.505,0.048333333333332,0.508333333333334}, + {0.048333333333332,0.508333333333334,0.0516666666666647,0.510555333333333}, + {0.0516666666666647,0.510555333333333,0.0555559999999981,0.511666666666667}, + {0.0555559999999981,0.511666666666667,0.0599999999999999,0.511111333333333}, + {0.0599999999999999,0.511111333333333,0.0638893333333333,0.51}, + {0.0638893333333333,0.51,0.0688893333333335,0.508333333333334}, + {0.0688893333333335,0.508333333333334,0.0727779999999996,0.506111333333333}, + {0.0727779999999996,0.506111333333333,0.0766666666666656,0.504444666666667}, + {0.0766666666666656,0.504444666666667,0.0799999999999983,0.502778}, + {0.0799999999999983,0.502778,0.0822226666666666,0.501111333333334}, + {0.0822226666666666,0.501111333333334,0.0833333333333333,0.500555333333333}, + {0.0833333333333333,0.500555333333333,0.0838893333333317,0.5}, + {0.187777999999999,0.333333333333333,0.187777999999999,0.335}, + {0.187777999999999,0.335,0.188889333333333,0.338333333333334}, + {0.188889333333333,0.338333333333334,0.189444666666667,0.345}, + {0.189444666666667,0.345,0.191111333333332,0.353888666666667}, + {0.191111333333332,0.353888666666667,0.192777999999999,0.365555333333334}, + {0.192777999999999,0.365555333333334,0.194444666666667,0.379444666666667}, + {0.194444666666667,0.379444666666667,0.196111333333332,0.394444666666667}, + {0.196111333333332,0.394444666666667,0.197778,0.41}, + {0.197778,0.41,0.198889333333334,0.425555333333334}, + {0.198889333333334,0.425555333333334,0.199444666666665,0.440555333333334}, + {0.199444666666665,0.440555333333334,0.198889333333334,0.453888666666667}, + {0.198889333333334,0.453888666666667,0.197778,0.466666666666667}, + {0.197778,0.466666666666667,0.195555999999999,0.478333333333333}, + {0.195555999999999,0.478333333333333,0.192222666666666,0.489444666666667}, + {0.192222666666666,0.489444666666667,0.187777999999999,0.5}, + {0.187777999999999,0.5,0.183333333333332,0.508333333333334}, + {0.183333333333332,0.508333333333334,0.177777999999999,0.516666666666667}, + {0.177777999999999,0.516666666666667,0.170556,0.525}, + {0.170556,0.525,0.162777999999998,0.533333333333333}, + {0.162777999999998,0.533333333333333,0.153889333333332,0.541666666666667}, + {0.153889333333332,0.541666666666667,0.144444666666665,0.55}, + {0.144444666666665,0.55,0.133333333333333,0.558333333333334}, + {0.133333333333333,0.558333333333334,0.122222666666666,0.566666666666666}, + {0.122222666666666,0.566666666666666,0.110556,0.575}, + {0.110556,0.575,0.0983333333333315,0.583333333333333}, + {0.0983333333333315,0.583333333333333,0.086666666666666,0.591666666666667}, + {0.086666666666666,0.591666666666667,0.0749999999999981,0.6}, + {0.0749999999999981,0.6,0.0644446666666667,0.608333333333333}, + {0.0644446666666667,0.608333333333333,0.0544446666666663,0.616666666666667}, + {0.0544446666666663,0.616666666666667,0.0449999999999993,0.625}, + {0.0449999999999993,0.625,0.0372226666666648,0.633333333333334}, + {0.0372226666666648,0.633333333333334,0.0311113333333329,0.641666666666667}, + {0.0311113333333329,0.641666666666667,0.0261113333333327,0.65}, + {0.0261113333333327,0.65,0.022778,0.658333333333333}, + {0.022778,0.658333333333333,0.0211113333333325,0.666666666666667}, + {0.0211113333333325,0.666666666666667,0.0211113333333325,0.676111333333333}, + {0.0211113333333325,0.676111333333333,0.0222226666666666,0.685555333333333}, + {0.0222226666666666,0.685555333333333,0.0255559999999993,0.695}, + {0.0255559999999993,0.695,0.0311113333333329,0.705}, + {0.0311113333333329,0.705,0.0372226666666648,0.715}, + {0.0372226666666648,0.715,0.0455560000000001,0.725555333333334}, + {0.0455560000000001,0.725555333333334,0.0538893333333329,0.736111333333334}, + {0.0538893333333329,0.736111333333334,0.0638893333333333,0.747222}, + {0.0638893333333333,0.747222,0.0738893333333337,0.757778}, + {0.0738893333333337,0.757778,0.0838893333333317,0.768333333333333}, + {0.0838893333333317,0.768333333333333,0.0944446666666655,0.778888666666666}, + {0.0944446666666655,0.778888666666666,0.103889333333332,0.788888666666667}, + {0.103889333333332,0.788888666666667,0.113333333333332,0.798333333333333}, + {0.113333333333332,0.798333333333333,0.121666666666665,0.807222}, + {0.121666666666665,0.807222,0.128889333333333,0.815}, + {0.128889333333333,0.815,0.135555999999999,0.822222}, + {0.135555999999999,0.822222,0.141111333333332,0.828333333333333}, + {0.141111333333332,0.828333333333333,0.146111333333333,0.833333333333333}, + {0.146111333333333,0.833333333333333,0.151666666666666,0.838333333333334}, + {0.151666666666666,0.838333333333334,0.156666666666666,0.841666666666667}, + {0.156666666666666,0.841666666666667,0.161111333333333,0.843888666666667}, + {0.161111333333333,0.843888666666667,0.164999999999999,0.845}, + {0.164999999999999,0.845,0.169444666666666,0.844444666666667}, + {0.169444666666666,0.844444666666667,0.173333333333332,0.843333333333333}, + {0.173333333333332,0.843333333333333,0.176666666666665,0.841666666666667}, + {0.176666666666665,0.841666666666667,0.18,0.839444666666667}, + {0.18,0.839444666666667,0.182777999999999,0.837778}, + {0.182777999999999,0.837778,0.185,0.836111333333333}, + {0.185,0.836111333333333,0.186666666666665,0.834444666666667}, + {0.186666666666665,0.834444666666667,0.187222666666666,0.833888666666667}, + {0.187222666666666,0.833888666666667,0.187777999999999,0.833333333333333}, + {0.354444666666666,1,0.354444666666666,0.916666666666667}, + {0.0211113333333325,0.916666666666667,0.0211113333333325,1}, + {0.0833333333333333,0.251666666666667,0.0838893333333317,0.25}, + {0.0827779999999999,0.255555333333334,0.0833333333333333,0.251666666666667}, + {0.0822226666666666,0.262222,0.0827779999999999,0.255555333333334}, + {0.0811113333333324,0.270555333333334,0.0822226666666666,0.262222}, + {0.0794446666666649,0.280555333333333,0.0811113333333324,0.270555333333334}, + {0.0788893333333315,0.291111333333333,0.0794446666666649,0.280555333333333}, + {0.0783333333333331,0.301111333333333,0.0788893333333315,0.291111333333333}, + {0.0783333333333331,0.310555333333333,0.0783333333333331,0.301111333333333}, + {0.0794446666666649,0.318888666666667,0.0783333333333331,0.310555333333333}, + {0.0811113333333324,0.326111333333333,0.0794446666666649,0.318888666666667}, + {0.0838893333333317,0.333333333333333,0.0811113333333324,0.326111333333333}, + {0.0872226666666667,0.339444666666667,0.0838893333333317,0.333333333333333}, + {0.0916666666666662,0.345,0.0872226666666667,0.339444666666667}, + {0.0972226666666648,0.351111333333333,0.0916666666666662,0.345}, + {0.104444666666666,0.357222,0.0972226666666648,0.351111333333333}, + {0.111666666666667,0.363333333333333,0.104444666666666,0.357222}, + {0.12,0.368888666666667,0.111666666666667,0.363333333333333}, + {0.128333333333333,0.375,0.12,0.368888666666667}, + {0.136666666666666,0.381111333333333,0.128333333333333,0.375}, + {0.144999999999998,0.386666666666667,0.136666666666666,0.381111333333333}, + {0.152222666666667,0.392778,0.144999999999998,0.386666666666667}, + {0.157777999999998,0.398888666666667,0.152222666666667,0.392778}, + {0.162777999999998,0.405,0.157777999999998,0.398888666666667}, + {0.165556,0.410555333333334,0.162777999999998,0.405}, + {0.167222666666665,0.416666666666667,0.165556,0.410555333333334}, + {0.167222666666665,0.423888666666667,0.167222666666665,0.416666666666667}, + {0.164999999999999,0.431111333333333,0.167222666666665,0.423888666666667}, + {0.160556,0.438333333333333,0.164999999999999,0.431111333333333}, + {0.154999999999999,0.446111333333333,0.160556,0.438333333333333}, + {0.148333333333333,0.454444666666667,0.154999999999999,0.446111333333333}, + {0.140555999999999,0.462222,0.148333333333333,0.454444666666667}, + {0.132777999999999,0.47,0.140555999999999,0.462222}, + {0.125555999999998,0.477778,0.132777999999999,0.47}, + {0.118889333333333,0.484444666666667,0.125555999999998,0.477778}, + {0.112777999999999,0.490555333333334,0.118889333333333,0.484444666666667}, + {0.108333333333332,0.496111333333333,0.112777999999999,0.490555333333334}, + {0.104444666666666,0.5,0.108333333333332,0.496111333333333}, + {0.101666666666667,0.502778,0.104444666666666,0.5}, + {0.0994446666666657,0.504444666666667,0.101666666666667,0.502778}, + {0.0972226666666648,0.505555333333334,0.0994446666666657,0.504444666666667}, + {0.0911113333333328,0.505,0.0927780000000003,0.505555333333334}, + {0.0894446666666653,0.503888666666667,0.0911113333333328,0.505}, + {0.0877780000000001,0.503333333333333,0.0894446666666653,0.503888666666667}, + {0.0861113333333326,0.502222,0.0877780000000001,0.503333333333333}, + {0.0849999999999985,0.501111333333334,0.0861113333333326,0.502222}, + {0.0844446666666651,0.500555333333333,0.0849999999999985,0.501111333333334}, + {0.0838893333333317,0.5,0.0844446666666651,0.500555333333333}, + {0.208333333333333,0.0416666666666667,0.208889333333332,0.0433333333333337}, + {0.208889333333332,0.0433333333333337,0.209444666666665,0.0472220000000003}, + {0.209444666666665,0.0472220000000003,0.209999999999998,0.0538886666666668}, + {0.209999999999998,0.0538886666666668,0.211111333333333,0.0622220000000002}, + {0.211111333333333,0.0622220000000002,0.212778,0.072222}, + {0.212778,0.072222,0.213333333333334,0.082778}, + {0.213333333333334,0.082778,0.213889333333332,0.0927779999999998}, + {0.213889333333332,0.0927779999999998,0.213889333333332,0.102222}, + {0.213889333333332,0.102222,0.212778,0.110555333333333}, + {0.212778,0.110555333333333,0.211111333333333,0.117778}, + {0.211111333333333,0.117778,0.208333333333333,0.125}, + {0.208333333333333,0.125,0.204999999999998,0.131111333333333}, + {0.204999999999998,0.131111333333333,0.200555999999999,0.136666666666667}, + {0.200555999999999,0.136666666666667,0.195,0.142778}, + {0.195,0.142778,0.187777999999999,0.148888666666667}, + {0.187777999999999,0.148888666666667,0.180555999999998,0.155}, + {0.180555999999998,0.155,0.172222666666665,0.160555333333334}, + {0.172222666666665,0.160555333333334,0.163889333333332,0.166666666666667}, + {0.163889333333332,0.166666666666667,0.155556,0.172778}, + {0.155556,0.172778,0.147222666666667,0.178333333333333}, + {0.147222666666667,0.178333333333333,0.139999999999998,0.184444666666667}, + {0.139999999999998,0.184444666666667,0.134444666666667,0.190555333333334}, + {0.134444666666667,0.190555333333334,0.129444666666667,0.196666666666667}, + {0.129444666666667,0.196666666666667,0.126666666666665,0.202222}, + {0.126666666666665,0.202222,0.125,0.208333333333333}, + {0.125,0.208333333333333,0.125,0.215555333333333}, + {0.125,0.215555333333333,0.127222666666666,0.222778}, + {0.127222666666666,0.222778,0.131666666666665,0.23}, + {0.131666666666665,0.23,0.137222666666666,0.237778}, + {0.137222666666666,0.237778,0.143889333333332,0.246111333333333}, + {0.143889333333332,0.246111333333333,0.151666666666666,0.253888666666667}, + {0.151666666666666,0.253888666666667,0.159444666666666,0.261666666666667}, + {0.159444666666666,0.261666666666667,0.166666666666667,0.269444666666667}, + {0.166666666666667,0.269444666666667,0.173333333333332,0.276111333333333}, + {0.173333333333332,0.276111333333333,0.179444666666666,0.282222}, + {0.179444666666666,0.282222,0.183889333333333,0.287778}, + {0.183889333333333,0.287778,0.187777999999999,0.291666666666667}, + {0.187777999999999,0.291666666666667,0.190555999999998,0.294444666666667}, + {0.190555999999998,0.294444666666667,0.192777999999999,0.296111333333334}, + {0.192777999999999,0.296111333333334,0.195,0.297222}, + {0.199444666666665,0.297222,0.201111333333332,0.296666666666667}, + {0.201111333333332,0.296666666666667,0.202778,0.295555333333333}, + {0.202778,0.295555333333333,0.204444666666665,0.295}, + {0.204444666666665,0.295,0.206111333333332,0.293888666666666}, + {0.206111333333332,0.293888666666666,0.207222666666667,0.292778}, + {0.207222666666667,0.292778,0.207778,0.292222}, + {0.207778,0.292222,0.208333333333333,0.291666666666667}, + {0.188889333333333,0.333888666666667,0.187777999999999,0.333333333333333}, + {0.191111333333332,0.335555333333333,0.188889333333333,0.333888666666667}, + {0.195555999999999,0.338888666666667,0.191111333333332,0.335555333333333}, + {0.202222666666666,0.342778,0.195555999999999,0.338888666666667}, + {0.210555999999999,0.348888666666667,0.202222666666666,0.342778}, + {0.221111333333333,0.356666666666667,0.210555999999999,0.348888666666667}, + {0.233889333333333,0.365555333333334,0.221111333333333,0.356666666666667}, + {0.247222666666666,0.375555333333333,0.233889333333333,0.365555333333334}, + {0.261666666666665,0.386111333333333,0.247222666666666,0.375555333333333}, + {0.275555999999999,0.397222,0.261666666666665,0.386111333333333}, + {0.289444666666666,0.408888666666667,0.275555999999999,0.397222}, + {0.302777999999999,0.420555333333333,0.289444666666666,0.408888666666667}, + {0.315,0.431666666666667,0.302777999999999,0.420555333333333}, + {0.325555999999999,0.442778,0.315,0.431666666666667}, + {0.334444666666665,0.453888666666667,0.325555999999999,0.442778}, + {0.341666666666666,0.465,0.334444666666665,0.453888666666667}, + {0.347777999999998,0.476111333333333,0.341666666666666,0.465}, + {0.351666666666667,0.487778,0.347777999999998,0.476111333333333}, + {0.354444666666666,0.5,0.351666666666667,0.487778}, + {0.355556,0.510555333333333,0.354444666666666,0.5}, + {0.356111333333333,0.522222,0.355556,0.510555333333333}, + {0.355556,0.534444666666667,0.356111333333333,0.522222}, + {0.354444666666666,0.547222,0.355556,0.534444666666667}, + {0.352777999999998,0.561111333333334,0.354444666666666,0.547222}, + {0.349999999999999,0.575555333333333,0.352777999999998,0.561111333333334}, + {0.346666666666666,0.591111333333333,0.349999999999999,0.575555333333333}, + {0.343333333333331,0.607222,0.346666666666666,0.591111333333333}, + {0.338889333333332,0.623333333333333,0.343333333333331,0.607222}, + {0.334444666666665,0.64,0.338889333333332,0.623333333333333}, + {0.329444666666665,0.657222,0.334444666666665,0.64}, + {0.324444666666665,0.674444666666667,0.329444666666665,0.657222}, + {0.319444666666667,0.691666666666666,0.324444666666665,0.674444666666667}, + {0.314444666666667,0.708333333333333,0.319444666666667,0.691666666666666}, + {0.308889333333333,0.725,0.314444666666667,0.708333333333333}, + {0.303889333333333,0.740555333333334,0.308889333333333,0.725}, + {0.299444666666666,0.756111333333333,0.303889333333333,0.740555333333334}, + {0.294444666666666,0.77,0.299444666666666,0.756111333333333}, + {0.289999999999999,0.783888666666667,0.294444666666666,0.77}, + {0.286111333333333,0.796111333333334,0.289999999999999,0.783888666666667}, + {0.281666666666666,0.807222,0.286111333333333,0.796111333333334}, + {0.278333333333334,0.817222,0.281666666666666,0.807222}, + {0.274444666666665,0.825555333333333,0.278333333333334,0.817222}, + {0.271111333333332,0.833333333333333,0.274444666666665,0.825555333333333}, + {0.266666666666666,0.841666666666667,0.271111333333332,0.833333333333333}, + {0.261666666666665,0.847778,0.266666666666666,0.841666666666667}, + {0.256666666666665,0.852222,0.261666666666665,0.847778}, + {0.251111333333332,0.855,0.256666666666665,0.852222}, + {0.245,0.856111333333333,0.251111333333332,0.855}, + {0.232222666666665,0.855,0.238889333333333,0.856111333333333}, + {0.224999999999999,0.852778,0.232222666666665,0.855}, + {0.218333333333331,0.85,0.224999999999999,0.852778}, + {0.211666666666666,0.846666666666666,0.218333333333331,0.85}, + {0.205555999999999,0.843888666666667,0.211666666666666,0.846666666666666}, + {0.199999999999998,0.840555333333333,0.205555999999999,0.843888666666667}, + {0.195555999999999,0.837778,0.199999999999998,0.840555333333333}, + {0.192222666666666,0.836111333333333,0.195555999999999,0.837778}, + {0.189444666666667,0.834444666666667,0.192222666666666,0.836111333333333}, + {0.188333333333333,0.833888666666667,0.189444666666667,0.834444666666667}, + {0.187777999999999,0.833333333333333,0.188333333333333,0.833888666666667}, + {0.209999999999998,0.0427780000000002,0.208333333333333,0.0416666666666667}, + {0.212778,0.0449999999999999,0.209999999999998,0.0427780000000002}, + {0.218333333333331,0.0483333333333332,0.212778,0.0449999999999999}, + {0.226111333333333,0.0538886666666668,0.218333333333331,0.0483333333333332}, + {0.234999999999999,0.0605553333333333,0.226111333333333,0.0538886666666668}, + {0.245,0.0683333333333334,0.234999999999999,0.0605553333333333}, + {0.255555999999999,0.0761113333333334,0.245,0.0683333333333334}, + {0.264999999999998,0.0844446666666669,0.255555999999999,0.0761113333333334}, + {0.273333333333333,0.0922220000000002,0.264999999999998,0.0844446666666669}, + {0.280555999999999,0.100555333333334,0.273333333333333,0.0922220000000002}, + {0.285556,0.108333333333333,0.280555999999999,0.100555333333334}, + {0.289444666666666,0.116666666666667,0.285556,0.108333333333333}, + {0.291666666666667,0.125,0.289444666666666,0.116666666666667}, + {0.292222666666665,0.133333333333334,0.291666666666667,0.125}, + {0.292222666666665,0.142222,0.292222666666665,0.133333333333334}, + {0.291111333333333,0.152222,0.292222666666665,0.142222}, + {0.289444666666666,0.162778,0.291111333333333,0.152222}, + {0.287222666666665,0.174444666666667,0.289444666666666,0.162778}, + {0.283889333333332,0.186666666666667,0.287222666666665,0.174444666666667}, + {0.280555999999999,0.199444666666666,0.283889333333332,0.186666666666667}, + {0.276666666666666,0.212222,0.280555999999999,0.199444666666666}, + {0.272778,0.225,0.276666666666666,0.212222}, + {0.268889333333332,0.237222,0.272778,0.225}, + {0.264999999999998,0.249444666666667,0.268889333333332,0.237222}, + {0.261666666666665,0.26,0.264999999999998,0.249444666666667}, + {0.258333333333333,0.27,0.261666666666665,0.26}, + {0.255555999999999,0.278333333333334,0.258333333333333,0.27}, + {0.252777999999999,0.285555333333334,0.255555999999999,0.278333333333334}, + {0.25,0.291666666666667,0.252777999999999,0.285555333333334}, + {0.247222666666666,0.296666666666667,0.25,0.291666666666667}, + {0.243889333333333,0.3,0.247222666666666,0.296666666666667}, + {0.240556,0.302222,0.243889333333333,0.3}, + {0.236666666666667,0.303333333333333,0.240556,0.302222}, + {0.232222666666665,0.302778,0.236666666666667,0.303333333333333}, + {0.228333333333332,0.301666666666667,0.232222666666665,0.302778}, + {0.223333333333332,0.3,0.228333333333332,0.301666666666667}, + {0.219444666666665,0.297778,0.223333333333332,0.3}, + {0.215555999999999,0.296111333333334,0.219444666666665,0.297778}, + {0.212222666666667,0.294444666666667,0.215555999999999,0.296111333333334}, + {0.209999999999998,0.292778,0.212222666666667,0.294444666666667}, + {0.208889333333332,0.292222,0.209999999999998,0.292778}, + {0.208333333333333,0.291666666666667,0.208889333333332,0.292222}, + {0,0,0,0} +}; + +double Icon29[][4] = { + {0,0.75,0,1}, + {1,1,1,0.75}, + {0.00333333333333267,0.750555333333333,0.00111133333333413,0.75}, + {0.0072220000000011,0.751111333333334,0.00333333333333267,0.750555333333333}, + {0.0127779999999997,0.751666666666667,0.0072220000000011,0.751111333333334}, + {0.0194446666666674,0.752778,0.0127779999999997,0.751666666666667}, + {0.0438886666666676,0.752222,0.0355553333333323,0.752778}, + {0.0522220000000004,0.750555333333333,0.0438886666666676,0.752222}, + {0.0599999999999999,0.747778,0.0522220000000004,0.750555333333333}, + {0.0677779999999994,0.743333333333334,0.0599999999999999,0.747778}, + {0.0755553333333339,0.737222,0.0677779999999994,0.743333333333334}, + {0.0833333333333333,0.729444666666667,0.0755553333333339,0.737222}, + {0.0888886666666669,0.723333333333333,0.0833333333333333,0.729444666666667}, + {0.0944446666666678,0.716111333333333,0.0888886666666669,0.723333333333333}, + {0.099999999999999,0.708333333333333,0.0944446666666678,0.716111333333333}, + {0.106666666666667,0.698888666666667,0.099999999999999,0.708333333333333}, + {0.112778000000001,0.688888666666667,0.106666666666667,0.698888666666667}, + {0.119444666666666,0.678333333333333,0.112778000000001,0.688888666666667}, + {0.126666666666668,0.666666666666667,0.119444666666666,0.678333333333333}, + {0.133333333333333,0.653888666666666,0.126666666666668,0.666666666666667}, + {0.140555333333334,0.641111333333334,0.133333333333333,0.653888666666666}, + {0.147778,0.628333333333333,0.140555333333334,0.641111333333334}, + {0.155555333333332,0.614444666666667,0.147778,0.628333333333333}, + {0.162778000000001,0.601111333333333,0.155555333333332,0.614444666666667}, + {0.169999999999999,0.588333333333334,0.162778000000001,0.601111333333333}, + {0.177222,0.575555333333333,0.169999999999999,0.588333333333334}, + {0.184444666666667,0.562778,0.177222,0.575555333333333}, + {0.191666666666668,0.551111333333333,0.184444666666667,0.562778}, + {0.198333333333333,0.540555333333333,0.191666666666668,0.551111333333333}, + {0.205000000000001,0.530555333333333,0.198333333333333,0.540555333333333}, + {0.211666666666666,0.521111333333333,0.205000000000001,0.530555333333333}, + {0.217778,0.513333333333333,0.211666666666666,0.521111333333333}, + {0.223888666666667,0.506111333333333,0.217778,0.513333333333333}, + {0.229444666666666,0.5,0.223888666666667,0.506111333333333}, + {0.239444666666666,0.491111333333333,0.229444666666666,0.5}, + {0.249444666666667,0.484444666666667,0.239444666666666,0.491111333333333}, + {0.258888666666666,0.480555333333333,0.249444666666667,0.484444666666667}, + {0.267778,0.478333333333333,0.258888666666666,0.480555333333333}, + {0.276666666666666,0.477222,0.267778,0.478333333333333}, + {0.302222,0.477778,0.293888666666668,0.477222}, + {0.310555333333333,0.478333333333333,0.302222,0.477778}, + {0.318333333333333,0.478888666666667,0.310555333333333,0.478333333333333}, + {0.333333333333333,0.479444666666667,0.326111333333332,0.478888666666667}, + {0.341111333333333,0.481111333333333,0.333333333333333,0.479444666666667}, + {0.349444666666666,0.484444666666667,0.341111333333333,0.481111333333333}, + {0.357778000000001,0.489444666666667,0.349444666666666,0.484444666666667}, + {0.366111333333334,0.495555333333333,0.357778000000001,0.489444666666667}, + {0.375,0.502778,0.366111333333334,0.495555333333333}, + {0.383333333333333,0.509444666666666,0.375,0.502778}, + {0.390000000000001,0.515555333333333,0.383333333333333,0.509444666666666}, + {0.393888666666667,0.518888666666667,0.390000000000001,0.515555333333333}, + {0.395555333333334,0.521111333333333,0.393888666666667,0.518888666666667}, + {0.393888666666667,0.520555333333334,0.395555333333334,0.521111333333333}, + {0.388888666666666,0.519444666666667,0.393888666666667,0.520555333333334}, + {0.381666666666668,0.518333333333333,0.388888666666666,0.519444666666667}, + {0.373333333333332,0.516666666666667,0.381666666666668,0.518333333333333}, + {0.363888666666665,0.515555333333333,0.373333333333332,0.516666666666667}, + {0.346666666666666,0.516111333333334,0.354444666666666,0.515555333333333}, + {0.339444666666668,0.517778,0.346666666666666,0.516111333333334}, + {0.333333333333333,0.521111333333333,0.339444666666668,0.517778}, + {0.328333333333333,0.525,0.333333333333333,0.521111333333333}, + {0.322221999999999,0.53,0.328333333333333,0.525}, + {0.316666666666668,0.536111333333333,0.322221999999999,0.53}, + {0.31,0.542778,0.316666666666668,0.536111333333333}, + {0.303333333333332,0.549444666666667,0.31,0.542778}, + {0.296111333333333,0.556666666666667,0.303333333333332,0.549444666666667}, + {0.289999999999999,0.564444666666667,0.296111333333333,0.556666666666667}, + {0.283888666666667,0.572222,0.289999999999999,0.564444666666667}, + {0.278333333333334,0.58,0.283888666666667,0.572222}, + {0.274444666666668,0.587778,0.278333333333334,0.58}, + {0.272221999999999,0.596111333333334,0.274444666666668,0.587778}, + {0.271111333333332,0.604444666666667,0.272221999999999,0.596111333333334}, + {0.271666666666666,0.612222,0.271111333333332,0.604444666666667}, + {0.273333333333333,0.620555333333333,0.271666666666666,0.612222}, + {0.276111333333333,0.629444666666667,0.273333333333333,0.620555333333333}, + {0.278888666666667,0.638888666666666,0.276111333333333,0.629444666666667}, + {0.282778,0.648888666666667,0.278888666666667,0.638888666666666}, + {0.287222,0.659444666666667,0.282778,0.648888666666667}, + {0.291666666666667,0.67,0.287222,0.659444666666667}, + {0.296111333333333,0.680555333333333,0.291666666666667,0.67}, + {0.301666666666667,0.690555333333334,0.296111333333333,0.680555333333333}, + {0.306666666666667,0.7,0.301666666666667,0.690555333333334}, + {0.312777999999999,0.708888666666667,0.306666666666667,0.7}, + {0.318888666666666,0.716666666666667,0.312777999999999,0.708888666666667}, + {0.325555333333334,0.723888666666667,0.318888666666666,0.716666666666667}, + {0.333333333333333,0.729444666666667,0.325555333333334,0.723888666666667}, + {0.341111333333333,0.733333333333333,0.333333333333333,0.729444666666667}, + {0.349999999999999,0.737222,0.341111333333333,0.733333333333333}, + {0.359999999999999,0.74,0.349999999999999,0.737222}, + {0.372222000000001,0.742222,0.359999999999999,0.74}, + {0.386111333333334,0.743888666666667,0.372222000000001,0.742222}, + {0.401111333333333,0.745555333333333,0.386111333333334,0.743888666666667}, + {0.417222,0.746666666666667,0.401111333333333,0.745555333333333}, + {0.433888666666666,0.747778,0.417222,0.746666666666667}, + {0.45,0.748333333333333,0.433888666666666,0.747778}, + {0.464444666666668,0.748888666666667,0.45,0.748333333333333}, + {0.477222,0.749444666666667,0.464444666666668,0.748888666666667}, + {0.494444666666666,0.75,0.487222,0.749444666666667}, + {0.503333333333333,0.750555333333333,0.501111333333334,0.75}, + {0.507222000000001,0.751111333333334,0.503333333333333,0.750555333333333}, + {0.512778,0.751666666666667,0.507222000000001,0.751111333333334}, + {0.519444666666667,0.752778,0.512778,0.751666666666667}, + {0.543888666666668,0.752222,0.535555333333332,0.752778}, + {0.552222,0.750555333333333,0.543888666666668,0.752222}, + {0.56,0.747778,0.552222,0.750555333333333}, + {0.567777999999999,0.743333333333334,0.56,0.747778}, + {0.575555333333334,0.737222,0.567777999999999,0.743333333333334}, + {0.583333333333333,0.729444666666667,0.575555333333334,0.737222}, + {0.588888666666667,0.723333333333333,0.583333333333333,0.729444666666667}, + {0.594444666666668,0.716111333333333,0.588888666666667,0.723333333333333}, + {0.599999999999999,0.708333333333333,0.594444666666668,0.716111333333333}, + {0.606666666666667,0.698888666666667,0.599999999999999,0.708333333333333}, + {0.612778000000001,0.688888666666667,0.606666666666667,0.698888666666667}, + {0.619444666666666,0.678333333333333,0.612778000000001,0.688888666666667}, + {0.626666666666667,0.666666666666667,0.619444666666666,0.678333333333333}, + {0.633333333333333,0.653888666666666,0.626666666666667,0.666666666666667}, + {0.640555333333334,0.641111333333334,0.633333333333333,0.653888666666666}, + {0.647778,0.628333333333333,0.640555333333334,0.641111333333334}, + {0.655555333333332,0.614444666666667,0.647778,0.628333333333333}, + {0.662778000000001,0.601111333333333,0.655555333333332,0.614444666666667}, + {0.669999999999999,0.588333333333334,0.662778000000001,0.601111333333333}, + {0.677222,0.575555333333333,0.669999999999999,0.588333333333334}, + {0.684444666666666,0.562778,0.677222,0.575555333333333}, + {0.691666666666668,0.551111333333333,0.684444666666666,0.562778}, + {0.698333333333333,0.540555333333333,0.691666666666668,0.551111333333333}, + {0.705000000000001,0.530555333333333,0.698333333333333,0.540555333333333}, + {0.711666666666666,0.521111333333333,0.705000000000001,0.530555333333333}, + {0.717778,0.513333333333333,0.711666666666666,0.521111333333333}, + {0.723888666666667,0.506111333333333,0.717778,0.513333333333333}, + {0.729444666666666,0.5,0.723888666666667,0.506111333333333}, + {0.739444666666666,0.491111333333333,0.729444666666666,0.5}, + {0.749444666666667,0.484444666666667,0.739444666666666,0.491111333333333}, + {0.758888666666666,0.480555333333333,0.749444666666667,0.484444666666667}, + {0.767778,0.478333333333333,0.758888666666666,0.480555333333333}, + {0.776666666666666,0.477222,0.767778,0.478333333333333}, + {0.802222,0.477778,0.793888666666668,0.477222}, + {0.810555333333333,0.478333333333333,0.802222,0.477778}, + {0.818333333333333,0.478888666666667,0.810555333333333,0.478333333333333}, + {0.833333333333333,0.479444666666667,0.826111333333332,0.478888666666667}, + {0.841111333333333,0.481111333333333,0.833333333333333,0.479444666666667}, + {0.849444666666666,0.484444666666667,0.841111333333333,0.481111333333333}, + {0.857778000000001,0.489444666666667,0.849444666666666,0.484444666666667}, + {0.866111333333334,0.495555333333333,0.857778000000001,0.489444666666667}, + {0.875,0.502778,0.866111333333334,0.495555333333333}, + {0.883333333333333,0.509444666666666,0.875,0.502778}, + {0.890000000000001,0.515555333333333,0.883333333333333,0.509444666666666}, + {0.893888666666667,0.518888666666667,0.890000000000001,0.515555333333333}, + {0.895555333333334,0.521111333333333,0.893888666666667,0.518888666666667}, + {0.893888666666667,0.520555333333334,0.895555333333334,0.521111333333333}, + {0.888888666666666,0.519444666666667,0.893888666666667,0.520555333333334}, + {0.881666666666668,0.518333333333333,0.888888666666666,0.519444666666667}, + {0.873333333333332,0.516666666666667,0.881666666666668,0.518333333333333}, + {0.863888666666665,0.515555333333333,0.873333333333332,0.516666666666667}, + {0.846666666666666,0.516111333333334,0.854444666666666,0.515555333333333}, + {0.839444666666668,0.517778,0.846666666666666,0.516111333333334}, + {0.833333333333333,0.521111333333333,0.839444666666668,0.517778}, + {0.828333333333333,0.525,0.833333333333333,0.521111333333333}, + {0.822221999999999,0.53,0.828333333333333,0.525}, + {0.816666666666668,0.536111333333333,0.822221999999999,0.53}, + {0.81,0.542778,0.816666666666668,0.536111333333333}, + {0.803333333333332,0.549444666666667,0.81,0.542778}, + {0.796111333333333,0.556666666666667,0.803333333333332,0.549444666666667}, + {0.789999999999999,0.564444666666667,0.796111333333333,0.556666666666667}, + {0.783888666666667,0.572222,0.789999999999999,0.564444666666667}, + {0.778333333333334,0.58,0.783888666666667,0.572222}, + {0.774444666666668,0.587778,0.778333333333334,0.58}, + {0.772221999999999,0.596111333333334,0.774444666666668,0.587778}, + {0.771111333333332,0.604444666666667,0.772221999999999,0.596111333333334}, + {0.771666666666666,0.612222,0.771111333333332,0.604444666666667}, + {0.773333333333333,0.620555333333333,0.771666666666666,0.612222}, + {0.776111333333333,0.629444666666667,0.773333333333333,0.620555333333333}, + {0.778888666666667,0.638888666666666,0.776111333333333,0.629444666666667}, + {0.782778,0.648888666666667,0.778888666666667,0.638888666666666}, + {0.787222,0.659444666666667,0.782778,0.648888666666667}, + {0.791666666666667,0.67,0.787222,0.659444666666667}, + {0.796111333333333,0.680555333333333,0.791666666666667,0.67}, + {0.801666666666667,0.690555333333334,0.796111333333333,0.680555333333333}, + {0.806666666666667,0.7,0.801666666666667,0.690555333333334}, + {0.812777999999999,0.708888666666667,0.806666666666667,0.7}, + {0.818888666666666,0.716666666666667,0.812777999999999,0.708888666666667}, + {0.825555333333334,0.723888666666667,0.818888666666666,0.716666666666667}, + {0.833333333333333,0.729444666666667,0.825555333333334,0.723888666666667}, + {0.841111333333333,0.733333333333333,0.833333333333333,0.729444666666667}, + {0.849999999999999,0.737222,0.841111333333333,0.733333333333333}, + {0.859999999999999,0.74,0.849999999999999,0.737222}, + {0.872222000000001,0.742222,0.859999999999999,0.74}, + {0.886111333333334,0.743888666666667,0.872222000000001,0.742222}, + {0.901111333333333,0.745555333333333,0.886111333333334,0.743888666666667}, + {0.917222,0.746666666666667,0.901111333333333,0.745555333333333}, + {0.933888666666666,0.747778,0.917222,0.746666666666667}, + {0.95,0.748333333333333,0.933888666666666,0.747778}, + {0.964444666666668,0.748888666666667,0.95,0.748333333333333}, + {0.977222,0.749444666666667,0.964444666666668,0.748888666666667}, + {0.994444666666666,0.75,0.987222,0.749444666666667}, + {0,0,0,0} +}; + +double Icon30[][4] = { + {0.103888666666667,0.687222,0,0.708333333333333}, + {0.125,0.583333333333333,0.103888666666667,0.687222}, + {0.145555333333334,0.687222,0.125,0.583333333333333}, + {0.25,0.708333333333333,0.145555333333334,0.687222}, + {0.145555333333334,0.728888666666667,0.25,0.708333333333333}, + {0.125,0.833333333333333,0.145555333333334,0.728888666666667}, + {0.103888666666667,0.728888666666667,0.125,0.833333333333333}, + {0,0.708333333333333,0.103888666666667,0.728888666666667}, + {0.291666666666667,0.458333333333333,0.0833333333333333,0.5}, + {0.333333333333333,0.25,0.291666666666667,0.458333333333333}, + {0.375,0.458333333333333,0.333333333333333,0.25}, + {0.583333333333333,0.5,0.375,0.458333333333333}, + {0.375,0.541666666666667,0.583333333333333,0.5}, + {0.333333333333333,0.75,0.375,0.541666666666667}, + {0.291666666666667,0.541666666666667,0.333333333333333,0.75}, + {0.0833333333333333,0.5,0.291666666666667,0.541666666666667}, + {0.520555333333334,0.270555333333334,0.416666666666667,0.291666666666667}, + {0.541666666666667,0.166666666666667,0.520555333333334,0.270555333333334}, + {0.562222000000001,0.270555333333334,0.541666666666667,0.166666666666667}, + {0.666666666666667,0.291666666666667,0.562222000000001,0.270555333333334}, + {0.562222000000001,0.312222,0.666666666666667,0.291666666666667}, + {0.541666666666667,0.416666666666667,0.562222000000001,0.312222}, + {0.520555333333334,0.312222,0.541666666666667,0.416666666666667}, + {0.416666666666667,0.291666666666667,0.520555333333334,0.312222}, + {0,0,0,0} +}; + +double Icon31[][4] = { + {0.208333333333333,0.458333333333333,0,0.5}, + {0.25,0.25,0.208333333333333,0.458333333333333}, + {0.291666666666667,0.458333333333333,0.25,0.25}, + {0.5,0.5,0.291666666666667,0.458333333333333}, + {0.291666666666667,0.541666666666667,0.5,0.5}, + {0.25,0.75,0.291666666666667,0.541666666666667}, + {0.208333333333333,0.541666666666667,0.25,0.75}, + {0,0.5,0.208333333333333,0.541666666666667}, + {0,0,0,0} +}; + +double Icon32[][4] = { + {0.25,0.25,0,0.5}, + {0.5,0.5,0.25,0.25}, + {0.25,0.75,0.5,0.5}, + {0,0.5,0.25,0.75}, + {0,0,0,0} +}; + +double Icon33[][4] = { + {0.166666666666667,0.25,0,0.333333333333333}, + {0.166666666666667,0.291666666666667,0.166666666666667,0.25}, + {0,0.333333333333333,0.166666666666667,0.416666666666667}, + {0.166666666666667,0.416666666666667,0.166666666666667,0.375}, + {0.208333333333333,0.458333333333333,0.291666666666667,0.625}, + {0.25,0.375,0.25,0.458333333333333}, + {0.291666666666667,0.0416666666666667,0.208333333333333,0.208333333333333}, + {0.25,0.208333333333333,0.25,0.291666666666667}, + {0.291666666666667,0.625,0.375,0.458333333333333}, + {0.333333333333333,0.458333333333333,0.333333333333333,0.375}, + {0.375,0.208333333333333,0.291666666666667,0.0416666666666667}, + {0.333333333333333,0.291666666666667,0.333333333333333,0.208333333333333}, + {0.416666666666667,0.416666666666667,0.583333333333333,0.333333333333333}, + {0.416666666666667,0.375,0.416666666666667,0.416666666666667}, + {0.583333333333333,0.333333333333333,0.416666666666667,0.25}, + {0.416666666666667,0.25,0.416666666666667,0.291666666666667}, + {0,0,0,0} +}; + +double Icon34[][4] = { + {0.125,0.497778,0.125,0.5}, + {0.124444666666667,0.493888666666667,0.125,0.497778}, + {0.123888666666668,0.486666666666667,0.124444666666667,0.493888666666667}, + {0.122778000000001,0.476111333333333,0.123888666666668,0.486666666666667}, + {0.121666666666665,0.462778,0.122778000000001,0.476111333333333}, + {0.12,0.447222,0.121666666666665,0.462778}, + {0.118888666666668,0.430555333333333,0.12,0.447222}, + {0.117778000000001,0.413333333333333,0.118888666666668,0.430555333333333}, + {0.116666666666665,0.396666666666667,0.117778000000001,0.413333333333333}, + {0.116666666666665,0.381666666666667,0.116666666666665,0.396666666666667}, + {0.116666666666665,0.367778,0.116666666666665,0.381666666666667}, + {0.117221999999998,0.356666666666667,0.116666666666665,0.367778}, + {0.118888666666668,0.346666666666666,0.117221999999998,0.356666666666667}, + {0.121666666666665,0.339444666666667,0.118888666666668,0.346666666666666}, + {0.125,0.333333333333333,0.121666666666665,0.339444666666667}, + {0.13,0.328333333333333,0.125,0.333333333333333}, + {0.136666666666666,0.325,0.13,0.328333333333333}, + {0.145000000000001,0.324444666666666,0.136666666666666,0.325}, + {0.153888666666665,0.325,0.145000000000001,0.324444666666666}, + {0.164444666666668,0.327778,0.153888666666665,0.325}, + {0.176111333333334,0.331111333333334,0.164444666666668,0.327778}, + {0.187777999999999,0.335555333333333,0.176111333333334,0.331111333333334}, + {0.198888666666666,0.339444666666667,0.187777999999999,0.335555333333333}, + {0.210555333333332,0.342778,0.198888666666666,0.339444666666667}, + {0.221111333333335,0.345,0.210555333333332,0.342778}, + {0.229999999999999,0.345555333333333,0.221111333333335,0.345}, + {0.238333333333334,0.343888666666667,0.229999999999999,0.345555333333333}, + {0.245,0.339444666666667,0.238333333333334,0.343888666666667}, + {0.25,0.333333333333333,0.245,0.339444666666667}, + {0.253333333333335,0.326666666666667,0.25,0.333333333333333}, + {0.255555333333334,0.318888666666667,0.253333333333335,0.326666666666667}, + {0.256666666666665,0.309444666666667,0.255555333333334,0.318888666666667}, + {0.257221999999999,0.298888666666667,0.256666666666665,0.309444666666667}, + {0.257221999999999,0.286666666666667,0.257221999999999,0.298888666666667}, + {0.256666666666665,0.273333333333333,0.257221999999999,0.286666666666667}, + {0.255555333333334,0.258888666666667,0.256666666666665,0.273333333333333}, + {0.253888666666668,0.244444666666666,0.255555333333334,0.258888666666667}, + {0.252221999999999,0.228888666666667,0.253888666666668,0.244444666666666}, + {0.25,0.213888666666667,0.252221999999999,0.228888666666667}, + {0.248333333333335,0.199444666666666,0.25,0.213888666666667}, + {0.247221999999998,0.185,0.248333333333335,0.199444666666666}, + {0.246111333333332,0.171666666666667,0.247221999999998,0.185}, + {0.245555333333333,0.159444666666667,0.246111333333332,0.171666666666667}, + {0.245555333333333,0.148888666666667,0.245555333333333,0.159444666666667}, + {0.246666666666665,0.139444666666667,0.245555333333333,0.148888666666667}, + {0.247778000000001,0.131666666666667,0.246666666666665,0.139444666666667}, + {0.25,0.125,0.247778000000001,0.131666666666667}, + {0.252778000000002,0.12,0.25,0.125}, + {0.255555333333334,0.115555333333334,0.252778000000002,0.12}, + {0.259444666666667,0.112778,0.255555333333334,0.115555333333334}, + {0.263888666666669,0.11,0.259444666666667,0.112778}, + {0.268888666666669,0.108333333333333,0.263888666666669,0.11}, + {0.273888666666664,0.107222,0.268888666666669,0.108333333333333}, + {0.279444666666668,0.106111333333333,0.273888666666664,0.107222}, + {0.285555333333335,0.105555333333333,0.279444666666668,0.106111333333333}, + {0.303888666666666,0.106111333333333,0.297777999999999,0.105555333333333}, + {0.309444666666669,0.107222,0.303888666666666,0.106111333333333}, + {0.314444666666664,0.108333333333333,0.309444666666669,0.107222}, + {0.319444666666664,0.11,0.314444666666664,0.108333333333333}, + {0.323888666666666,0.112778,0.319444666666664,0.11}, + {0.327778,0.115555333333334,0.323888666666666,0.112778}, + {0.330555333333332,0.12,0.327778,0.115555333333334}, + {0.333333333333333,0.125,0.330555333333332,0.12}, + {0.335555333333332,0.131666666666667,0.333333333333333,0.125}, + {0.336666666666668,0.139444666666667,0.335555333333332,0.131666666666667}, + {0.337778,0.148888666666667,0.336666666666668,0.139444666666667}, + {0.337778,0.159444666666667,0.337778,0.148888666666667}, + {0.337222000000002,0.171666666666667,0.337778,0.159444666666667}, + {0.336111333333335,0.185,0.337222000000002,0.171666666666667}, + {0.334999999999998,0.199444666666666,0.336111333333335,0.185}, + {0.333333333333333,0.213888666666667,0.334999999999998,0.199444666666666}, + {0.331111333333335,0.229444666666667,0.333333333333333,0.213888666666667}, + {0.329444666666665,0.244444666666666,0.331111333333335,0.229444666666667}, + {0.327778,0.258888666666667,0.329444666666665,0.244444666666666}, + {0.326666666666668,0.273333333333333,0.327778,0.258888666666667}, + {0.326111333333335,0.286666666666667,0.326666666666668,0.273333333333333}, + {0.326111333333335,0.298888666666667,0.326111333333335,0.286666666666667}, + {0.326666666666668,0.309444666666667,0.326111333333335,0.298888666666667}, + {0.327778,0.318888666666667,0.326666666666668,0.309444666666667}, + {0.329999999999998,0.326666666666667,0.327778,0.318888666666667}, + {0.333333333333333,0.333333333333333,0.329999999999998,0.326666666666667}, + {0.338333333333333,0.339444666666667,0.333333333333333,0.333333333333333}, + {0.344999999999999,0.343888666666667,0.338333333333333,0.339444666666667}, + {0.353333333333334,0.345555333333333,0.344999999999999,0.343888666666667}, + {0.362221999999998,0.345,0.353333333333334,0.345555333333333}, + {0.372778000000001,0.342778,0.362221999999998,0.345}, + {0.384444666666667,0.339444666666667,0.372778000000001,0.342778}, + {0.396111333333332,0.335555333333333,0.384444666666667,0.339444666666667}, + {0.407222,0.331111333333334,0.396111333333332,0.335555333333333}, + {0.418888666666665,0.327778,0.407222,0.331111333333334}, + {0.429444666666669,0.325,0.418888666666665,0.327778}, + {0.438333333333333,0.324444666666666,0.429444666666669,0.325}, + {0.446666666666668,0.325,0.438333333333333,0.324444666666666}, + {0.453333333333333,0.328333333333333,0.446666666666668,0.325}, + {0.458333333333333,0.333333333333333,0.453333333333333,0.328333333333333}, + {0.461666666666668,0.339444666666667,0.458333333333333,0.333333333333333}, + {0.464444666666665,0.346666666666666,0.461666666666668,0.339444666666667}, + {0.466111333333335,0.356666666666667,0.464444666666665,0.346666666666666}, + {0.466666666666669,0.367778,0.466111333333335,0.356666666666667}, + {0.466666666666669,0.381666666666667,0.466666666666669,0.367778}, + {0.466666666666669,0.396666666666667,0.466666666666669,0.381666666666667}, + {0.465555333333332,0.413333333333333,0.466666666666669,0.396666666666667}, + {0.464444666666665,0.430555333333333,0.465555333333332,0.413333333333333}, + {0.463333333333333,0.447222,0.464444666666665,0.430555333333333}, + {0.461666666666668,0.462778,0.463333333333333,0.447222}, + {0.460555333333332,0.476111333333333,0.461666666666668,0.462778}, + {0.459444666666665,0.486666666666667,0.460555333333332,0.476111333333333}, + {0.458888666666667,0.493888666666667,0.459444666666665,0.486666666666667}, + {0.458333333333333,0.497778,0.458888666666667,0.493888666666667}, + {0.458333333333333,0.5,0.458333333333333,0.497778}, + {0.125,0.541666666666667,0.125,0.542222}, + {0.125,0.542222,0.125,0.543888666666666}, + {0.125,0.543888666666666,0.124444666666667,0.547778}, + {0.124444666666667,0.547778,0.123888666666668,0.554444666666667}, + {0.123888666666668,0.554444666666667,0.123333333333335,0.563888666666667}, + {0.123333333333335,0.563888666666667,0.122778000000001,0.574444666666666}, + {0.122778000000001,0.574444666666666,0.122221999999998,0.585}, + {0.122221999999998,0.585,0.122221999999998,0.595555333333333}, + {0.122221999999998,0.595555333333333,0.122221999999998,0.605}, + {0.122221999999998,0.605,0.122778000000001,0.612778}, + {0.122778000000001,0.612778,0.123333333333335,0.619444666666666}, + {0.123333333333335,0.619444666666666,0.125,0.625}, + {0.125,0.625,0.127778000000002,0.631111333333333}, + {0.127778000000002,0.631111333333333,0.131111333333332,0.636666666666667}, + {0.131111333333332,0.636666666666667,0.136111333333332,0.642222}, + {0.136111333333332,0.642222,0.142778000000002,0.647778}, + {0.142778000000002,0.647778,0.149444666666668,0.653333333333334}, + {0.149444666666668,0.653333333333334,0.156111333333333,0.658888666666667}, + {0.156111333333333,0.658888666666667,0.161111333333333,0.662778}, + {0.161111333333333,0.662778,0.165000000000002,0.665555333333333}, + {0.165000000000002,0.665555333333333,0.166666666666667,0.666666666666667}, + {0.458333333333333,0.542222,0.458333333333333,0.541666666666667}, + {0.458333333333333,0.543888666666666,0.458333333333333,0.542222}, + {0.457778,0.547778,0.458333333333333,0.543888666666666}, + {0.457222000000002,0.554444666666667,0.457778,0.547778}, + {0.456666666666668,0.563888666666667,0.457222000000002,0.554444666666667}, + {0.456111333333335,0.574444666666666,0.456666666666668,0.563888666666667}, + {0.455555333333332,0.585,0.456111333333335,0.574444666666666}, + {0.455555333333332,0.595555333333333,0.455555333333332,0.585}, + {0.455555333333332,0.605,0.455555333333332,0.595555333333333}, + {0.456111333333335,0.612778,0.455555333333332,0.605}, + {0.456666666666668,0.619444666666666,0.456111333333335,0.612778}, + {0.458333333333333,0.625,0.456666666666668,0.619444666666666}, + {0.461111333333335,0.631111333333333,0.458333333333333,0.625}, + {0.464444666666665,0.636666666666667,0.461111333333335,0.631111333333333}, + {0.469444666666665,0.642222,0.464444666666665,0.636666666666667}, + {0.476111333333336,0.647778,0.469444666666665,0.642222}, + {0.482778000000001,0.653333333333334,0.476111333333336,0.647778}, + {0.489444666666666,0.658888666666667,0.482778000000001,0.653333333333334}, + {0.494444666666666,0.662778,0.489444666666666,0.658888666666667}, + {0.498333333333335,0.665555333333333,0.494444666666666,0.662778}, + {0.5,0.666666666666667,0.498333333333335,0.665555333333333}, + {0,0,0,0} +}; + +double Icon35[][4] = { + {0.583333333333333,0.75,0.583333333333333,0}, + {0,0,0,0.75}, + {0.125,0.5,0.125,0.497778}, + {0.125,0.497778,0.124444666666667,0.493888666666667}, + {0.124444666666667,0.493888666666667,0.123888666666668,0.486666666666667}, + {0.123888666666668,0.486666666666667,0.122778000000001,0.476111333333333}, + {0.122778000000001,0.476111333333333,0.121666666666665,0.462778}, + {0.121666666666665,0.462778,0.12,0.447222}, + {0.12,0.447222,0.118888666666668,0.430555333333333}, + {0.118888666666668,0.430555333333333,0.117778000000001,0.413333333333333}, + {0.117778000000001,0.413333333333333,0.116666666666665,0.396666666666667}, + {0.116666666666665,0.396666666666667,0.116666666666665,0.381666666666667}, + {0.116666666666665,0.381666666666667,0.116666666666665,0.367778}, + {0.116666666666665,0.367778,0.117221999999998,0.356666666666667}, + {0.117221999999998,0.356666666666667,0.118888666666668,0.346666666666666}, + {0.118888666666668,0.346666666666666,0.121666666666665,0.339444666666667}, + {0.121666666666665,0.339444666666667,0.125,0.333333333333333}, + {0.125,0.333333333333333,0.13,0.328333333333333}, + {0.13,0.328333333333333,0.136666666666666,0.325}, + {0.136666666666666,0.325,0.145000000000001,0.324444666666666}, + {0.145000000000001,0.324444666666666,0.153888666666665,0.325}, + {0.153888666666665,0.325,0.164444666666668,0.327778}, + {0.164444666666668,0.327778,0.176111333333334,0.331111333333334}, + {0.176111333333334,0.331111333333334,0.187777999999999,0.335555333333333}, + {0.187777999999999,0.335555333333333,0.198888666666666,0.339444666666667}, + {0.198888666666666,0.339444666666667,0.210555333333332,0.342778}, + {0.210555333333332,0.342778,0.221111333333335,0.345}, + {0.221111333333335,0.345,0.229999999999999,0.345555333333333}, + {0.229999999999999,0.345555333333333,0.238333333333334,0.343888666666667}, + {0.238333333333334,0.343888666666667,0.245,0.339444666666667}, + {0.245,0.339444666666667,0.25,0.333333333333333}, + {0.25,0.333333333333333,0.253333333333335,0.326666666666667}, + {0.253333333333335,0.326666666666667,0.255555333333334,0.318888666666667}, + {0.255555333333334,0.318888666666667,0.256666666666665,0.309444666666667}, + {0.256666666666665,0.309444666666667,0.257221999999999,0.298888666666667}, + {0.257221999999999,0.298888666666667,0.257221999999999,0.286666666666667}, + {0.257221999999999,0.286666666666667,0.256666666666665,0.273333333333333}, + {0.256666666666665,0.273333333333333,0.255555333333334,0.258888666666667}, + {0.255555333333334,0.258888666666667,0.253888666666668,0.244444666666666}, + {0.253888666666668,0.244444666666666,0.252221999999999,0.228888666666667}, + {0.252221999999999,0.228888666666667,0.25,0.213888666666667}, + {0.25,0.213888666666667,0.248333333333335,0.199444666666666}, + {0.248333333333335,0.199444666666666,0.247221999999998,0.185}, + {0.247221999999998,0.185,0.246111333333332,0.171666666666667}, + {0.246111333333332,0.171666666666667,0.245555333333333,0.159444666666667}, + {0.245555333333333,0.159444666666667,0.245555333333333,0.148888666666667}, + {0.245555333333333,0.148888666666667,0.246666666666665,0.139444666666667}, + {0.246666666666665,0.139444666666667,0.247778000000001,0.131666666666667}, + {0.247778000000001,0.131666666666667,0.25,0.125}, + {0.25,0.125,0.252778000000002,0.12}, + {0.252778000000002,0.12,0.255555333333334,0.115555333333334}, + {0.255555333333334,0.115555333333334,0.259444666666667,0.112778}, + {0.259444666666667,0.112778,0.263888666666669,0.11}, + {0.263888666666669,0.11,0.268888666666669,0.108333333333333}, + {0.268888666666669,0.108333333333333,0.273888666666664,0.107222}, + {0.273888666666664,0.107222,0.279444666666668,0.106111333333333}, + {0.279444666666668,0.106111333333333,0.285555333333335,0.105555333333333}, + {0.297777999999999,0.105555333333333,0.303888666666666,0.106111333333333}, + {0.303888666666666,0.106111333333333,0.309444666666669,0.107222}, + {0.309444666666669,0.107222,0.314444666666664,0.108333333333333}, + {0.314444666666664,0.108333333333333,0.319444666666664,0.11}, + {0.319444666666664,0.11,0.323888666666666,0.112778}, + {0.323888666666666,0.112778,0.327778,0.115555333333334}, + {0.327778,0.115555333333334,0.330555333333332,0.12}, + {0.330555333333332,0.12,0.333333333333333,0.125}, + {0.333333333333333,0.125,0.335555333333332,0.131666666666667}, + {0.335555333333332,0.131666666666667,0.336666666666668,0.139444666666667}, + {0.336666666666668,0.139444666666667,0.337778,0.148888666666667}, + {0.337778,0.148888666666667,0.337778,0.159444666666667}, + {0.337778,0.159444666666667,0.337222000000002,0.171666666666667}, + {0.337222000000002,0.171666666666667,0.336111333333335,0.185}, + {0.336111333333335,0.185,0.334999999999998,0.199444666666666}, + {0.334999999999998,0.199444666666666,0.333333333333333,0.213888666666667}, + {0.333333333333333,0.213888666666667,0.331111333333335,0.229444666666667}, + {0.331111333333335,0.229444666666667,0.329444666666665,0.244444666666666}, + {0.329444666666665,0.244444666666666,0.327778,0.258888666666667}, + {0.327778,0.258888666666667,0.326666666666668,0.273333333333333}, + {0.326666666666668,0.273333333333333,0.326111333333335,0.286666666666667}, + {0.326111333333335,0.286666666666667,0.326111333333335,0.298888666666667}, + {0.326111333333335,0.298888666666667,0.326666666666668,0.309444666666667}, + {0.326666666666668,0.309444666666667,0.327778,0.318888666666667}, + {0.327778,0.318888666666667,0.329999999999998,0.326666666666667}, + {0.329999999999998,0.326666666666667,0.333333333333333,0.333333333333333}, + {0.333333333333333,0.333333333333333,0.338333333333333,0.339444666666667}, + {0.338333333333333,0.339444666666667,0.344999999999999,0.343888666666667}, + {0.344999999999999,0.343888666666667,0.353333333333334,0.345555333333333}, + {0.353333333333334,0.345555333333333,0.362221999999998,0.345}, + {0.362221999999998,0.345,0.372778000000001,0.342778}, + {0.372778000000001,0.342778,0.384444666666667,0.339444666666667}, + {0.384444666666667,0.339444666666667,0.396111333333332,0.335555333333333}, + {0.396111333333332,0.335555333333333,0.407222,0.331111333333334}, + {0.407222,0.331111333333334,0.418888666666665,0.327778}, + {0.418888666666665,0.327778,0.429444666666669,0.325}, + {0.429444666666669,0.325,0.438333333333333,0.324444666666666}, + {0.438333333333333,0.324444666666666,0.446666666666668,0.325}, + {0.446666666666668,0.325,0.453333333333333,0.328333333333333}, + {0.453333333333333,0.328333333333333,0.458333333333333,0.333333333333333}, + {0.458333333333333,0.333333333333333,0.461666666666668,0.339444666666667}, + {0.461666666666668,0.339444666666667,0.464444666666665,0.346666666666666}, + {0.464444666666665,0.346666666666666,0.466111333333335,0.356666666666667}, + {0.466111333333335,0.356666666666667,0.466666666666669,0.367778}, + {0.466666666666669,0.367778,0.466666666666669,0.381666666666667}, + {0.466666666666669,0.381666666666667,0.466666666666669,0.396666666666667}, + {0.466666666666669,0.396666666666667,0.465555333333332,0.413333333333333}, + {0.465555333333332,0.413333333333333,0.464444666666665,0.430555333333333}, + {0.464444666666665,0.430555333333333,0.463333333333333,0.447222}, + {0.463333333333333,0.447222,0.461666666666668,0.462778}, + {0.461666666666668,0.462778,0.460555333333332,0.476111333333333}, + {0.460555333333332,0.476111333333333,0.459444666666665,0.486666666666667}, + {0.459444666666665,0.486666666666667,0.458888666666667,0.493888666666667}, + {0.458888666666667,0.493888666666667,0.458333333333333,0.497778}, + {0.458333333333333,0.497778,0.458333333333333,0.5}, + {0.125,0.542222,0.125,0.541666666666667}, + {0.125,0.543888666666666,0.125,0.542222}, + {0.124444666666667,0.547778,0.125,0.543888666666666}, + {0.123888666666668,0.554444666666667,0.124444666666667,0.547778}, + {0.123333333333335,0.563888666666667,0.123888666666668,0.554444666666667}, + {0.122778000000001,0.574444666666666,0.123333333333335,0.563888666666667}, + {0.122221999999998,0.585,0.122778000000001,0.574444666666666}, + {0.122221999999998,0.595555333333333,0.122221999999998,0.585}, + {0.122221999999998,0.605,0.122221999999998,0.595555333333333}, + {0.122778000000001,0.612778,0.122221999999998,0.605}, + {0.123333333333335,0.619444666666666,0.122778000000001,0.612778}, + {0.125,0.625,0.123333333333335,0.619444666666666}, + {0.127778000000002,0.631111333333333,0.125,0.625}, + {0.131111333333332,0.636666666666667,0.127778000000002,0.631111333333333}, + {0.136111333333332,0.642222,0.131111333333332,0.636666666666667}, + {0.142778000000002,0.647778,0.136111333333332,0.642222}, + {0.149444666666668,0.653333333333334,0.142778000000002,0.647778}, + {0.156111333333333,0.658888666666667,0.149444666666668,0.653333333333334}, + {0.161111333333333,0.662778,0.156111333333333,0.658888666666667}, + {0.165000000000002,0.665555333333333,0.161111333333333,0.662778}, + {0.166666666666667,0.666666666666667,0.165000000000002,0.665555333333333}, + {0.458333333333333,0.541666666666667,0.458333333333333,0.542222}, + {0.458333333333333,0.542222,0.458333333333333,0.543888666666666}, + {0.458333333333333,0.543888666666666,0.457778,0.547778}, + {0.457778,0.547778,0.457222000000002,0.554444666666667}, + {0.457222000000002,0.554444666666667,0.456666666666668,0.563888666666667}, + {0.456666666666668,0.563888666666667,0.456111333333335,0.574444666666666}, + {0.456111333333335,0.574444666666666,0.455555333333332,0.585}, + {0.455555333333332,0.585,0.455555333333332,0.595555333333333}, + {0.455555333333332,0.595555333333333,0.455555333333332,0.605}, + {0.455555333333332,0.605,0.456111333333335,0.612778}, + {0.456111333333335,0.612778,0.456666666666668,0.619444666666666}, + {0.456666666666668,0.619444666666666,0.458333333333333,0.625}, + {0.458333333333333,0.625,0.461111333333335,0.631111333333333}, + {0.461111333333335,0.631111333333333,0.464444666666665,0.636666666666667}, + {0.464444666666665,0.636666666666667,0.469444666666665,0.642222}, + {0.469444666666665,0.642222,0.476111333333336,0.647778}, + {0.476111333333336,0.647778,0.482778000000001,0.653333333333334}, + {0.482778000000001,0.653333333333334,0.489444666666666,0.658888666666667}, + {0.489444666666666,0.658888666666667,0.494444666666666,0.662778}, + {0.494444666666666,0.662778,0.498333333333335,0.665555333333333}, + {0.498333333333335,0.665555333333333,0.5,0.666666666666667}, + {0,0,0,0} +}; + +double Icon36[][4] = { + {0.0694446666666645,0.397778,0.0733333333333329,0.395555333333334}, + {0.067222666666666,0.401111333333333,0.0694446666666645,0.397778}, + {0.0649999999999977,0.405,0.067222666666666,0.401111333333333}, + {0.0638893333333309,0.409444666666667,0.0649999999999977,0.405}, + {0.0627779999999992,0.414444666666667,0.0638893333333309,0.409444666666667}, + {0.0622226666666658,0.42,0.0627779999999992,0.414444666666667}, + {0.0622226666666658,0.425555333333334,0.0622226666666658,0.42}, + {0.0622226666666658,0.431111333333333,0.0622226666666658,0.425555333333334}, + {0.0627779999999992,0.436666666666667,0.0622226666666658,0.431111333333333}, + {0.0638893333333309,0.441666666666666,0.0627779999999992,0.436666666666667}, + {0.0649999999999977,0.446111333333333,0.0638893333333309,0.441666666666666}, + {0.067222666666666,0.45,0.0649999999999977,0.446111333333333}, + {0.0694446666666645,0.453333333333333,0.067222666666666,0.45}, + {0.0733333333333329,0.455555333333334,0.0694446666666645,0.453333333333333}, + {0.0783333333333331,0.457222,0.0733333333333329,0.455555333333334}, + {0.0844446666666651,0.458333333333333,0.0783333333333331,0.457222}, + {0.101111333333331,0.457222,0.0922226666666669,0.458333333333333}, + {0.111111333333331,0.455,0.101111333333331,0.457222}, + {0.121666666666665,0.452778,0.111111333333331,0.455}, + {0.132777999999997,0.45,0.121666666666665,0.452778}, + {0.143889333333334,0.447222,0.132777999999997,0.45}, + {0.154444666666668,0.445555333333333,0.143889333333334,0.447222}, + {0.164444666666663,0.444444666666667,0.154444666666668,0.445555333333333}, + {0.181111333333334,0.446666666666667,0.173333333333332,0.444444666666667}, + {0.187222666666666,0.45,0.181111333333334,0.446666666666667}, + {0.192222666666666,0.455555333333334,0.187222666666666,0.45}, + {0.195556000000001,0.461666666666667,0.192222666666666,0.455555333333334}, + {0.198333333333333,0.47,0.195556000000001,0.461666666666667}, + {0.199999999999998,0.479444666666667,0.198333333333333,0.47}, + {0.201666666666663,0.49,0.199999999999998,0.479444666666667}, + {0.203333333333333,0.502778,0.201666666666663,0.49}, + {0.204444666666665,0.516111333333334,0.203333333333333,0.502778}, + {0.205555999999997,0.53,0.204444666666665,0.516111333333334}, + {0.20611133333333,0.545,0.205555999999997,0.53}, + {0.206666666666663,0.559444666666667,0.20611133333333,0.545}, + {0.206666666666663,0.573333333333334,0.206666666666663,0.559444666666667}, + {0.20611133333333,0.586666666666667,0.206666666666663,0.573333333333334}, + {0.204999999999998,0.599444666666667,0.20611133333333,0.586666666666667}, + {0.203333333333333,0.61,0.204999999999998,0.599444666666667}, + {0.200555999999996,0.619444666666666,0.203333333333333,0.61}, + {0.197222666666666,0.627778,0.200555999999996,0.619444666666666}, + {0.192222666666666,0.633888666666667,0.197222666666666,0.627778}, + {0.186111333333334,0.638888666666666,0.192222666666666,0.633888666666667}, + {0.178333333333332,0.642222,0.186111333333334,0.638888666666666}, + {0.16888933333333,0.645,0.178333333333332,0.642222}, + {0.157777999999998,0.646111333333333,0.16888933333333,0.645}, + {0.145555999999999,0.646666666666667,0.157777999999998,0.646111333333333}, + {0.117777999999997,0.646111333333333,0.132222666666664,0.646666666666667}, + {0.103333333333334,0.645,0.117777999999997,0.646111333333333}, + {0.0888893333333319,0.643888666666667,0.103333333333334,0.645}, + {0.0744446666666647,0.642222,0.0888893333333319,0.643888666666667}, + {0.061111333333334,0.641111333333334,0.0744446666666647,0.642222}, + {0.0488893333333304,0.639444666666667,0.061111333333334,0.641111333333334}, + {0.0377779999999982,0.638333333333333,0.0488893333333304,0.639444666666667}, + {0.0283333333333312,0.637222,0.0377779999999982,0.638333333333333}, + {0.0205559999999991,0.635555333333333,0.0283333333333312,0.637222}, + {0.0144446666666672,0.633888666666667,0.0205559999999991,0.635555333333333}, + {0.00944466666666699,0.631666666666667,0.0144446666666672,0.633888666666667}, + {0.00611133333333195,0.628888666666667,0.00944466666666699,0.631666666666667}, + {0.0033333333333303,0.626111333333334,0.00611133333333195,0.628888666666667}, + {0.00166666666666515,0.622222,0.0033333333333303,0.626111333333334}, + {0.000555999999998373,0.618333333333334,0.00166666666666515,0.622222}, + {0,0.613888666666667,0.000555999999998373,0.618333333333334}, + {0,0.608888666666667,0,0.613888666666667}, + {0.000555999999998373,0.604444666666667,0,0.608888666666667}, + {0.00111133333333176,0.599444666666667,0.000555999999998373,0.604444666666667}, + {0.00222266666666352,0.594444666666667,0.00111133333333176,0.599444666666667}, + {0.0033333333333303,0.59,0.00222266666666352,0.594444666666667}, + {0.00500000000000019,0.586111333333333,0.0033333333333303,0.59}, + {0.00666666666666534,0.582222,0.00500000000000019,0.586111333333333}, + {0.00833333333333049,0.579444666666667,0.00666666666666534,0.582222}, + {0.0111113333333321,0.576666666666667,0.00833333333333049,0.579444666666667}, + {0.0144446666666672,0.574444666666666,0.0111113333333321,0.576666666666667}, + {0.0194446666666674,0.572778,0.0144446666666672,0.574444666666666}, + {0.0255559999999993,0.571666666666667,0.0194446666666674,0.572778}, + {0.0333333333333314,0.571111333333333,0.0255559999999993,0.571666666666667}, + {0.0522226666666654,0.572222,0.042222666666665,0.571111333333333}, + {0.0627779999999992,0.573333333333334,0.0522226666666654,0.572222}, + {0.0738893333333313,0.574444666666666,0.0627779999999992,0.573333333333334}, + {0.0849999999999985,0.575555333333333,0.0738893333333313,0.574444666666666}, + {0.0955559999999972,0.576666666666667,0.0849999999999985,0.575555333333333}, + {0.105555999999998,0.577778,0.0955559999999972,0.576666666666667}, + {0.122222666666663,0.577222,0.114444666666666,0.577778}, + {0.12833333333333,0.576111333333333,0.122222666666663,0.577222}, + {0.13333333333333,0.574444666666666,0.12833333333333,0.576111333333333}, + {0.137222666666664,0.572222,0.13333333333333,0.574444666666666}, + {0.139444666666667,0.568888666666667,0.137222666666664,0.572222}, + {0.141666666666666,0.565,0.139444666666667,0.568888666666667}, + {0.142777999999997,0.560555333333333,0.141666666666666,0.565}, + {0.143889333333334,0.555555333333333,0.142777999999997,0.560555333333333}, + {0.144444666666667,0.55,0.143889333333334,0.555555333333333}, + {0.144444666666667,0.544444666666667,0.144444666666667,0.55}, + {0.144444666666667,0.539444666666667,0.144444666666667,0.544444666666667}, + {0.143889333333334,0.533888666666667,0.144444666666667,0.539444666666667}, + {0.142777999999997,0.528888666666666,0.143889333333334,0.533888666666667}, + {0.141666666666666,0.524444666666666,0.142777999999997,0.528888666666666}, + {0.139444666666667,0.520555333333334,0.141666666666666,0.524444666666666}, + {0.137222666666664,0.517222,0.139444666666667,0.520555333333334}, + {0.13333333333333,0.515,0.137222666666664,0.517222}, + {0.12833333333333,0.513333333333333,0.13333333333333,0.515}, + {0.122222666666663,0.512222,0.12833333333333,0.513333333333333}, + {0.105555999999998,0.513333333333333,0.114444666666666,0.512222}, + {0.0955559999999972,0.515555333333333,0.105555999999998,0.513333333333333}, + {0.0849999999999985,0.517778,0.0955559999999972,0.515555333333333}, + {0.0738893333333313,0.520555333333334,0.0849999999999985,0.517778}, + {0.0627779999999992,0.523333333333333,0.0738893333333313,0.520555333333334}, + {0.0522226666666654,0.525,0.0627779999999992,0.523333333333333}, + {0.042222666666665,0.526111333333333,0.0522226666666654,0.525}, + {0.0255559999999993,0.523888666666667,0.0333333333333314,0.526111333333333}, + {0.0194446666666674,0.520555333333334,0.0255559999999993,0.523888666666667}, + {0.0144446666666672,0.515,0.0194446666666674,0.520555333333334}, + {0.0111113333333321,0.508888666666667,0.0144446666666672,0.515}, + {0.00833333333333049,0.500555333333333,0.0111113333333321,0.508888666666667}, + {0.00666666666666534,0.491111333333333,0.00833333333333049,0.500555333333333}, + {0.00500000000000019,0.480555333333333,0.00666666666666534,0.491111333333333}, + {0.0033333333333303,0.467778,0.00500000000000019,0.480555333333333}, + {0.00222266666666352,0.454444666666667,0.0033333333333303,0.467778}, + {0.00111133333333176,0.440555333333334,0.00222266666666352,0.454444666666667}, + {0.000555999999998373,0.426111333333333,0.00111133333333176,0.440555333333334}, + {0,0.411111333333333,0.000555999999998373,0.426111333333333}, + {0,0.397222,0,0.411111333333333}, + {0.000555999999998373,0.383888666666667,0,0.397222}, + {0.00166666666666515,0.371111333333333,0.000555999999998373,0.383888666666667}, + {0.0033333333333303,0.360555333333333,0.00166666666666515,0.371111333333333}, + {0.00611133333333195,0.351111333333333,0.0033333333333303,0.360555333333333}, + {0.00944466666666699,0.342778,0.00611133333333195,0.351111333333333}, + {0.0144446666666672,0.336666666666667,0.00944466666666699,0.342778}, + {0.0205559999999991,0.331666666666666,0.0144446666666672,0.336666666666667}, + {0.0283333333333312,0.328333333333333,0.0205559999999991,0.331666666666666}, + {0.0377779999999982,0.325555333333333,0.0283333333333312,0.328333333333333}, + {0.0488893333333304,0.324444666666666,0.0377779999999982,0.325555333333333}, + {0.061111333333334,0.323888666666667,0.0488893333333304,0.324444666666666}, + {0.0888893333333319,0.324444666666666,0.0744446666666647,0.323888666666667}, + {0.103333333333334,0.325555333333333,0.0888893333333319,0.324444666666666}, + {0.117777999999997,0.326666666666667,0.103333333333334,0.325555333333333}, + {0.132222666666664,0.328333333333333,0.117777999999997,0.326666666666667}, + {0.145555999999999,0.329444666666667,0.132222666666664,0.328333333333333}, + {0.157777999999998,0.331111333333334,0.145555999999999,0.329444666666667}, + {0.16888933333333,0.332222,0.157777999999998,0.331111333333334}, + {0.178333333333332,0.333333333333333,0.16888933333333,0.332222}, + {0.186111333333334,0.335,0.178333333333332,0.333333333333333}, + {0.192222666666666,0.336666666666667,0.186111333333334,0.335}, + {0.197222666666666,0.338888666666667,0.192222666666666,0.336666666666667}, + {0.200555999999996,0.341111333333333,0.197222666666666,0.338888666666667}, + {0.203333333333333,0.344444666666667,0.200555999999996,0.341111333333333}, + {0.204999999999998,0.348333333333333,0.203333333333333,0.344444666666667}, + {0.20611133333333,0.352222,0.204999999999998,0.348333333333333}, + {0.206666666666663,0.356666666666667,0.20611133333333,0.352222}, + {0.206666666666663,0.361111333333334,0.206666666666663,0.356666666666667}, + {0.20611133333333,0.366111333333333,0.206666666666663,0.361111333333334}, + {0.205555999999997,0.371111333333333,0.20611133333333,0.366111333333333}, + {0.204444666666665,0.375555333333333,0.205555999999997,0.371111333333333}, + {0.203333333333333,0.38,0.204444666666665,0.375555333333333}, + {0.201666666666663,0.383888666666667,0.203333333333333,0.38}, + {0.199999999999998,0.387778,0.201666666666663,0.383888666666667}, + {0.198333333333333,0.391111333333334,0.199999999999998,0.387778}, + {0.195556000000001,0.393333333333333,0.198333333333333,0.391111333333334}, + {0.192222666666666,0.395555333333334,0.195556000000001,0.393333333333333}, + {0.187222666666666,0.397222,0.192222666666666,0.395555333333334}, + {0.181111333333334,0.398333333333333,0.187222666666666,0.397222}, + {0.173333333333332,0.398888666666667,0.181111333333334,0.398333333333333}, + {0.154444666666668,0.397778,0.164444666666663,0.398888666666667}, + {0.143889333333334,0.396666666666667,0.154444666666668,0.397778}, + {0.132777999999997,0.395555333333334,0.143889333333334,0.396666666666667}, + {0.121666666666665,0.394444666666667,0.132777999999997,0.395555333333334}, + {0.111111333333331,0.393333333333333,0.121666666666665,0.394444666666667}, + {0.101111333333331,0.392222,0.111111333333331,0.393333333333333}, + {0.0844446666666651,0.392778,0.0922226666666669,0.392222}, + {0.0783333333333331,0.393888666666667,0.0844446666666651,0.392778}, + {0.0733333333333329,0.395555333333334,0.0783333333333331,0.393888666666667}, + {0.317777999999999,0.334444666666667,0.311666666666667,0.336666666666667}, + {0.323333333333333,0.332778,0.317777999999999,0.334444666666667}, + {0.329444666666665,0.331666666666666,0.323333333333333,0.332778}, + {0.335555999999997,0.331111333333334,0.329444666666665,0.331666666666666}, + {0.353333333333334,0.331666666666666,0.347222666666667,0.331111333333334}, + {0.359444666666666,0.332778,0.353333333333334,0.331666666666666}, + {0.365,0.334444666666667,0.359444666666666,0.332778}, + {0.371111333333332,0.336666666666667,0.365,0.334444666666667}, + {0.375555999999998,0.338888666666667,0.371111333333332,0.336666666666667}, + {0.38,0.341666666666667,0.375555999999998,0.338888666666667}, + {0.384444666666667,0.344444666666667,0.38,0.341666666666667}, + {0.388889333333334,0.347222,0.384444666666667,0.344444666666667}, + {0.393889333333334,0.349444666666667,0.388889333333334,0.347222}, + {0.398889333333334,0.352222,0.393889333333334,0.349444666666667}, + {0.403889333333334,0.355,0.398889333333334,0.352222}, + {0.408333333333331,0.357778,0.403889333333334,0.355}, + {0.413333333333332,0.361666666666667,0.408333333333331,0.357778}, + {0.417777999999998,0.366111333333333,0.413333333333332,0.361666666666667}, + {0.421666666666667,0.371111333333333,0.417777999999998,0.366111333333333}, + {0.424999999999997,0.377778,0.421666666666667,0.371111333333333}, + {0.428333333333332,0.385555333333333,0.424999999999997,0.377778}, + {0.430556,0.395555333333334,0.428333333333332,0.385555333333333}, + {0.431666666666667,0.403333333333334,0.430556,0.395555333333334}, + {0.432777999999999,0.412222,0.431666666666667,0.403333333333334}, + {0.433889333333331,0.422222,0.432777999999999,0.412222}, + {0.434444666666664,0.433333333333334,0.433889333333331,0.422222}, + {0.434999999999997,0.445555333333333,0.434444666666664,0.433333333333334}, + {0.435556000000001,0.458888666666667,0.434999999999997,0.445555333333333}, + {0.435556000000001,0.472778,0.435556000000001,0.458888666666667}, + {0.436111333333334,0.487222,0.435556000000001,0.472778}, + {0.436111333333334,0.502222,0.436111333333334,0.487222}, + {0.436111333333334,0.517222,0.436111333333334,0.502222}, + {0.436111333333334,0.532778,0.436111333333334,0.517222}, + {0.436111333333334,0.547222,0.436111333333334,0.532778}, + {0.435556000000001,0.561666666666667,0.436111333333334,0.547222}, + {0.435556000000001,0.575555333333333,0.435556000000001,0.561666666666667}, + {0.434999999999997,0.588333333333334,0.435556000000001,0.575555333333333}, + {0.434444666666664,0.6,0.434999999999997,0.588333333333334}, + {0.433889333333331,0.610555333333333,0.434444666666664,0.6}, + {0.432777999999999,0.619444666666666,0.433889333333331,0.610555333333333}, + {0.431666666666667,0.627222,0.432777999999999,0.619444666666666}, + {0.430556,0.633888666666667,0.431666666666667,0.627222}, + {0.428889333333331,0.64,0.430556,0.633888666666667}, + {0.426666666666667,0.644444666666667,0.428889333333331,0.64}, + {0.42388933333333,0.647778,0.426666666666667,0.644444666666667}, + {0.420556,0.65,0.42388933333333,0.647778}, + {0.417222666666665,0.651666666666667,0.420556,0.65}, + {0.413333333333332,0.652222,0.417222666666665,0.651666666666667}, + {0.405000000000001,0.651666666666667,0.409444666666663,0.652222}, + {0.400555999999999,0.650555333333333,0.405000000000001,0.651666666666667}, + {0.396666666666666,0.649444666666666,0.400555999999999,0.650555333333333}, + {0.392222666666664,0.648333333333333,0.396666666666666,0.649444666666666}, + {0.388333333333331,0.646666666666667,0.392222666666664,0.648333333333333}, + {0.384444666666667,0.645,0.388333333333331,0.646666666666667}, + {0.381111333333332,0.643333333333333,0.384444666666667,0.645}, + {0.377777999999997,0.641666666666667,0.381111333333332,0.643333333333333}, + {0.375,0.639444666666667,0.377777999999997,0.641666666666667}, + {0.372777999999997,0.636666666666667,0.375,0.639444666666667}, + {0.371111333333332,0.633888666666667,0.372777999999997,0.636666666666667}, + {0.369444666666666,0.628888666666667,0.371111333333332,0.633888666666667}, + {0.36833333333333,0.622778,0.369444666666666,0.628888666666667}, + {0.367777999999996,0.615,0.36833333333333,0.622778}, + {0.367777999999996,0.606111333333333,0.367777999999996,0.615}, + {0.368889333333333,0.596111333333334,0.367777999999996,0.606111333333333}, + {0.37,0.585555333333333,0.368889333333333,0.596111333333334}, + {0.371111333333332,0.574444666666666,0.37,0.585555333333333}, + {0.372222666666663,0.563333333333333,0.371111333333332,0.574444666666666}, + {0.37333333333333,0.552778,0.372222666666663,0.563333333333333}, + {0.374444666666667,0.542778,0.37333333333333,0.552778}, + {0.374444666666667,0.533888666666667,0.374444666666667,0.542778}, + {0.373889333333333,0.526111333333333,0.374444666666667,0.533888666666667}, + {0.372777999999997,0.52,0.373889333333333,0.526111333333333}, + {0.371111333333332,0.515,0.372777999999997,0.52}, + {0.368889333333333,0.511111333333333,0.371111333333332,0.515}, + {0.365555999999998,0.508888666666667,0.368889333333333,0.511111333333333}, + {0.361666666666665,0.506666666666667,0.365555999999998,0.508888666666667}, + {0.357222666666667,0.505555333333334,0.361666666666665,0.506666666666667}, + {0.352222666666667,0.504444666666667,0.357222666666667,0.505555333333334}, + {0.346666666666664,0.503888666666667,0.352222666666667,0.504444666666667}, + {0.330555999999997,0.504444666666667,0.33611133333333,0.503888666666667}, + {0.325555999999996,0.505555333333334,0.330555999999997,0.504444666666667}, + {0.321111333333334,0.506666666666667,0.325555999999996,0.505555333333334}, + {0.317222666666666,0.508888666666667,0.321111333333334,0.506666666666667}, + {0.313889333333331,0.511111333333333,0.317222666666666,0.508888666666667}, + {0.311666666666667,0.515,0.313889333333331,0.511111333333333}, + {0.309999999999997,0.52,0.311666666666667,0.515}, + {0.308889333333331,0.526111333333333,0.309999999999997,0.52}, + {0.308333333333332,0.533888666666667,0.308889333333331,0.526111333333333}, + {0.308333333333332,0.542778,0.308333333333332,0.533888666666667}, + {0.309444666666664,0.552778,0.308333333333332,0.542778}, + {0.310556000000001,0.563333333333333,0.309444666666664,0.552778}, + {0.311666666666667,0.574444666666666,0.310556000000001,0.563333333333333}, + {0.312777999999999,0.585555333333333,0.311666666666667,0.574444666666666}, + {0.313889333333331,0.596111333333334,0.312777999999999,0.585555333333333}, + {0.314999999999998,0.606111333333333,0.313889333333331,0.596111333333334}, + {0.314999999999998,0.615,0.314999999999998,0.606111333333333}, + {0.314444666666664,0.622778,0.314999999999998,0.615}, + {0.313333333333333,0.628888666666667,0.314444666666664,0.622778}, + {0.311666666666667,0.633888666666667,0.313333333333333,0.628888666666667}, + {0.309999999999997,0.636666666666667,0.311666666666667,0.633888666666667}, + {0.307777999999999,0.639444666666667,0.309999999999997,0.636666666666667}, + {0.304999999999997,0.641666666666667,0.307777999999999,0.639444666666667}, + {0.301666666666667,0.643333333333333,0.304999999999997,0.641666666666667}, + {0.298333333333332,0.645,0.301666666666667,0.643333333333333}, + {0.294444666666664,0.646666666666667,0.298333333333332,0.645}, + {0.290556,0.648333333333333,0.294444666666664,0.646666666666667}, + {0.286111333333333,0.649444666666666,0.290556,0.648333333333333}, + {0.281666666666666,0.650555333333333,0.286111333333333,0.649444666666666}, + {0.277777999999998,0.651666666666667,0.281666666666666,0.650555333333333}, + {0.273333333333331,0.652222,0.277777999999998,0.651666666666667}, + {0.265555999999999,0.651666666666667,0.269444666666667,0.652222}, + {0.262222666666664,0.65,0.265555999999999,0.651666666666667}, + {0.258889333333334,0.647778,0.262222666666664,0.65}, + {0.256111333333332,0.644444666666667,0.258889333333334,0.647778}, + {0.253889333333333,0.64,0.256111333333332,0.644444666666667}, + {0.252222666666663,0.633888666666667,0.253889333333333,0.64}, + {0.251111333333332,0.627222,0.252222666666663,0.633888666666667}, + {0.25,0.619444666666666,0.251111333333332,0.627222}, + {0.248889333333333,0.610555333333333,0.25,0.619444666666666}, + {0.24833333333333,0.6,0.248889333333333,0.610555333333333}, + {0.247777999999997,0.588333333333334,0.24833333333333,0.6}, + {0.247222666666663,0.575555333333333,0.247777999999997,0.588333333333334}, + {0.247222666666663,0.561666666666667,0.247222666666663,0.575555333333333}, + {0.246666666666665,0.547222,0.247222666666663,0.561666666666667}, + {0.246666666666665,0.532778,0.246666666666665,0.547222}, + {0.246666666666665,0.517222,0.246666666666665,0.532778}, + {0.246666666666665,0.502222,0.246666666666665,0.517222}, + {0.246666666666665,0.487222,0.246666666666665,0.502222}, + {0.247222666666663,0.472778,0.246666666666665,0.487222}, + {0.247222666666663,0.458888666666667,0.247222666666663,0.472778}, + {0.247777999999997,0.445555333333333,0.247222666666663,0.458888666666667}, + {0.24833333333333,0.433333333333334,0.247777999999997,0.445555333333333}, + {0.248889333333333,0.422222,0.24833333333333,0.433333333333334}, + {0.25,0.412222,0.248889333333333,0.422222}, + {0.251111333333332,0.403333333333334,0.25,0.412222}, + {0.252222666666663,0.395555333333334,0.251111333333332,0.403333333333334}, + {0.254444666666667,0.385555333333333,0.252222666666663,0.395555333333334}, + {0.257777999999997,0.377778,0.254444666666667,0.385555333333333}, + {0.261111333333332,0.371111333333333,0.257777999999997,0.377778}, + {0.265000000000001,0.366111333333333,0.261111333333332,0.371111333333333}, + {0.269444666666667,0.361666666666667,0.265000000000001,0.366111333333333}, + {0.274444666666668,0.357778,0.269444666666667,0.361666666666667}, + {0.278889333333334,0.355,0.274444666666668,0.357778}, + {0.28388933333333,0.352222,0.278889333333334,0.355}, + {0.28888933333333,0.349444666666667,0.28388933333333,0.352222}, + {0.29388933333333,0.347222,0.28888933333333,0.349444666666667}, + {0.298333333333332,0.344444666666667,0.29388933333333,0.347222}, + {0.302777999999999,0.341666666666667,0.298333333333332,0.344444666666667}, + {0.307222666666666,0.338888666666667,0.302777999999999,0.341666666666667}, + {0.311666666666667,0.336666666666667,0.307222666666666,0.338888666666667}, + {0.371111333333332,0.455555333333334,0.367222666666663,0.457778}, + {0.367222666666663,0.457778,0.362778000000001,0.459444666666667}, + {0.362778000000001,0.459444666666667,0.356111333333331,0.460555333333333}, + {0.356111333333331,0.460555333333333,0.348889333333332,0.461111333333333}, + {0.333889333333332,0.461111333333333,0.326666666666663,0.460555333333333}, + {0.326666666666663,0.460555333333333,0.319999999999998,0.459444666666667}, + {0.319999999999998,0.459444666666667,0.315556000000001,0.457778}, + {0.315556000000001,0.457778,0.311666666666667,0.455555333333334}, + {0.311666666666667,0.455555333333334,0.309444666666664,0.451666666666667}, + {0.309444666666664,0.451666666666667,0.307777999999999,0.446666666666667}, + {0.307777999999999,0.446666666666667,0.306666666666667,0.440555333333334}, + {0.306666666666667,0.440555333333334,0.306111333333334,0.433333333333334}, + {0.306111333333334,0.433333333333334,0.306111333333334,0.425555333333334}, + {0.306111333333334,0.425555333333334,0.306111333333334,0.417778}, + {0.306111333333334,0.417778,0.306666666666667,0.410555333333334}, + {0.306666666666667,0.410555333333334,0.307777999999999,0.404444666666667}, + {0.307777999999999,0.404444666666667,0.309444666666664,0.399444666666666}, + {0.309444666666664,0.399444666666666,0.311666666666667,0.395555333333334}, + {0.311666666666667,0.395555333333334,0.315556000000001,0.393333333333333}, + {0.315556000000001,0.393333333333333,0.319999999999998,0.391666666666667}, + {0.319999999999998,0.391666666666667,0.326666666666663,0.390555333333333}, + {0.326666666666663,0.390555333333333,0.333889333333332,0.39}, + {0.348889333333332,0.39,0.356111333333331,0.390555333333333}, + {0.356111333333331,0.390555333333333,0.362778000000001,0.391666666666667}, + {0.362778000000001,0.391666666666667,0.367222666666663,0.393333333333333}, + {0.367222666666663,0.393333333333333,0.371111333333332,0.395555333333334}, + {0.371111333333332,0.395555333333334,0.37333333333333,0.399444666666666}, + {0.37333333333333,0.399444666666666,0.375,0.404444666666667}, + {0.375,0.404444666666667,0.376111333333332,0.410555333333334}, + {0.376111333333332,0.410555333333334,0.376666666666665,0.417778}, + {0.376666666666665,0.417778,0.376666666666665,0.425555333333334}, + {0.376666666666665,0.425555333333334,0.376666666666665,0.433333333333334}, + {0.376666666666665,0.433333333333334,0.376111333333332,0.440555333333334}, + {0.376111333333332,0.440555333333334,0.375,0.446666666666667}, + {0.375,0.446666666666667,0.37333333333333,0.451666666666667}, + {0.37333333333333,0.451666666666667,0.371111333333332,0.455555333333334}, + {0.549444666666664,0.633888666666667,0.553889333333331,0.637778}, + {0.553889333333331,0.637778,0.557777999999999,0.64}, + {0.557777999999999,0.64,0.562222666666666,0.642222}, + {0.562222666666666,0.642222,0.566666666666668,0.643333333333333}, + {0.566666666666668,0.643333333333333,0.570556000000001,0.644444666666667}, + {0.570556000000001,0.644444666666667,0.574999999999998,0.645}, + {0.583333333333333,0.645,0.587778,0.644444666666667}, + {0.587778,0.644444666666667,0.591666666666664,0.643333333333333}, + {0.591666666666664,0.643333333333333,0.596111333333331,0.642222}, + {0.596111333333331,0.642222,0.600555999999997,0.64}, + {0.600555999999997,0.64,0.604444666666666,0.637778}, + {0.604444666666666,0.637778,0.608889333333333,0.633888666666667}, + {0.608889333333333,0.633888666666667,0.613333333333334,0.628888666666667}, + {0.613333333333334,0.628888666666667,0.617777999999996,0.623333333333333}, + {0.617777999999996,0.623333333333333,0.622222666666663,0.616111333333333}, + {0.622222666666663,0.616111333333333,0.626666666666665,0.608888666666667}, + {0.626666666666665,0.608888666666667,0.631666666666665,0.600555333333334}, + {0.631666666666665,0.600555333333334,0.636666666666665,0.591666666666667}, + {0.636666666666665,0.591666666666667,0.641666666666666,0.582778}, + {0.641666666666666,0.582778,0.646111333333332,0.573333333333334}, + {0.646111333333332,0.573333333333334,0.651111333333333,0.563888666666667}, + {0.651111333333333,0.563888666666667,0.655555999999999,0.554444666666667}, + {0.655555999999999,0.554444666666667,0.659444666666663,0.545}, + {0.659444666666663,0.545,0.662777999999998,0.535555333333334}, + {0.662777999999998,0.535555333333334,0.666111333333333,0.525555333333333}, + {0.666111333333333,0.525555333333333,0.668333333333332,0.515}, + {0.668333333333332,0.515,0.669999999999997,0.505555333333334}, + {0.669999999999997,0.505555333333334,0.671111333333333,0.495}, + {0.671111333333333,0.495,0.672222666666665,0.484444666666667}, + {0.672222666666665,0.484444666666667,0.672777999999999,0.472778}, + {0.672777999999999,0.472778,0.673333333333332,0.46}, + {0.673333333333332,0.46,0.67388933333333,0.447222}, + {0.67388933333333,0.447222,0.67388933333333,0.433888666666667}, + {0.67388933333333,0.433888666666667,0.67388933333333,0.42}, + {0.67388933333333,0.42,0.67388933333333,0.406666666666667}, + {0.67388933333333,0.406666666666667,0.67388933333333,0.393888666666667}, + {0.67388933333333,0.393888666666667,0.673333333333332,0.381666666666667}, + {0.673333333333332,0.381666666666667,0.672777999999999,0.37}, + {0.672777999999999,0.37,0.672222666666665,0.36}, + {0.672222666666665,0.36,0.671111333333333,0.350555333333334}, + {0.671111333333333,0.350555333333334,0.669999999999997,0.342778}, + {0.669999999999997,0.342778,0.668333333333332,0.336666666666667}, + {0.668333333333332,0.336666666666667,0.666666666666667,0.332222}, + {0.666666666666667,0.332222,0.664444666666663,0.328888666666667}, + {0.664444666666663,0.328888666666667,0.661666666666666,0.326111333333333}, + {0.661666666666666,0.326111333333333,0.658333333333331,0.323888666666667}, + {0.658333333333331,0.323888666666667,0.655000000000001,0.322222}, + {0.655000000000001,0.322222,0.651111333333333,0.321111333333333}, + {0.651111333333333,0.321111333333333,0.647222666666664,0.320555333333333}, + {0.647222666666664,0.320555333333333,0.642777999999997,0.32}, + {0.634444666666667,0.32,0.63,0.320555333333333}, + {0.63,0.320555333333333,0.626111333333332,0.321111333333333}, + {0.626111333333332,0.321111333333333,0.622222666666663,0.322222}, + {0.622222666666663,0.322222,0.618889333333333,0.323888666666667}, + {0.618889333333333,0.323888666666667,0.615555999999998,0.326111333333333}, + {0.615555999999998,0.326111333333333,0.612778000000001,0.328888666666667}, + {0.612778000000001,0.328888666666667,0.610555999999998,0.332222}, + {0.610555999999998,0.332222,0.608889333333333,0.336666666666667}, + {0.608889333333333,0.336666666666667,0.607222666666667,0.342778}, + {0.607222666666667,0.342778,0.606111333333331,0.351111333333333}, + {0.606111333333331,0.351111333333333,0.605555999999998,0.360555333333333}, + {0.605555999999998,0.360555333333333,0.605555999999998,0.371111333333333}, + {0.605555999999998,0.371111333333333,0.606111333333331,0.383888666666667}, + {0.606111333333331,0.383888666666667,0.606666666666664,0.397222}, + {0.606666666666664,0.397222,0.607778000000001,0.411111333333333}, + {0.607778000000001,0.411111333333333,0.608889333333333,0.426111333333333}, + {0.608889333333333,0.426111333333333,0.609999999999999,0.440555333333334}, + {0.609999999999999,0.440555333333334,0.611111333333331,0.454444666666667}, + {0.611111333333331,0.454444666666667,0.611666666666665,0.467778}, + {0.611666666666665,0.467778,0.612222666666668,0.480555333333333}, + {0.612222666666668,0.480555333333333,0.612222666666668,0.491111333333333}, + {0.612222666666668,0.491111333333333,0.611666666666665,0.500555333333333}, + {0.611666666666665,0.500555333333333,0.610555999999998,0.508888666666667}, + {0.610555999999998,0.508888666666667,0.608889333333333,0.515}, + {0.608889333333333,0.515,0.607222666666667,0.519444666666667}, + {0.607222666666667,0.519444666666667,0.604999999999999,0.522778}, + {0.604999999999999,0.522778,0.602222666666667,0.525555333333333}, + {0.602222666666667,0.525555333333333,0.598889333333332,0.527778}, + {0.598889333333332,0.527778,0.595555999999997,0.529444666666667}, + {0.595555999999997,0.529444666666667,0.591666666666664,0.530555333333333}, + {0.591666666666664,0.530555333333333,0.587778,0.531111333333333}, + {0.587778,0.531111333333333,0.583333333333333,0.531666666666667}, + {0.574999999999998,0.531666666666667,0.570556000000001,0.531111333333333}, + {0.570556000000001,0.531111333333333,0.566666666666668,0.530555333333333}, + {0.566666666666668,0.530555333333333,0.562777999999999,0.529444666666667}, + {0.562777999999999,0.529444666666667,0.559444666666664,0.527778}, + {0.559444666666664,0.527778,0.556111333333334,0.525555333333333}, + {0.556111333333334,0.525555333333333,0.553333333333332,0.522778}, + {0.553333333333332,0.522778,0.551111333333334,0.519444666666667}, + {0.551111333333334,0.519444666666667,0.549444666666664,0.515}, + {0.549444666666664,0.515,0.547777999999999,0.508888666666667}, + {0.547777999999999,0.508888666666667,0.546666666666667,0.500555333333333}, + {0.546666666666667,0.500555333333333,0.546111333333333,0.491111333333333}, + {0.546111333333333,0.491111333333333,0.546111333333333,0.480555333333333}, + {0.546111333333333,0.480555333333333,0.546666666666667,0.467778}, + {0.546666666666667,0.467778,0.547222666666665,0.454444666666667}, + {0.547222666666665,0.454444666666667,0.548333333333332,0.440555333333334}, + {0.548333333333332,0.440555333333334,0.549444666666664,0.426111333333333}, + {0.549444666666664,0.426111333333333,0.550556,0.411111333333333}, + {0.550556,0.411111333333333,0.551666666666667,0.397222}, + {0.551666666666667,0.397222,0.552222666666665,0.383888666666667}, + {0.552222666666665,0.383888666666667,0.552777999999999,0.371111333333333}, + {0.552777999999999,0.371111333333333,0.552777999999999,0.360555333333333}, + {0.552777999999999,0.360555333333333,0.552222666666665,0.351111333333333}, + {0.552222666666665,0.351111333333333,0.551111333333334,0.342778}, + {0.551111333333334,0.342778,0.549444666666664,0.336666666666667}, + {0.549444666666664,0.336666666666667,0.547777999999999,0.332222}, + {0.547777999999999,0.332222,0.545556,0.328888666666667}, + {0.545556,0.328888666666667,0.542777999999998,0.326111333333333}, + {0.542777999999998,0.326111333333333,0.539444666666663,0.323888666666667}, + {0.539444666666663,0.323888666666667,0.536111333333333,0.322222}, + {0.536111333333333,0.322222,0.532222666666665,0.321111333333333}, + {0.532222666666665,0.321111333333333,0.528333333333331,0.320555333333333}, + {0.528333333333331,0.320555333333333,0.523889333333334,0.32}, + {0.515555999999999,0.32,0.511111333333332,0.320555333333333}, + {0.511111333333332,0.320555333333333,0.507222666666664,0.321111333333333}, + {0.507222666666664,0.321111333333333,0.50333333333333,0.322222}, + {0.50333333333333,0.322222,0.5,0.323888666666667}, + {0.5,0.323888666666667,0.496666666666665,0.326111333333333}, + {0.496666666666665,0.326111333333333,0.493889333333333,0.328888666666667}, + {0.493889333333333,0.328888666666667,0.491666666666665,0.332222}, + {0.491666666666665,0.332222,0.49,0.336666666666667}, + {0.49,0.336666666666667,0.488333333333334,0.342778}, + {0.488333333333334,0.342778,0.487222666666668,0.350555333333334}, + {0.487222666666668,0.350555333333334,0.486111333333331,0.36}, + {0.486111333333331,0.36,0.485555999999998,0.37}, + {0.485555999999998,0.37,0.484999999999999,0.381666666666667}, + {0.484999999999999,0.381666666666667,0.484444666666666,0.393888666666667}, + {0.484444666666666,0.393888666666667,0.484444666666666,0.406666666666667}, + {0.484444666666666,0.406666666666667,0.484444666666666,0.42}, + {0.484444666666666,0.42,0.484444666666666,0.433888666666667}, + {0.484444666666666,0.433888666666667,0.484444666666666,0.447222}, + {0.484444666666666,0.447222,0.484999999999999,0.46}, + {0.484999999999999,0.46,0.485555999999998,0.472778}, + {0.485555999999998,0.472778,0.486111333333331,0.484444666666667}, + {0.486111333333331,0.484444666666667,0.487222666666668,0.495}, + {0.487222666666668,0.495,0.488333333333334,0.505555333333334}, + {0.488333333333334,0.505555333333334,0.49,0.515}, + {0.49,0.515,0.492222666666663,0.525555333333333}, + {0.492222666666663,0.525555333333333,0.495555999999998,0.535555333333334}, + {0.495555999999998,0.535555333333334,0.498889333333333,0.545}, + {0.498889333333333,0.545,0.502777999999997,0.554444666666667}, + {0.502777999999997,0.554444666666667,0.507222666666664,0.563888666666667}, + {0.507222666666664,0.563888666666667,0.512222666666664,0.573333333333334}, + {0.512222666666664,0.573333333333334,0.516666666666666,0.582778}, + {0.516666666666666,0.582778,0.521666666666666,0.591666666666667}, + {0.521666666666666,0.591666666666667,0.526666666666666,0.600555333333334}, + {0.526666666666666,0.600555333333334,0.531666666666666,0.608888666666667}, + {0.531666666666666,0.608888666666667,0.536111333333333,0.616111333333333}, + {0.536111333333333,0.616111333333333,0.540556,0.623333333333333}, + {0.540556,0.623333333333333,0.544999999999997,0.628888666666667}, + {0.544999999999997,0.628888666666667,0.549444666666664,0.633888666666667}, + {0.728333333333334,0.633888666666667,0.734444666666666,0.642222}, + {0.734444666666666,0.642222,0.742222666666663,0.647778}, + {0.742222666666663,0.647778,0.751666666666665,0.651666666666667}, + {0.751666666666665,0.651666666666667,0.762777999999997,0.653888666666666}, + {0.762777999999997,0.653888666666666,0.775000000000001,0.655}, + {0.775000000000001,0.655,0.788333333333332,0.654444666666667}, + {0.788333333333332,0.654444666666667,0.802777999999999,0.652778}, + {0.802777999999999,0.652778,0.817222666666666,0.650555333333333}, + {0.817222666666666,0.650555333333333,0.831666666666663,0.648333333333333}, + {0.831666666666663,0.648333333333333,0.846111333333331,0.645555333333334}, + {0.846111333333331,0.645555333333334,0.859444666666666,0.643333333333333}, + {0.859444666666666,0.643333333333333,0.871666666666665,0.641111333333334}, + {0.871666666666665,0.641111333333334,0.882777999999997,0.638888666666666}, + {0.882777999999997,0.638888666666666,0.892222666666664,0.637222}, + {0.892222666666664,0.637222,0.900000000000001,0.635555333333333}, + {0.900000000000001,0.635555333333333,0.906111333333333,0.633888666666667}, + {0.906111333333333,0.633888666666667,0.911111333333333,0.631666666666667}, + {0.911111333333333,0.631666666666667,0.914444666666663,0.628888666666667}, + {0.914444666666663,0.628888666666667,0.917222666666665,0.626111333333334}, + {0.917222666666665,0.626111333333334,0.91888933333333,0.622222}, + {0.91888933333333,0.622222,0.919999999999997,0.618333333333334}, + {0.919999999999997,0.618333333333334,0.920556,0.613888666666667}, + {0.920556,0.613888666666667,0.920556,0.608888666666667}, + {0.920556,0.608888666666667,0.919999999999997,0.604444666666667}, + {0.919999999999997,0.604444666666667,0.919444666666664,0.599444666666667}, + {0.919444666666664,0.599444666666667,0.918333333333332,0.594444666666667}, + {0.918333333333332,0.594444666666667,0.917222666666665,0.59}, + {0.917222666666665,0.59,0.915556,0.586111333333333}, + {0.915556,0.586111333333333,0.91388933333333,0.582222}, + {0.91388933333333,0.582222,0.912222666666665,0.579444666666667}, + {0.912222666666665,0.579444666666667,0.909444666666663,0.576666666666667}, + {0.909444666666663,0.576666666666667,0.906111333333333,0.574444666666666}, + {0.906111333333333,0.574444666666666,0.901111333333333,0.572778}, + {0.901111333333333,0.572778,0.895000000000001,0.571666666666667}, + {0.895000000000001,0.571666666666667,0.887222666666664,0.571111333333333}, + {0.87833333333333,0.571111333333333,0.86833333333333,0.572222}, + {0.86833333333333,0.572222,0.857778000000001,0.573333333333334}, + {0.857778000000001,0.573333333333334,0.846666666666664,0.574444666666666}, + {0.846666666666664,0.574444666666666,0.835555999999997,0.575555333333333}, + {0.835555999999997,0.575555333333333,0.824999999999998,0.576666666666667}, + {0.824999999999998,0.576666666666667,0.814999999999998,0.577778}, + {0.806111333333334,0.577778,0.798333333333332,0.577222}, + {0.798333333333332,0.577222,0.792222666666665,0.576111333333333}, + {0.792222666666665,0.576111333333333,0.787222666666665,0.574444666666666}, + {0.787222666666665,0.574444666666666,0.783333333333331,0.571666666666667}, + {0.783333333333331,0.571666666666667,0.780555999999999,0.567778}, + {0.780555999999999,0.567778,0.778889333333334,0.562778}, + {0.778889333333334,0.562778,0.778333333333331,0.557222}, + {0.778333333333331,0.557222,0.778333333333331,0.551111333333333}, + {0.778333333333331,0.551111333333333,0.778889333333334,0.544444666666667}, + {0.778889333333334,0.544444666666667,0.780000000000001,0.538333333333333}, + {0.780000000000001,0.538333333333333,0.780555999999999,0.532222}, + {0.780555999999999,0.532222,0.782222666666665,0.526666666666667}, + {0.782222666666665,0.526666666666667,0.783333333333331,0.521666666666667}, + {0.783333333333331,0.521666666666667,0.784999999999997,0.517778}, + {0.784999999999997,0.517778,0.787222666666665,0.515}, + {0.787222666666665,0.515,0.791111333333333,0.512778}, + {0.791111333333333,0.512778,0.796111333333333,0.511666666666667}, + {0.796111333333333,0.511666666666667,0.802222666666665,0.512222}, + {0.802222666666665,0.512222,0.809444666666664,0.513333333333333}, + {0.809444666666664,0.513333333333333,0.817222666666666,0.515}, + {0.817222666666666,0.515,0.824999999999998,0.516666666666667}, + {0.824999999999998,0.516666666666667,0.832222666666667,0.517778}, + {0.832222666666667,0.517778,0.838333333333333,0.518333333333333}, + {0.838333333333333,0.518333333333333,0.843333333333334,0.517222}, + {0.843333333333334,0.517222,0.847222666666667,0.515}, + {0.847222666666667,0.515,0.849444666666666,0.511111333333333}, + {0.849444666666666,0.511111333333333,0.851111333333331,0.506666666666667}, + {0.851111333333331,0.506666666666667,0.852222666666667,0.5}, + {0.852222666666667,0.5,0.852778000000001,0.492778}, + {0.852778000000001,0.492778,0.852778000000001,0.485}, + {0.852778000000001,0.485,0.852778000000001,0.477778}, + {0.852778000000001,0.477778,0.852222666666667,0.470555333333333}, + {0.852222666666667,0.470555333333333,0.851111333333331,0.463888666666667}, + {0.851111333333331,0.463888666666667,0.849444666666666,0.459444666666667}, + {0.849444666666666,0.459444666666667,0.847222666666667,0.455555333333334}, + {0.847222666666667,0.455555333333334,0.843333333333334,0.453333333333333}, + {0.843333333333334,0.453333333333333,0.838333333333333,0.452222}, + {0.838333333333333,0.452222,0.832222666666667,0.452778}, + {0.832222666666667,0.452778,0.824999999999998,0.453888666666667}, + {0.824999999999998,0.453888666666667,0.817222666666666,0.455555333333334}, + {0.817222666666666,0.455555333333334,0.809444666666664,0.457222}, + {0.809444666666664,0.457222,0.802222666666665,0.458888666666667}, + {0.796111333333333,0.458888666666667,0.791111333333333,0.457778}, + {0.791111333333333,0.457778,0.787222666666665,0.455555333333334}, + {0.787222666666665,0.455555333333334,0.784999999999997,0.452778}, + {0.784999999999997,0.452778,0.783333333333331,0.448888666666667}, + {0.783333333333331,0.448888666666667,0.782222666666665,0.443888666666667}, + {0.782222666666665,0.443888666666667,0.780555999999999,0.438333333333333}, + {0.780555999999999,0.438333333333333,0.780000000000001,0.432222}, + {0.780000000000001,0.432222,0.778889333333334,0.425555333333334}, + {0.778889333333334,0.425555333333334,0.778333333333331,0.418888666666666}, + {0.778333333333331,0.418888666666666,0.778333333333331,0.412778}, + {0.778333333333331,0.412778,0.778889333333334,0.407222}, + {0.778889333333334,0.407222,0.780555999999999,0.402222}, + {0.780555999999999,0.402222,0.783333333333331,0.398333333333333}, + {0.783333333333331,0.398333333333333,0.787222666666665,0.395555333333334}, + {0.787222666666665,0.395555333333334,0.792222666666665,0.393888666666667}, + {0.792222666666665,0.393888666666667,0.798333333333332,0.392778}, + {0.798333333333332,0.392778,0.806111333333334,0.392222}, + {0.814999999999998,0.392222,0.824999999999998,0.393333333333333}, + {0.824999999999998,0.393333333333333,0.835555999999997,0.394444666666667}, + {0.835555999999997,0.394444666666667,0.846666666666664,0.395555333333334}, + {0.846666666666664,0.395555333333334,0.857778000000001,0.396666666666667}, + {0.857778000000001,0.396666666666667,0.86833333333333,0.397778}, + {0.86833333333333,0.397778,0.87833333333333,0.398888666666667}, + {0.887222666666664,0.398888666666667,0.895000000000001,0.398333333333333}, + {0.895000000000001,0.398333333333333,0.901111333333333,0.397222}, + {0.901111333333333,0.397222,0.906111333333333,0.395555333333334}, + {0.906111333333333,0.395555333333334,0.909444666666663,0.393333333333333}, + {0.909444666666663,0.393333333333333,0.912222666666665,0.391111333333334}, + {0.912222666666665,0.391111333333334,0.91388933333333,0.387778}, + {0.91388933333333,0.387778,0.915556,0.383888666666667}, + {0.915556,0.383888666666667,0.917222666666665,0.38}, + {0.917222666666665,0.38,0.918333333333332,0.375555333333333}, + {0.918333333333332,0.375555333333333,0.919444666666664,0.371111333333333}, + {0.919444666666664,0.371111333333333,0.919999999999997,0.366111333333333}, + {0.919999999999997,0.366111333333333,0.920556,0.361111333333334}, + {0.920556,0.361111333333334,0.920556,0.356666666666667}, + {0.920556,0.356666666666667,0.919999999999997,0.352222}, + {0.919999999999997,0.352222,0.91888933333333,0.348333333333333}, + {0.91888933333333,0.348333333333333,0.917222666666665,0.344444666666667}, + {0.917222666666665,0.344444666666667,0.914444666666663,0.341111333333333}, + {0.914444666666663,0.341111333333333,0.911111333333333,0.338888666666667}, + {0.911111333333333,0.338888666666667,0.906111333333333,0.336666666666667}, + {0.906111333333333,0.336666666666667,0.900000000000001,0.335}, + {0.900000000000001,0.335,0.892222666666664,0.333333333333333}, + {0.892222666666664,0.333333333333333,0.882777999999997,0.331666666666666}, + {0.882777999999997,0.331666666666666,0.871666666666665,0.33}, + {0.871666666666665,0.33,0.859444666666666,0.327222}, + {0.859444666666666,0.327222,0.846111333333331,0.325}, + {0.846111333333331,0.325,0.831666666666663,0.322222}, + {0.831666666666663,0.322222,0.817222666666666,0.32}, + {0.817222666666666,0.32,0.802777999999999,0.317778}, + {0.802777999999999,0.317778,0.788333333333332,0.316111333333333}, + {0.788333333333332,0.316111333333333,0.775000000000001,0.315555333333334}, + {0.775000000000001,0.315555333333334,0.762777999999997,0.316666666666666}, + {0.762777999999997,0.316666666666666,0.751666666666665,0.318888666666667}, + {0.751666666666665,0.318888666666667,0.742222666666663,0.322778}, + {0.742222666666663,0.322778,0.734444666666666,0.328333333333333}, + {0.734444666666666,0.328333333333333,0.728333333333334,0.336666666666667}, + {0.728333333333334,0.336666666666667,0.724444666666666,0.343888666666667}, + {0.724444666666666,0.343888666666667,0.721666666666664,0.352778}, + {0.721666666666664,0.352778,0.718889333333332,0.362778}, + {0.718889333333332,0.362778,0.717222666666667,0.374444666666667}, + {0.717222666666667,0.374444666666667,0.715555999999997,0.387222}, + {0.715555999999997,0.387222,0.714444666666665,0.401666666666667}, + {0.714444666666665,0.401666666666667,0.713333333333333,0.417222}, + {0.713333333333333,0.417222,0.712778,0.433333333333334}, + {0.712778,0.433333333333334,0.712222666666667,0.45}, + {0.712222666666667,0.45,0.711666666666664,0.467778}, + {0.711666666666664,0.467778,0.711666666666664,0.485555333333333}, + {0.711666666666664,0.485555333333333,0.711666666666664,0.502778}, + {0.711666666666664,0.502778,0.712222666666667,0.520555333333334}, + {0.712222666666667,0.520555333333334,0.712778,0.537222}, + {0.712778,0.537222,0.713333333333333,0.553333333333333}, + {0.713333333333333,0.553333333333333,0.714444666666665,0.568888666666667}, + {0.714444666666665,0.568888666666667,0.715555999999997,0.583333333333333}, + {0.715555999999997,0.583333333333333,0.717222666666667,0.596111333333334}, + {0.717222666666667,0.596111333333334,0.718889333333332,0.607778}, + {0.718889333333332,0.607778,0.721666666666664,0.617778}, + {0.721666666666664,0.617778,0.724444666666666,0.626666666666667}, + {0.724444666666666,0.626666666666667,0.728333333333334,0.633888666666667}, + {0,0,0,0} +}; + +double Icon37[][4] = { + {0.140555333333334,0.338888666666667,0.133333333333335,0.336111333333333}, + {0.147221999999999,0.342778,0.140555333333334,0.338888666666667}, + {0.153333333333336,0.346666666666666,0.147221999999999,0.342778}, + {0.159444000000003,0.351666666666667,0.153333333333336,0.346666666666666}, + {0.165000000000002,0.356666666666667,0.159444000000003,0.351666666666667}, + {0.170000000000002,0.362222,0.165000000000002,0.356666666666667}, + {0.175555333333335,0.367778,0.170000000000002,0.362222}, + {0.180000000000002,0.373333333333333,0.175555333333335,0.367778}, + {0.185000000000002,0.378888666666667,0.180000000000002,0.373333333333333}, + {0.188888666666666,0.384444666666666,0.185000000000002,0.378888666666667}, + {0.192777333333334,0.39,0.188888666666666,0.384444666666666}, + {0.195555333333336,0.395555333333334,0.192777333333334,0.39}, + {0.198333333333333,0.402222,0.195555333333336,0.395555333333334}, + {0.200000000000003,0.409444666666667,0.198333333333333,0.402222}, + {0.200555333333336,0.417222,0.200000000000003,0.409444666666667}, + {0.20111066666667,0.425555333333334,0.200555333333336,0.417222}, + {0.201666666666668,0.433333333333334,0.20111066666667,0.425555333333334}, + {0.20111066666667,0.441666666666666,0.201666666666668,0.433333333333334}, + {0.200555333333336,0.449444666666666,0.20111066666667,0.441666666666666}, + {0.200000000000003,0.456666666666666,0.200555333333336,0.449444666666666}, + {0.198333333333333,0.463888666666667,0.200000000000003,0.456666666666666}, + {0.195555333333336,0.47,0.198333333333333,0.463888666666667}, + {0.191666666666668,0.475555333333334,0.195555333333336,0.47}, + {0.186110666666669,0.480555333333333,0.191666666666668,0.475555333333334}, + {0.17888866666667,0.483888666666667,0.186110666666669,0.480555333333333}, + {0.170555333333335,0.487222,0.17888866666667,0.483888666666667}, + {0.161666666666666,0.49,0.170555333333335,0.487222}, + {0.152777333333333,0.492778,0.161666666666666,0.49}, + {0.144444000000002,0.496666666666667,0.152777333333333,0.492778}, + {0.138333333333335,0.501111333333334,0.144444000000002,0.496666666666667}, + {0.134444000000002,0.507222,0.138333333333335,0.501111333333334}, + {0.133333333333335,0.514444666666667,0.134444000000002,0.507222}, + {0.133888666666669,0.520555333333334,0.133333333333335,0.514444666666667}, + {0.136110666666667,0.527778,0.133888666666669,0.520555333333334}, + {0.139444000000002,0.536111333333333,0.136110666666667,0.527778}, + {0.144444000000002,0.545,0.139444000000002,0.536111333333333}, + {0.150555333333334,0.555,0.144444000000002,0.545}, + {0.157222,0.565555333333334,0.150555333333334,0.555}, + {0.164444000000003,0.576111333333333,0.157222,0.565555333333334}, + {0.171666666666667,0.586666666666667,0.164444000000003,0.576111333333333}, + {0.178333333333337,0.597222,0.171666666666667,0.586666666666667}, + {0.184443999999999,0.606666666666667,0.178333333333337,0.597222}, + {0.189443999999999,0.615555333333334,0.184443999999999,0.606666666666667}, + {0.192777333333334,0.622778,0.189443999999999,0.615555333333334}, + {0.195000000000003,0.628888666666667,0.192777333333334,0.622778}, + {0.195555333333336,0.633888666666667,0.195000000000003,0.628888666666667}, + {0.195000000000003,0.637778,0.195555333333336,0.633888666666667}, + {0.193333333333333,0.640555333333333,0.195000000000003,0.637778}, + {0.190000000000002,0.642222,0.193333333333333,0.640555333333333}, + {0.186110666666669,0.643333333333333,0.190000000000002,0.642222}, + {0.181110666666669,0.644444666666667,0.186110666666669,0.643333333333333}, + {0.176110666666669,0.645,0.181110666666669,0.644444666666667}, + {0.158333333333336,0.644444666666667,0.164444000000003,0.645}, + {0.152777333333333,0.643333333333333,0.158333333333336,0.644444666666667}, + {0.147777333333333,0.642222,0.152777333333333,0.643333333333333}, + {0.142777333333332,0.640555333333333,0.147777333333333,0.642222}, + {0.137777333333337,0.637778,0.142777333333332,0.640555333333333}, + {0.133333333333335,0.633888666666667,0.137777333333337,0.637778}, + {0.128888666666668,0.628888666666667,0.133333333333335,0.633888666666667}, + {0.124444000000002,0.622222,0.128888666666668,0.628888666666667}, + {0.119444000000001,0.614444666666667,0.124444000000002,0.622222}, + {0.114444000000001,0.604444666666667,0.119444000000001,0.614444666666667}, + {0.109444000000001,0.593333333333333,0.114444000000001,0.604444666666667}, + {0.104444000000001,0.581111333333334,0.109444000000001,0.593333333333333}, + {0.0994440000000007,0.568333333333333,0.104444000000001,0.581111333333334}, + {0.0944440000000005,0.556111333333333,0.0994440000000007,0.568333333333333}, + {0.0894440000000003,0.544444666666667,0.0944440000000005,0.556111333333333}, + {0.0850000000000032,0.534444666666667,0.0894440000000003,0.544444666666667}, + {0.0805553333333364,0.525555333333333,0.0850000000000032,0.534444666666667}, + {0.076666666666668,0.519444666666667,0.0805553333333364,0.525555333333333}, + {0.0738886666666663,0.515555333333333,0.076666666666668,0.519444666666667}, + {0.0711106666666694,0.514444666666667,0.0738886666666663,0.515555333333333}, + {0.0694439999999995,0.515555333333333,0.0711106666666694,0.514444666666667}, + {0.0677773333333344,0.519444666666667,0.0694439999999995,0.515555333333333}, + {0.0677773333333344,0.525555333333333,0.0677773333333344,0.519444666666667}, + {0.0677773333333344,0.534444666666667,0.0677773333333344,0.525555333333333}, + {0.0683333333333328,0.544444666666667,0.0677773333333344,0.534444666666667}, + {0.0700000000000026,0.556111333333333,0.0683333333333328,0.544444666666667}, + {0.0711106666666694,0.568333333333333,0.0700000000000026,0.556111333333333}, + {0.0722220000000012,0.581111333333334,0.0711106666666694,0.568333333333333}, + {0.0733333333333329,0.593333333333333,0.0722220000000012,0.581111333333334}, + {0.0744439999999997,0.604444666666667,0.0733333333333329,0.593333333333333}, + {0.0744439999999997,0.614444666666667,0.0744439999999997,0.604444666666667}, + {0.0738886666666663,0.622222,0.0744439999999997,0.614444666666667}, + {0.0727773333333346,0.628888666666667,0.0738886666666663,0.622222}, + {0.0711106666666694,0.633888666666667,0.0727773333333346,0.628888666666667}, + {0.0694439999999995,0.636666666666667,0.0711106666666694,0.633888666666667}, + {0.067222000000001,0.638888666666666,0.0694439999999995,0.636666666666667}, + {0.0650000000000025,0.641111333333334,0.067222000000001,0.638888666666666}, + {0.0622220000000008,0.642778,0.0650000000000025,0.641111333333334}, + {0.0588886666666658,0.645,0.0622220000000008,0.642778}, + {0.0555553333333355,0.646666666666667,0.0588886666666658,0.645}, + {0.0522220000000004,0.648333333333333,0.0555553333333355,0.646666666666667}, + {0.0483333333333367,0.65,0.0522220000000004,0.648333333333333}, + {0.0444440000000033,0.651666666666667,0.0483333333333367,0.65}, + {0.0400000000000015,0.653333333333334,0.0444440000000033,0.651666666666667}, + {0.0361106666666681,0.654444666666667,0.0400000000000015,0.653333333333334}, + {0.0322219999999997,0.655555333333333,0.0361106666666681,0.654444666666667}, + {0.028333333333336,0.656111333333333,0.0322219999999997,0.655555333333333}, + {0.0250000000000009,0.655555333333333,0.028333333333336,0.656111333333333}, + {0.0216666666666659,0.655,0.0250000000000009,0.655555333333333}, + {0.0183333333333356,0.652778,0.0216666666666659,0.655}, + {0.015555333333334,0.65,0.0183333333333356,0.652778}, + {0.0133333333333354,0.646111333333333,0.015555333333334,0.65}, + {0.0111106666666672,0.640555333333333,0.0133333333333354,0.646111333333333}, + {0.00944400000000201,0.633888666666667,0.0111106666666672,0.640555333333333}, + {0.00833333333333523,0.626666666666667,0.00944400000000201,0.633888666666667}, + {0.00722200000000347,0.617778,0.00833333333333523,0.626666666666667}, + {0.00611066666666697,0.607778,0.00722200000000347,0.617778}, + {0.00500000000000019,0.596111333333334,0.00611066666666697,0.607778}, + {0.00444400000000182,0.582778,0.00500000000000019,0.596111333333334}, + {0.00388866666666843,0.568888666666667,0.00444400000000182,0.582778}, + {0.00333333333333504,0.553333333333333,0.00388866666666843,0.568888666666667}, + {0.00222200000000328,0.537222,0.00333333333333504,0.553333333333333}, + {0.00166666666666989,0.52,0.00222200000000328,0.537222}, + {0.00111066666666678,0.502778,0.00166666666666989,0.52}, + {0.000555333333333389,0.485,0.00111066666666678,0.502778}, + {0.000555333333333389,0.467222,0.000555333333333389,0.485}, + {0,0.45,0.000555333333333389,0.467222}, + {0,0.432778,0,0.45}, + {0,0.416666666666667,0,0.432778}, + {0.000555333333333389,0.401111333333333,0,0.416666666666667}, + {0.00111066666666678,0.387222,0.000555333333333389,0.401111333333333}, + {0.00166666666666989,0.373888666666667,0.00111066666666678,0.387222}, + {0.00333333333333504,0.362222,0.00166666666666989,0.373888666666667}, + {0.00500000000000019,0.352222,0.00333333333333504,0.362222}, + {0.00666666666667008,0.343333333333333,0.00500000000000019,0.352222}, + {0.00944400000000201,0.336111333333333,0.00666666666667008,0.343333333333333}, + {0.0138886666666688,0.327778,0.00944400000000201,0.336111333333333}, + {0.0194440000000024,0.322222,0.0138886666666688,0.327778}, + {0.0255553333333343,0.317778,0.0194440000000024,0.322222}, + {0.0327773333333331,0.316111333333333,0.0255553333333343,0.317778}, + {0.0411106666666683,0.315,0.0327773333333331,0.316111333333333}, + {0.0500000000000019,0.315555333333334,0.0411106666666683,0.315}, + {0.0588886666666658,0.317222,0.0500000000000019,0.315555333333334}, + {0.0683333333333328,0.319444666666667,0.0588886666666658,0.317222}, + {0.0777773333333348,0.321666666666667,0.0683333333333328,0.319444666666667}, + {0.0872220000000018,0.324444666666666,0.0777773333333348,0.321666666666667}, + {0.0966666666666687,0.326666666666667,0.0872220000000018,0.324444666666666}, + {0.104999999999999,0.328888666666667,0.0966666666666687,0.326666666666667}, + {0.113333333333334,0.331111333333334,0.104999999999999,0.328888666666667}, + {0.120555333333333,0.332778,0.113333333333334,0.331111333333334}, + {0.127222000000003,0.334444666666667,0.120555333333333,0.332778}, + {0.133333333333335,0.336111333333333,0.127222000000003,0.334444666666667}, + {0.136110666666667,0.451666666666667,0.133333333333335,0.455555333333334}, + {0.137777333333337,0.446666666666667,0.136110666666667,0.451666666666667}, + {0.138333333333335,0.440555333333334,0.137777333333337,0.446666666666667}, + {0.138888666666669,0.433333333333334,0.138333333333335,0.440555333333334}, + {0.139444000000002,0.425555333333334,0.138888666666669,0.433333333333334}, + {0.138888666666669,0.417778,0.139444000000002,0.425555333333334}, + {0.138333333333335,0.410555333333334,0.138888666666669,0.417778}, + {0.137777333333337,0.404444666666667,0.138333333333335,0.410555333333334}, + {0.136110666666667,0.399444666666666,0.137777333333337,0.404444666666667}, + {0.133333333333335,0.395555333333334,0.136110666666667,0.399444666666666}, + {0.129444000000002,0.393333333333333,0.133333333333335,0.395555333333334}, + {0.124444000000002,0.391666666666667,0.129444000000002,0.393333333333333}, + {0.117777333333336,0.390555333333333,0.124444000000002,0.391666666666667}, + {0.110555333333333,0.39,0.117777333333336,0.390555333333333}, + {0.0866666666666684,0.390555333333333,0.0938886666666671,0.39}, + {0.080000000000003,0.391666666666667,0.0866666666666684,0.390555333333333}, + {0.0750000000000028,0.393333333333333,0.080000000000003,0.391666666666667}, + {0.0711106666666694,0.395555333333334,0.0750000000000028,0.393333333333333}, + {0.0683333333333328,0.399444666666666,0.0711106666666694,0.395555333333334}, + {0.0666666666666676,0.404444666666667,0.0683333333333328,0.399444666666666}, + {0.0661106666666692,0.410555333333334,0.0666666666666676,0.404444666666667}, + {0.0655553333333359,0.417778,0.0661106666666692,0.410555333333334}, + {0.0655553333333359,0.425555333333334,0.0655553333333359,0.417778}, + {0.0655553333333359,0.433333333333334,0.0655553333333359,0.425555333333334}, + {0.0661106666666692,0.440555333333334,0.0655553333333359,0.433333333333334}, + {0.0666666666666676,0.446666666666667,0.0661106666666692,0.440555333333334}, + {0.0683333333333328,0.451666666666667,0.0666666666666676,0.446666666666667}, + {0.0711106666666694,0.455555333333334,0.0683333333333328,0.451666666666667}, + {0.0750000000000028,0.457778,0.0711106666666694,0.455555333333334}, + {0.080000000000003,0.459444666666667,0.0750000000000028,0.457778}, + {0.0866666666666684,0.460555333333333,0.080000000000003,0.459444666666667}, + {0.0938886666666671,0.461111333333333,0.0866666666666684,0.460555333333333}, + {0.117777333333336,0.460555333333333,0.110555333333333,0.461111333333333}, + {0.124444000000002,0.459444666666667,0.117777333333336,0.460555333333333}, + {0.129444000000002,0.457778,0.124444000000002,0.459444666666667}, + {0.133333333333335,0.455555333333334,0.129444000000002,0.457778}, + {0.257222000000003,0.633888666666667,0.262777333333337,0.641111333333334}, + {0.262777333333337,0.641111333333334,0.270000000000001,0.646666666666667}, + {0.270000000000001,0.646666666666667,0.278333333333336,0.651111333333333}, + {0.278333333333336,0.651111333333333,0.288333333333336,0.653333333333334}, + {0.288333333333336,0.653333333333334,0.29888866666667,0.654444666666667}, + {0.29888866666667,0.654444666666667,0.311110666666669,0.655}, + {0.311110666666669,0.655,0.323333333333333,0.653888666666666}, + {0.323333333333333,0.653888666666666,0.336666666666668,0.652778}, + {0.336666666666668,0.652778,0.350555333333332,0.650555333333333}, + {0.350555333333332,0.650555333333333,0.363888666666668,0.648333333333333}, + {0.363888666666668,0.648333333333333,0.377222000000003,0.646111333333333}, + {0.377222000000003,0.646111333333333,0.389444000000002,0.643888666666667}, + {0.389444000000002,0.643888666666667,0.401666666666666,0.641666666666667}, + {0.401666666666666,0.641666666666667,0.412222,0.64}, + {0.412222,0.64,0.422222,0.638333333333333}, + {0.422222,0.638333333333333,0.430555333333335,0.636666666666667}, + {0.430555333333335,0.636666666666667,0.437777333333334,0.635555333333333}, + {0.437777333333334,0.635555333333333,0.443333333333333,0.633888666666667}, + {0.443333333333333,0.633888666666667,0.448333333333333,0.631666666666667}, + {0.448333333333333,0.631666666666667,0.452222000000001,0.628888666666667}, + {0.452222000000001,0.628888666666667,0.455000000000003,0.626111333333334}, + {0.455000000000003,0.626111333333334,0.456666666666668,0.622222}, + {0.456666666666668,0.622222,0.457777333333335,0.618333333333334}, + {0.457777333333335,0.618333333333334,0.458333333333333,0.613333333333333}, + {0.458333333333333,0.613333333333333,0.458333333333333,0.608888666666667}, + {0.458333333333333,0.608888666666667,0.457777333333335,0.603888666666667}, + {0.457777333333335,0.603888666666667,0.457222000000002,0.598888666666667}, + {0.457222000000002,0.598888666666667,0.45611066666667,0.594444666666667}, + {0.45611066666667,0.594444666666667,0.455000000000003,0.589444666666667}, + {0.455000000000003,0.589444666666667,0.453333333333333,0.585555333333333}, + {0.453333333333333,0.585555333333333,0.451666666666668,0.581666666666666}, + {0.451666666666668,0.581666666666666,0.449444,0.578888666666667}, + {0.449444,0.578888666666667,0.446666666666668,0.576111333333333}, + {0.446666666666668,0.576111333333333,0.443333333333333,0.573888666666667}, + {0.443333333333333,0.573888666666667,0.438333333333333,0.572222}, + {0.438333333333333,0.572222,0.431666666666667,0.571111333333333}, + {0.431666666666667,0.571111333333333,0.42388866666667,0.570555333333333}, + {0.414444000000003,0.570555333333333,0.403888666666669,0.571666666666667}, + {0.403888666666669,0.571666666666667,0.392777333333332,0.572778}, + {0.392777333333332,0.572778,0.381110666666667,0.573888666666667}, + {0.381110666666667,0.573888666666667,0.37,0.575}, + {0.37,0.575,0.358888666666668,0.576111333333333}, + {0.358888666666668,0.576111333333333,0.348333333333334,0.577222}, + {0.338888666666667,0.577222,0.33111066666667,0.576666666666667}, + {0.33111066666667,0.576666666666667,0.324444,0.575555333333333}, + {0.324444,0.575555333333333,0.319444,0.573888666666667}, + {0.319444,0.573888666666667,0.315000000000002,0.571111333333333}, + {0.315000000000002,0.571111333333333,0.312222000000001,0.567222}, + {0.312222000000001,0.567222,0.310555333333336,0.562222}, + {0.310555333333336,0.562222,0.310000000000002,0.556666666666667}, + {0.310000000000002,0.556666666666667,0.310000000000002,0.550555333333334}, + {0.310000000000002,0.550555333333334,0.310555333333336,0.543888666666666}, + {0.310555333333336,0.543888666666666,0.311666666666667,0.537778}, + {0.311666666666667,0.537778,0.312777333333334,0.531666666666667}, + {0.312777333333334,0.531666666666667,0.313888666666666,0.526111333333333}, + {0.313888666666666,0.526111333333333,0.315555333333336,0.521111333333333}, + {0.315555333333336,0.521111333333333,0.317222000000001,0.517222}, + {0.317222000000001,0.517222,0.319444,0.514444666666667}, + {0.319444,0.514444666666667,0.323333333333333,0.512222}, + {0.323333333333333,0.512222,0.328333333333333,0.511111333333333}, + {0.328333333333333,0.511111333333333,0.335000000000003,0.511666666666667}, + {0.335000000000003,0.511666666666667,0.342222000000002,0.512778}, + {0.342222000000002,0.512778,0.350555333333332,0.514444666666667}, + {0.350555333333332,0.514444666666667,0.358333333333334,0.516111333333334}, + {0.358333333333334,0.516111333333334,0.365555333333333,0.517222}, + {0.365555333333333,0.517222,0.372222000000003,0.517778}, + {0.372222000000003,0.517778,0.377222000000003,0.516666666666667}, + {0.377222000000003,0.516666666666667,0.381110666666667,0.514444666666667}, + {0.381110666666667,0.514444666666667,0.383888666666669,0.511111333333333}, + {0.383888666666669,0.511111333333333,0.385,0.506111333333333}, + {0.385,0.506111333333333,0.386110666666667,0.5}, + {0.386110666666667,0.5,0.38666666666667,0.492778}, + {0.38666666666667,0.492778,0.38666666666667,0.485}, + {0.38666666666667,0.485,0.38666666666667,0.477222}, + {0.38666666666667,0.477222,0.386110666666667,0.47}, + {0.386110666666667,0.47,0.385,0.463888666666667}, + {0.385,0.463888666666667,0.383888666666669,0.458888666666667}, + {0.383888666666669,0.458888666666667,0.381110666666667,0.455555333333334}, + {0.381110666666667,0.455555333333334,0.377222000000003,0.453333333333333}, + {0.377222000000003,0.453333333333333,0.372222000000003,0.452222}, + {0.372222000000003,0.452222,0.365555333333333,0.452778}, + {0.365555333333333,0.452778,0.358333333333334,0.453888666666667}, + {0.358333333333334,0.453888666666667,0.349999999999999,0.455555333333334}, + {0.349999999999999,0.455555333333334,0.342222000000002,0.457222}, + {0.342222000000002,0.457222,0.335000000000003,0.458888666666667}, + {0.328333333333333,0.458888666666667,0.323333333333333,0.457778}, + {0.323333333333333,0.457778,0.319444,0.455555333333334}, + {0.319444,0.455555333333334,0.317222000000001,0.452778}, + {0.317222000000001,0.452778,0.315555333333336,0.448888666666667}, + {0.315555333333336,0.448888666666667,0.313888666666666,0.443888666666667}, + {0.313888666666666,0.443888666666667,0.312777333333334,0.438333333333333}, + {0.312777333333334,0.438333333333333,0.311666666666667,0.432222}, + {0.311666666666667,0.432222,0.310555333333336,0.425555333333334}, + {0.310555333333336,0.425555333333334,0.310000000000002,0.418888666666666}, + {0.310000000000002,0.418888666666666,0.310000000000002,0.412778}, + {0.310000000000002,0.412778,0.310555333333336,0.407222}, + {0.310555333333336,0.407222,0.312222000000001,0.402222}, + {0.312222000000001,0.402222,0.315000000000002,0.398333333333333}, + {0.315000000000002,0.398333333333333,0.319444,0.395555333333334}, + {0.319444,0.395555333333334,0.324444,0.393888666666667}, + {0.324444,0.393888666666667,0.33111066666667,0.392778}, + {0.33111066666667,0.392778,0.338888666666667,0.392222}, + {0.348333333333334,0.392222,0.358888666666668,0.393333333333333}, + {0.358888666666668,0.393333333333333,0.37,0.394444666666667}, + {0.37,0.394444666666667,0.38166666666667,0.395555333333334}, + {0.38166666666667,0.395555333333334,0.392777333333332,0.396666666666667}, + {0.392777333333332,0.396666666666667,0.403888666666669,0.397778}, + {0.403888666666669,0.397778,0.414444000000003,0.398888666666667}, + {0.42388866666667,0.398888666666667,0.431666666666667,0.398333333333333}, + {0.431666666666667,0.398333333333333,0.438333333333333,0.397222}, + {0.438333333333333,0.397222,0.443333333333333,0.395555333333334}, + {0.443333333333333,0.395555333333334,0.446666666666668,0.393333333333333}, + {0.446666666666668,0.393333333333333,0.449444,0.390555333333333}, + {0.449444,0.390555333333333,0.451666666666668,0.387778}, + {0.451666666666668,0.387778,0.453333333333333,0.383888666666667}, + {0.453333333333333,0.383888666666667,0.455000000000003,0.38}, + {0.455000000000003,0.38,0.45611066666667,0.375555333333333}, + {0.45611066666667,0.375555333333333,0.457222000000002,0.370555333333333}, + {0.457222000000002,0.370555333333333,0.457777333333335,0.366111333333333}, + {0.457777333333335,0.366111333333333,0.458333333333333,0.361111333333334}, + {0.458333333333333,0.361111333333334,0.458333333333333,0.356111333333333}, + {0.458333333333333,0.356111333333333,0.457777333333335,0.351666666666667}, + {0.457777333333335,0.351666666666667,0.456666666666668,0.347778}, + {0.456666666666668,0.347778,0.455000000000003,0.343888666666667}, + {0.455000000000003,0.343888666666667,0.452222000000001,0.341111333333333}, + {0.452222000000001,0.341111333333333,0.448333333333333,0.338333333333334}, + {0.448333333333333,0.338333333333334,0.443333333333333,0.336111333333333}, + {0.443333333333333,0.336111333333333,0.437777333333334,0.334444666666667}, + {0.437777333333334,0.334444666666667,0.430555333333335,0.333333333333333}, + {0.430555333333335,0.333333333333333,0.422222,0.331666666666666}, + {0.422222,0.331666666666666,0.412222,0.33}, + {0.412222,0.33,0.401666666666666,0.328333333333333}, + {0.401666666666666,0.328333333333333,0.389444000000002,0.326111333333333}, + {0.389444000000002,0.326111333333333,0.377222000000003,0.323888666666667}, + {0.377222000000003,0.323888666666667,0.363888666666668,0.321666666666667}, + {0.363888666666668,0.321666666666667,0.349999999999999,0.319444666666667}, + {0.349999999999999,0.319444666666667,0.336666666666668,0.317222}, + {0.336666666666668,0.317222,0.323333333333333,0.316111333333333}, + {0.323333333333333,0.316111333333333,0.311110666666669,0.315555333333334}, + {0.29888866666667,0.315555333333334,0.288333333333336,0.316666666666666}, + {0.288333333333336,0.316666666666666,0.278333333333336,0.318888666666667}, + {0.278333333333336,0.318888666666667,0.270000000000001,0.323333333333334}, + {0.270000000000001,0.323333333333334,0.262777333333337,0.328888666666667}, + {0.262777333333337,0.328888666666667,0.257222000000003,0.336111333333333}, + {0.257222000000003,0.336111333333333,0.253333333333335,0.343333333333333}, + {0.253333333333335,0.343333333333333,0.25,0.352222}, + {0.25,0.352222,0.247777333333336,0.362222}, + {0.247777333333336,0.362222,0.245555333333333,0.373888666666667}, + {0.245555333333333,0.373888666666667,0.243888666666668,0.387222}, + {0.243888666666668,0.387222,0.242222000000003,0.401111333333333}, + {0.242222000000003,0.401111333333333,0.241666666666669,0.416666666666667}, + {0.241666666666669,0.416666666666667,0.240555333333333,0.432778}, + {0.240555333333333,0.432778,0.24,0.45}, + {0.24,0.45,0.24,0.467222}, + {0.24,0.467222,0.24,0.485}, + {0.24,0.485,0.24,0.502778}, + {0.24,0.502778,0.24,0.52}, + {0.24,0.52,0.240555333333333,0.537222}, + {0.240555333333333,0.537222,0.241666666666669,0.553333333333333}, + {0.241666666666669,0.553333333333333,0.242222000000003,0.568888666666667}, + {0.242222000000003,0.568888666666667,0.243888666666668,0.582778}, + {0.243888666666668,0.582778,0.245555333333333,0.596111333333334}, + {0.245555333333333,0.596111333333334,0.247777333333336,0.607778}, + {0.247777333333336,0.607778,0.25,0.617778}, + {0.25,0.617778,0.253333333333335,0.626666666666667}, + {0.253333333333335,0.626666666666667,0.257222000000003,0.633888666666667}, + {0.505,0.514444666666667,0.51,0.52}, + {0.51,0.52,0.516666666666666,0.523333333333333}, + {0.516666666666666,0.523333333333333,0.524444000000003,0.525555333333333}, + {0.53388866666667,0.525555333333333,0.544444000000003,0.524444666666666}, + {0.544444000000003,0.524444666666666,0.555555333333335,0.522778}, + {0.555555333333335,0.522778,0.567222000000001,0.52}, + {0.567222000000001,0.52,0.578333333333333,0.517222}, + {0.578333333333333,0.517222,0.589444,0.515}, + {0.589444,0.515,0.599999999999999,0.512778}, + {0.599999999999999,0.512778,0.609444000000001,0.511666666666667}, + {0.617222000000003,0.511666666666667,0.623888666666668,0.512778}, + {0.623888666666668,0.512778,0.628888666666668,0.514444666666667}, + {0.628888666666668,0.514444666666667,0.632777333333337,0.516666666666667}, + {0.632777333333337,0.516666666666667,0.635555333333334,0.52}, + {0.635555333333334,0.52,0.637777333333337,0.523888666666667}, + {0.637777333333337,0.523888666666667,0.638888666666669,0.528333333333334}, + {0.638888666666669,0.528333333333334,0.640000000000001,0.533333333333333}, + {0.640000000000001,0.533333333333333,0.640555333333334,0.538888666666667}, + {0.640555333333334,0.538888666666667,0.640555333333334,0.544444666666667}, + {0.640555333333334,0.544444666666667,0.640555333333334,0.549444666666667}, + {0.640555333333334,0.549444666666667,0.640000000000001,0.555}, + {0.640000000000001,0.555,0.638888666666669,0.56}, + {0.638888666666669,0.56,0.637777333333337,0.564444666666667}, + {0.637777333333337,0.564444666666667,0.635555333333334,0.568333333333333}, + {0.635555333333334,0.568333333333333,0.632777333333337,0.571666666666667}, + {0.632777333333337,0.571666666666667,0.628888666666668,0.573888666666667}, + {0.628888666666668,0.573888666666667,0.623888666666668,0.575555333333333}, + {0.623888666666668,0.575555333333333,0.617222000000003,0.576666666666667}, + {0.617222000000003,0.576666666666667,0.609444000000001,0.577222}, + {0.599999999999999,0.577222,0.589444,0.576111333333333}, + {0.589444,0.576111333333333,0.578333333333333,0.575}, + {0.578333333333333,0.575,0.566666666666668,0.573888666666667}, + {0.566666666666668,0.573888666666667,0.555555333333335,0.572778}, + {0.555555333333335,0.572778,0.544444000000003,0.571666666666667}, + {0.544444000000003,0.571666666666667,0.53388866666667,0.570555333333333}, + {0.524444000000003,0.570555333333333,0.516666666666666,0.571111333333333}, + {0.516666666666666,0.571111333333333,0.51,0.572222}, + {0.51,0.572222,0.505,0.573888666666667}, + {0.505,0.573888666666667,0.50166666666667,0.576111333333333}, + {0.50166666666667,0.576111333333333,0.498888666666668,0.578888666666667}, + {0.498888666666668,0.578888666666667,0.49666666666667,0.581666666666666}, + {0.49666666666667,0.581666666666666,0.495,0.585555333333333}, + {0.495,0.585555333333333,0.493333333333335,0.589444666666667}, + {0.493333333333335,0.589444666666667,0.492222000000003,0.594444666666667}, + {0.492222000000003,0.594444666666667,0.491110666666666,0.598888666666667}, + {0.491110666666666,0.598888666666667,0.490555333333333,0.603888666666667}, + {0.490555333333333,0.603888666666667,0.49,0.608888666666667}, + {0.49,0.608888666666667,0.49,0.613333333333333}, + {0.49,0.613333333333333,0.490555333333333,0.618333333333334}, + {0.490555333333333,0.618333333333334,0.491666666666669,0.622222}, + {0.491666666666669,0.622222,0.493333333333335,0.626111333333334}, + {0.493333333333335,0.626111333333334,0.496110666666667,0.628888666666667}, + {0.496110666666667,0.628888666666667,0.5,0.631666666666667}, + {0.5,0.631666666666667,0.505,0.633888666666667}, + {0.505,0.633888666666667,0.510555333333334,0.635555333333333}, + {0.510555333333334,0.635555333333333,0.517777333333332,0.636666666666667}, + {0.517777333333332,0.636666666666667,0.526110666666668,0.637778}, + {0.526110666666668,0.637778,0.536110666666668,0.638888666666666}, + {0.536110666666668,0.638888666666666,0.546666666666667,0.64}, + {0.546666666666667,0.64,0.558888666666666,0.641666666666667}, + {0.558888666666666,0.641666666666667,0.571110666666669,0.642778}, + {0.571110666666669,0.642778,0.584444,0.643888666666667}, + {0.584444,0.643888666666667,0.598333333333334,0.645}, + {0.598333333333334,0.645,0.611666666666669,0.646111333333333}, + {0.611666666666669,0.646111333333333,0.625,0.646666666666667}, + {0.649444000000003,0.646666666666667,0.660000000000001,0.645555333333334}, + {0.660000000000001,0.645555333333334,0.670000000000002,0.643888666666667}, + {0.670000000000002,0.643888666666667,0.678333333333337,0.641666666666667}, + {0.678333333333337,0.641666666666667,0.685555333333336,0.638333333333333}, + {0.685555333333336,0.638333333333333,0.691110666666669,0.633888666666667}, + {0.691110666666669,0.633888666666667,0.696110666666669,0.627778}, + {0.696110666666669,0.627778,0.700000000000003,0.619444666666666}, + {0.700000000000003,0.619444666666666,0.702777333333335,0.61}, + {0.702777333333335,0.61,0.704444,0.599444666666667}, + {0.704444,0.599444666666667,0.705555333333336,0.586666666666667}, + {0.705555333333336,0.586666666666667,0.70611066666667,0.573333333333334}, + {0.70611066666667,0.573333333333334,0.70611066666667,0.559444666666667}, + {0.70611066666667,0.559444666666667,0.705555333333336,0.545}, + {0.705555333333336,0.545,0.705000000000003,0.53}, + {0.705000000000003,0.53,0.703888666666666,0.516111333333334}, + {0.703888666666666,0.516111333333334,0.702777333333335,0.502778}, + {0.702777333333335,0.502778,0.70111066666667,0.49}, + {0.70111066666667,0.49,0.699444,0.479444666666667}, + {0.699444,0.479444666666667,0.697222000000001,0.47}, + {0.697222000000001,0.47,0.694444,0.461666666666667}, + {0.694444,0.461666666666667,0.691110666666669,0.455555333333334}, + {0.691110666666669,0.455555333333334,0.686110666666669,0.45}, + {0.686110666666669,0.45,0.679444000000004,0.446666666666667}, + {0.679444000000004,0.446666666666667,0.671666666666667,0.444444666666667}, + {0.662222,0.444444666666667,0.651666666666666,0.445555333333333}, + {0.651666666666666,0.445555333333333,0.640555333333334,0.447222}, + {0.640555333333334,0.447222,0.628888666666668,0.45}, + {0.628888666666668,0.45,0.617777333333336,0.452778}, + {0.617777333333336,0.452778,0.606666666666669,0.455}, + {0.606666666666669,0.455,0.59611066666667,0.457222}, + {0.59611066666667,0.457222,0.586666666666668,0.458333333333333}, + {0.578888666666666,0.458333333333333,0.572222000000001,0.457222}, + {0.572222000000001,0.457222,0.567222000000001,0.455555333333334}, + {0.567222000000001,0.455555333333334,0.563333333333333,0.453333333333333}, + {0.563333333333333,0.453333333333333,0.560555333333336,0.45}, + {0.560555333333336,0.45,0.558333333333332,0.446111333333333}, + {0.558333333333332,0.446111333333333,0.557222000000001,0.441666666666666}, + {0.557222000000001,0.441666666666666,0.556110666666669,0.436666666666667}, + {0.556110666666669,0.436666666666667,0.555555333333335,0.431111333333333}, + {0.555555333333335,0.431111333333333,0.555555333333335,0.425555333333334}, + {0.555555333333335,0.425555333333334,0.555555333333335,0.42}, + {0.555555333333335,0.42,0.556110666666669,0.414444666666667}, + {0.556110666666669,0.414444666666667,0.557222000000001,0.409444666666667}, + {0.557222000000001,0.409444666666667,0.558333333333332,0.405}, + {0.558333333333332,0.405,0.560555333333336,0.401111333333333}, + {0.560555333333336,0.401111333333333,0.563333333333333,0.397778}, + {0.563333333333333,0.397778,0.567222000000001,0.395555333333334}, + {0.567222000000001,0.395555333333334,0.572222000000001,0.393888666666667}, + {0.572222000000001,0.393888666666667,0.578888666666666,0.392778}, + {0.578888666666666,0.392778,0.586666666666668,0.392222}, + {0.59611066666667,0.392222,0.606666666666669,0.393333333333333}, + {0.606666666666669,0.393333333333333,0.617777333333336,0.394444666666667}, + {0.617777333333336,0.394444666666667,0.629444000000002,0.395555333333334}, + {0.629444000000002,0.395555333333334,0.640555333333334,0.396666666666667}, + {0.640555333333334,0.396666666666667,0.651666666666666,0.397778}, + {0.651666666666666,0.397778,0.662222,0.398888666666667}, + {0.671666666666667,0.398888666666667,0.679444000000004,0.398333333333333}, + {0.679444000000004,0.398333333333333,0.686110666666669,0.397222}, + {0.686110666666669,0.397222,0.691110666666669,0.395555333333334}, + {0.691110666666669,0.395555333333334,0.694444,0.393333333333333}, + {0.694444,0.393333333333333,0.697222000000001,0.390555333333333}, + {0.697222000000001,0.390555333333333,0.699444,0.387778}, + {0.699444,0.387778,0.70111066666667,0.383888666666667}, + {0.70111066666667,0.383888666666667,0.702777333333335,0.38}, + {0.702777333333335,0.38,0.703888666666666,0.375555333333333}, + {0.703888666666666,0.375555333333333,0.705000000000003,0.370555333333333}, + {0.705000000000003,0.370555333333333,0.705555333333336,0.366111333333333}, + {0.705555333333336,0.366111333333333,0.70611066666667,0.361111333333334}, + {0.70611066666667,0.361111333333334,0.70611066666667,0.356111333333333}, + {0.70611066666667,0.356111333333333,0.705555333333336,0.351666666666667}, + {0.705555333333336,0.351666666666667,0.704444,0.347778}, + {0.704444,0.347778,0.702777333333335,0.343888666666667}, + {0.702777333333335,0.343888666666667,0.700000000000003,0.341111333333333}, + {0.700000000000003,0.341111333333333,0.696110666666669,0.338333333333334}, + {0.696110666666669,0.338333333333334,0.691110666666669,0.336111333333333}, + {0.691110666666669,0.336111333333333,0.685555333333336,0.334444666666667}, + {0.685555333333336,0.334444666666667,0.678333333333337,0.333333333333333}, + {0.678333333333337,0.333333333333333,0.670000000000002,0.332222}, + {0.670000000000002,0.332222,0.660000000000001,0.331111333333334}, + {0.660000000000001,0.331111333333334,0.649444000000003,0.33}, + {0.649444000000003,0.33,0.637222000000004,0.328333333333333}, + {0.637222000000004,0.328333333333333,0.625,0.327222}, + {0.625,0.327222,0.611666666666669,0.326111333333333}, + {0.611666666666669,0.326111333333333,0.597777333333335,0.325}, + {0.597777333333335,0.325,0.584444,0.323888666666667}, + {0.584444,0.323888666666667,0.571110666666669,0.323333333333334}, + {0.546666666666667,0.323333333333334,0.536110666666668,0.324444666666666}, + {0.536110666666668,0.324444666666666,0.526110666666668,0.326111333333333}, + {0.526110666666668,0.326111333333333,0.517777333333332,0.328333333333333}, + {0.517777333333332,0.328333333333333,0.510555333333334,0.331666666666666}, + {0.510555333333334,0.331666666666666,0.505,0.336111333333333}, + {0.505,0.336111333333333,0.5,0.342222}, + {0.5,0.342222,0.496110666666667,0.350555333333334}, + {0.496110666666667,0.350555333333334,0.493333333333335,0.36}, + {0.493333333333335,0.36,0.491666666666669,0.370555333333333}, + {0.491666666666669,0.370555333333333,0.490555333333333,0.383333333333334}, + {0.490555333333333,0.383333333333334,0.49,0.396666666666667}, + {0.49,0.396666666666667,0.49,0.410555333333334}, + {0.49,0.410555333333334,0.490555333333333,0.425555333333334}, + {0.490555333333333,0.425555333333334,0.491110666666666,0.44}, + {0.491110666666666,0.44,0.492222000000003,0.453888666666667}, + {0.492222000000003,0.453888666666667,0.493333333333335,0.467222}, + {0.493333333333335,0.467222,0.495,0.48}, + {0.495,0.48,0.49666666666667,0.490555333333334}, + {0.49666666666667,0.490555333333334,0.498888666666668,0.5}, + {0.498888666666668,0.5,0.50166666666667,0.508333333333334}, + {0.50166666666667,0.508333333333334,0.505,0.514444666666667}, + {0.752777333333337,0.633888666666667,0.758333333333335,0.641111333333334}, + {0.758333333333335,0.641111333333334,0.765555333333334,0.646666666666667}, + {0.765555333333334,0.646666666666667,0.773888666666669,0.651111333333333}, + {0.773888666666669,0.651111333333333,0.78388866666667,0.653333333333334}, + {0.78388866666667,0.653333333333334,0.794444000000003,0.654444666666667}, + {0.794444000000003,0.654444666666667,0.806666666666667,0.655}, + {0.806666666666667,0.655,0.818888666666666,0.653888666666666}, + {0.818888666666666,0.653888666666666,0.832222000000002,0.652778}, + {0.832222000000002,0.652778,0.84611066666667,0.650555333333333}, + {0.84611066666667,0.650555333333333,0.859444000000001,0.648333333333333}, + {0.859444000000001,0.648333333333333,0.872777333333336,0.646111333333333}, + {0.872777333333336,0.646111333333333,0.885,0.643888666666667}, + {0.885,0.643888666666667,0.897221999999999,0.641666666666667}, + {0.897221999999999,0.641666666666667,0.907777333333333,0.64}, + {0.907777333333333,0.64,0.917777333333333,0.638333333333333}, + {0.917777333333333,0.638333333333333,0.926110666666669,0.636666666666667}, + {0.926110666666669,0.636666666666667,0.933333333333332,0.635555333333333}, + {0.933333333333332,0.635555333333333,0.938888666666666,0.633888666666667}, + {0.938888666666666,0.633888666666667,0.943888666666666,0.631666666666667}, + {0.943888666666666,0.631666666666667,0.947777333333335,0.628888666666667}, + {0.947777333333335,0.628888666666667,0.950555333333336,0.626111333333334}, + {0.950555333333336,0.626111333333334,0.952222000000001,0.622222}, + {0.952222000000001,0.622222,0.953333333333333,0.618333333333334}, + {0.953333333333333,0.618333333333334,0.953888666666666,0.613333333333333}, + {0.953888666666666,0.613333333333333,0.953888666666666,0.608888666666667}, + {0.953888666666666,0.608888666666667,0.953333333333333,0.603888666666667}, + {0.953333333333333,0.603888666666667,0.952777333333335,0.598888666666667}, + {0.952777333333335,0.598888666666667,0.951666666666668,0.594444666666667}, + {0.951666666666668,0.594444666666667,0.950555333333336,0.589444666666667}, + {0.950555333333336,0.589444666666667,0.948888666666666,0.585555333333333}, + {0.948888666666666,0.585555333333333,0.947222000000001,0.581666666666666}, + {0.947222000000001,0.581666666666666,0.945000000000003,0.578888666666667}, + {0.945000000000003,0.578888666666667,0.942222000000001,0.576111333333333}, + {0.942222000000001,0.576111333333333,0.938888666666666,0.573888666666667}, + {0.938888666666666,0.573888666666667,0.933888666666666,0.572222}, + {0.933888666666666,0.572222,0.927222,0.571111333333333}, + {0.927222,0.571111333333333,0.919444000000003,0.570555333333333}, + {0.910000000000001,0.570555333333333,0.899444000000003,0.571666666666667}, + {0.899444000000003,0.571666666666667,0.888333333333335,0.572778}, + {0.888333333333335,0.572778,0.87666666666667,0.573888666666667}, + {0.87666666666667,0.573888666666667,0.865555333333333,0.575}, + {0.865555333333333,0.575,0.854444000000001,0.576111333333333}, + {0.854444000000001,0.576111333333333,0.843888666666667,0.577222}, + {0.834444,0.577222,0.826666666666668,0.576666666666667}, + {0.826666666666668,0.576666666666667,0.820000000000003,0.575555333333333}, + {0.820000000000003,0.575555333333333,0.815000000000002,0.573888666666667}, + {0.815000000000002,0.573888666666667,0.810555333333336,0.571111333333333}, + {0.810555333333336,0.571111333333333,0.807777333333334,0.567222}, + {0.807777333333334,0.567222,0.806110666666669,0.562222}, + {0.806110666666669,0.562222,0.805555333333335,0.556666666666667}, + {0.805555333333335,0.556666666666667,0.805555333333335,0.550555333333334}, + {0.805555333333335,0.550555333333334,0.806110666666669,0.543888666666666}, + {0.806110666666669,0.543888666666666,0.807222000000001,0.537778}, + {0.807222000000001,0.537778,0.808333333333332,0.531666666666667}, + {0.808333333333332,0.531666666666667,0.809443999999999,0.526111333333333}, + {0.809443999999999,0.526111333333333,0.811110666666669,0.521111333333333}, + {0.811110666666669,0.521111333333333,0.812777333333334,0.517222}, + {0.812777333333334,0.517222,0.815000000000002,0.514444666666667}, + {0.815000000000002,0.514444666666667,0.818888666666666,0.512222}, + {0.818888666666666,0.512222,0.823888666666666,0.511111333333333}, + {0.823888666666666,0.511111333333333,0.830555333333336,0.511666666666667}, + {0.830555333333336,0.511666666666667,0.837777333333335,0.512778}, + {0.837777333333335,0.512778,0.84611066666667,0.514444666666667}, + {0.84611066666667,0.514444666666667,0.853888666666667,0.516111333333334}, + {0.853888666666667,0.516111333333334,0.861110666666666,0.517222}, + {0.861110666666666,0.517222,0.867777333333336,0.517778}, + {0.867777333333336,0.517778,0.872777333333336,0.516666666666667}, + {0.872777333333336,0.516666666666667,0.87666666666667,0.514444666666667}, + {0.87666666666667,0.514444666666667,0.879444000000002,0.511111333333333}, + {0.879444000000002,0.511111333333333,0.880555333333334,0.506111333333333}, + {0.880555333333334,0.506111333333333,0.88166666666667,0.5}, + {0.88166666666667,0.5,0.882222000000003,0.492778}, + {0.882222000000003,0.492778,0.882222000000003,0.485}, + {0.882222000000003,0.485,0.882222000000003,0.477222}, + {0.882222000000003,0.477222,0.88166666666667,0.47}, + {0.88166666666667,0.47,0.880555333333334,0.463888666666667}, + {0.880555333333334,0.463888666666667,0.879444000000002,0.458888666666667}, + {0.879444000000002,0.458888666666667,0.87666666666667,0.455555333333334}, + {0.87666666666667,0.455555333333334,0.872777333333336,0.453333333333333}, + {0.872777333333336,0.453333333333333,0.867777333333336,0.452222}, + {0.867777333333336,0.452222,0.861110666666666,0.452778}, + {0.861110666666666,0.452778,0.853888666666667,0.453888666666667}, + {0.853888666666667,0.453888666666667,0.845555333333337,0.455555333333334}, + {0.845555333333337,0.455555333333334,0.837777333333335,0.457222}, + {0.837777333333335,0.457222,0.830555333333336,0.458888666666667}, + {0.823888666666666,0.458888666666667,0.818888666666666,0.457778}, + {0.818888666666666,0.457778,0.815000000000002,0.455555333333334}, + {0.815000000000002,0.455555333333334,0.812777333333334,0.452778}, + {0.812777333333334,0.452778,0.811110666666669,0.448888666666667}, + {0.811110666666669,0.448888666666667,0.809443999999999,0.443888666666667}, + {0.809443999999999,0.443888666666667,0.808333333333332,0.438333333333333}, + {0.808333333333332,0.438333333333333,0.807222000000001,0.432222}, + {0.807222000000001,0.432222,0.806110666666669,0.425555333333334}, + {0.806110666666669,0.425555333333334,0.805555333333335,0.418888666666666}, + {0.805555333333335,0.418888666666666,0.805555333333335,0.412778}, + {0.805555333333335,0.412778,0.806110666666669,0.407222}, + {0.806110666666669,0.407222,0.807777333333334,0.402222}, + {0.807777333333334,0.402222,0.810555333333336,0.398333333333333}, + {0.810555333333336,0.398333333333333,0.815000000000002,0.395555333333334}, + {0.815000000000002,0.395555333333334,0.820000000000003,0.393888666666667}, + {0.820000000000003,0.393888666666667,0.826666666666668,0.392778}, + {0.826666666666668,0.392778,0.834444,0.392222}, + {0.843888666666667,0.392222,0.854444000000001,0.393333333333333}, + {0.854444000000001,0.393333333333333,0.865555333333333,0.394444666666667}, + {0.865555333333333,0.394444666666667,0.877222000000003,0.395555333333334}, + {0.877222000000003,0.395555333333334,0.888333333333335,0.396666666666667}, + {0.888333333333335,0.396666666666667,0.899444000000003,0.397778}, + {0.899444000000003,0.397778,0.910000000000001,0.398888666666667}, + {0.919444000000003,0.398888666666667,0.927222,0.398333333333333}, + {0.927222,0.398333333333333,0.933888666666666,0.397222}, + {0.933888666666666,0.397222,0.938888666666666,0.395555333333334}, + {0.938888666666666,0.395555333333334,0.942222000000001,0.393333333333333}, + {0.942222000000001,0.393333333333333,0.945000000000003,0.390555333333333}, + {0.945000000000003,0.390555333333333,0.947222000000001,0.387778}, + {0.947222000000001,0.387778,0.948888666666666,0.383888666666667}, + {0.948888666666666,0.383888666666667,0.950555333333336,0.38}, + {0.950555333333336,0.38,0.951666666666668,0.375555333333333}, + {0.951666666666668,0.375555333333333,0.952777333333335,0.370555333333333}, + {0.952777333333335,0.370555333333333,0.953333333333333,0.366111333333333}, + {0.953333333333333,0.366111333333333,0.953888666666666,0.361111333333334}, + {0.953888666666666,0.361111333333334,0.953888666666666,0.356111333333333}, + {0.953888666666666,0.356111333333333,0.953333333333333,0.351666666666667}, + {0.953333333333333,0.351666666666667,0.952222000000001,0.347778}, + {0.952222000000001,0.347778,0.950555333333336,0.343888666666667}, + {0.950555333333336,0.343888666666667,0.947777333333335,0.341111333333333}, + {0.947777333333335,0.341111333333333,0.943888666666666,0.338333333333334}, + {0.943888666666666,0.338333333333334,0.938888666666666,0.336111333333333}, + {0.938888666666666,0.336111333333333,0.933333333333332,0.334444666666667}, + {0.933333333333332,0.334444666666667,0.926110666666669,0.333333333333333}, + {0.926110666666669,0.333333333333333,0.917777333333333,0.331666666666666}, + {0.917777333333333,0.331666666666666,0.907777333333333,0.33}, + {0.907777333333333,0.33,0.897221999999999,0.328333333333333}, + {0.897221999999999,0.328333333333333,0.885,0.326111333333333}, + {0.885,0.326111333333333,0.872777333333336,0.323888666666667}, + {0.872777333333336,0.323888666666667,0.859444000000001,0.321666666666667}, + {0.859444000000001,0.321666666666667,0.845555333333337,0.319444666666667}, + {0.845555333333337,0.319444666666667,0.832222000000002,0.317222}, + {0.832222000000002,0.317222,0.818888666666666,0.316111333333333}, + {0.818888666666666,0.316111333333333,0.806666666666667,0.315555333333334}, + {0.794444000000003,0.315555333333334,0.78388866666667,0.316666666666666}, + {0.78388866666667,0.316666666666666,0.773888666666669,0.318888666666667}, + {0.773888666666669,0.318888666666667,0.765555333333334,0.323333333333334}, + {0.765555333333334,0.323333333333334,0.758333333333335,0.328888666666667}, + {0.758333333333335,0.328888666666667,0.752777333333337,0.336111333333333}, + {0.752777333333337,0.336111333333333,0.748888666666668,0.343333333333333}, + {0.748888666666668,0.343333333333333,0.745555333333333,0.352222}, + {0.745555333333333,0.352222,0.743333333333335,0.362222}, + {0.743333333333335,0.362222,0.741110666666666,0.373888666666667}, + {0.741110666666666,0.373888666666667,0.739444000000001,0.387222}, + {0.739444000000001,0.387222,0.737777333333336,0.401111333333333}, + {0.737777333333336,0.401111333333333,0.737222000000003,0.416666666666667}, + {0.737222000000003,0.416666666666667,0.736110666666666,0.432778}, + {0.736110666666666,0.432778,0.735555333333333,0.45}, + {0.735555333333333,0.45,0.735555333333333,0.467222}, + {0.735555333333333,0.467222,0.735555333333333,0.485}, + {0.735555333333333,0.485,0.735555333333333,0.502778}, + {0.735555333333333,0.502778,0.735555333333333,0.52}, + {0.735555333333333,0.52,0.736110666666666,0.537222}, + {0.736110666666666,0.537222,0.737222000000003,0.553333333333333}, + {0.737222000000003,0.553333333333333,0.737777333333336,0.568888666666667}, + {0.737777333333336,0.568888666666667,0.739444000000001,0.582778}, + {0.739444000000001,0.582778,0.741110666666666,0.596111333333334}, + {0.741110666666666,0.596111333333334,0.743333333333335,0.607778}, + {0.743333333333335,0.607778,0.745555333333333,0.617778}, + {0.745555333333333,0.617778,0.748888666666668,0.626666666666667}, + {0.748888666666668,0.626666666666667,0.752777333333337,0.633888666666667}, + {1.18388866666667,0.397778,1.18666666666667,0.395555333333334}, + {1.179444,0.398333333333333,1.18388866666667,0.397778}, + {1.174444,0.397222,1.179444,0.398333333333333}, + {1.16888866666667,0.394444666666667,1.174444,0.397222}, + {1.16277733333333,0.391111333333334,1.16888866666667,0.394444666666667}, + {1.15555533333333,0.387222,1.16277733333333,0.391111333333334}, + {1.14888866666667,0.383333333333334,1.15555533333333,0.387222}, + {1.14277733333333,0.381111333333333,1.14888866666667,0.383333333333334}, + {1.137222,0.380555333333334,1.14277733333333,0.381111333333333}, + {1.132222,0.382222,1.137222,0.380555333333334}, + {1.12777733333334,0.387222,1.132222,0.382222}, + {1.125,0.395555333333334,1.12777733333334,0.387222}, + {1.12388866666667,0.402222,1.125,0.395555333333334}, + {1.12277733333334,0.41,1.12388866666667,0.402222}, + {1.12166666666667,0.419444666666667,1.12277733333334,0.41}, + {1.12166666666667,0.43,1.12166666666667,0.419444666666667}, + {1.12166666666667,0.441666666666666,1.12166666666667,0.43}, + {1.12166666666667,0.455,1.12166666666667,0.441666666666666}, + {1.122222,0.468888666666667,1.12166666666667,0.455}, + {1.12333333333333,0.483888666666667,1.122222,0.468888666666667}, + {1.12388866666667,0.498888666666667,1.12333333333333,0.483888666666667}, + {1.125,0.515,1.12388866666667,0.498888666666667}, + {1.12611066666667,0.530555333333333,1.125,0.515}, + {1.12666666666667,0.545555333333333,1.12611066666667,0.530555333333333}, + {1.12777733333334,0.560555333333333,1.12666666666667,0.545555333333333}, + {1.12833333333333,0.574444666666666,1.12777733333334,0.560555333333333}, + {1.12833333333333,0.587778,1.12833333333333,0.574444666666666}, + {1.12833333333333,0.599444666666667,1.12833333333333,0.587778}, + {1.12833333333333,0.61,1.12833333333333,0.599444666666667}, + {1.127222,0.619444666666666,1.12833333333333,0.61}, + {1.12666666666667,0.627222,1.127222,0.619444666666666}, + {1.125,0.633888666666667,1.12666666666667,0.627222}, + {1.12333333333333,0.638888666666666,1.125,0.633888666666667}, + {1.12166666666667,0.642778,1.12333333333333,0.638888666666666}, + {1.119444,0.646111333333333,1.12166666666667,0.642778}, + {1.117222,0.648888666666667,1.119444,0.646111333333333}, + {1.114444,0.651111333333333,1.117222,0.648888666666667}, + {1.11166666666667,0.652778,1.114444,0.651111333333333}, + {1.10833333333333,0.653888666666666,1.11166666666667,0.652778}, + {1.105,0.655,1.10833333333333,0.653888666666666}, + {1.10111066666667,0.655555333333333,1.105,0.655}, + {1.09777733333334,0.656111333333333,1.10111066666667,0.655555333333333}, + {1.08666666666667,0.655555333333333,1.09,0.656111333333333}, + {1.08277733333333,0.655,1.08666666666667,0.655555333333333}, + {1.079444,0.653888666666666,1.08277733333333,0.655}, + {1.07611066666667,0.652778,1.079444,0.653888666666666}, + {1.07333333333333,0.651111333333333,1.07611066666667,0.652778}, + {1.07055533333334,0.648888666666667,1.07333333333333,0.651111333333333}, + {1.06833333333333,0.646111333333333,1.07055533333334,0.648888666666667}, + {1.06611066666667,0.642778,1.06833333333333,0.646111333333333}, + {1.064444,0.638888666666666,1.06611066666667,0.642778}, + {1.06277733333333,0.633888666666667,1.064444,0.638888666666666}, + {1.06111066666667,0.627222,1.06277733333333,0.633888666666667}, + {1.06055533333334,0.619444666666666,1.06111066666667,0.627222}, + {1.059444,0.61,1.06055533333334,0.619444666666666}, + {1.059444,0.599444666666667,1.059444,0.61}, + {1.059444,0.587778,1.059444,0.599444666666667}, + {1.059444,0.574444666666666,1.059444,0.587778}, + {1.06,0.560555333333333,1.059444,0.574444666666666}, + {1.06111066666667,0.545555333333333,1.06,0.560555333333333}, + {1.06166666666667,0.530555333333333,1.06111066666667,0.545555333333333}, + {1.06277733333333,0.514444666666667,1.06166666666667,0.530555333333333}, + {1.06388866666667,0.498888666666667,1.06277733333333,0.514444666666667}, + {1.064444,0.483888666666667,1.06388866666667,0.498888666666667}, + {1.06555533333334,0.468888666666667,1.064444,0.483888666666667}, + {1.06611066666667,0.455,1.06555533333334,0.468888666666667}, + {1.06611066666667,0.441666666666666,1.06611066666667,0.455}, + {1.06611066666667,0.43,1.06611066666667,0.441666666666666}, + {1.06611066666667,0.419444666666667,1.06611066666667,0.43}, + {1.065,0.41,1.06611066666667,0.419444666666667}, + {1.064444,0.402222,1.065,0.41}, + {1.06277733333333,0.395555333333334,1.064444,0.402222}, + {1.06,0.387222,1.06277733333333,0.395555333333334}, + {1.05555533333334,0.382222,1.06,0.387222}, + {1.05055533333334,0.380555333333334,1.05555533333334,0.382222}, + {1.045,0.381111333333333,1.05055533333334,0.380555333333334}, + {1.03833333333334,0.383333333333334,1.045,0.381111333333333}, + {1.03166666666667,0.387222,1.03833333333334,0.383333333333334}, + {1.025,0.391111333333334,1.03166666666667,0.387222}, + {1.01833333333334,0.394444666666667,1.025,0.391111333333334}, + {1.01277733333334,0.397222,1.01833333333334,0.394444666666667}, + {1.00777733333334,0.398333333333333,1.01277733333334,0.397222}, + {1.00333333333333,0.397778,1.00777733333334,0.398333333333333}, + {1.00055533333333,0.395555333333334,1.00333333333333,0.397778}, + {0.998333333333335,0.393333333333333,1.00055533333333,0.395555333333334}, + {0.99666666666667,0.39,0.998333333333335,0.393333333333333}, + {0.995555333333333,0.386111333333333,0.99666666666667,0.39}, + {0.993888666666668,0.381666666666667,0.995555333333333,0.386111333333333}, + {0.992222000000003,0.376666666666667,0.993888666666668,0.381666666666667}, + {0.990555333333333,0.371111333333333,0.992222000000003,0.376666666666667}, + {0.988888666666668,0.365555333333334,0.990555333333333,0.371111333333333}, + {0.987777333333336,0.360555333333333,0.988888666666668,0.365555333333334}, + {0.987222000000003,0.355,0.987777333333336,0.360555333333333}, + {0.987222000000003,0.35,0.987222000000003,0.355}, + {0.988333333333334,0.345555333333333,0.987222000000003,0.35}, + {0.991110666666666,0.341666666666667,0.988333333333334,0.345555333333333}, + {0.995,0.338333333333334,0.991110666666666,0.341666666666667}, + {1.00055533333333,0.336111333333333,0.995,0.338333333333334}, + {1.00611066666667,0.334444666666667,1.00055533333333,0.336111333333333}, + {1.01333333333334,0.333333333333333,1.00611066666667,0.334444666666667}, + {1.02166666666667,0.332778,1.01333333333334,0.333333333333333}, + {1.03166666666667,0.331666666666666,1.02166666666667,0.332778}, + {1.042222,0.331111333333334,1.03166666666667,0.331666666666666}, + {1.06666666666667,0.330555333333334,1.054444,0.331111333333334}, + {1.13277733333334,0.331111333333334,1.12055533333333,0.330555333333334}, + {1.15555533333333,0.331666666666666,1.145,0.331111333333334}, + {1.16555533333333,0.332778,1.15555533333333,0.331666666666666}, + {1.17388866666667,0.333333333333333,1.16555533333333,0.332778}, + {1.18111066666667,0.334444666666667,1.17388866666667,0.333333333333333}, + {1.18666666666667,0.336111333333333,1.18111066666667,0.334444666666667}, + {1.192222,0.338333333333334,1.18666666666667,0.336111333333333}, + {1.19611066666667,0.341666666666667,1.192222,0.338333333333334}, + {1.19888866666667,0.345555333333333,1.19611066666667,0.341666666666667}, + {1.2,0.35,1.19888866666667,0.345555333333333}, + {1.2,0.355,1.2,0.35}, + {1.199444,0.360555333333333,1.2,0.355}, + {1.19833333333333,0.366111333333333,1.199444,0.360555333333333}, + {1.19666666666667,0.371111333333333,1.19833333333333,0.366111333333333}, + {1.195,0.376666666666667,1.19666666666667,0.371111333333333}, + {1.19333333333333,0.381666666666667,1.195,0.376666666666667}, + {1.19166666666667,0.386111333333333,1.19333333333333,0.381666666666667}, + {1.19,0.39,1.19166666666667,0.386111333333333}, + {1.18888866666667,0.393333333333333,1.19,0.39}, + {1.18666666666667,0.395555333333334,1.18888866666667,0.393333333333333}, + {0,0,0,0} +}; + +double Icon38[][4] = { + {0.166666666666667,0,0,1}, + {0.166666666666667,1,0.333333333333333,0}, + {0,0,0,0} +}; + +typedef double LineType[4]; +typedef LineType *IconType; +IconType Icons[] = { + Icon0, + Icon1, + Icon2, + Icon3, + Icon4, + Icon5, + Icon6, + Icon7, + Icon8, + Icon9, + Icon10, + Icon11, + Icon12, + Icon13, + Icon14, + Icon15, + Icon16, + Icon17, + Icon18, + Icon19, + Icon20, + Icon21, + Icon22, + Icon23, + Icon24, + Icon25, + Icon26, + Icon27, + Icon28, + Icon29, + Icon30, + Icon31, + Icon32, + Icon33, + Icon34, + Icon35, + Icon36, + Icon37, + Icon38, +}; + +double IconWidths[] = { + 0.5, + 0.5, + 0.333333333333333, + 0.5, + 0.5, + 0.541666666666667, + 0.541666666666667, + 0.166666666666667, + 0.5, + 0.5, + 0.707221999999999, + 0.75, + 0.318888666666666, + 0.106111333333333, + 0.312222, + 0.315555333333333, + 0.291666666666667, + 0.312777333333333, + 0.316111333333333, + 0.296666666666667, + 0.273333333333333, + 0.31, + 0.166666666666667, + 0.166666666666667, + 0.375, + 0.333333333333333, + 0.939999999999998, + 1, + 0.356111333333333, + 1, + 0.666666666666667, + 0.5, + 0.5, + 0.583333333333333, + 0.583333333333333, + 0.583333333333333, + 0.920556, + 1.2, + 0.333333333333333, +}; diff --git a/noatun-plugins/tippercanoe/main.cpp b/noatun-plugins/tippercanoe/main.cpp new file mode 100644 index 0000000..28a60ec --- /dev/null +++ b/noatun-plugins/tippercanoe/main.cpp @@ -0,0 +1,170 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <time.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <pwd.h> +#include <string.h> +#include "syna.h" +#include <math.h> +#include <unistd.h> +#include <fcntl.h> + +void Core::allocOutput(int w,int h) +{ +#if 0 + delete[] output; + delete[] lastOutput; + delete[] lastLastOutput; + output = new unsigned char[w*h*2]; + lastOutput = new unsigned char[w*h*2]; + lastLastOutput = new unsigned char[w*h*2]; + memset(output,32,w*h*2); + memset(lastOutput,32,w*h*2); + outWidth = w; + outHeight = h; +#endif + + outputBmp.size(w,h); + lastOutputBmp.size(w,h); + lastLastOutputBmp.size(w,h); + polygonEngine.size(w,h); + outWidth = w; + outHeight = h; +} + +void Core::toDefaults() +{ + fadeMode = Stars; + pointsAreDiamonds = true; + + brightnessTwiddler = 0.33; //0.125; + starSize = 0.125; + + fgRedSlider=0.0; + fgGreenSlider=0.5; + bgRedSlider=1.0; + bgGreenSlider=0.2; +} + +Core::Core() +{ + core=this; + int i; + + data=new sampleType[NumSamples*2+16]; + windY=windX=1; + windWidth=320; + windHeight=240; + for(i=0;i<NumSamples;i++) + { + negSinTable[i] = -sin(3.141592*2.0/NumSamples*i); + cosTable[i] = cos(3.141592*2.0/NumSamples*i); + bitReverse[i] = bitReverser(i); + } + + screen = new SdlScreen; + if (!screen->init(windX,windY,windWidth,windHeight,false)) + { + delete screen; + screen = 0; + return; + } + + allocOutput(outWidth,outHeight); + + setStarSize(starSize); + + interface=new Interface; +} + +Core::~Core() +{ + delete interface; + + screen->end(); + delete screen; +} + +bool Core::go() +{ + time_t timer = time(NULL); + + printf("%u\n", static_cast<SdlScreen *>(screen)->winID()); + fflush(stdout); + + int frames = 0; + while (1) + { + fade(); + + if (!calculate()) + break; + + if (!interface->go()) break; + + screen->show(); + frames++; + } + + timer = time(0) - timer; +/* if (timer > 10) + printf("Frames per second: %f\n", double(frames) / timer);*/ + return true; +} + +bool start() +{ +return true; +} + + +void error(const char *, bool) +{ + +/* fprintf(stderr, "synaescope: Error %s\n",str); + if (syscall) + fprintf(stderr,"(reason for error: %s)\n",strerror(errno));*/ + exit(1); +} +void warning(const char *, bool) +{ +/* fprintf(stderr, "synaescope: Possible error %s\n",str); + if (syscall) + fprintf(stderr,"(reason for error: %s)\n",strerror(errno));*/ +} + +#include <kinstance.h> +int main() +{ + fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) & ~O_NONBLOCK); + KInstance in("noatunsynaescope"); + core=new Core; + core->go(); + delete core; + exit(0); +} + + diff --git a/noatun-plugins/tippercanoe/polygon.h b/noatun-plugins/tippercanoe/polygon.h new file mode 100644 index 0000000..f711c03 --- /dev/null +++ b/noatun-plugins/tippercanoe/polygon.h @@ -0,0 +1,98 @@ +#include <string.h> + +template<class Pixel> +struct Bitmap { + int width, height, extra; + Pixel *data; + + Bitmap(int e=0) : extra(e), data(0) { }; + ~Bitmap() { delete[] data; }; + + void size(int w,int h) { + delete[] data; + width = w; + height = h; + data = new Pixel[w*h+extra]; + clear(); + } + + void clear() { + memset(data,0,sizeof(Pixel)*(width*height+extra)); + } +}; + +template<class Pixel, class Combiner, int superSampleShift> +struct PolygonEngine : public Bitmap<Pixel> { + PolygonEngine() : Bitmap<Pixel>(1) { } + +#define super (1<<superSampleShift) + void apply(Pixel *dest) { + Pixel sum=0; + int count = this->width*this->height; + Pixel *src = this->data; + while(count--) { + sum += *(src++); + if (sum) + *dest = Combiner::combine(sum,*dest); + dest++; + } + } + + void add(Pixel color,int x,int y) { + if (y < 0) return; + if (y >= this->height) return; + if (x < 0) x = 0; + if (x > this->width) x = this->width; + this->data[x+y*this->width] += color; + } + + /* Color is char[layers] */ + + // zwoosh, yknow, it goes... zwoosh an all these bars and lines and + // crap intersect. + Pixel colorTable[2][super+1]; + void pen(Pixel color) { + for(int i=0;i<super+1;i++) { + colorTable[0][i] = color*i; + colorTable[1][i] = -(color*i); + } + } + + void line(int x1,int y1,int x2,int y2) { + Pixel *colors; + if (y2 < y1) { + int temp; + temp = x2; x2 = x1; x1 = temp; + temp = y2; y2 = y1; y1 = temp; + colors = colorTable[1]; + } else { + if (y1 == y2) return; + + colors= colorTable[0]; + } + + int slope = (x1-x2 << 16)/(y1-y2); + int x = x1<<16, y = y1; + while(y < y2) { + add(colors[super-((x>>16)&(super-1))], + x>>(16+superSampleShift),y>>superSampleShift); + add(colors[(x>>16)&(super-1)], + 1+(x>>(16+superSampleShift)),y>>superSampleShift); + x += slope; + y++; + } + } + + void icon(double icon[][4],Pixel color,double x,double y, + double scaleX, double scaleY) { + pen(color); + x *= super; + y *= super; + scaleX *= super; + scaleY *= super; + for(int i=0;icon[i][1] != icon[i][3];i++) + line(int(icon[i][0]*scaleX+x),int(icon[i][1]*scaleY+y), + int(icon[i][2]*scaleX+x),int(icon[i][3]*scaleY+y)); + } +#undef super +}; diff --git a/noatun-plugins/tippercanoe/sdlwrap.cpp b/noatun-plugins/tippercanoe/sdlwrap.cpp new file mode 100644 index 0000000..7449aec --- /dev/null +++ b/noatun-plugins/tippercanoe/sdlwrap.cpp @@ -0,0 +1,197 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> + + 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. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <string.h> +#include "syna.h" +#include <iostream> +#include <SDL_syswm.h> +#include "SDL.h" + +static SDL_Surface *surface; + +SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) +{ + SDL_Surface *screen; + + /* Set the video mode */ + screen = SDL_SetVideoMode(w, h, bpp, flags); + + return screen; +} + +void SdlScreen::setPalette(unsigned char *palette) +{ + SDL_Color sdlPalette[256]; + + for(int i=0;i<256;i++) { + sdlPalette[i].r = palette[i*3+0]; + sdlPalette[i].g = palette[i*3+1]; + sdlPalette[i].b = palette[i*3+2]; + } + + SDL_SetColors(surface, sdlPalette, 0, 256); +} + +bool SdlScreen::init(int,int,int width,int height,bool fullscreen) +{ + Uint32 videoflags; + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + //char str[1000]; + //printf(str, "Could not initialize SDL library: %s\n",SDL_GetError()); + return false; + } + + SDL_WM_SetCaption("Synaescope","synaescope"); + + /* See if we try to get a hardware colormap */ + videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0); + + surface = CreateScreen(width, height, 8, videoflags); + if (!surface) + { + error("requesting screen dimensions"); + } + + core->outWidth = width; + core->outHeight = height; + + SDL_EnableUNICODE(1); + SDL_ShowCursor(0); + + return true; +} + +void SdlScreen::end(void) +{ + SDL_Quit(); +} + +bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) +{ + SDL_Event event; + + keyHit = 0; + + while ( SDL_PollEvent(&event) > 0 ) { + switch (event.type) { + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if ( event.button.state == SDL_PRESSED ) + mouseButtons |= 1 << event.button.button; + else + mouseButtons &= ~( 1 << event.button.button ); + mouseX = event.button.x; + mouseY = event.button.y; + break; + case SDL_MOUSEMOTION : + mouseX = event.motion.x; + mouseY = event.motion.y; + break; + case SDL_KEYDOWN: + /* Ignore key releases */ + if ( event.key.state == SDL_RELEASED ) { + break; + } + + if(event.key.keysym.sym == SDLK_SPACE) + { + SDL_WM_ToggleFullScreen(surface); + mouseButtons = 0; + } + + if (event.key.keysym.unicode > 255) + break; + + keyHit = event.key.keysym.unicode; + return true; + case SDL_QUIT: + //keyHit = 'q'; + //return false; + break; + default: + break; + } + } + return true; +} + +int SdlScreen::sizeUpdate(void) { return 0; } + +void SdlScreen::show(void) { + SDL_LockSurface(surface); + + register unsigned long *ptr2 = (unsigned long*)core->output(); + unsigned long *ptr1 = (unsigned long*)( surface->pixels ); + int i = core->outWidth*core->outHeight/4; + + do { + // Asger Alstrup Nielsen's (alstrup@diku.dk) + // optimized 32 bit screen loop + register unsigned int const r1 = *(ptr2++); + register unsigned int const r2 = *(ptr2++); + + //if (r1 || r2) { +#ifdef LITTLEENDIAN + register unsigned int const v = + ((r1 & 0x000000f0ul) >> 4) + | ((r1 & 0x0000f000ul) >> 8) + | ((r1 & 0x00f00000ul) >> 12) + | ((r1 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r2 & 0x000000f0ul) << 12) + | ((r2 & 0x0000f000ul) << 8) + | ((r2 & 0x00f00000ul) << 4) + | ((r2 & 0xf0000000ul))); +#else + register unsigned int const v = + ((r2 & 0x000000f0ul) >> 4) + | ((r2 & 0x0000f000ul) >> 8) + | ((r2 & 0x00f00000ul) >> 12) + | ((r2 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r1 & 0x000000f0ul) << 12) + | ((r1 & 0x0000f000ul) << 8) + | ((r1 & 0x00f00000ul) << 4) + | ((r1 & 0xf0000000ul))); +#endif + //} else ptr1++; + } while (--i); + + SDL_UnlockSurface(surface); + SDL_UpdateRect(surface, 0, 0, 0, 0); +} + +int SdlScreen::winID(void) +{ + SDL_SysWMinfo info; + info.version.major = SDL_MAJOR_VERSION; + info.version.minor = SDL_MINOR_VERSION; + info.version.patch = SDL_PATCHLEVEL; + info.subsystem = SDL_SYSWM_X11; + + info.info.x11.wmwindow = 0xdeadbeef; + SDL_GetWMInfo(&info); + return info.info.x11.wmwindow; +} diff --git a/noatun-plugins/tippercanoe/symbol.h b/noatun-plugins/tippercanoe/symbol.h new file mode 100644 index 0000000..53137c0 --- /dev/null +++ b/noatun-plugins/tippercanoe/symbol.h @@ -0,0 +1,1021 @@ +#define SYMBOLSWIDTH 586 +#define SYMBOLSHEIGHT 50 +unsigned char Symbols[586*50] = { + 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,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,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,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,0,0,0,0,0,0,0,0,132,241,72,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,13,30,37,31,24,5,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,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,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,0,0,0, + 0,0,0,0,0,0,0,0,132,254,237,72,0,0,0,0,0,0,0,0,0,0,0,1,7,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,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,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,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,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,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,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,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,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,10,87, + 176,225,244,246,244,238,206,135,39,1,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,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,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,0,0,0,0,0,0,0,0,132,254, + 254,236,73,0,0,0,0,0,0,0,0,0,0,3,154,138,58,9,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,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,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,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,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,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,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,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,36,211,80,0,0,0,0,0,0,0,0,0,0,0,2,77,204,252,254,254,254, + 254,254,254,254,254,239,145,21,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,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,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,0,0,0,0,0,0,0,132,254,255,245, + 215,72,0,0,0,0,0,0,0,0,0,0,115,254,249,213,138,58,8,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,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,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,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,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,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,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,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,36,212,253,80,0,0,0,0,0,0,0,0,0,0,7,136,247,254,254,254,254, + 254,254,254,254,254,254,254,254,208,52,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,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,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,0,0,0,0,0,0,132,254, + 255,225,66,210,72,0,0,0,0,0,0,0,0,0,40,244,254,254,254,249,214,137,57,8, + 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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,37,212,254,254,80,0,0,0,0,0,0,0,0,0,4,150,253,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,227,50,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,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,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, + 0,0,0,0,0,132,254,255,225,10,55,217,71,0,0,0,0,0,0,0,0,4,194,254,255,255, + 255,255,254,250,214,137,57,10,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,80,0,0, + 0,0,0,0,0,0,0,100,250,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,203,17,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,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,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,0,0,0,0,132,254,255,225,10,1,196,187,1, + 0,0,0,0,0,0,0,0,115,254,255,255,255,255,255,254,254,254,249,212,137,57, + 10,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,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,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,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,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, + 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,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,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,36,211,254,254,254,254,80,0,0,0,0,0,0,0,0,29,230,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,130,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,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,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,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,41,244,255,255, + 255,255,255,255,255,255,254,254,254,249,212,137,58,8,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,35,212,254,254,254, + 254,254,80,0,0,0,0,0,0,0,0,134,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,232,26,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, + 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,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,0,0,0,132,254,255, + 225,10,1,196,190,1,0,0,0,0,0,0,0,0,4,196,254,255,255,255,255,255,255,255, + 255,255,255,255,254,254,249,212,137,57,8,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,0, + 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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, + 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,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,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,36,212,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,16,225,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,255,255,255,254,112,0,0,0,0,0,0,0,3,12,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,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,16, + 0,0,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,0,0,111,155,155,111,0,0,0,16,148,155, + 155,58,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,132,254, + 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,115,253,254,255,255,255,255,255, + 255,255,255,255,255,255,255,254,254,254,250,194,15,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,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,38,179, + 38,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,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,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,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,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, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,62,251,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,254,182,1,0,0,0,0,0,0,18,171,19,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,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,1,162,44,0,0,0,0,0,37,159,11,0,0,0,0,0,0,0,0,0,0,1,182,254, + 254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,0,23,136,1,0,0,0,0, + 0,68,92,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 40,244,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254, + 232,64,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,0,0,0,0,0,0,9,151,253,245,99,1,0,0, + 6,50,106,155,166,174,166,162,115,52,11,0,0,0,38,213,254,213,39,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,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,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,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,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,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,108,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,255,254,223,9,0,0,0,0,0,0,18,239,185,19,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,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,1,197,219,45,0,0,0,0,38,246,166,11,0,0,0,0,0,0,0,0,0,1,182,254,254, + 182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,23,192,196,1,0,0,0,0,68, + 233,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 4,196,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,232,65, + 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,0,0,0,0,0,0,20,180,252,255,254,244,95,10,97, + 197,248,254,254,255,255,255,254,254,248,210,118,20,36,212,254,255,254,213, + 39,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,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,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,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,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, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,254,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,117,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,255,255,228,11,0,0,0,0,0,0,18,240,254,185, + 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,0,0,0,0,0,0,0,1,197,254,218,44,0,0,0,38,247,253,165,11,0,0,0,0,0,0, + 0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,23,192, + 254,196,1,0,0,0,67,234,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190, + 1,0,0,0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,255, + 255,254,233,65,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,0,0,0,0,0,0,19,186,254,255, + 254,254,225,74,34,220,254,254,255,255,255,255,255,255,255,254,254,248,95, + 44,205,254,254,255,254,213,38,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254, + 254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,122,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,228, + 11,0,0,0,0,0,0,18,240,254,254,186,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 17,187,197,197,197,197,197,195,46,0,0,0,0,0,0,0,142,197,197,197,197,197, + 197,107,0,0,0,0,0,0,0,81,196,197,197,197,197,197,197,197,197,197,197,197, + 197,197,197,197,197,197,197,197,197,194,37,0,0,0,0,0,0,1,197,254,254,219, + 44,0,0,38,247,254,253,165,11,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,0,0,22,192,254,254,196,1,0,0,66,235,254,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,39,246, + 254,255,255,255,255,255,255,255,255,255,255,254,234,64,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,0,0,0,0,0,0,17,187,254,255,254,254,204,34,0,0,47,222,254,254, + 255,255,255,255,255,255,254,248,113,2,0,18,175,254,254,255,254,214,36,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,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,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,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,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,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,36,211,254,254,254,254,254,254,254,254,254,254, + 254,80,0,0,0,0,0,0,0,114,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,255,255,255,254,227,11,0,0,0,0,0,0,18,240,255,254,254, + 185,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,220,43,0,38,247,254,254,253,166, + 11,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0, + 22,193,254,254,254,196,1,0,67,234,254,255,254,111,0,0,0,0,0,0,0,132,254, + 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,3,196,254,255,255,255,255,255, + 255,255,255,255,255,236,64,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,0,0,0,0,0,0,0,29, + 211,254,255,254,204,30,0,0,0,0,47,221,254,255,255,255,255,255,254,243,112, + 2,0,0,0,14,175,253,255,254,231,54,0,0,0,0,0,0,1,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,4,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, + 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,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,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,2,5,5,5,1, + 0,0,0,0,0,0,0,0,0,0,0,5,5,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,255, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,74,253,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,254, + 194,2,0,0,0,0,0,0,18,240,255,255,255,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254, + 254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254, + 254,254,219,44,38,247,254,254,254,253,166,11,0,0,0,0,0,1,182,254,254,182, + 1,0,0,27,243,254,254,96,0,0,0,0,0,0,23,192,254,254,254,254,196,1,68,233, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,231,53, + 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,0,0,0,0,0,0,0,0,36,210,254,225,33,0,0,0,0,0, + 0,48,221,254,254,255,255,254,237,78,1,0,0,0,0,0,15,198,254,231,61,0,0,0, + 0,0,0,0,73,213,214,214,214,214,214,214,214,213,214,214,214,214,214,214, + 214,214,214,214,214,214,214,214,213,214,214,214,214,214,214,214,214,214, + 156,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,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,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,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,8,145,213,214,213,133,5,0,0,0,0,0,0,0,0,0,88,211,213, + 214,181,24,0,0,0,0,3,11,11,11,11,11,11,11,40,210,254,255,255,254,254,254, + 254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,26,235,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,131,0,0,0,0, + 0,0,0,18,240,255,255,255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23, + 242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254, + 138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254, + 254,218,83,247,254,254,254,254,253,165,11,0,0,0,0,1,182,254,254,182,1,0, + 0,27,243,254,254,96,0,0,0,0,0,23,191,254,254,254,254,254,197,69,233,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,40,245,255,255,255,255,255,255,255,255,255,255,254,226, + 52,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,0,0,0,0,0,0,0,0,37,205,79,0,0,0,0,0,0,0, + 0,47,222,254,254,254,238,76,0,0,0,0,0,0,0,0,45,212,62,0,0,0,0,0,0,0,0,87, + 253,185,168,168,168,168,168,171,243,249,175,168,204,254,255,254,220,168, + 170,239,243,171,168,220,254,195,168,168,168,168,168,169,236,185,1,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,10,11,11,11,5, + 0,0,0,0,0,0,0,0,0,0,7,11,11,11,9,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,11,11,11,11,4,0,0,0,0,0,0,0,0,0,0,8,11,11,11,8,0,0,0,0,0, + 0,0,0,0,0,4,11,11,11,11,1,0,0,0,0,0,0,0,0,0,1,11,11,11,11,4,0,0,0,0,0,0, + 0,0,0,0,8,11,11,11,7,0,0,0,0,0,0,0,0,0,0,5,11,11,11,10,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,8,151,252,254,254,254,251,136,2,0, + 0,0,0,0,0,0,88,242,254,224,246,254,194,22,0,0,0,64,228,229,229,229,229, + 229,229,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,1,163,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,255,244,45,0,0,0,0,0,0,0,18,240,255,255,255,255,254, + 254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,237,253,254,254,254, + 254,254,253,165,11,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0, + 0,0,22,191,254,254,254,254,254,254,233,235,254,254,254,255,255,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,4,196, + 255,255,255,255,255,255,255,255,255,255,255,254,225,52,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,0,0,0,0,0,0,0,0,21,4,0,0,0,0,0,0,0,0,0,48,222,254,239,77,0, + 0,0,0,0,0,0,0,0,1,24,0,0,0,0,0,0,0,0,0,87,251,50,0,0,0,0,0,10,223,251,67, + 0,53,246,255,253,99,0,31,241,222,9,0,153,253,80,0,0,0,0,0,2,200,185,1,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,87,224,229, + 229,229,179,18,0,0,0,0,0,0,0,0,37,203,229,229,229,214,55,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,226,229,229,229,170,14,0,0,0,0,0,0, + 0,0,45,208,229,229,229,209,47,0,0,0,0,0,0,0,0,13,167,229,229,229,227,101, + 1,0,0,0,0,0,0,0,1,109,227,229,229,229,161,11,0,0,0,0,0,0,0,0,52,213,229, + 229,229,205,39,0,0,0,0,0,0,0,0,16,177,229,229,229,225,90,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,65,251,254,255,255,255,255,238,15, + 0,0,0,0,0,0,11,225,254,207,34,104,247,253,80,0,0,0,71,253,255,255,255,255, + 254,254,254,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,0,49,243,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,254,161,1,0,0,0,0,0,0,0,18,240,255,255,255,255,254, + 254,254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,253,165,11,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0, + 0,0,22,192,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0, + 0,116,253,254,255,255,255,254,235,219,254,255,255,255,254,226,53,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,21,21,21,21,21,21,21,21,21, + 21,21,21,21,21,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,114,2,0,0,0,0,0, + 0,0,0,0,47,207,76,0,0,0,0,0,0,0,0,0,0,80,130,0,0,0,0,0,0,0,0,0,87,251,50, + 0,0,0,0,0,9,223,254,161,0,5,193,254,235,28,0,116,254,222,9,0,153,254,79, + 0,0,0,0,0,1,200,185,1,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,88,242,254,254,255,255,254,185,18,0,0,0,0,0,0,37,214,254,254, + 255,255,254,228,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,246,254, + 254,255,255,254,175,14,0,0,0,0,0,0,44,220,254,254,255,255,254,222,47,0, + 0,0,0,0,0,13,172,254,254,255,255,254,246,101,1,0,0,0,0,0,1,109,248,254, + 254,255,255,253,165,11,0,0,0,0,0,0,53,226,254,254,255,255,254,216,39,0, + 0,0,0,0,0,17,182,254,254,255,255,254,243,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,69,253,254,255,255,255,255,239,16,0,0,0,0,0,0,12, + 230,212,32,0,1,113,253,81,0,0,0,71,253,254,255,255,255,254,255,255,255, + 255,254,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0, + 2,141,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 229,36,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,254,254,184,19,0, + 0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183, + 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0, + 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253, + 165,11,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,22,192,254,254,254, + 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,41,244,254,255,255,254, + 233,66,37,212,254,255,255,255,254,226,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,108,240,241,241,241,241,241,241,241,241,241,241,241,241, + 241,224,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,249,115,2,0,0,0,0,0,0,0, + 29,99,119,113,55,4,0,0,0,0,0,0,0,80,240,230,22,0,0,0,0,0,0,0,0,87,251,50, + 0,0,0,0,0,9,223,255,228,18,0,97,253,165,1,4,196,254,222,9,0,153,254,79, + 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,53,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,6,176,254,255,255,255,255,254,242,110,18,0,0,0,0,0,106,250,255, + 255,255,255,254,252,154,44,0,0,0,0,10,51,0,0,0,0,0,0,0,3,56,2,0,0,0,1,64, + 193,254,255,255,255,255,254,237,57,0,0,0,0,0,39,143,251,255,255,255,255, + 254,251,123,0,0,0,0,0,0,54,236,254,255,255,255,254,254,196,66,1,0,0,0,2, + 69,202,254,255,255,255,255,254,234,98,11,0,0,0,0,43,151,252,255,255,255, + 255,254,251,137,35,0,0,0,0,17,108,241,254,255,255,255,254,254,187,61,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255, + 255,254,255,255,254,255,254,255,254,254,254,254,254,254,254,254,254,254, + 80,0,0,0,0,0,0,0,0,0,13,192,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,244,84,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,253,165,11,1,182,254,254,182,1,0,0,27,243,254,254,96, + 0,23,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0, + 0,0,0,4,196,254,255,254,233,66,0,0,37,211,254,255,255,255,254,225,34,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53, + 248,254,248,115,2,0,0,0,0,3,112,186,152,158,153,173,163,23,0,0,0,0,0,80, + 240,254,253,85,0,0,0,0,0,0,0,0,87,251,50,0,5,36,37,37,45,228,255,252,79, + 0,20,226,73,0,40,244,254,222,9,0,153,253,105,37,15,0,1,32,38,208,185,1, + 0,0,0,0,0,0,0,0,0,0,0,0,8,150,240,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,186, + 253,253,253,253,242,144,228,183,19,0,0,0,0,3,126,249,253,253,253,251,170, + 192,227,55,0,0,10,161,237,76,0,0,0,0,0,3,123,243,112,2,0,1,98,241,163,201, + 253,253,253,253,238,78,0,0,0,0,0,45,219,201,162,250,253,253,253,250,140, + 6,0,0,0,0,0,0,0,75,237,253,253,253,253,203,161,242,102,1,0,2,109,243,157, + 207,253,253,253,253,234,143,236,164,11,0,0,52,225,194,169,251,253,253,253, + 250,158,206,214,40,0,0,17,181,229,143,241,253,253,253,253,196,167,240,91, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255, + 255,254,254,255,254,255,254,254,254,254,254,254,254,254,254,254,254,254, + 80,0,0,0,0,0,0,0,0,0,0,24,188,253,254,254,254,254,254,254,254,254,254,254, + 254,254,237,97,1,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,254, + 254,254,184,18,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0, + 0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,253,164,12,182,254,254,182,1,0,0,27,243,254,254,96, + 22,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255, + 255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,116,254,254,233,66,0,0,0,0,37,212,254,255,254,253,161,9,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,253,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,234,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109, + 254,254,254,248,115,2,0,0,0,113,161,193,249,253,252,224,149,171,14,0,0, + 0,80,239,254,255,254,154,0,0,0,0,0,0,0,0,87,251,50,0,38,240,247,247,247, + 253,255,254,165,1,0,115,12,0,121,254,255,222,9,0,153,254,249,247,102,0, + 8,214,247,253,185,1,0,0,0,0,0,0,0,0,0,0,0,2,145,252,254,241,58,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,17,67,68,68,68,93,228,254,254,171,2,0,0,0,0,3,59,68, + 68,68,73,190,254,254,226,27,3,156,253,254,237,48,0,0,0,0,115,250,254,247, + 86,0,87,245,254,251,135,67,68,68,68,46,0,0,0,0,0,34,219,254,254,192,67, + 68,68,68,62,6,0,0,0,0,0,0,0,0,0,45,68,68,68,68,149,251,254,245,74,0,99, + 247,254,250,126,67,68,68,68,105,237,254,253,146,0,41,225,254,254,182,66, + 68,68,68,78,205,254,254,211,15,7,179,254,254,229,78,68,68,68,68,158,252, + 254,243,63,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,69,253,254,254,254, + 254,254,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254, + 255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254, + 254,254,80,0,0,0,0,0,0,0,0,0,0,0,11,133,239,254,254,254,254,254,254,254, + 254,254,252,200,55,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,255,255,254,254,185,17,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253, + 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,253,165,193,254,254,182,1,0,0,27,243,254, + 254,118,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0, + 0,0,0,0,0,0,0,0,0,0,41,244,234,65,0,0,0,0,0,0,36,213,254,253,161,10,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 159,254,255,255,254,248,115,2,0,31,186,194,254,255,255,254,254,238,162, + 105,0,0,80,239,254,255,255,255,201,3,0,0,0,0,0,0,0,87,251,50,0,16,102,116, + 246,254,255,255,255,236,26,0,10,0,7,208,254,255,222,9,0,153,255,255,254, + 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,254,255,254,88,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0, + 0,0,23,241,254,255,250,46,9,223,254,255,253,75,0,0,0,1,184,254,255,254, + 122,0,152,254,255,255,154,0,0,0,0,0,0,0,0,0,0,73,253,254,255,224,10,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,254,255,254,108,0,166,254,255,254, + 140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,254, + 255,243,26,20,240,254,255,252,49,0,0,0,3,208,254,255,254,95,0,0,0,0,0,0, + 0,0,0,68,189,198,107,5,0,0,0,0,0,0,0,0,69,252,144,104,105,104,183,239,16, + 0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254, + 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,0,0,0,0,0,0,37,147,225,249,254,254,253,252,242,193,87,8,0,0,0, + 0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,254,254, + 184,18,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183, + 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0, + 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,252,254,254,182,1,0,0,27,243,254,254,242,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0, + 0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,176, + 65,0,0,0,0,0,0,0,0,36,211,160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,109,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,233,29,0,0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,249,115, + 2,103,151,250,255,255,255,255,255,254,169,172,3,80,240,254,255,255,255, + 255,211,5,0,0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,253,94,0, + 0,0,53,248,255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0, + 0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,9, + 223,255,255,253,75,0,0,0,1,184,255,255,254,122,0,153,255,255,255,154,0, + 0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,197,255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255, + 187,1,87,254,255,255,214,6,0,0,0,43,249,255,255,243,26,20,240,255,255,252, + 49,0,0,0,3,209,255,255,254,95,0,0,0,0,0,0,0,0,34,233,254,254,251,82,0,0, + 0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55, + 252,81,0,0,0,71,253,254,255,255,254,254,254,255,254,255,254,254,254,254, + 254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,52, + 83,84,84,73,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255, + 255,255,255,255,255,254,254,254,156,2,0,0,0,0,0,0,23,242,255,255,255,255, + 255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0, + 104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,182,1,0,0,27, + 243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190, + 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,26,10,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,218,254,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0, + 1,178,255,255,255,255,255,255,249,112,123,158,254,255,255,255,255,255,254, + 187,177,81,240,254,255,255,255,255,255,211,5,0,0,0,0,0,0,0,87,251,50,0, + 0,0,19,240,255,255,255,255,254,161,0,0,0,116,254,255,255,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,255,255,254, + 88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0, + 0,0,0,0,23,242,255,255,250,46,9,223,255,255,253,75,0,0,0,1,184,255,255, + 254,122,0,153,255,255,255,154,0,0,0,0,0,0,0,0,0,0,74,253,255,255,224,10, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,0,166,255,255, + 254,140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249, + 255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,0,0, + 0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,121,73,73,73,168, + 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,255,255,255, + 255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254, + 80,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,18,240,255,255,255,255,255,255,255,255,255,255,255,254,218,43,0,0, + 0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254, + 254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,182,1,0,0,27,243,254,254,252,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,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,108,251,253,253,253, + 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,230,29, + 0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,254,248,112,120,153,253, + 255,255,255,255,255,254,181,176,81,240,254,255,255,255,255,255,211,5,0, + 0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,254,113,0,0,0,69,251, + 255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0, + 0,0,0,0,5,211,254,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,89,254, + 255,255,211,4,0,0,0,0,0,0,1,1,1,23,240,255,255,250,45,9,221,254,255,253, + 75,1,1,1,2,181,254,255,254,122,0,150,254,255,254,154,1,1,1,1,0,0,0,0,0, + 0,71,253,255,255,224,10,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,194,254,255, + 254,108,0,163,254,255,254,140,1,1,1,1,116,254,255,254,187,1,84,253,255, + 255,214,7,1,1,1,42,248,255,255,242,26,19,238,255,255,252,49,0,0,0,3,206, + 254,255,254,94,0,0,0,0,0,0,0,0,47,244,254,254,253,104,0,0,0,0,0,0,0,0,69, + 253,252,252,252,252,253,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0, + 0,0,71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254, + 254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,3,81,94,94,94,94,94, + 94,94,94,94,93,19,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255, + 255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253, + 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,205,208,254,254,182,1,0,0,27,243,254, + 254,145,224,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,11,134,158,158,158,158,158,158,158,158,158,158,158,158, + 158,158,158,158,158,158,158,158,158,66,0,0,0,0,0,0,0,0,0,0,0,0,167,254, + 255,255,255,254,248,115,2,62,170,229,254,254,255,255,255,251,159,145,1, + 80,240,254,255,255,255,255,208,4,0,0,0,0,0,0,0,87,251,50,0,14,91,106,245, + 254,255,255,255,243,39,0,2,0,14,222,255,255,222,9,0,153,255,255,254,106, + 0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,90,243,254,214,32,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,54,184,190,190,190,155,195,254,250,124,1,0,0,0,0,17, + 161,190,190,190,176,157,250,254,187,14,1,101,246,254,210,142,190,190,190, + 188,140,235,254,229,52,0,46,222,254,240,136,187,190,190,190,127,4,0,0,0, + 0,14,174,254,252,162,169,190,190,190,167,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 75,239,254,224,43,0,54,227,254,236,135,187,190,190,190,148,208,254,247, + 100,0,17,184,254,251,156,173,190,190,190,169,168,253,253,167,7,2,123,250, + 254,190,15,0,0,0,0,85,242,254,218,35,0,0,0,0,0,0,0,0,1,115,233,237,163, + 14,0,0,0,0,0,0,0,0,69,252,114,63,63,63,164,239,16,0,0,0,0,0,0,12,230,146, + 0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,255,254,255,254,255, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,217, + 250,250,250,250,250,250,250,250,250,248,51,0,0,0,0,0,0,0,0,0,0,0,0,18,240, + 255,255,255,255,255,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,204,31,182,254,254, + 182,1,0,0,27,243,254,254,96,49,223,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10, + 1,196,190,1,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,31,245,252,250,250,250,250,250,250, + 250,250,250,250,250,250,250,250,250,250,250,250,250,254,127,0,0,0,0,0,0, + 0,0,0,0,0,0,121,254,255,255,254,248,115,2,0,5,170,149,242,254,254,254,252, + 181,184,44,0,0,80,239,254,254,255,254,166,0,0,0,0,0,0,0,0,87,251,50,0,38, + 243,250,250,250,254,254,254,187,4,0,82,6,0,144,254,254,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,90,204,37,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,55,227,254,254,255,255,253,168,191,126,3,0,0, + 0,0,17,184,254,254,255,255,254,207,157,184,19,0,0,1,101,203,155,250,254, + 254,255,254,238,141,211,57,0,0,0,47,207,142,233,254,254,255,255,252,137, + 5,0,0,0,0,14,173,164,199,254,254,255,255,254,195,24,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,76,208,49,0,0,0,55,210,141,237,254,254,255,254,250,157,202,104, + 1,0,0,17,182,159,205,254,254,255,255,254,194,168,166,12,0,0,3,123,186,21, + 0,0,0,0,0,0,86,205,41,0,0,0,0,0,0,0,0,0,0,0,15,16,1,0,0,0,0,0,0,0,0,0,69, + 252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71, + 253,254,255,254,254,254,254,254,254,255,254,254,254,254,254,254,254,254, + 254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,1,38,44,44,44,44,44,44,44,44, + 44,44,9,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255, + 254,218,44,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0, + 0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,251, + 47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,204,30,1,182,254,254,182,1,0,0,27,243,254,254,96,0,49,223, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111, + 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,31, + 245,137,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,62,243,127, + 0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,254,248,115,2,0,0,0,27,177,159,174,192, + 185,159,183,80,0,0,0,0,80,239,254,254,254,99,0,0,0,0,0,0,0,0,87,251,50, + 0,6,43,44,44,52,229,254,253,98,0,11,209,53,0,56,249,254,222,9,0,153,255, + 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,37,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,31,192,254,255,255,255,255,254,248,85,3,0,0,0,0,0, + 118,253,255,255,255,255,254,254,159,31,0,0,0,0,1,63,241,254,255,255,255, + 254,254,215,54,0,0,0,0,0,24,201,254,255,255,255,255,254,245,85,5,0,0,0, + 0,26,146,253,255,255,255,255,254,253,144,18,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 38,0,0,0,0,0,53,212,254,255,255,255,255,254,242,89,5,0,0,0,0,11,148,254, + 255,255,255,255,254,253,139,24,0,0,0,0,9,31,0,0,0,0,0,0,0,2,37,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0, + 0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255, + 255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,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,18,240, + 255,255,255,255,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,23,242,255, + 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0, + 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 254,254,254,254,254,254,254,254,254,254,254,204,30,0,1,182,254,254,182, + 1,0,0,27,243,254,254,96,0,0,49,223,254,254,254,254,254,254,254,254,254, + 254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196, + 190,1,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,31,245,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,21,241,127,0,0,0,0,0,0,0,0,0,0,0,0,14,216,254,248,115,2,0,0,0,0,0, + 18,115,175,181,180,148,47,0,0,0,0,0,0,80,239,254,239,36,0,0,0,0,0,0,0,0, + 87,251,50,0,0,0,0,0,9,223,255,238,28,0,75,252,146,0,8,212,254,222,9,0,153, + 255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,2,111,220, + 52,0,0,0,0,0,0,0,0,0,0,0,0,54,220,151,217,254,254,254,254,250,127,3,0,0, + 0,0,0,0,11,165,253,254,254,254,254,194,168,201,29,0,0,0,0,1,102,245,254, + 254,254,254,230,143,225,75,0,0,0,0,0,47,221,254,254,254,254,248,153,210, + 137,5,0,0,23,191,177,186,254,254,254,254,254,188,175,194,24,0,0,0,0,0,0, + 0,0,0,0,0,1,96,223,66,0,0,0,72,224,144,228,254,254,254,254,246,149,215, + 126,3,0,0,0,0,19,184,254,254,254,254,253,181,181,185,20,0,0,6,144,203,32, + 0,0,0,0,0,2,106,221,57,0,0,0,0,0,0,0,0,0,0,2,34,41,5,0,0,0,0,0,0,0,0,0, + 69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0, + 71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,254, + 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,4,118,137,137,137,137,137, + 137,137,137,137,135,28,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255, + 255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60, + 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254, + 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,204,31,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0, + 0,0,50,224,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,31,245,112,0,44,136,137,137,137,137,137,137,137,137,137,137,137,137,137, + 120,6,20,241,127,0,0,0,0,0,0,0,0,0,0,0,0,0,126,248,115,2,0,0,0,0,0,0,0, + 0,5,43,9,0,0,0,0,0,0,0,0,0,80,240,169,2,0,0,0,0,0,0,0,0,87,251,50,0,0,0, + 0,0,9,223,254,179,2,2,172,254,222,17,0,135,254,222,9,0,153,255,255,254, + 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,1,109,247,254,225,41,0, + 0,0,0,0,0,0,0,0,0,51,226,254,247,138,115,116,116,116,90,3,0,0,0,0,0,0,0, + 0,11,105,116,116,116,116,167,252,254,202,18,0,0,0,0,1,78,116,116,116,116, + 134,241,254,237,64,0,0,0,0,0,43,116,116,116,116,118,214,254,251,129,0,20, + 191,254,253,172,111,116,116,116,116,174,253,254,193,14,0,0,0,0,0,0,0,0, + 0,0,93,244,254,233,54,0,69,236,254,242,127,116,116,116,116,120,219,254, + 250,117,0,0,0,0,0,19,110,116,116,116,116,181,254,254,184,10,4,143,252,254, + 205,20,0,0,0,0,104,246,254,228,45,0,0,0,0,0,0,0,0,3,136,242,246,185,20, + 0,0,0,0,0,0,0,0,69,252,168,137,137,137,198,239,16,0,0,0,0,0,0,12,230,146, + 0,0,0,55,252,81,0,0,0,66,236,237,237,237,237,237,237,247,254,255,254,254, + 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,206, + 237,237,237,237,237,237,237,237,237,235,49,0,0,0,0,0,0,0,0,0,0,0,0,18,240, + 255,255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255, + 255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0, + 0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254, + 251,254,254,254,254,254,254,254,205,31,0,0,0,1,182,254,254,182,1,0,0,27, + 243,254,254,96,0,0,0,0,50,224,254,254,254,254,254,254,245,249,254,254,254, + 255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,29,228,104,2,170,254,254,254,254,253,252,251,249,251,252, + 254,254,254,254,250,76,19,224,118,0,0,0,0,0,0,0,0,0,0,0,0,0,22,76,2,0,0, + 0,0,0,0,0,0,0,78,233,114,2,0,0,0,0,0,0,0,0,0,57,43,0,0,0,0,0,0,0,0,0,87, + 251,50,0,0,0,0,0,9,223,253,89,0,36,240,254,252,80,0,48,247,222,9,0,153, + 254,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,212,254,255, + 254,88,0,0,0,0,0,0,0,0,0,0,138,254,255,254,167,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,23,241,254,255,250,46,0,0,0,0,0,0,0,0,0,1,183,254,255,254, + 122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,200,1,73,253,254,255,224,10,0,0, + 0,32,245,254,255,247,36,0,0,0,0,0,0,0,0,0,1,196,254,255,254,108,0,165,254, + 255,254,140,0,0,0,0,117,254,255,254,187,1,0,0,0,0,0,0,0,0,0,42,249,254, + 255,243,26,19,239,254,255,252,49,0,0,0,3,207,254,255,254,94,0,0,0,0,0,0, + 0,0,53,248,255,254,254,112,0,0,0,0,0,0,0,0,69,253,241,237,237,237,246,239, + 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,4,14,14,14,14,14,14,14, + 72,235,254,254,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0, + 0,0,0,0,0,0,0,0,12,14,14,14,14,14,14,14,14,14,14,2,0,0,0,0,0,0,0,0,0,0, + 0,0,18,240,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254, + 240,119,248,254,254,254,254,254,204,30,0,0,0,0,1,182,254,254,182,1,0,0, + 27,243,254,254,96,0,0,0,0,0,50,223,254,254,254,254,254,198,112,247,254, + 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,1,14,6,54,246,255,253,219,141,82,49,48,42,49,55,102,172, + 241,254,254,194,7,14,7,0,0,0,0,0,0,0,0,0,0,0,0,0,59,43,0,0,0,0,0,0,0,0, + 0,79,240,254,249,114,2,0,0,0,0,0,0,0,0,23,78,1,0,0,0,0,0,0,0,0,87,253,177, + 158,158,158,158,158,161,242,251,170,158,189,254,254,254,206,158,162,242, + 242,161,158,216,254,255,254,198,158,161,241,255,255,185,1,0,0,0,0,0,0,0, + 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0, + 0,0,1,184,255,255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74, + 253,255,255,224,10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197, + 255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0, + 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255, + 255,254,95,0,0,0,0,0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252, + 78,14,14,14,140,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0, + 0,0,0,0,0,0,0,70,235,254,255,254,254,254,254,254,254,254,254,254,254,80, + 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,18,240,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255, + 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0, + 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,240, + 81,38,247,254,254,254,254,205,30,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,50,223,254,254,254,254,196,4,111,247,254,255,255, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,2,171,254,254,177,18,0,0,0,0,0,0,0,0,1,59,238,255,251,76,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,64,232,199,14,0,0,0,0,0,0,0,78,239,254,255,255, + 248,113,2,0,0,0,0,0,0,4,163,244,96,1,0,0,0,0,0,0,0,75,221,221,221,221,221, + 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221, + 221,221,221,221,221,221,221,221,221,221,161,1,0,0,0,0,0,0,0,0,0,0,0,5,213, + 255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,0,0,1,184,255, + 255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,253,255,255,224, + 10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108, + 0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,0,0,0,0,0,0,0,43, + 249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0, + 0,0,0,0,0,0,27,224,254,254,248,71,0,0,0,0,0,0,0,0,69,252,68,0,0,0,134,239, + 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,70, + 235,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0, + 0,0,5,155,179,179,179,179,179,179,179,179,179,177,36,0,0,0,0,0,0,0,0,0, + 0,0,0,18,240,255,255,254,219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242, + 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138, + 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254, + 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,241,81, + 0,38,247,254,254,254,204,31,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243, + 254,254,96,0,0,0,0,0,0,0,50,224,254,254,254,196,1,2,111,248,254,255,254, + 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,54,246,254,254,129,1,0,0,0,0,0,0,0,0,0,15,223,255,254,193,6,0,0,0, + 0,0,0,0,0,0,0,0,0,64,232,254,253,165,11,0,0,0,0,0,78,239,254,255,255,255, + 254,248,113,2,0,0,0,0,4,129,251,254,244,96,1,0,0,0,0,0,0,2,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,6,0,0,0,0,0,0,0,0, + 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,241,255,255,250,46,0,0,0,0,0,0,0, + 0,0,1,183,254,255,254,122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,201,1,73, + 253,255,255,224,10,0,0,0,33,245,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197, + 255,255,254,108,0,166,254,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0, + 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,208,255, + 255,254,95,0,0,0,0,0,0,0,0,0,51,162,167,84,2,0,0,0,0,0,0,0,0,69,253,199, + 179,179,179,218,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,254,80,0,0, + 0,0,0,0,0,0,0,0,0,0,6,179,206,206,206,206,206,206,206,206,206,204,42,0, + 0,0,0,0,0,0,0,0,0,0,0,18,240,255,254,220,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,18,196,206,206,206,206,206,204,48,0,0,0,0,0,0,0,148,206,206,206,206, + 206,206,112,0,0,0,0,0,0,0,84,206,206,206,206,206,206,206,206,206,206,206, + 206,206,206,206,206,206,206,206,206,206,203,38,0,0,0,0,0,0,1,197,254,254, + 241,82,0,0,38,247,254,254,205,31,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0, + 27,243,254,254,96,0,0,0,0,0,0,0,0,50,224,254,254,196,1,0,2,111,248,254, + 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,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,2,170,254,255,255,242,137,48,10,1,1,1,1,3,19,76,187,253,255,255, + 250,75,0,0,0,0,0,0,0,0,0,0,0,39,231,254,254,254,253,164,11,0,0,0,78,238, + 254,255,255,255,255,255,254,248,113,2,0,0,4,129,250,255,255,254,244,72, + 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,0,0,0,1,127,251,254,234,49,0,0,0,0,0,0,0,0, + 0,0,63,236,254,250,143,136,142,142,141,91,1,0,0,0,0,0,0,0,0,6,113,142,142, + 142,131,178,253,254,215,23,0,0,0,0,0,0,0,0,0,0,98,246,254,243,75,0,0,0, + 0,0,34,138,142,142,141,126,224,254,253,145,0,26,206,254,254,182,123,142, + 142,142,130,185,254,254,207,17,0,0,0,0,0,0,0,0,0,0,109,249,254,240,64,0, + 84,242,254,247,130,139,142,142,141,128,229,254,252,132,0,0,0,0,0,0,0,0, + 0,0,13,185,254,254,198,12,5,161,253,254,220,114,141,142,142,137,152,250, + 254,237,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255, + 255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,3,3,3,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,254, + 219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,3,3,2,0,0,0,0,0,0, + 0,0,2,3,3,3,3,3,2,1,0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,2,0,0,0,0,0,0,0,1,197,254,240,82,0,0,0,38,247,254,205,30,0,0,0,0, + 0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,50, + 224,254,196,1,0,0,1,111,248,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1, + 196,190,1,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,54,245,255,255,255,254,254,247,225, + 200,199,199,199,204,237,252,254,255,255,255,254,192,6,0,0,0,0,0,0,0,0,0, + 0,7,151,252,254,255,254,253,188,37,0,75,239,254,255,255,255,255,255,255, + 255,254,248,113,2,22,160,251,254,255,255,254,185,17,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,0,0,0,0,4,130,231,66,0,0,0,0,0,0,0,0,0,0,0,0,68,232,158,207,254, + 254,254,254,248,108,1,0,0,0,0,0,0,6,147,252,254,254,254,254,183,179,215, + 40,0,0,0,0,0,0,0,0,0,0,0,1,102,236,92,1,0,0,0,0,35,211,254,254,254,254, + 245,146,222,155,8,0,0,31,206,188,174,253,254,254,254,253,176,186,208,33, + 0,0,0,0,0,0,0,0,0,0,0,2,113,234,81,0,0,0,88,235,148,220,254,254,254,254, + 242,144,227,144,6,0,0,0,0,0,0,0,0,0,0,0,18,186,200,28,0,0,10,162,219,148, + 247,254,254,254,254,209,156,232,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,146,0,0, + 0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,235,254,254,254,254,254, + 254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,6,6,6,6,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,18,240,218,44,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,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,1,197,240,82,0,0,0,0,38, + 247,205,30,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96, + 0,0,0,0,0,0,0,0,0,0,50,224,196,1,0,0,0,2,111,247,111,0,0,0,0,0,0,0,132, + 254,255,225,10,1,196,190,1,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,1,117,193,193,193,193, + 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,189,44, + 0,0,0,0,0,0,0,0,0,0,0,7,151,252,254,255,255,254,223,38,128,235,254,254, + 255,255,255,255,255,254,254,241,169,19,178,254,254,255,255,254,190,18,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,0,0,0,0,0,0,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 43,190,254,255,255,255,255,254,246,72,0,0,0,0,0,0,114,252,255,255,255,255, + 254,253,155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,0,0,0,0,0,10,196,254,255, + 255,255,255,254,243,93,8,0,0,0,0,25,142,253,255,255,255,255,254,253,145, + 26,0,0,0,0,0,0,0,0,0,0,0,0,0,2,37,0,0,0,0,0,51,209,254,255,255,255,255, + 254,240,85,6,0,0,0,0,0,0,0,0,0,0,0,0,0,17,23,0,0,0,0,10,99,245,255,255, + 255,255,254,254,193,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,147,0,0,0,55,252,81, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,254,254,254,254,80, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,205,216,216,216,215,147,7,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,18,204,45,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,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,1,183,82,0,0,0,0,0,38,198,31, + 0,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0, + 0,0,0,0,0,0,50,167,1,0,0,0,0,2,112,104,0,0,0,0,0,0,0,132,254,255,225,10, + 1,196,190,1,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,26,209,217,217,217,217,217,217,217, + 217,217,217,217,217,217,217,217,217,217,217,217,217,217,108,0,0,0,0,0,0, + 0,0,0,0,0,0,8,151,252,254,254,245,99,1,1,28,104,164,209,218,218,218,214, + 173,106,40,2,0,38,212,254,254,254,213,37,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,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,234,254,255,255,255,253, + 166,11,0,0,0,0,0,0,26,198,254,255,255,255,254,215,41,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,79,239,254,255,255,255,253,155,9,0,0,0,0,0,0, + 32,206,254,255,255,255,254,208,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,89,243,254,255,255,255,252,144,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,10,162,253,255,255,255,254,236,73,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,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12, + 230,222,45,0,3,131,253,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,236,254, + 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,86,165,166,166,147, + 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,35,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,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,41,0,0,0,0, + 0,0,15,27,0,0,0,0,0,0,0,0,0,0,0,0,119,166,166,118,0,0,0,17,158,166,165, + 62,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,2,17,0,0,0,0,0,0,0,132,254,255, + 225,10,1,196,190,1,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,20,159,166,166,166,166,166, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,82,0,0, + 0,0,0,0,0,0,0,0,0,0,0,8,151,252,245,99,1,0,0,0,0,0,6,7,7,7,7,1,0,0,0,0, + 0,38,213,254,213,39,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,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,67,164,166,166,166,137,11,0,0,0,0,0,0,0,0,26, + 153,166,166,166,160,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 75,165,166,166,166,130,9,0,0,0,0,0,0,0,0,32,156,166,166,166,157,34,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,165,166,166,166,123,7,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,135,166,166,166,165,70,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,61,250,255,255,255,255, + 255,237,15,0,0,0,0,0,0,10,221,254,219,49,124,250,253,79,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,70,237,254,254,254,254,254,80,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,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,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,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,132,254,255,225, + 10,1,196,190,1,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,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,7,147,99,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,38,179,38,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,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,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,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,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,4,131,251, + 254,254,254,249,116,1,0,0,0,0,0,0,0,69,237,254,236,250,254,178,15,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,80,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,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,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, + 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,132,254, + 255,225,10,1,196,190,1,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,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,2,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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,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,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,4,105,144, + 145,144,96,2,0,0,0,0,0,0,0,0,0,64,144,145,145,129,14,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,80,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,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,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,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,132,254,255,225,10, + 1,196,190,1,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,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,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,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,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,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,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,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,72, + 236,254,253,80,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,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, + 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,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,132,254,255,225,10,12,209,141,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,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,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,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,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,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,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,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,71,237,254,80,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,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,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,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,132,254,255, + 224,21,163,155,8,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,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,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,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,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,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,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,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,71,236,80,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,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,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,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,132,254,255,233,173,155,8,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,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,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,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,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,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,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,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,71,63,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,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,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,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,132,254,255, + 252,155,9,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,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,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,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,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,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,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,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,1,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,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,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,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,132,254,253,155,9,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,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,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,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,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,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,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,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,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, + 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,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,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,132,253,156,9,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,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,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, + 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,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,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,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,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,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,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,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,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, + 132,160,8,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,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,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,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,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,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,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,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,}; diff --git a/noatun-plugins/tippercanoe/syna.h b/noatun-plugins/tippercanoe/syna.h new file mode 100644 index 0000000..d4ea60e --- /dev/null +++ b/noatun-plugins/tippercanoe/syna.h @@ -0,0 +1,247 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + + 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. +*/ + +#ifndef SYNA_H +#define SYNA_H + +#include "config.h" +#include <qptrlist.h> +#include "polygon.h" + +//************************************** +// For the incurably fiddle prone: + +// log2 of sample size +#define LogSize 9 + +// overlap amount between samples. Set to 1 or 2 if you have a fast computer +#define Overlap 1 + +// Brightness +#define Brightness 150 + +// Sample frequency +#define Frequency 22050 + +//*************************************** + +#define DefaultWidth 260 +#define DefaultHeight 260 + +#define NumSamples (1<<LogSize) +#define RecSize (1<<LogSize-Overlap) + +#ifndef __linux__ +#warning This target has not been tested! +#endif + +#ifdef __FreeBSD__ +#include <machine/endian.h> +typedef unsigned short sampleType; +#else +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_ENDIAN_H +#include <endian.h> +#elif defined(_BIG_ENDIAN) +#define BIG_ENDIAN 1 +#define BYTE_ORDER BIG_ENDIAN +#endif +typedef short sampleType; +#endif + +#if BYTE_ORDER == BIG_ENDIAN +#define BIGENDIAN +#else +#define LITTLEENDIAN +#endif + +void error(const char *str, bool syscall=false); +void warning(const char *str, bool syscall=false); + +enum SymbolID +{ + Speaker, Bulb, + Play, Pause, Stop, SkipFwd, SkipBack, + Handle, Pointer, Open, NoCD, Exit, + Zero, One, Two, Three, Four, + Five, Six, Seven, Eight, Nine, + Slider, Selector, Plug, Loop, Box, Bar, + Flame, Wave, Stars, Star, Diamond, Size, FgColor, BgColor, + Save, Reset, TrackSelect, + NotASymbol +}; + +// wrap +struct BaseScreen +{ + virtual bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen) = 0; + virtual void setPalette(unsigned char *palette) = 0; + virtual void end() = 0; + virtual int sizeUpdate() = 0; + virtual bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) = 0; + virtual void show() = 0; +}; + +struct SdlScreen : public BaseScreen +{ + bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen); + void setPalette(unsigned char *palette); + void end(); + int sizeUpdate(); + bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit); + void show(); + int winID(); +}; + +// core +class Combiner +{ +public: + static unsigned short combine(unsigned short a,unsigned short b) + { + //Not that i want to give the compiler a hint or anything... + unsigned char ah = a>>8, al = a&255, bh = b>>8, bl = b&255; + if (ah < 64) ah *= 4; else ah = 255; + if (al < 64) al *= 4; else al = 255; + if (bh > ah) ah = bh; + if (bl > al) al = bl; + return ah*256+al; + } +}; + +class Interface; + +class Core +{ +public: + Core(); + ~Core(); + + inline unsigned char *output() { return (unsigned char*)outputBmp.data; } + inline unsigned char *lastOutput() { return (unsigned char*)lastOutputBmp.data; } + inline unsigned char *lastLastOutput() { return (unsigned char*)lastLastOutputBmp.data; } + + void allocOutput(int w,int h); + void interfaceInit(); + //void coreInit(); + void setStarSize(double size); + void setupPalette(double); + + bool go(); + bool calculate(); + + void toDefaults(); + void fade(); + void fadeFade(); + inline void fadePixelWave(int x, int y, int where, int step); + void fadeWave(); + inline void fadePixelHeat(int x,int y,int where,int step); + void fadeHeat(); + + void fft(double*, double*); + + inline void addPixel(int x, int y, int br1, int br2); + inline void addPixelFast(unsigned char *p, int br1, int br2); + inline unsigned char getPixel(int x, int y, int where); + + static int bitReverser(int); + + +public: + BaseScreen *screen; + Interface *interface; + sampleType *data; + Bitmap<unsigned short> outputBmp, lastOutputBmp, lastLastOutputBmp; + PolygonEngine<unsigned short,Combiner,2> polygonEngine; + + double cosTable[NumSamples], negSinTable[NumSamples]; + int bitReverse[NumSamples]; + int scaleDown[256]; + int maxStarRadius; + + +public: + int outWidth, outHeight; + SymbolID fadeMode; + bool pointsAreDiamonds; + + double brightnessTwiddler; + double starSize; + + double fgRedSlider, fgGreenSlider, bgRedSlider, bgGreenSlider; + SymbolID state; + + int windX, windY, windWidth, windHeight; +}; + +extern Core *core; + +inline unsigned char Core::getPixel(int x,int y,int where) +{ + if (x < 0 || y < 0 || x >= outWidth || y >= outHeight) return 0; + return lastOutput()[where]; +} + + +struct Button; + +struct UIObject +{ + int visibleMask, activeMask; + double x,y,width,height; + bool active; + + virtual int go(bool mouseDown,bool mouseClick,bool mouseOver, + double x, double y, double scale, char &hotKey, int &action) + = 0; + + virtual void handleKey(char key, int &action) = 0; + void changed(); +}; + +class Interface +{ +public: + Interface(); + ~Interface(); + bool go(); + void syncToState(); + void setupPalette(); + + void putString(char *string,int x,int y,int red,int blue); + +protected: + void addUI(UIObject *obj); + void changeState(int transitionSymbol); + +private: + QPtrList<UIObject> uiObjects; + Button *stateButton, *starsButton, *waveButton, *flameButton, *starButton, *diamondButton; + int mouseButtons; + + int visibleMask; + int mouseX, mouseY, lastX, lastY, countDown; + +}; + + +#endif + diff --git a/noatun-plugins/tippercanoe/synaescope.cpp b/noatun-plugins/tippercanoe/synaescope.cpp new file mode 100644 index 0000000..8ccf6c3 --- /dev/null +++ b/noatun-plugins/tippercanoe/synaescope.cpp @@ -0,0 +1,103 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> + + this file is X11 source + */ + +#include <noatun/conversion.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kprocess.h> +#include <kstandarddirs.h> +#include <qframe.h> +#include <qregexp.h> +#include <noatun/app.h> +#include "syna.h" +#include "synaescope.h" + +extern "C" Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("tippecanoe"); + return new SynaeScope(); +} + +SynaeScope::SynaeScope() + : QWidget(0, 0, WType_TopLevel | WStyle_DialogBorder | WRepaintNoErase | WMouseNoMask) + , StereoScope(50) + , Plugin() +{ + setSamples(bufferSize); + mBuffer = new char[bufferSize * 16 * 2]; + setFixedSize(320, 240); + setCaption(i18n("Tippecanoe - Noatun")); + setIcon(SmallIcon("noatun")); + show(); + embed = new QXEmbed(this); + embed->move(0,0); + embed->resize(320, 240); + embed->show(); + embed->setFocus(); +} + +SynaeScope::~SynaeScope() +{ + connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *))); + napp->pluginMenuRemove(pluginMenuItem); +} + +void SynaeScope::init() +{ + connect(&process, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(read(KProcess *, char *, int))); + pluginMenuItem = napp->pluginMenuAdd(i18n("Toggle Tippecanoe"), this, SLOT(toggle(void))); + + process << KStandardDirs::findExe("noatuntippecanoe.bin"); + + // Note that process.start() will fail if findExe fails, so there's no real need + // for two separate checks. + if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout))) + { + KMessageBox::error(0, i18n("Unable to start noatuntippecanoe.bin. Check your installation.")); + unload(); + } + else + start(); + +} + +void SynaeScope::scopeEvent(float *left, float *right, int size) +{ + if(!isHidden() && process.isRunning()) + { + Conversion::convertStereo2FloatToI16le((unsigned long)size, left, + right, (unsigned char*)mBuffer); + + process.writeStdin((char *)mBuffer, bufferSize*2); + } +} + +void SynaeScope::read(KProcess *, char *buf, int) +{ + QString num = QString::fromLatin1(buf); + num = num.left(num.find(QRegExp("\\s"))); + id = num.toInt(); + embed->embed(id); +} + +void SynaeScope::processExited(KProcess *) +{ + unload(); +} + +void SynaeScope::toggle(void) +{ + if(isHidden()) + show(); + else + hide(); +} + +#include "synaescope.moc" diff --git a/noatun-plugins/tippercanoe/synaescope.h b/noatun-plugins/tippercanoe/synaescope.h new file mode 100644 index 0000000..da6855b --- /dev/null +++ b/noatun-plugins/tippercanoe/synaescope.h @@ -0,0 +1,46 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + Copyright (C) 2001 Neil Stevens<multivac@fcmail.com> + + this file is X11 source + */ + +#ifndef SYNAESCOPE_H +#define SYNAESCOPE_H + +#include <noatun/conversion.h> +#include "syna.h" +#include <noatun/plugin.h> +#include <kprocess.h> +#include <qwidget.h> +#include <qxembed.h> + +class SynaeScope : public QWidget, public StereoScope, public Plugin +{ +Q_OBJECT + +public: + SynaeScope(); + virtual ~SynaeScope(); + + void init(); + +private slots: + void processExited(KProcess *); + void toggle(void); + void read(KProcess *, char *, int); + +protected: + virtual void scopeEvent(float *left, float *right, int bands); + +private: + char *mBuffer; + static const int bufferSize=512; + KProcess process; + int pluginMenuItem; + QXEmbed *embed; + WId id; +}; + +#endif diff --git a/noatun-plugins/tippercanoe/tippecanoe.plugin b/noatun-plugins/tippercanoe/tippecanoe.plugin new file mode 100644 index 0000000..a7fb06d --- /dev/null +++ b/noatun-plugins/tippercanoe/tippecanoe.plugin @@ -0,0 +1,72 @@ +Filename=noatuntippecanoe.la +Author=Neil Stevens, Charles Samuels, Paul Francis Harrison +Site=http://noatun.kde.org/ +Email=multivac@fcmail.com +Type=visualization +License=GPL +Name=Tippecanoe +Name[af]= tippecanoe +Name[hi]=टिपर-केनॉय +Name[it]=Tippercanoe +Name[ne]=टिपेकोन +Name[ru]=Каноэ +Name[ta]=டிப்கானோ +Name[tg]=Каноэ +Comment=A visualization you can play with for hours. +Comment[af]='n visualiseering jy kan speel met vir ure. +Comment[ar]=مرئية يمكنك اللعب بها لساعات. +Comment[az]=Saatlarca oynaya biləvəyiniz əyani efekt +Comment[bg]=Забавна приставка за визуализация за Noatun +Comment[bs]=Vizualizacija sa kojom se možete igrati satima. +Comment[ca]=Un visualitzador que pot reproduir durant hores. +Comment[cs]=Vizualizace, se kterou si vyhrajete +Comment[cy]=Dychmygydd y gallwch chwarae efo fo am oriau +Comment[da]=En visualisering som du kan bruge timer på. +Comment[de]=Eine Visualisierung, mit der Sie viele Stunden spielen können. +Comment[el]=Μια οπτικοποίηση με την οποία μπορεί να παίζεις για ώρες. +Comment[en_GB]=A visualisation you can play with for hours. +Comment[eo]=Vidadilo kun kiu vi povas ludi horlonge. +Comment[es]=Una forma de visualización en la que puede reproducir durante horas. +Comment[et]=Ostsilloskoop, millega võib jännata tundide kaupa. +Comment[eu]=Hainbat ordutaz ibil daitekeen bisualizazioa. +Comment[fa]=تجسمی که میتوانید ساعتها اجرا کنید. +Comment[fi]=Visuaalisaatio, jota voit soittaa tunteja +Comment[fr]=Un affichage avec lequel vous pouvez jouer pendant des heures +Comment[fy]=In fisualisaasje om oeren mei te boartsjen. +Comment[ga]=Amharcléiriú ar féidir súgradh leis ar feadh uaireanta an chloig. +Comment[gl]=Unha visualización que o usuário pode reproducir durante horas. +Comment[he]=המחשה שאפשר לשחק איתה שעות +Comment[hi]=एक विज़ुअलाइज़ेशन जिसके साथ आप घंटों खेल सकते हैं +Comment[hr]=Vizualizacija koju možete gledati satima +Comment[hu]=Egy sokoldalú vizualizációs modul +Comment[is]=Sjónræn brella sem hægt er að leika sér með lengi. +Comment[it]=Una visualizzazione con cui puoi giocare per ore +Comment[ja]=何時間でも遊べる視覚効果 +Comment[ka]=ვიზუალიზაცია, რომლითაც საათობით შეგიძლიათ თამაში +Comment[kk]=Арбайтың көрініс. +Comment[km]= រូបភាពមើលឃើញមួយ ដែលអ្នកអាចចាក់បានច្រើនម៉ោង ។ +Comment[lt]=Vizualizacija, su kuria Jūs galite žaisti ištisas valandas. +Comment[mk]=Визуелизација што може да ја гледате со часови. +Comment[ms]=Visualisasi yang anda boleh main berjam-jam.. +Comment[nb]=En visualisering du kan leke med i timer. +Comment[nds]=En Filmmaker, mit den Du över Stünnen spelen kannst. +Comment[ne]=तपाईँले एक घण्टासम्म प्ले गर्न सक्ने दृष्टीकरण । +Comment[nl]=Een visualisatie waarmee u uren kunt spelen. +Comment[nn]=Ei visualisering du kan leika med i fleire timar. +Comment[pl]=Wizualizacja, którą można się bawić godzinami. +Comment[pt]=Uma visualização que o utilizador pode reproduzir durante horas. +Comment[pt_BR]=Uma visualização que você pode reproduzir. +Comment[ro]=Un modul de vizualizare cu care vă puteţi juca ore întregi +Comment[ru]=Зрительный образ, который вы можете рассматривать часами +Comment[sk]=Vizualizácia s ktorou sa môžete hrať celé hodiny. +Comment[sl]=Vizualizacija, s katero se lahko igrate ure in ure. +Comment[sr]=Визуелизација којом се можете играти сатима. +Comment[sr@Latn]=Vizuelizacija kojom se možete igrati satima. +Comment[sv]=Visualisering man kan leka med i flera timmar +Comment[ta]=நீங்கள் பலநேரம் வாசிக்கக்கூடிய காட்சியமைப்பு. +Comment[tg]=Намуди тамошобин, ки метавонед ӯро соатҳо тамошо кунед. +Comment[tr]=Saatlerce oynayabileceğiniz bir görselleştirme. +Comment[uk]=Втулок візуалізації, з яким ви зможете гратись годинами. +Comment[vi]=Ô xem chơi dễ dàng. +Comment[xh]=Umboniso wengqondo onokuwudlala ngawo iiyure. +Comment[zh_CN]=可以长时间播放的视觉化显示 diff --git a/noatun-plugins/tippercanoe/ui.cpp b/noatun-plugins/tippercanoe/ui.cpp new file mode 100644 index 0000000..e260d18 --- /dev/null +++ b/noatun-plugins/tippercanoe/ui.cpp @@ -0,0 +1,507 @@ +#include "font.h" +#include "icons.h" +#include "syna.h" +#include <math.h> +#include <stdlib.h> +#include <kconfig.h> + +#define output core->output() + +static void putChar(unsigned char character,int x,int y,int red,int blue) +{ + unsigned short *ptr = ((unsigned short *)output) + x + y*core->outWidth; + unsigned short put = (blue<<8)+red; + int i,j; + for(i=0;i<8;i++,ptr += core->outWidth-8) + for(j=0;j<8;j++,ptr++) + if (font[character*8+i] & (128>>j)) + *ptr = put; +} + +void Interface::putString(char *string,int x,int y,int red,int blue) +{ + if (x < 0 || y < 0 || y >= core->outHeight-8) + return; + for(;*string && x <= core->outWidth-8;string++,x+=8) + putChar((unsigned char)(*string),x,y,red,blue); +} + +void UIObject::changed() +{ +} + +struct Button : public UIObject +{ + int icon; + char hotKey; + + bool passive, bright; + + Button(int _am,int _vm,double _x,double _y, + double _size,int _icon,char _key = 0, + bool _passive = false, bool _bright = false) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = height = _size; + icon = _icon; hotKey = _key; passive = _passive; bright = _bright; + } + + int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseDown; + (void)_x; + (void)_y; + core->polygonEngine.icon( + Icons[icon], + (bright ? 0x0202 : 0x0100), + x*scale,y*scale,width*scale,height*scale); + + if (mouseOver && !passive) + core->polygonEngine.icon( + Icons[icon], + 0x0002, + (x-IconWidths[icon]*width/2)*scale, + (y-height/2)*scale,width*scale*2,height*scale*2); + + if (mouseOver && mouseClick && !passive) + action = icon; + + if (mouseOver && !passive && hotKey) + _hotKey = hotKey; + + return 0; + } + + void handleKey(char key, int &action) + { + if (key == hotKey && !passive) + action = icon; + } +}; +#define BarWidth 0.1 +struct SliderBar : public UIObject +{ + double *value; + char leftKey, rightKey; + + typedef void (Core::*Callback)(double v); + Callback callback; + + SliderBar(int _am,int _vm,double _x,double _y, + double _width,double _height, double *_value, + Callback _callback, char _leftKey, char _rightKey) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = _width; height = _height; + value = _value; callback = _callback; + leftKey = _leftKey; rightKey = _rightKey; + } + + int go(bool mouseDown,bool mouseClick,bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseClick; + (void)_y; + (void)action; + core->polygonEngine.icon( + Icons[Bar], + 0x0100, + x*scale,y*scale,width*scale,height*scale); + core->polygonEngine.icon( + Icons[Slider], + 0x0200, + (x+*value*width-IconWidths[Slider]*height/2)*scale, + y*scale,height*scale,height*scale); + + if (mouseOver) + { + double newValue = (_x)/(width); + if (newValue < 0.0) newValue = 0.0; + if (newValue > 1.0) newValue = 1.0; + + core->polygonEngine.icon( + Icons[Selector], + 0x0002, + (x+newValue*width-IconWidths[Selector]*height/2)*scale, + y*scale,height*scale,height*scale); + + if (mouseDown) + { + *value = newValue; + + if (callback) + (core->*callback)(*value); + changed(); + } + + if (mouseOver) + _hotKey = (newValue < *value ? leftKey : rightKey); + } + + return 0; + } + void handleKey(char key, int &action) + { + (void)action; + if (key == leftKey || key == rightKey) + { + if (key == leftKey) + { + if (*value == 0.0) return; + *value -= 0.05; + if (*value < 0.0) *value = 0.0; + } + else + { + if (*value == 1.0) return; + *value += 0.05; + if (*value > 1.0) *value = 1.0; + } + + if (callback) + (core->*callback)(*value); + changed(); + } + } +}; +#undef BarWidth + + +struct PopperUpper : public UIObject +{ + int maskAdd; + + PopperUpper(int _am,int _vm,double _x,double _y, + double _width,double _height, int _maskAdd) + { + activeMask = _am; visibleMask = _vm; + x = _x; y = _y; width = _width; height = _height; + maskAdd = _maskAdd; + } + + int go(bool mouseDown,bool mouseClick, bool mouseOver, + double _x, double _y, double scale, char &_hotKey, int &action) + { + (void)mouseDown; + (void)mouseClick; + (void)_x; + (void)_y; + (void)_hotKey; + (void)action; + + core->polygonEngine.icon( + Icons[Box], + 0x0200, + x*scale,y*scale,width*scale,height*scale); + + return mouseOver ? maskAdd : 0; + } + + void handleKey(char key, int &action) + { + (void)key; + (void)action; + } +}; + +void Interface::setupPalette() +{ +#define BOUND(x) ((x) > 255 ? 255 : (x)) +#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + int i; + unsigned char palette[768]; + + double scale, fgRed, fgGreen, fgBlue, bgRed, bgGreen, bgBlue; + fgRed = core->fgRedSlider; + fgGreen = core->fgGreenSlider; + fgBlue = 1.0 - MAX(core->fgRedSlider,core->fgGreenSlider); + scale = MAX(MAX(fgRed,fgGreen),fgBlue); + fgRed /= scale; + fgGreen /= scale; + fgBlue /= scale; + + bgRed = core->bgRedSlider; + bgGreen = core->bgGreenSlider; + bgBlue = 1.0 - MAX(core->bgRedSlider, core->bgGreenSlider); + scale = MAX(MAX(bgRed, bgGreen), bgBlue); + bgRed /= scale; + bgGreen /= scale; + bgBlue /= scale; + + for(i=0;i<256;i++) + { + int f = i&15, b = i/16; + palette[i*3+0] = PEAKIFY(b*bgRed*16+f*fgRed*16); + palette[i*3+1] = PEAKIFY(b*bgGreen*16+f*fgGreen*16); + palette[i*3+2] = PEAKIFY(b*bgBlue*16+f*fgBlue*16); + } + core->screen->setPalette(palette); +#undef BOUND +#undef PEAKIFY +#undef MAX +} + +//Visible mask +#define ALL 1 +#define BUTTONBAR 2 +#define TRACKBAR 4 +#define DIALBAR 8 +#define VOLUMEBAR 16 + +//Active mask +//#define ALL 1 +#define PLAYING 2 +#define PAUSED 4 +#define STOPPED 8 +#define NOCD 32 +#define OPEN 64 + + +// TODO Lay things out with parents and a stack, like QT +Interface::Interface() +{ + static const float IconSize=0.2; + static const float SliderSize=0.125; + + { + KConfig config("noatun/synaescope", false, false, "data"); + core->fadeMode=(SymbolID)config.readNumEntry("mode", (int)Stars); + core->pointsAreDiamonds=config.readBoolEntry("diamonds", false); + core->brightnessTwiddler=config.readDoubleNumEntry("brightness", .4); + core->starSize=config.readDoubleNumEntry("starsize", .1); + core->fgRedSlider=config.readDoubleNumEntry("FGRed", 0.0); + core->fgGreenSlider=config.readDoubleNumEntry("FGgreen", 1.0); + core->bgRedSlider=config.readDoubleNumEntry("BGRed", 0.0); + core->bgGreenSlider=config.readDoubleNumEntry("BGGreen", 0.0); + } + + uiObjects.setAutoDelete(true); + + double x,y; + + //addUI(new Button(ALL,0.025,0.525,IconSize, 0, 'x')); +// addUI(new PopperUpper(ALL,ALL,0,0,0.25,0.25, BUTTONBAR)); +// addUI(stateButton = new Button(ALL,ALL,0.05,0.025,IconSize, 0, 0, true, false)); + + addUI(new PopperUpper(ALL,BUTTONBAR,x=0.25,y=0,1.375,0.25, BUTTONBAR)); +// x += 0.1; y += 0.025; + +// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, ALL,0,0.25,0.25,0.25, TRACKBAR)); +// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, TRACKBAR,x=0.25,y=0.25,1.0,0.625, TRACKBAR)); +// x += 0.1; y += 0.1; + + addUI(new PopperUpper(ALL,ALL,0,0.0,0.25,0.25, DIALBAR)); + addUI(new Button(ALL,ALL,0.075,0.05,IconSize, Bulb, 0, true, false)); + + addUI(new PopperUpper(ALL,DIALBAR,x=0.25,y=0.0,1.25,1.0, DIALBAR)); + x += 0.05; y += 0.025; + + addUI(starsButton = new Button(ALL,DIALBAR,x,y,IconSize, Stars, 'd')); + addUI(waveButton = new Button(ALL,DIALBAR,x+IconSize,y,IconSize, Wave, 'f')); + addUI(flameButton = new Button(ALL,DIALBAR,x+IconSize*2.5,y,IconSize, Flame, 'g')); + + addUI(starButton = new Button(ALL,DIALBAR,x+IconSize*3.5,y,IconSize, Star, 'h')); + addUI(diamondButton = new Button(ALL,DIALBAR,x+IconSize*4.5,y,IconSize, Diamond, 'j')); + + y += IconSize*1.3; + + addUI(new Button(ALL,DIALBAR,x,y-0.05,IconSize, Bulb, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x+IconSize,y, 0.75, SliderSize, &core->brightnessTwiddler, /*&Core::setBrightness,*/0, 'z', 'x')); + + addUI(new Button(ALL,DIALBAR,x,y+SliderSize*1,IconSize, Size, 'x', true)); + addUI(new SliderBar(ALL,DIALBAR, + x+IconSize,y+SliderSize, 0.75, SliderSize, &core->starSize, &Core::setStarSize, 'c','v')); + + addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*2-0.025,IconSize, FgColor, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x,y+SliderSize*2, 0.45, SliderSize, &(core->fgRedSlider), &Core::setupPalette, 'b','n')); + addUI(new SliderBar(ALL,DIALBAR, + x+0.5+SliderSize,y+SliderSize*2, 0.45, SliderSize, &core->fgGreenSlider, &Core::setupPalette, 'm',',')); + + addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*3,IconSize, BgColor, 0, true)); + addUI(new SliderBar(ALL,DIALBAR, + x,y+SliderSize*3, 0.45, SliderSize, &core->bgRedSlider, &Core::setupPalette, 'B','N')); + addUI(new SliderBar(ALL,DIALBAR, + x+0.5+SliderSize,y+SliderSize*3, 0.45, SliderSize, &core->bgGreenSlider, &Core::setupPalette, 'M','<')); + + x += 0.1;// y += 0.0625; + //static double value = 0.5; + //addUI(new SliderBar(ALL,0,0.75,1.0,0.25,&value)); + + //addUI(new Button(BUTTONBAR,x,y,IconSize, 1, 'x')); + //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 2, 'x')); + //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 3, 'x')); + + visibleMask = ALL; + mouseX = -1; + mouseY = -1; + lastY = -1; + lastY = -1; + countDown = 0; + mouseButtons = 0; + + syncToState(); + +} + +Interface::~Interface() +{ + KConfig config("noatun/synaescope", false, false, "data"); + config.writeEntry("mode",core->fadeMode); + config.writeEntry("diamonds", core->pointsAreDiamonds); + config.writeEntry("brightness", core->brightnessTwiddler); + config.writeEntry("starsize", core->starSize); + config.writeEntry("FGRed", core->fgRedSlider); + config.writeEntry("FGgreen", core->fgGreenSlider); + config.writeEntry("BGRed", core->bgRedSlider); + config.writeEntry("BGGreen", core->bgGreenSlider); +} + +void Interface::addUI(UIObject *obj) +{ + uiObjects.append(obj); +} + +void Interface::syncToState() +{ + starsButton->bright = (core->fadeMode == Stars); + flameButton->bright = (core->fadeMode == Flame); + waveButton->bright = (core->fadeMode == Wave); + + starButton->bright = !core->pointsAreDiamonds; + diamondButton->bright = core->pointsAreDiamonds; + + setupPalette(); +} + +void Interface::changeState(int transitionSymbol) +{ + if (transitionSymbol < 0) + { + return ; + } + + int retVal = 0; + switch(transitionSymbol) + { + case Flame : + starsButton->bright = false; + flameButton->bright = true; + waveButton->bright = false; + core->fadeMode = Flame; + core->setStarSize(core->starSize); + break; + case Wave : + starsButton->bright = false; + flameButton->bright = false; + waveButton->bright = true; + core->fadeMode = Wave; + core->setStarSize(core->starSize); + break; + case Stars : + starsButton->bright = true; + flameButton->bright = false; + waveButton->bright = false; + core->fadeMode = Stars; + core->setStarSize(core->starSize); + break; + + case Star : + core->pointsAreDiamonds = false; + starButton->bright = true; + diamondButton->bright = false; + break; + case Diamond : + core->pointsAreDiamonds = true; + starButton->bright = false; + diamondButton->bright = true; + break; + + case Exit : + retVal = 1; break; + } +// return retVal; +} + +bool Interface::go() +{ + int newVisibleMask = ALL; + char keyHit; + int action = NotASymbol; + int oldButtons = mouseButtons; + + core->screen->sizeUpdate(); + if (!core->screen->inputUpdate(mouseX,mouseY,mouseButtons,keyHit)) + return false; + + bool mouseClick = (mouseButtons && !oldButtons); + + if ((mouseX != lastX || mouseY != lastY) && + lastX > 0 && lastY > 0 && + lastX < core->outWidth && lastY < core->outHeight) + countDown = 40; + + int activeMask = ALL; + + if (countDown) + { + countDown--; + + double scale = + (core->outWidth*0.625 < core->outHeight ? core->outWidth*0.625 : core->outHeight); + double scaledX = mouseX / scale; + double scaledY = mouseY / scale; + + char hotKey = 0; + + core->polygonEngine.clear(); + +// stateButton->icon = core->state; + + + for (UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next()) + { + if ((i->visibleMask & visibleMask) && (i->activeMask & activeMask)) + newVisibleMask |= i->go(mouseButtons,mouseClick, + (scaledX >= i->x && + scaledY >= i->y && + scaledX < i->x+i->width && + scaledY < i->y+i->height), + scaledX - i->x, + scaledY - i->y, + scale, + hotKey, + action); + } + + visibleMask = newVisibleMask; + if (visibleMask != 1) + countDown = 20; + + core->polygonEngine.icon(Icons[Pointer],0x0303,mouseX,mouseY,50,50); + + core->polygonEngine.apply(core->outputBmp.data); + + char hint[2] = " "; + hint[0] = hotKey; + putString(hint,mouseX+6,mouseY+7,0,0); + } + + if (keyHit) + for(UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next()) + if (i->activeMask & activeMask) + i->handleKey(keyHit,action); + + + lastX = mouseX; + lastY = mouseY; + + changeState(action); + + return true; +} + +#undef output diff --git a/noatun-plugins/tyler/AUTHORS b/noatun-plugins/tyler/AUTHORS new file mode 100644 index 0000000..be639e7 --- /dev/null +++ b/noatun-plugins/tyler/AUTHORS @@ -0,0 +1,8 @@ +Noatun conversion +Neil Stevens <multivac@fcmail.com> + +Original XMMS plugin "Infinity" +Julien Carme <julien.carme@acm.org> + +with optimisations by +Mitja Horvat <Mitja.Horvat@hermes.si> diff --git a/noatun-plugins/tyler/COPYING b/noatun-plugins/tyler/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/noatun-plugins/tyler/COPYING @@ -0,0 +1,340 @@ + 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 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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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. + + <signature of Ty Coon>, 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. diff --git a/noatun-plugins/tyler/Makefile.am b/noatun-plugins/tyler/Makefile.am new file mode 100644 index 0000000..b42b7a0 --- /dev/null +++ b/noatun-plugins/tyler/Makefile.am @@ -0,0 +1,21 @@ +INCLUDES= $(all_includes) $(SDL_CFLAGS) + +METASOURCES = AUTO + +kde_module_LTLIBRARIES = noatuntyler.la + +noatuntyler_la_SOURCES = tyler.cpp +noatuntyler_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatuntyler_la_LIBADD = $(LIB_KFILE) -lnoatun -lm + +bin_PROGRAMS = noatuntyler.bin + +noatuntyler_bin_SOURCES = main.cpp file.cpp compute.c display.c renderer.c +noatuntyler_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH) +noatuntyler_bin_LDADD = $(LIB_KDECORE) -lm $(SDL_LIBS) + +noatun_DATA = tyler.plugin tylerstates +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/tyler.pot diff --git a/noatun-plugins/tyler/README b/noatun-plugins/tyler/README new file mode 100644 index 0000000..246a966 --- /dev/null +++ b/noatun-plugins/tyler/README @@ -0,0 +1,89 @@ +Infinity -- An XMMS Visualization Plug-in +------------------------------------ + +version 0.2 + +by Julien Carme Copyright(C) 2000 + +Infinity is a XMMS plug-in which generate full-screen interactive light effects +according to a music. + +The installation can be done by a very standard ./configure && make && make install + +To run the plug-in, +-run xmms +-enter the visualization plug-ins menu (Ctrl-V), +-choose Infinity. +-choose Configure, and your resolution. +-choose Enable, and press Tab to enter Full-Screen mode. +-to stop it, press Tab again and disable it. + +You can change the resolution in the configuration menu. In full-screen mode,SDL +should choose the best possible resolution according to the resolution you asked +for. For example, 640x300 will display a letter-box screen in 640x480. +See SDL section for more information about the scale factor. + +You don't need to be root to enter the full-screen mode. + +There is two different modes in this plug-in, the default mode is non-interactive: + +-Non-Interactive Mode: + +States and palettes are selected randomly, and change sometimes. + + Keys: + - Space: change effect. + - F12: change palette. + - Tab: toggle full-screen. + - Enter: switch to interactive mode. + - F11: screenshot + + +-Interactive Mode: + +You can control the effect: + + Keys: + + - F12: change palette. + - Tab: toggle full-screen. + - Enter: switch to non-interactive mode. + - F1-F10: choose transformation vector field + - a,z: change curve 1 lighting + - q,s: change curve 2 lighting + - e,r: change curve 1 amplitude + - d,f: change curve 2 amplitude + - w: change curve 2 type + - mouse: change curve 2 position + - F11: screensh +. + +Speed: +------ +Infinity need a smooth animation to be interesting. +To increase speed, you can: +-compile with pgcc and full (-O6) optimisations. +-use low resolutions and letter box effect. +In 320x160, it should run on a small pentiums. + +SDL: +---- +You must have installed a recent version of SDL(>=1.0.6) to run this program. +If you experience problems with SDL, refer to their documentation first. +If you cannot obtain low resolutions, you should add them to the +screen section of your /etc/XF86Config (you can use your X configurator +instead of editing it yourself). If and only if you cannot change your +XF86Config, you can change the scale factor in the preference menu. But +the program will be much slower. + +Known Bugs: +----------- +Your X has to be at least in 16 bpp to make this program work. If you have more +than 16 bpp, it should work but may be very slow. If you still use a 8 bpp X, +mail me, I would really like to know if an implementation of it could interest +somebody. +Preferences cannot be saved, and cannot be changed while the plug-in is enabled. + + +Please send questions, comments, suggestions, bug reports or anything else to: +julien.carme@acm.org diff --git a/noatun-plugins/tyler/README.Infinity b/noatun-plugins/tyler/README.Infinity new file mode 100644 index 0000000..246a966 --- /dev/null +++ b/noatun-plugins/tyler/README.Infinity @@ -0,0 +1,89 @@ +Infinity -- An XMMS Visualization Plug-in +------------------------------------ + +version 0.2 + +by Julien Carme Copyright(C) 2000 + +Infinity is a XMMS plug-in which generate full-screen interactive light effects +according to a music. + +The installation can be done by a very standard ./configure && make && make install + +To run the plug-in, +-run xmms +-enter the visualization plug-ins menu (Ctrl-V), +-choose Infinity. +-choose Configure, and your resolution. +-choose Enable, and press Tab to enter Full-Screen mode. +-to stop it, press Tab again and disable it. + +You can change the resolution in the configuration menu. In full-screen mode,SDL +should choose the best possible resolution according to the resolution you asked +for. For example, 640x300 will display a letter-box screen in 640x480. +See SDL section for more information about the scale factor. + +You don't need to be root to enter the full-screen mode. + +There is two different modes in this plug-in, the default mode is non-interactive: + +-Non-Interactive Mode: + +States and palettes are selected randomly, and change sometimes. + + Keys: + - Space: change effect. + - F12: change palette. + - Tab: toggle full-screen. + - Enter: switch to interactive mode. + - F11: screenshot + + +-Interactive Mode: + +You can control the effect: + + Keys: + + - F12: change palette. + - Tab: toggle full-screen. + - Enter: switch to non-interactive mode. + - F1-F10: choose transformation vector field + - a,z: change curve 1 lighting + - q,s: change curve 2 lighting + - e,r: change curve 1 amplitude + - d,f: change curve 2 amplitude + - w: change curve 2 type + - mouse: change curve 2 position + - F11: screensh +. + +Speed: +------ +Infinity need a smooth animation to be interesting. +To increase speed, you can: +-compile with pgcc and full (-O6) optimisations. +-use low resolutions and letter box effect. +In 320x160, it should run on a small pentiums. + +SDL: +---- +You must have installed a recent version of SDL(>=1.0.6) to run this program. +If you experience problems with SDL, refer to their documentation first. +If you cannot obtain low resolutions, you should add them to the +screen section of your /etc/XF86Config (you can use your X configurator +instead of editing it yourself). If and only if you cannot change your +XF86Config, you can change the scale factor in the preference menu. But +the program will be much slower. + +Known Bugs: +----------- +Your X has to be at least in 16 bpp to make this program work. If you have more +than 16 bpp, it should work but may be very slow. If you still use a 8 bpp X, +mail me, I would really like to know if an implementation of it could interest +somebody. +Preferences cannot be saved, and cannot be changed while the plug-in is enabled. + + +Please send questions, comments, suggestions, bug reports or anything else to: +julien.carme@acm.org diff --git a/noatun-plugins/tyler/compute.c b/noatun-plugins/tyler/compute.c new file mode 100644 index 0000000..78d6f90 --- /dev/null +++ b/noatun-plugins/tyler/compute.c @@ -0,0 +1,188 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#include <math.h> +#include "renderer.h" +#include "compute.h" + +#define PI 3.14159 + +t_complex fct(t_complex a,int n,int p1,int p2) /*p1 et p2:0-4 */ +{ + t_complex b; + float fact; + float an; + float circle_size; + float speed; + float co,si; + + a.x-=scr_par.width/2; + a.y-=scr_par.height/2; + + switch (n) { + + case 0: + an=0.025*(p1-2)+0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.25; + speed=2000+p2*500; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + case 1: + an=0.015*(p1-2)+0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.45; + speed=4000+p2*1000; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + fact=(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + case 2: + an=0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.25; + speed=400+p2*100; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + case 3: + an=(sin(sqrt(a.x*a.x+a.y*a.y)/20)/20)+0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.25; + speed=4000; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + case 4: + an=0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.25; + speed=sin(sqrt(a.x*a.x+a.y*a.y)/5)*3000+4000; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + case 5: + b.x=a.x*1.02; + b.y=a.y*1.02; + break; + + case 6: + an=0.002; + co=cos(an); + si=sin(an); + circle_size=scr_par.height*0.25; + fact=1+cos(atan(a.x/(a.y+0.00001))*6)*0.02; + b.x=(co*a.x-si*a.y); + b.y=(si*a.x+co*a.y); + b.x=(b.x*fact); + b.y=(b.y*fact); + break; + + } + + b.x+=scr_par.width/2; + b.y+=scr_par.height/2; + if (b.x<0) + b.x=0; + if (b.y<0) + b.y=0; + if (b.x>scr_par.width-1) + b.x=scr_par.width-1; + if (b.y>scr_par.height-1) + b.y=scr_par.height-1; + + return b; +} + + +void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field); + +void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field) +{ + int fin=debut+step; + const int prop_transmitted=249; + const int b_add=g*scr_par.width*scr_par.height; + t_coord c; + + + if (fin>scr_par.height) + fin=scr_par.height; + for (c.y=debut;c.y<fin;c.y++) + for (c.x=0;c.x<scr_par.width;c.x++) { + t_complex a; + float fpy; + int rw,lw,add; + unsigned int w1,w2,w3,w4; + unsigned int x,y; + + a.x=(float)c.x; + a.y=(float)c.y; + a=fct(a,f,p1,p2); + add=c.x+c.y*scr_par.width; + x=(int)(a.x); + y=(int)(a.y); + vector_field[b_add+add].coord=(x<<16)|y; + + fpy=a.y-floor(a.y); + rw=(int)((a.x-floor(a.x))*prop_transmitted); + lw=prop_transmitted-rw; + w4=(int)(fpy*rw); + w2=rw-w4; + w3=(int)(fpy*lw); + w1=lw-w3; + vector_field[b_add+add].weight=(w1<<24)|(w2<<16)|(w3<<8)|w4; + } +} + +void generate_vector_field(t_interpol* vector_field) +{ + int f; + int i,p1,p2; + + for (f=0;f<NB_FCT;f++) { + p1=2; + p2=2; + for (i=0;i<scr_par.height;i+=10) + generate_sector(f,f,p1,p2,i,10,vector_field); + } +} diff --git a/noatun-plugins/tyler/compute.h b/noatun-plugins/tyler/compute.h new file mode 100644 index 0000000..5025360 --- /dev/null +++ b/noatun-plugins/tyler/compute.h @@ -0,0 +1,23 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#define NB_FCT 7 + +t_complex fct(t_complex a,int n,int p1,int p2); +void generate_vector_field(t_interpol* vector_field); + diff --git a/noatun-plugins/tyler/display.c b/noatun-plugins/tyler/display.c new file mode 100644 index 0000000..6b4f295 --- /dev/null +++ b/noatun-plugins/tyler/display.c @@ -0,0 +1,481 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#include "renderer.h" +#include "main.h" +#include "display.h" +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include <SDL.h> + + +SDL_Color color_table[NB_PALETTES][256]; +short current_colors[256]; + +byte* surface1; +byte* surface2; + +void generate_colors(void) +{ + int i,k; + float colors[NB_PALETTES][2][3]={{{1,1,1},{1,1,1}}, + {{2,1.5,0},{0,0.5,2}}, + {{0,1,2},{0,1,0}}, + {{0,2,1},{0,0,1}}, + {{2,0,0},{0,1,1}}}; + + for (k=0;k<NB_PALETTES;k++) + { + for ( i=0; i<128; i++ ) + { + color_table[k][i].r = colors[k][0][0]*i; + color_table[k][i].g = colors[k][0][1]*i; + color_table[k][i].b = colors[k][0][2]*i; + } + + for ( i=0; i<128; i++ ) + { + color_table[k][i+128].r = colors[k][0][0]*127+colors[k][1][0]*i; + color_table[k][i+128].g = colors[k][0][1]*127+colors[k][1][1]*i; + color_table[k][i+128].b = colors[k][0][2]*127+colors[k][1][2]*i; + } + } +} + +void change_color(int t2,int t1,int w) +{ + unsigned int i; + + for (i=0;i<255;i++) + { + int r,g,b; + r = (color_table[t1][i].r*w+color_table[t2][i].r*(256-w) )>>11; + g = (color_table[t1][i].g*w+color_table[t2][i].g*(256-w) )>>10; + b = (color_table[t1][i].b*w+color_table[t2][i].b*(256-w) )>>11; + current_colors[i]=(r<<11)+(g<<5)+b; + } +} + +void compute_surface(t_interpol* vector_field) +{ + int i,j; + int add_dest=0; + int add_src; + t_interpol *interpol; + register byte* ptr_pix; + int color; + byte* ptr_swap; + + for (j=0;j<scr_par.height;j++) + { + for (i=0;i<scr_par.width;i++) + { + interpol=&vector_field[add_dest]; + add_src=(interpol->coord & 0xFFFF)*scr_par.width+(interpol->coord>>16); + ptr_pix=&((byte*)surface1)[add_src]; + color=(*(ptr_pix)*(interpol->weight>>24) + +*(ptr_pix+1)*((interpol->weight & 0xFFFFFF)>>16) + +*(ptr_pix+scr_par.width)*((interpol->weight & 0xFFFF)>>8) + +*(ptr_pix+scr_par.width+1)*(interpol->weight & 0xFF))>>8; + + if (color>255) + surface2[add_dest]=255; + else + surface2[add_dest]=color; + add_dest++; + } + } + + ptr_swap=surface1; + surface1=surface2; + surface2=ptr_swap; +} + +void display_surface(void) +{ + int i,j; + + if (scr_par.scale>1) + { + for (i=0;i<scr_par.height;i++) + { + short* pdest=(short*)(screen->pixels+i*screen->pitch*scr_par.scale); + byte* psrc=surface1+i*scr_par.width; + + if (scr_par.scale==2) + { + for (j=1; j<scr_par.width; j++) + { + *pdest = current_colors[*psrc++]; + pdest++; + *pdest = *(pdest-1); + pdest++; + } + + memcpy(screen->pixels+i*screen->pitch*2+screen->pitch, + screen->pixels+i*screen->pitch*2,screen->pitch); + } +/* else + { + for (j=1;j<scr_par.width;j++) { + *(pdest++)=current_colors[*psrc++]; + *(pdest++)=*(pdest-1); + *(pdest++)=*(pdest-1); + } + memcpy(screen->pixels+i*screen->pitch*3+screen->pitch, + screen->pixels+i*screen->pitch*3,screen->pitch); + memcpy(screen->pixels+i*screen->pitch*3+screen->pitch*2, + screen->pixels+i*screen->pitch*3,screen->pitch); + + } +*/ + } + } + else + { + byte* psrc=surface1; + for (i=0;i<scr_par.height;i++) + { + short* pdest=(short*)(screen->pixels+i*screen->pitch); + for (j=0;j<scr_par.width;j++) + *pdest++=current_colors[*psrc++]; + } + } + SDL_UpdateRect(screen, 0, 0, 0, 0); +} + +void blur(t_interpol* vector_field) +{ + compute_surface(vector_field); + display_surface(); +} + +void plot1(int x,int y,int c); +void plot1(int x,int y,int c) +{ + if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3) + assign_max(&(surface1)[x+y*scr_par.width],c); +} + +void plot2(int x,int y,int c); +void plot2(int x,int y,int c) +{ + int ty; + + if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3) { + ty = y*scr_par.width; + assign_max(&(surface1)[x+ty],c); + assign_max(&(surface1)[x+1+ty],c); + assign_max(&(surface1)[x+ty+scr_par.width],c); + assign_max(&(surface1)[x+1+ty+scr_par.width],c); + } +} + + +void plot3(int x,int y,int c); +void plot3(int x,int y,int c) +{ + int ty; + + if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3) { + ty = y*scr_par.width; + assign_max(&(surface1)[x+ty],c/3); + assign_max(&(surface1)[x+1+ty],c>>1); + assign_max(&(surface1)[x+ty+scr_par.width],c>>1); + assign_max(&(surface1)[x+1+ty+scr_par.width],c); + assign_max(&(surface1)[x+ty+(scr_par.width<<1)],c/3); + assign_max(&(surface1)[x+2+ty+(scr_par.width<<1)],c/3); + assign_max(&(surface1)[x+1+ty+(scr_par.width<<1)],c>>1); + assign_max(&(surface1)[x+2+ty+scr_par.width],c>>1); + assign_max(&(surface1)[x+2+ty+scr_par.width],c/3); + } +} + +#if 0 +void line(int x1,int y1,int x2,int y2,int c) +{ + int i,j; + float x,y,vx,vy,d; + const float step=1; + + if (x1==x2 && y1==y2) + plot3(x1,y1,255); + else { + x=x1; + y=y1; + d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); + vx=step*(x2-x1)/d; + vy=step*(y2-y1)/d; + for (i=0;i<(int)(d/step)+1;i++) { + plot1(x,y,c); + x+=vx; + y+=vy; + } + } +} +#endif + +#define SWAP(x,y) \ + x = x + y; \ + y = x - y; \ + x = x - y; + +void line(int _x1, int _y1, int _x2, int _y2, int _c) +{ + int dx, dy, cxy, dxy; + /* calculate the distances */ + dx = abs(_x1 - _x2); + dy = abs(_y1 - _y2); + + cxy = 0; + if (dy > dx) + { + /* Follow Y axis */ + if (_y1 > _y2) + { + SWAP(_y1, _y2); + SWAP(_x1, _x2); + } + + if (_x1 > _x2) + dxy = -1; + else + dxy = 1; + + for (_y1=_y1; _y1<_y2; _y1++) + { + cxy += dx; + if (cxy >= dy) + { + _x1+= dxy; + cxy -= dy; + } + plot1(_x1, _y1, _c); + } + } + else + { + /* Follow X axis */ + if (_x1 > _x2) + { + SWAP(_x1, _x2); + SWAP(_y1, _y2); + } + + if (_y1 > _y2) + dxy = -1; + else + dxy = 1; + + for (_x1=_x1; _x1<_x2; _x1++) + { + cxy += dy; + if (cxy >= dx) + { + _y1+=dxy; + cxy -= dx; + } + plot1(_x1, _y1, _c); + } + } +} + +struct sincos +{ + int i; + float *f; +}; + +/* Little optimization for cos/sin functions */ +static struct sincos cosw = { 0, NULL }; +static struct sincos sinw = { 0, NULL }; + +void spectral(t_effect* current_effect,short data[2][512]) +{ + int i, halfheight, halfwidth; + float old_y1,old_y2; + float _y1=(((data[0][0]+data[1][0])>>9)*current_effect->spectral_amplitude*scr_par.height)>>12; + float _y2=(((data[0][0]+data[1][0])>>9)*current_effect->spectral_amplitude*scr_par.height)>>12; + const int density_lines=5; + const int step=4; + const int shift=(current_effect->spectral_shift*scr_par.height)>>8; + + if (cosw.i != scr_par.width || sinw.i != scr_par.width) + { + free(cosw.f); + free(sinw.f); + sinw.f = cosw.f = NULL; + sinw.i = cosw.i = 0; + } + + if (cosw.i == 0 || cosw.f == NULL) + { + float halfPI = (float)PI/2; + cosw.i = scr_par.width; + cosw.f = malloc(sizeof(float)*scr_par.width); + for (i=0; i<scr_par.width;i+=step) + cosw.f[i] = cos((float)i/scr_par.width*PI+halfPI); + } + + if (sinw.i == 0 || sinw.f == NULL) + { + float halfPI = (float)PI/2; + sinw.i = scr_par.width; + sinw.f = malloc(sizeof(float)*scr_par.width); + for (i=0; i<scr_par.width;i+=step) + sinw.f[i] = sin((float)i/scr_par.width*PI+halfPI); + } + + if (current_effect->mode_spectre==3) + { + if (_y1<0) + _y1=0; + + if (_y2<0) + _y2=0; + } + + halfheight = scr_par.height >> 1; + halfwidth = scr_par.width >> 1; + for (i=step;i<scr_par.width;i+=step) + { + old_y1=_y1; + old_y2=_y2; + _y1=((data[1][(i<<9)/scr_par.width/density_lines]>>8)* + current_effect->spectral_amplitude*scr_par.height)>>12; + _y2=((data[0][(i<<9)/scr_par.width/density_lines]>>8)* + current_effect->spectral_amplitude*scr_par.height)>>12; + + switch (current_effect->mode_spectre) + { + case 0: + line(i-step,halfheight+shift+old_y2, + i,halfheight+shift+_y2, + current_effect->spectral_color); + break; + case 1: + line(i-step,halfheight+shift+old_y1, + i,halfheight+shift+_y1, + current_effect->spectral_color); + line(i-step,halfheight-shift+old_y2, + i,halfheight-shift+_y2, + current_effect->spectral_color); + break; + case 2: + line(i-step,halfheight+shift+old_y1, + i,halfheight+shift+_y1, + current_effect->spectral_color); + line(i-step,halfheight-shift+old_y1, + i,halfheight-shift+_y1, + current_effect->spectral_color); + line(halfwidth+shift+old_y2,i-step, + halfwidth+shift+_y2,i, + current_effect->spectral_color); + line(halfwidth-shift+old_y2,i-step, + halfwidth-shift+_y2,i, + current_effect->spectral_color); + break; + case 3: + if (_y1<0) + _y1=0; + if (_y2<0) + _y2=0; + case 4: + line(halfwidth + cosw.f[i-step] * (shift+old_y1), + halfheight + sinw.f[i-step] * (shift+old_y1), + halfwidth + cosw.f[i] * (shift+_y1), + halfheight + sinw.f[i] * (shift+_y1), + current_effect->spectral_color); + line(halfwidth - cosw.f[i-step] * (shift+old_y2), + halfheight + sinw.f[i-step] * (shift+old_y2), + halfwidth - cosw.f[i] * (shift+_y2), + halfheight + sinw.f[i] * (shift+_y2), + current_effect->spectral_color); + break; + } + } + + if (current_effect->mode_spectre==3 || current_effect->mode_spectre==4) + line(halfwidth + cosw.f[scr_par.width - step] * (shift+_y1), + halfheight + sinw.f[scr_par.width - step] * (shift+_y1), + halfwidth - cosw.f[scr_par.width - step] * (shift+_y2), + halfheight + sinw.f[scr_par.width - step] * (shift+_y2), + current_effect->spectral_color); +} + +void curve(t_effect* current_effect) +{ + int i,j,k; + float v,vr; + float x,y; + float amplitude=(float)current_effect->curve_amplitude/256; + + for (j=0;j<2;j++) + { + v=80; + vr=0.001; + k=current_effect->x_curve; + for (i=0;i<64;i++) + { + x=cos((float)(k)/(v+v*j*1.34))*scr_par.height*amplitude; + y=sin((float)(k)/(1.756*(v+v*j*0.93)))*scr_par.height*amplitude; + plot2(x*cos((float)k*vr)+y*sin((float)k*vr)+scr_par.width/2, + x*sin((float)k*vr)-y*cos((float)k*vr)+scr_par.height/2, + current_effect->curve_color); + k++; + } + } + current_effect->x_curve=k; +} + + +void init_sdl(void) +{ + surface1=(byte*)malloc(scr_par.width*scr_par.height); + surface2=(byte*)malloc(scr_par.width*scr_par.height); + + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) + { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + + SDL_WM_SetCaption("Tyler", 0L); + screen = SDL_SetVideoMode(scr_par.width * scr_par.scale, + scr_par.height * scr_par.scale, 16, VIDEO_FLAGS); + + if ( screen == NULL ) + { + fprintf(stderr, "Couldn't init video mode: %s\n", SDL_GetError()); + exit(1); + } + SDL_ShowCursor(0); + SDL_EnableKeyRepeat(0,0); +} + +void toggle_fullscreen(void) +{ + SDL_WM_ToggleFullScreen(screen); +} + +void close_sdl(void) +{ + SDL_Quit(); +} diff --git a/noatun-plugins/tyler/display.h b/noatun-plugins/tyler/display.h new file mode 100644 index 0000000..d71b6c6 --- /dev/null +++ b/noatun-plugins/tyler/display.h @@ -0,0 +1,40 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#ifndef _DISPLAY_H_ +#define _DISPLAY_H_ + +#define NB_PALETTES 5 +#define wrap(a) ( a < 0 ? 0 : ( a > 255 ? 255 : a )) +#define assign_max(p,a) ( *p = ( *p > a ? *p : a )) +#define PI 3.14159 + +#define VIDEO_FLAGS (SDL_HWSURFACE|SDL_HWPALETTE) + +void generate_colors(void); +void change_color(int old_p,int p,int w); +void compute_surface(t_interpol* vector_field); +void display_surface(void); +void blur(t_interpol* vector_field); +void spectral(t_effect* current_effect,short data[2][512]); +void line(int _x1, int _y1, int _x2, int _y2, int _c); +void curve(t_effect* current_effect); +void init_sdl(void); +void toggle_fullscreen(void); +void close_sdl(void); +#endif diff --git a/noatun-plugins/tyler/file.cpp b/noatun-plugins/tyler/file.cpp new file mode 100644 index 0000000..58ddd79 --- /dev/null +++ b/noatun-plugins/tyler/file.cpp @@ -0,0 +1,81 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +extern "C" +{ +#include "renderer.h" +#include <stdlib.h> +} + +#include <qfile.h> +#include <kglobal.h> +#include <kstandarddirs.h> + +static QString getDataPath(void) +{ + KStandardDirs &dirs = *KGlobal::dirs(); + + return dirs.findResource("data", "noatun/tylerstates"); +} + +static QString getSavePath(void) +{ + KStandardDirs &dirs = *KGlobal::dirs(); + return dirs.saveLocation("data", "noatun/") + "tylerstates"; +} + +extern "C" void save_effect(t_effect *effect) +{ + QFile file(getSavePath()); + if(!file.open(IO_WriteOnly)) + return; + + for(unsigned i = 0; i < sizeof(t_effect); i++) + file.putch( *((byte *)effect + i) ); +} + +t_effect effects[100]; +int nb_effects=0; + +extern "C" void load_effects() +{ + QFile file(getDataPath()); + if(!file.open(IO_ReadOnly)) + exit(1); + + unsigned int i; + nb_effects = 0; + while(!file.atEnd()) + { + byte* ptr_effect = (byte *)&effects[nb_effects++]; + for(i = 0; i < sizeof(t_effect); i++) + ptr_effect[i] = file.getch(); + } +} + +extern "C" void load_random_effect(t_effect *effect) +{ + if(nb_effects > 0) + { + int num_effect = rand() % nb_effects; + unsigned int i; + + for(i = 0; i < sizeof(t_effect) ; i++) + *((byte*)effect+i)=*((byte*)(&effects[num_effect])+i); + } +} diff --git a/noatun-plugins/tyler/file.h b/noatun-plugins/tyler/file.h new file mode 100644 index 0000000..270bbea --- /dev/null +++ b/noatun-plugins/tyler/file.h @@ -0,0 +1,31 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#ifndef FILE_H +#define FILE_H + +#include <stdio.h> +#include "renderer.h" +#include <stdlib.h> + +extern void save_effect(t_effect *_effect); +extern void load_effects(void); +void load_random_effect(t_effect *effect); + +#endif // FILE_H + diff --git a/noatun-plugins/tyler/main.cpp b/noatun-plugins/tyler/main.cpp new file mode 100644 index 0000000..219c6ed --- /dev/null +++ b/noatun-plugins/tyler/main.cpp @@ -0,0 +1,100 @@ +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Charles Samuels <charles@kde.org> +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 + +#include <kinstance.h> + +extern "C" +{ +#include <SDL.h> +#include <SDL_syswm.h> +#include <SDL_thread.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/types.h> + +#include "renderer.h" +#include "display.h" +} + +// stuff in main.h +extern "C" +{ +typedef struct t_config { + int xres,yres,sres; + int teff,tcol; +} t_config; + +t_config config = {512, 352, 1, 100, 100}; +//t_config config = {640, 480, 1, 100, 100}; + +bool finished; +SDL_Thread *thread; +SDL_mutex *synchro_mutex, *access_mutex; +short pcm_data[2][512]; +SDL_Surface *screen; +} + +int winID(void) +{ + SDL_SysWMinfo info; + info.version.major = SDL_MAJOR_VERSION; + info.subsystem = SDL_SYSWM_X11; + + SDL_GetWMInfo(&info); + return info.info.x11.wmwindow; +} + +int main(int, char **) +{ + fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) & ~O_NONBLOCK); + + atexit(SDL_Quit); + + KInstance in("noatuntyler"); + + finished = false; + access_mutex = SDL_CreateMutex(); + + init_renderer1(); + printf("%u\n", winID()); + fflush(stdout); + init_renderer2(); + thread = SDL_CreateThread((int (*)(void *))renderer, NULL); + + fd_set set; + struct timeval tv; + while(check_finished() != 1) + { + FD_ZERO(&set); + FD_SET(STDIN_FILENO, &set); + tv.tv_sec = 0; + tv.tv_usec = 250; + if(0 < select(STDIN_FILENO + 1, &set, 0, 0, &tv)) + { + SDL_mutexP(access_mutex); + read(STDIN_FILENO, (void *)pcm_data, sizeof(short) * 2 * 512); + SDL_mutexV(access_mutex); + } + usleep(5); + } + /*fprintf(stderr,"exiting main()\n");*/ + SDL_WaitThread(thread, NULL); +} diff --git a/noatun-plugins/tyler/main.h b/noatun-plugins/tyler/main.h new file mode 100644 index 0000000..9b500b0 --- /dev/null +++ b/noatun-plugins/tyler/main.h @@ -0,0 +1,30 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#include <SDL.h> + +typedef struct t_config { + int xres,yres,sres; + int teff,tcol; +} t_config; + +extern int finished; +extern SDL_mutex *synchro_mutex,*access_mutex; +extern short pcm_data[2][512]; +extern t_config config; +extern SDL_Surface *screen; diff --git a/noatun-plugins/tyler/renderer.c b/noatun-plugins/tyler/renderer.c new file mode 100644 index 0000000..cd32959 --- /dev/null +++ b/noatun-plugins/tyler/renderer.c @@ -0,0 +1,195 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#include "file.h" +#include "main.h" +#include "renderer.h" +#include "compute.h" +#include "display.h" + +#include <SDL.h> +#include <SDL_keysym.h> +#include <stdlib.h> + +#define wrap(a) ( a < 0 ? 0 : ( a > 255 ? 255 : a )) + +t_interpol* vector_field; +t_effect current_effect; +t_screen_parametres scr_par; +t_general_parametres gen_par; +int old_color=0,color=0; +int t_last_color,t_last_effect; +int mode_interactif=0; + +void check_events(void) +{ + SDL_Event event; + byte* keystate; + int i; + int sx,sy; + if (mode_interactif) + { + SDL_GetMouseState(&sx,&sy); + current_effect.spectral_shift=sx; + } + + SDL_PollEvent(&event); + + if (event.type == SDL_KEYDOWN) + { + switch(event.key.keysym.sym) + { + case SDLK_RETURN: + mode_interactif=!mode_interactif; + break; + case SDLK_SPACE: + toggle_fullscreen(); + break; + case SDLK_TAB: + load_random_effect(¤t_effect); + t_last_effect=0; + break; + case SDLK_F12: + if (t_last_color>32) + { + t_last_color=0; + old_color=color; + color=(color+1)%NB_PALETTES; + } + break; + case SDLK_m: + if (mode_interactif) save_effect(¤t_effect); + break; + case SDLK_w: + if (mode_interactif) current_effect.mode_spectre=(current_effect.mode_spectre+1)%5; + break; + default: + break; + } + } + else if (event.type == SDL_QUIT) + { + finished = 1; + return; + } + + keystate = SDL_GetKeyState(NULL); + if (mode_interactif) + { + if ( keystate[SDLK_a]) + current_effect.curve_color=wrap(current_effect.curve_color-32); + if ( keystate[SDLK_z]) + current_effect.curve_color=wrap(current_effect.curve_color+32); + if ( keystate[SDLK_q]) + current_effect.spectral_color=wrap(current_effect.spectral_color-32); + if ( keystate[SDLK_s]) + current_effect.spectral_color=wrap(current_effect.spectral_color+32); + + for (i=0;i<10;i++) + { + if ( keystate[SDLK_F1+i]) + current_effect.num_effect=i%NB_FCT; + } + + if (keystate[SDLK_d]) { + current_effect.spectral_amplitude=(current_effect.spectral_amplitude-1); + } + if (keystate[SDLK_f]) { + current_effect.spectral_amplitude=(current_effect.spectral_amplitude+1); + } + if (keystate[SDLK_e]) { + current_effect.curve_amplitude=(current_effect.curve_amplitude-1); + } + if (keystate[SDLK_r]) { + current_effect.curve_amplitude=(current_effect.curve_amplitude+1); + } + } +} + + +int check_finished(void) +{ + return finished; +} + + +void init_renderer1(void) +{ + scr_par.width=config.xres; + scr_par.height=config.yres; + scr_par.scale=config.sres; + + gen_par.t_between_effects=config.teff; + gen_par.t_between_colors=config.tcol; + + init_sdl(); +} + +void init_renderer2(void) +{ + generate_colors(); + load_effects(); + load_random_effect(¤t_effect); + + vector_field=(t_interpol*)malloc(scr_par.width*scr_par.height*NB_FCT*sizeof(t_interpol)); + generate_vector_field(vector_field); +} + + +void renderer(void) +{ + while (check_finished() != 1) + { + check_events(); + blur(&vector_field[scr_par.width*scr_par.height*current_effect.num_effect]); + spectral(¤t_effect,pcm_data); + curve(¤t_effect); + if (t_last_color<=32) + { + change_color(old_color, + color, + t_last_color*8); + } + t_last_color+=1; + t_last_effect+=1; + if (t_last_effect%gen_par.t_between_effects==0) + { + if (!mode_interactif) { + load_random_effect(¤t_effect); + t_last_effect=0; + } + } + if (t_last_color%gen_par.t_between_colors==0) + { + if (!mode_interactif) { + old_color=color; + color=rand()%NB_PALETTES; + t_last_color=0; + } + } + } + /*fprintf(stderr,"exiting thread\n");*/ + close_renderer(); +} + +void close_renderer(void) +{ + free(vector_field); + close_sdl(); + SDL_mutexV(synchro_mutex); +} diff --git a/noatun-plugins/tyler/renderer.h b/noatun-plugins/tyler/renderer.h new file mode 100644 index 0000000..06aa326 --- /dev/null +++ b/noatun-plugins/tyler/renderer.h @@ -0,0 +1,69 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// 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 +*/ + +#ifndef RENDERER_H +#define RENDERER_H + +void check_events(void); +int check_finished(void); +void init_renderer1(void); +void init_renderer2(void); +void renderer(void); +void close_renderer(void); + +typedef unsigned char byte; + +typedef struct t_coord { + int x,y; +} t_coord; + +typedef struct t_complex { + float x,y; +} t_complex; + +typedef struct t_interpol { + unsigned int coord ; /* coordinates of the top left pixel.*/ + unsigned int weight; /*32 bits = 4*8= weights of the four corners */ +} t_interpol; + +typedef struct t_effect { + int num_effect; + int x_curve; + int curve_color; + int curve_amplitude; + int spectral_amplitude; + int spectral_color; + int mode_spectre; + int spectral_shift; +} t_effect; + +typedef struct t_screen_parametres { + int width; + int height; + int scale; + int bpp; /*bytes per pixels. */ +} t_screen_parametres; + +typedef struct t_general_parametres { + int t_between_effects; + int t_between_colors; +} t_general_parametres; + +extern t_screen_parametres scr_par; + +#endif diff --git a/noatun-plugins/tyler/tyler.cpp b/noatun-plugins/tyler/tyler.cpp new file mode 100644 index 0000000..7990ae2 --- /dev/null +++ b/noatun-plugins/tyler/tyler.cpp @@ -0,0 +1,72 @@ +// Copyright (C) 2001 Charles Samuels <charles@kde.org> +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> + +#include "tyler.h" + +#include <noatun/conversion.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kprocess.h> +#include <kstandarddirs.h> +#include <noatun/app.h> +#include <kdebug.h> + +extern "C" Plugin *create_plugin() +{ + KGlobal::locale()->insertCatalogue("tyler"); + return new Tyler(); +} + +const int Tyler::bufferSize = 512; + +Tyler::Tyler() + : QObject() + , StereoScope(25) + , Plugin() +{ + setSamples(bufferSize*2); + mBuffer = new char[bufferSize * 16 * 2]; +} + +Tyler::~Tyler() +{ + delete [] mBuffer; +} + +void Tyler::init() +{ + process << KStandardDirs::findExe("noatuntyler.bin"); + connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *))); + + // Note that process.start() will fail if findExe fails, so there's no real need + // for two separate checks. + if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout))) + { + KMessageBox::error(0, i18n("Unable to start noatuntyler.bin. Check your installation.")); + unload(); + } + else + start(); + +} + +void Tyler::scopeEvent(float *left, float *right, int size) +{ + if(process.isRunning()) + { + Conversion::convertMonoFloatTo16le((unsigned long)size, right, + (unsigned char*)mBuffer); + + Conversion::convertMonoFloatTo16le((unsigned long)size, left, + ((unsigned char*)mBuffer)+bufferSize*2); + process.writeStdin((char *)mBuffer, bufferSize*2*2); + } +} + +void Tyler::processExited(KProcess *) +{ + unload(); +} + +#include "tyler.moc" diff --git a/noatun-plugins/tyler/tyler.h b/noatun-plugins/tyler/tyler.h new file mode 100644 index 0000000..ff72a80 --- /dev/null +++ b/noatun-plugins/tyler/tyler.h @@ -0,0 +1,34 @@ +// Copyright (C) 2001 Charles Samuels <charles@kde.org> +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> + +#ifndef TYLER_H +#define TYLER_H + +#include <noatun/conversion.h> +#include <noatun/plugin.h> +#include <kprocess.h> +#include <qwidget.h> + +class Tyler : public QObject, public StereoScope, public Plugin +{ +Q_OBJECT + +public: + Tyler(); + virtual ~Tyler(); + + void init(); + +private slots: + void processExited(KProcess *); + +protected: + virtual void scopeEvent(float *left, float *right, int bands); + +private: + char *mBuffer; + static const int bufferSize; + KProcess process; +}; + +#endif diff --git a/noatun-plugins/tyler/tyler.plugin b/noatun-plugins/tyler/tyler.plugin new file mode 100644 index 0000000..4eb0412 --- /dev/null +++ b/noatun-plugins/tyler/tyler.plugin @@ -0,0 +1,70 @@ +Filename=noatuntyler.la +Author=Neil Stevens, Julien Carme +Site=http://noatun.kde.org/ +Email=neil@qualityassistant.com +Type=visualization +License=GPL +Name=Tyler +Name[hi]=टायलर +Name[hr]=Slagač +Name[it]=Tessuto +Name[ne]=टाइलर +Name[ru]=Тайлер +Name[ta]=டைலர் +Name[tg]=Тайлер +Comment=Ported from Infinity from XMMS +Comment[ar]=منقولة من XMMS Infinity +Comment[az]=Infinity-dən XMMS-ə port edilmişdir +Comment[bg]=Приставка, която наподобява темата Infinity от плеъра XMMS +Comment[br]=Porzhed eus Infinity ouzh XMMS +Comment[bs]=Portovano sa Infinity dodatka za XMMS +Comment[ca]=Portat des de l'Infinity de l'XMMS +Comment[cs]=Přenesený modul Infinity z XMMS +Comment[cy]=Troswyd o Infinity oddiwrth XMMS +Comment[da]=Porteret fra Infinity fra XMMS +Comment[de]=Portiert aus Infinity von XMMS +Comment[el]=Προσαρμογή από το Infinity για το XMMS +Comment[eo]=Portita el Infinity el XMMS +Comment[es]=Portado a partir de Infinity desde XMMS +Comment[et]=XMMSi Infinity port +Comment[eu]=XMMSren Infinity-tik etorria +Comment[fi]=Käännetty XMMS Infinitystä +Comment[fr]=Portage d'Infinity de XMMS +Comment[fy]=Oerdroegen fanút Infinity fan XMMS +Comment[gl]=Portado a partir de Infinity de XMMS +Comment[he]=הוסב מ־Infinity מ־XMMS +Comment[hi]=इनफिनिटी से एक्सएमएमएस पर पोर्टेड +Comment[hr]=Prebačeno iz Infinity-a, iz XMMS-a +Comment[hu]=Az XMMS Infinity átirata +Comment[is]=Flutt úr Infinity frá XMMS +Comment[it]=Preso da Infinity di XMMS +Comment[ja]=XMMS の Infinity から移植 +Comment[ka]=XMMS-იდან გადმოტანილი უსასრულობის გამოსახულება +Comment[kk]=XMMS Infinity-ден көшірілген көрініс +Comment[km]=បានការពារពីអនន្តរភាពពី XMMS +Comment[lt]=Perkeltas iš Infinity iš XMMS +Comment[mk]=Пренесена од Infinity од XMMS +Comment[ms]=Diangkut dari Infiniti dari XMMS +Comment[nb]=Overført fra XMMS til Infinity +Comment[nds]=Vun Infinity vun XMMS porteert +Comment[ne]=एक्सएमएमएसबाट अनन्तसम्म पोर्टेट गरिएको +Comment[nl]=Overgedragen vanuit Infinity van XMMS +Comment[nn]=Overført frå Infinity frå XMMS +Comment[pl]=Przeniesiona wtyczka Infinity z XMMS +Comment[pt]=Transposto a partir do Infinity do XMMS +Comment[pt_BR]=Portado do Infinity e do XMMS +Comment[ro]=Portat din Infinity din XMMS +Comment[ru]=Зрительный образ, портированный с образа Infinity из XMMS +Comment[sk]=Portované z Infinity z XMMS +Comment[sl]=Prenos iz Infinity iz XMMS +Comment[sr]=Пребачено са Infinity-ја са XMMS-а +Comment[sr@Latn]=Prebačeno sa Infinity-ja sa XMMS-a +Comment[sv]=Överförd från Infinity i XMMS +Comment[ta]=XMMS-ல் இருந்து முடிவில்லாத்து நுழைக்கப்பட்டது +Comment[tg]=Намуди тамошобин, ки бо намуди Infinity аз XMMS интиқол шудааст +Comment[tr]=XMMS'deki Infinity'den taşındı +Comment[uk]=Запозичене з Infinity від XMMS +Comment[vi]=Chuyển từ Infinity từ XMML +Comment[xh]=Iphathe okusuka kokungenasiphelo ukusuka kwi XMMS +Comment[zh_CN]=从 XMMS 的 Infinity 处移植来的 +Comment[zh_TW]=移自 XMMS 與 Infinity diff --git a/noatun-plugins/tyler/tylerstates b/noatun-plugins/tyler/tylerstates Binary files differnew file mode 100644 index 0000000..d784758 --- /dev/null +++ b/noatun-plugins/tyler/tylerstates diff --git a/noatun-plugins/wavecapture/Makefile.am b/noatun-plugins/wavecapture/Makefile.am new file mode 100644 index 0000000..0ffa449 --- /dev/null +++ b/noatun-plugins/wavecapture/Makefile.am @@ -0,0 +1,18 @@ +# $Id$ + +INCLUDES = -I$(kde_includes)/arts $(all_includes) +kde_module_LTLIBRARIES = noatunwavecapture.la + + +noatunwavecapture_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +noatunwavecapture_la_LIBADD = $(LIB_KFILE) -lnoatun -lm -lartsmodules + +noatunwavecapture_la_SOURCES = wavecapture.cpp +noatunwavecapture_la_METASOURCES = AUTO +noinst_HEADERS = wavecapture.h + +noatun_DATA = wavecapture.plugin +noatundir = $(kde_datadir)/noatun + +messages: rc.cpp + $(XGETTEXT) *.cpp *.h -o $(podir)/wavecapture.pot diff --git a/noatun-plugins/wavecapture/wavecapture.cpp b/noatun-plugins/wavecapture/wavecapture.cpp new file mode 100644 index 0000000..b95d3ce --- /dev/null +++ b/noatun-plugins/wavecapture/wavecapture.cpp @@ -0,0 +1,197 @@ +/* + Copyright (C) 2001 Matthias Kretz <kretz@kde.org> + + 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. +*/ +/* $Id$ */ +#include "wavecapture.h" + +#include <noatun/player.h> +#include <noatun/app.h> +#include <noatun/engine.h> +#include <noatun/noatunarts.h> + +#include <arts/soundserver.h> +#include <arts/mcoputils.h> + +#include <klocale.h> +#include <kpopupmenu.h> +#include <kfiledialog.h> +#include <kurl.h> +#include <krecentdocument.h> +#include <kio/job.h> +#include <kio/jobclasses.h> + +#include <qfile.h> +#include <qstring.h> +#include <qtimer.h> + +#include <string> + +extern "C" +{ + Plugin *create_plugin() + { + KGlobal::locale()->insertCatalogue("wavecapture"); + return new WaveCapture(); + } +} + +WaveCapture::WaveCapture() : QObject(0,0), Plugin(), + _enabled( false ), + _status( STOPPED ), + _capture( Arts::DynamicCast( napp->player()->engine()->server()->createObject( "Arts::Effect_WAVECAPTURE" ) ) ), + _count( 0 ), + _id( 0 ), + _filename( "" ), + _timer( new QTimer( this ) ), + m_job( 0 ) +{ + NOATUNPLUGINC(WaveCapture); + + if( napp->player()->isPlaying() ) + _status = PLAYING; + else if( napp->player()->isPaused() ) + _status = PAUSED; + + newSong(); + + connect( _timer, SIGNAL( timeout() ), SLOT( saveAs() ) ); + + connect(napp->player(), SIGNAL(changed()), SLOT(newSong())); + connect(napp->player(), SIGNAL(stopped()), SLOT(stopped())); + connect(napp->player(), SIGNAL(playing()), SLOT(playing())); + connect(napp->player(), SIGNAL( paused()), SLOT( paused())); +} + +WaveCapture::~WaveCapture() +{ + napp->pluginMenuRemove(pluginMenuItem); + if( _enabled ) + { + if( PLAYING == _status ) + stop(); + QString filename = QFile::decodeName( (Arts::MCOPUtils::createFilePath( _filename ) + ".wav").c_str() ); + QFile::remove( filename ); + } + delete m_job; +} + +void WaveCapture::init() +{ + pluginMenuItem = napp->pluginMenuAdd( i18n( "Wave Capture" ), this, SLOT( toggle() ) ); + napp->pluginMenu()->setCheckable( true ); +} + +void WaveCapture::toggle() +{ + _enabled = ! _enabled; + if( PLAYING == _status ) + { + if( _enabled ) + start(); + else + { + stop(); + QString filename = QFile::decodeName( (Arts::MCOPUtils::createFilePath( _filename ) + ".wav").c_str() ); + QFile::remove( filename ); + } + } + napp->pluginMenu()->setItemChecked( pluginMenuItem, _enabled ); +} + +void WaveCapture::newSong() +{ + if( napp->player()->current() ) + { + QString title = napp->player()->current().title(); + _capture.filename( std::string( QFile::encodeName( title ) ) ); + } + _timer->start( 0, true ); +} + +void WaveCapture::saveAs() +{ + // this could be a candidate for a race condition - but unlikely and harmless + std::string filename = _filename; + _filename = _capture.filename().c_str(); + if( _enabled && ( !filename.empty() ) ) + { + KFileDialog dlg( ":savedir", "*.wav", 0, "filedialog", true ); + dlg.setCaption( i18n( "Save Last Wave File As" ) ); + dlg.setOperationMode( KFileDialog::Saving ); + dlg.setSelection( QFile::decodeName( filename.c_str() ) + ".wav" ); + + QString filename2 = QFile::decodeName( (Arts::MCOPUtils::createFilePath( filename ) + ".wav").c_str() ); + if( dlg.exec() ) + { + KURL url = dlg.selectedURL(); + if (url.isValid()) + KRecentDocument::add( url ); + + m_job = KIO::file_move( KURL( filename2 ), url, -1, true ); + connect( m_job, SIGNAL( result( KIO::Job* ) ), SLOT( copyFinished( KIO::Job* ) ) ); + } + else + { + QFile::remove( filename2 ); + } + } +} + +void WaveCapture::stopped() +{ + if( _enabled && PLAYING == _status ) + stop(); + _status = STOPPED; + _capture.filename( std::string( "" ) ); +} + +void WaveCapture::playing() +{ + if( _enabled && PLAYING != _status ) + start(); + _status = PLAYING; +} + +void WaveCapture::paused() +{ + if( _enabled && PLAYING == _status ) + stop(); + _status = PAUSED; +} + +void WaveCapture::start() +{ + _capture.start(); + _id = napp->player()->engine()->globalEffectStack()->insertBottom( _capture, "capture too wave" ); +} + +void WaveCapture::stop() +{ + napp->player()->engine()->globalEffectStack()->remove( _id ); + _capture.stop(); + _timer->start( 0, true ); +} + +void WaveCapture::copyFinished( KIO::Job* job ) +{ + if( job == m_job ) + m_job = 0; +} + +#include "wavecapture.moc" + +// vim:ts=4:sw=4 diff --git a/noatun-plugins/wavecapture/wavecapture.h b/noatun-plugins/wavecapture/wavecapture.h new file mode 100644 index 0000000..f5d894f --- /dev/null +++ b/noatun-plugins/wavecapture/wavecapture.h @@ -0,0 +1,72 @@ +/* + Copyright (C) 2001 Matthias Kretz <kretz@kde.org> + + 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. +*/ +/* $Id$ */ + +#ifndef WAVECAPTURE_H +#define WAVECAPTURE_H + +#include <noatun/plugin.h> +#include <artsmodules.h> + +#include <string> + +class QTimer; +namespace KIO { class Job; } + +class WaveCapture : public QObject, public Plugin +{ +Q_OBJECT +NOATUNPLUGIND + +public: + WaveCapture(); + virtual ~WaveCapture(); + + void init(); + +protected slots: + void toggle(); + void newSong(); + void stopped(); + void playing(); + void paused(); + void saveAs(); + void copyFinished( KIO::Job* ); + +private: + void start(); + void stop(); + + int pluginMenuItem; + + bool _enabled; + enum Status { PAUSED, STOPPED, PLAYING }; + Status _status; + + Arts::Effect_WAVECAPTURE _capture; + int _count; + long _id; + std::string _filename; + + QTimer* _timer; + KIO::Job* m_job; +}; + +#endif + +// vim:ts=4:sw=4 diff --git a/noatun-plugins/wavecapture/wavecapture.plugin b/noatun-plugins/wavecapture/wavecapture.plugin new file mode 100644 index 0000000..50d7dcc --- /dev/null +++ b/noatun-plugins/wavecapture/wavecapture.plugin @@ -0,0 +1,112 @@ +Filename=noatunwavecapture.la +Author=Matthias Kretz +Site=http://noatun.kde.org/ +Email=kretz@kde.org +Type=no idea +License=GPL +Name=Wave Capture +Name[af]=Golf Vang +Name[az]=Səs Yaxalama +Name[ca]=Captura wave +Name[cs]=Zachycení do WAV +Name[cy]=Dal Tonnau +Name[da]=Wave-indfanger +Name[de]=wav-Rekorder +Name[el]=Σύλληψη wave +Name[eo]=Onda kaptado +Name[es]=Captura de onda +Name[et]=Wave-faili salvestaja +Name[eu]=Uhin harrapatzailea +Name[fa]=گیراندازی Wave +Name[fi]=Äänen kaappaus +Name[fr]=Capture wave +Name[fy]=Weach-heiner +Name[gl]=Captura como WAVE +Name[he]=לכידת Wave +Name[hi]=वेव केप्चर +Name[hr]=Wave snimanje +Name[hu]=Hangfelvétel +Name[it]=Cattura in wav +Name[ja]=Wave キャプチャ +Name[ka]=ტალღათა ჩამწერი +Name[km]=ចាប់យក wave +Name[lt]=Wave įrašymas +Name[mk]=Снимање звук +Name[nb]=Wave-opptak +Name[nds]=Wave-Datei opnehmen +Name[ne]=वेभ ग्रहण +Name[nl]=Wave-vanger +Name[nn]=Wave-opptak +Name[nso]=Tshwaro ya Lephoto +Name[pa]=ਤਰੰਗ ਪ੍ਰਾਪਤੀ +Name[pl]=Zgrywanie do pliku WAV +Name[pt]=Captura para WAVE +Name[ro]=Captură WAV +Name[ru]=Сохранение в wav +Name[sk]=Uložiť wave +Name[sl]=Zajem WAV +Name[sv]=Vågformslagring +Name[ta]=அலை கவர்தல் +Name[tg]=Захира кардан дар wav +Name[tr]=Dalga Yakalayıcı +Name[uk]=Збереження у Wave +Name[vi]=Bắt WAV +Name[xh]=Ubamba Amaza +Name[zh_CN]=声波抓取 +Comment=Capture to wave file +Comment[af]=Vang na golf lêer +Comment[az]=Yaxala və wave faylına qeyd et +Comment[bg]=Аудио запис във файл във формат wave +Comment[bs]=Hvata melodiju u wave datoteku +Comment[ca]=Captura a un fitxer wave +Comment[cs]=Zachycení do WAV souboru +Comment[cy]=Dal i ffeil wave +Comment[da]=Indfang til wave-fil +Comment[de]=Aufnehmen als wav-Datei +Comment[el]=Σύλληψη σε αρχείο wave +Comment[eo]=Kaptu al onda dosiero +Comment[es]=Crea un archivo de ondas +Comment[et]=Salvestab wave-failiks +Comment[eu]=Uhin fitxategira harrapatzen du +Comment[fa]=گیراندازی پروندۀ wave +Comment[fi]=Kaappaa äänitiedosto +Comment[fr]=Capturer vers un fichier wave +Comment[fy]=Opnimme as weach-triem +Comment[ga]=Gabháil i gcomhad toinne +Comment[gl]=Capturar a un ficheiro WAVE +Comment[he]=לכידה לקובץ wave +Comment[hi]=वेव फ़ाइल में केप्चर करता है +Comment[hr]=Snimanje u wav datoteku +Comment[hu]=Mentés WAV fájlba +Comment[is]=Vista hljóð í wave skrár +Comment[it]=Cattura su di file wave +Comment[ja]=wave ファイルに保存 +Comment[ka]=ტალღის ფაილში ჩაწერა +Comment[kk]=Дыбысты қағып алып сақтау +Comment[km]=ចាប់យកឯកសារ wave +Comment[lt]=Užfiksuoti wave byloje +Comment[mk]=Снимање во wave-датотека +Comment[ms]=Cekup ke fail wave +Comment[nb]=Opptak til wav-file +Comment[nds]=Wave-Datei opnehmen +Comment[ne]=वेभ फाइलमा अभिग्रहण गर्नुहोस् +Comment[nl]=Opnemen als wave-bestand +Comment[nn]=Opptak til wave-file +Comment[pl]=Zgrywanie do pliku WAV +Comment[pt]=Capturar para um ficheiro WAVE +Comment[pt_BR]=captura e transforma para arquivos wave +Comment[ro]=Capturează sunetul într-un fişier WAV +Comment[ru]=Сохранение произведения в формате wav +Comment[sk]=Uložiť wave do súboru +Comment[sl]=Zajem v datoteko WAV +Comment[sr]=Зароби у wave фајл +Comment[sr@Latn]=Zarobi u wave fajl +Comment[sv]=Lagra till vågformsfil +Comment[ta]= அலைக்கோப்புக்கு கவர்தல் +Comment[tg]=Захирашавии баромад дар формати wav +Comment[tr]=Bir dalga dosyasına yakala +Comment[uk]=Збереження в файл wave +Comment[vi]=Bắt vào tập tin WAV +Comment[xh]=Ibanjwe kwifayile yamaza +Comment[zh_CN]=抓取到声波文件 +Comment[zh_TW]=抓取 wave 檔 |