-
-namespace Ui {
- class FusesDialog;
-}
-
-class FusesDialog : public QDialog
-{
- Q_OBJECT
-
-public:
- explicit FusesDialog(QWidget *parent = 0);
- ~FusesDialog();
-
-private slots:
- void on_readFuses_clicked();
- void on_resetFuses_EEdelete_clicked();
- void on_resetFuses_EEprotect_clicked();
-
-private:
- Ui::FusesDialog *ui;
-
-};
-
-#endif // _FUSESDIALOG_H_
diff --git a/companion/src/fusesdialog.ui b/companion/src/fusesdialog.ui
deleted file mode 100644
index e9e161062..000000000
--- a/companion/src/fusesdialog.ui
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
- FusesDialog
-
-
-
- 0
- 0
- 374
- 207
-
-
-
- Fuses
-
-
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Reads the current fuses in the AVR controller.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">AtMega 64 </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">:</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse not set: 0E, 81, FF</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse set: 0E, 89, FF</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for AtMega 2560 :</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse not set: D7, 11, FC</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse set: D7, 19, FC</span></p></body></html>
-
-
- Read Fuses
-
-
-
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Reset Fuses</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Fuses in the AVR tell it how to behave. Pressing this button sets the fuses to the default parameters needed in the FW. These parameters are different for stock and 4.1 MB, please verify you selected the appropriate processor type in preferences.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">This button also sets the "EEPROM protect" Fuse.</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">This prevents erasing of the EEPROM when the flash memory is written.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">WARNING</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Setting fuses can lead to problems and even a total lockout from your controller. Do this only if you know what you are doing.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for "dealing with Fuse Bricks".</span></p></body></html>
-
-
- Reset Fuses
-EEPROM - PROTECT
-
-
-
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Reset Fuses</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Fuses in the AVR tell it how to behave. Pressing this button sets the fuses to the default parameters needed in the </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">FW. These parameters are different for stock and 4.1 MB, please verify you selected the appropriate processor type in preferences.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">This button also clears the "EEPROM protect" Fuse.</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">This causes erasing of the EEPROM when the flash memory is written.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">WARNING</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Setting fuses can lead to problems and even a total lockout from your controller. Do this only if you know what you are doing.</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for "dealing with Fuse Bricks".</span></p></body></html>
-
-
- Reset Fuses
-EEPROM - DELETE
-
-
-
- -
-
-
- QFrame::Panel
-
-
- QFrame::Raised
-
-
- 2
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
-<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">WARNING</span></p>
-<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600; text-decoration: underline;"></p>
-<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changing the fuses can mess up your radio.</p>
-<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceed only if you know what you are doing.</p></body></html>
-
-
-
-
-
-
-
-
-
-
diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp
index 9417f4b37..14c50dace 100644
--- a/companion/src/helpers.cpp
+++ b/companion/src/helpers.cpp
@@ -232,23 +232,6 @@ static bool caseInsensitiveLessThan(const QString &s1, const QString &s2)
return s1.toLower() < s2.toLower();
}
-bool displayT16ImportWarning()
-{
- QMessageBox msgBox;
- msgBox.setWindowTitle(QObject::tr("WARNING"));
- msgBox.setText(QObject::tr("Importing JumperTX data into OpenTX 2.3 is not supported and dangerous.
\
- It is unfortunately not possible for us to differentiate JumperTX data from legitimate FrSky X10 data, but You should only continue here if the file you opened comes from a real FrSky X10.
\
- Do you really want to continue?
"));
- msgBox.setIcon(QMessageBox::Warning);
- msgBox.addButton(QMessageBox::No);
- msgBox.addButton(QMessageBox::Yes);
- msgBox.setDefaultButton(QMessageBox::No);
-
- if (msgBox.exec() == QMessageBox::No)
- return false;
- return true;
-}
-
void Helpers::populateFileComboBox(QComboBox * b, const QSet & set, const QString & current)
{
b->clear();
@@ -347,6 +330,26 @@ int Helpers::getFirstPosValueIndex(QComboBox * cbo)
return -1;
}
+QString Helpers::concatPath(QString & str1, QString & str2, bool onlyonesep)
+{
+ return (str1 % ((!str1.endsWith("/") || !onlyonesep) ? "/" : "") % str2);
+}
+
+QString Helpers::concatPath(const QString & str1, const QString & str2, bool onlyonesep)
+{
+ return (str1 % ((!str1.endsWith("/") || !onlyonesep) ? "/" : "") % str2);
+}
+
+QString Helpers::concatPath(const QString & str1, QString & str2, bool onlyonesep)
+{
+ return (str1 % ((!str1.endsWith("/") || !onlyonesep) ? "/" : "") % str2);
+}
+
+QString Helpers::concatPath(QString & str1, const QString & str2, bool onlyonesep)
+{
+ return (str1 % ((!str1.endsWith("/") || !onlyonesep) ? "/" : "") % str2);
+}
+
#ifdef __APPLE__
// Flag when simulator is running
static bool simulatorRunning = false;
diff --git a/companion/src/helpers.h b/companion/src/helpers.h
index 473504989..05952d920 100644
--- a/companion/src/helpers.h
+++ b/companion/src/helpers.h
@@ -56,8 +56,6 @@ extern const QColor colors[CPN_MAX_CURVES];
#define TRIM_MODE_NONE 0x1F // 0b11111
#define TRIM_MODE_3POS (2 * CPN_MAX_FLIGHT_MODES)
-bool displayT16ImportWarning();
-
class CompanionIcon: public QIcon {
public:
CompanionIcon(const QString &baseimage);
@@ -119,6 +117,10 @@ namespace Helpers
unsigned int getBitmappedValue(const unsigned int & field, const unsigned int index = 0, const unsigned int numbits = 1, const unsigned int offset = 0);
void setBitmappedValue(unsigned int & field, unsigned int value, unsigned int index = 0, unsigned int numbits = 1, unsigned int offset = 0);
int getFirstPosValueIndex(QComboBox * cbo);
+ QString concatPath(QString & str1, QString & str2, bool onlyonesep = true);
+ QString concatPath(const QString & str1, const QString & str2, bool onlyonesep = true);
+ QString concatPath(const QString & str1, QString & str2, bool onlyonesep = true);
+ QString concatPath(QString & str1, const QString & str2, bool onlyonesep = true);
} // namespace Helpers
diff --git a/companion/src/images/library/00001.png b/companion/src/images/library/00001.png
deleted file mode 100644
index 43cd387dc..000000000
Binary files a/companion/src/images/library/00001.png and /dev/null differ
diff --git a/companion/src/images/library/00002.png b/companion/src/images/library/00002.png
deleted file mode 100644
index 37b24b0d7..000000000
Binary files a/companion/src/images/library/00002.png and /dev/null differ
diff --git a/companion/src/images/library/00003.png b/companion/src/images/library/00003.png
deleted file mode 100644
index 6e45e310a..000000000
Binary files a/companion/src/images/library/00003.png and /dev/null differ
diff --git a/companion/src/images/library/00004.png b/companion/src/images/library/00004.png
deleted file mode 100644
index e8494d868..000000000
Binary files a/companion/src/images/library/00004.png and /dev/null differ
diff --git a/companion/src/images/library/00005.png b/companion/src/images/library/00005.png
deleted file mode 100644
index 34e83f860..000000000
Binary files a/companion/src/images/library/00005.png and /dev/null differ
diff --git a/companion/src/images/library/00006.png b/companion/src/images/library/00006.png
deleted file mode 100644
index ce8bb5ce1..000000000
Binary files a/companion/src/images/library/00006.png and /dev/null differ
diff --git a/companion/src/images/library/00007.png b/companion/src/images/library/00007.png
deleted file mode 100644
index 358a29faf..000000000
Binary files a/companion/src/images/library/00007.png and /dev/null differ
diff --git a/companion/src/images/library/00008.png b/companion/src/images/library/00008.png
deleted file mode 100644
index 1399c91ae..000000000
Binary files a/companion/src/images/library/00008.png and /dev/null differ
diff --git a/companion/src/images/library/00009.png b/companion/src/images/library/00009.png
deleted file mode 100644
index e71a38cae..000000000
Binary files a/companion/src/images/library/00009.png and /dev/null differ
diff --git a/companion/src/images/library/00010.png b/companion/src/images/library/00010.png
deleted file mode 100644
index fa973998b..000000000
Binary files a/companion/src/images/library/00010.png and /dev/null differ
diff --git a/companion/src/images/library/00011.png b/companion/src/images/library/00011.png
deleted file mode 100644
index f5f61be96..000000000
Binary files a/companion/src/images/library/00011.png and /dev/null differ
diff --git a/companion/src/images/library/00012.png b/companion/src/images/library/00012.png
deleted file mode 100644
index 8af4d4fc4..000000000
Binary files a/companion/src/images/library/00012.png and /dev/null differ
diff --git a/companion/src/images/library/00021.png b/companion/src/images/library/00021.png
deleted file mode 100644
index d1c867df1..000000000
Binary files a/companion/src/images/library/00021.png and /dev/null differ
diff --git a/companion/src/images/library/00022.png b/companion/src/images/library/00022.png
deleted file mode 100644
index 85ef578f8..000000000
Binary files a/companion/src/images/library/00022.png and /dev/null differ
diff --git a/companion/src/images/library/00050.png b/companion/src/images/library/00050.png
deleted file mode 100644
index 0218d0570..000000000
Binary files a/companion/src/images/library/00050.png and /dev/null differ
diff --git a/companion/src/images/library/00051.png b/companion/src/images/library/00051.png
deleted file mode 100644
index ec135da3c..000000000
Binary files a/companion/src/images/library/00051.png and /dev/null differ
diff --git a/companion/src/images/library/00052.png b/companion/src/images/library/00052.png
deleted file mode 100644
index 64eca2f66..000000000
Binary files a/companion/src/images/library/00052.png and /dev/null differ
diff --git a/companion/src/images/library/00053.png b/companion/src/images/library/00053.png
deleted file mode 100644
index c73a99701..000000000
Binary files a/companion/src/images/library/00053.png and /dev/null differ
diff --git a/companion/src/images/library/00054.png b/companion/src/images/library/00054.png
deleted file mode 100644
index e4d1878c9..000000000
Binary files a/companion/src/images/library/00054.png and /dev/null differ
diff --git a/companion/src/images/library/00055.png b/companion/src/images/library/00055.png
deleted file mode 100644
index 5bf13ecb2..000000000
Binary files a/companion/src/images/library/00055.png and /dev/null differ
diff --git a/companion/src/images/library/00056.png b/companion/src/images/library/00056.png
deleted file mode 100644
index c44d1a5e0..000000000
Binary files a/companion/src/images/library/00056.png and /dev/null differ
diff --git a/companion/src/images/library/00057.png b/companion/src/images/library/00057.png
deleted file mode 100644
index 678355ae0..000000000
Binary files a/companion/src/images/library/00057.png and /dev/null differ
diff --git a/companion/src/images/library/00058.png b/companion/src/images/library/00058.png
deleted file mode 100644
index fa384d1e6..000000000
Binary files a/companion/src/images/library/00058.png and /dev/null differ
diff --git a/companion/src/images/library/00059.png b/companion/src/images/library/00059.png
deleted file mode 100644
index 6d5a1d93d..000000000
Binary files a/companion/src/images/library/00059.png and /dev/null differ
diff --git a/companion/src/images/library/00060.png b/companion/src/images/library/00060.png
deleted file mode 100644
index 9f3c5d78e..000000000
Binary files a/companion/src/images/library/00060.png and /dev/null differ
diff --git a/companion/src/images/library/00061.png b/companion/src/images/library/00061.png
deleted file mode 100644
index f054a15d8..000000000
Binary files a/companion/src/images/library/00061.png and /dev/null differ
diff --git a/companion/src/images/library/00062.png b/companion/src/images/library/00062.png
deleted file mode 100644
index ed7a1c01f..000000000
Binary files a/companion/src/images/library/00062.png and /dev/null differ
diff --git a/companion/src/images/library/00063.png b/companion/src/images/library/00063.png
deleted file mode 100644
index 6d199bb6f..000000000
Binary files a/companion/src/images/library/00063.png and /dev/null differ
diff --git a/companion/src/images/library/00064.png b/companion/src/images/library/00064.png
deleted file mode 100644
index 2b2081c88..000000000
Binary files a/companion/src/images/library/00064.png and /dev/null differ
diff --git a/companion/src/images/library/00065.png b/companion/src/images/library/00065.png
deleted file mode 100644
index 4a92323e5..000000000
Binary files a/companion/src/images/library/00065.png and /dev/null differ
diff --git a/companion/src/images/library/00066.png b/companion/src/images/library/00066.png
deleted file mode 100644
index 2e7668f7d..000000000
Binary files a/companion/src/images/library/00066.png and /dev/null differ
diff --git a/companion/src/images/library/00304.png b/companion/src/images/library/00304.png
deleted file mode 100644
index 936732b2e..000000000
Binary files a/companion/src/images/library/00304.png and /dev/null differ
diff --git a/companion/src/images/library/10801.png b/companion/src/images/library/10801.png
deleted file mode 100644
index 1ad61712b..000000000
Binary files a/companion/src/images/library/10801.png and /dev/null differ
diff --git a/companion/src/images/library/10802.png b/companion/src/images/library/10802.png
deleted file mode 100644
index bbf26657e..000000000
Binary files a/companion/src/images/library/10802.png and /dev/null differ
diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp
index f4a261042..159d3bd4d 100644
--- a/companion/src/mainwindow.cpp
+++ b/companion/src/mainwindow.cpp
@@ -21,7 +21,6 @@
#include "mainwindow.h"
#include "mdichild.h"
-#include "burnconfigdialog.h"
#include "comparedialog.h"
#include "logsdialog.h"
#include "apppreferencesdialog.h"
@@ -34,7 +33,6 @@
#include "warnings.h"
#include "helpers.h"
#include "appdata.h"
-#include "radionotfound.h"
#include "process_sync.h"
#include "radiointerface.h"
#include "progressdialog.h"
@@ -483,7 +481,7 @@ void MainWindow::sdsync(bool postUpdate)
if (syncOpts.folderA.isEmpty())
syncOpts.folderA = g.profile[g.id()].sdPath();
if (syncOpts.folderB.isEmpty())
- syncOpts.folderB = findMassstoragePath("SOUNDS", true);
+ syncOpts.folderB = findMassStoragePath("SOUNDS", true);
if (syncOpts.folderA.isEmpty())
errorMsgs << tr("No local SD structure path configured!");
@@ -556,11 +554,14 @@ void MainWindow::readSettings()
bool MainWindow::readFirmwareFromRadio(const QString & filename)
{
ProgressDialog progressDialog(this, tr("Read Firmware from Radio"), CompanionIcon("read_flash.png"));
- bool result = readFirmware(filename, progressDialog.progress());
- if (!result && !progressDialog.isEmpty()) {
+ progressDialog.open();
+
+ if (readFirmware(filename, progressDialog.progress())) {
progressDialog.exec();
+ return true;
}
- return result;
+
+ return false;
}
bool MainWindow::readSettingsFromRadio(const QString & filename)
@@ -587,40 +588,38 @@ void MainWindow::writeFlash(QString fileToFlash)
{
FlashFirmwareDialog * cd = new FlashFirmwareDialog(this);
cd->exec();
+ cd->deleteLater();
}
void MainWindow::readBackup()
{
- if (IS_FAMILY_HORUS_OR_T16(getCurrentBoard())) {
- QMessageBox::information(this, CPN_STR_APP_NAME, tr("This function is not yet implemented"));
- return;
- // TODO implementation
- }
- QString fileName = QFileDialog::getSaveFileName(this, tr("Save Radio Backup to File"), g.eepromDir(), EXTERNAL_EEPROM_FILES_FILTER);
- if (!fileName.isEmpty()) {
- if (!readSettingsFromRadio(fileName))
- return;
- }
}
void MainWindow::readFlash()
{
- QString fileName = QFileDialog::getSaveFileName(this,tr("Read Radio Firmware to File"), g.flashDir(), FLASH_FILES_FILTER);
- if (!fileName.isEmpty()) {
- readFirmwareFromRadio(fileName);
+ if (!isRadioConnected()) {
+ QMessageBox::critical(this, tr("Detect Radio"),
+ tr("Radio could not be detected by DFU or UF2 modes") % ".\n" %
+ tr("Check cable is securely connected and radio lights are illuminated") % ".\n" %
+ tr("Note: USB mode is not suitable for flashing firmware."));
+ return;
}
-}
-void MainWindow::burnConfig()
-{
- burnConfigDialog *bcd = new burnConfigDialog(this);
- bcd->exec();
- delete bcd;
-}
+ ProgressDialog progressDialog(this, tr("Read Firmware From Radio"),
+ CompanionIcon("read_flash.png"));
-void MainWindow::burnList()
-{
- burnConfigDialog bcd(this);
+ auto progress = progressDialog.progress();
+
+ readFirmware(
+ [this, progress](const QByteArray &_data) {
+ writeFirmwareToFile(this, _data, progress, true);
+ },
+ [this](const QString &err) {
+ qDebug() << tr("Could not read radio firmware: %1").arg(err);
+ },
+ progress);
+
+ progressDialog.exec();
}
void MainWindow::compare()
@@ -824,7 +823,6 @@ void MainWindow::retranslateUi(bool showMsg)
trAct(exportAppSettingsAct, tr("Export Settings..."), tr("Save all the current %1 and Simulator settings (including radio profiles) to a file.").arg(CPN_STR_APP_NAME));
trAct(importAppSettingsAct, tr("Import Settings..."), tr("Load %1 and Simulator settings from a prevously exported settings file.").arg(CPN_STR_APP_NAME));
- trAct(burnConfigAct, tr("Configure Radio Communications..."), tr("Configure Companion for communicating with the Radio"));
trAct(editSplashAct, tr("Edit Radio Splash Image..."), tr("Edit the splash image of your Radio"));
trAct(readFlashAct, tr("Read Firmware from Radio"), tr("Read firmware from Radio"));
trAct(writeFlashAct, tr("Write Firmware to Radio"), tr("Write firmware to Radio"));
@@ -832,6 +830,7 @@ void MainWindow::retranslateUi(bool showMsg)
trAct(readSettingsAct, tr("Read Models and Settings from Radio"), tr("Read Models and Settings from Radio"));
trAct(writeBUToRadioAct, tr("Write Backup to Radio"), tr("Write Backup from file to Radio"));
trAct(readBUToFileAct, tr("Backup Radio to File"), tr("Save a complete backup file of all settings and model data in the Radio"));
+ trAct(radioGetDevicesAct, tr("Connected Radios"), tr("Get a list of connected radios"));
trAct(compareAct, tr("Compare Models"), tr("Compare models"));
trAct(updatesAct, tr("Update components..."), tr("Download and update EdgeTX components and supporting resources"));
@@ -897,7 +896,7 @@ void MainWindow::createActions()
editAppSettingsAct = addAct("apppreferences.png", SLOT(editAppSettings()), QKeySequence::Preferences);
exportAppSettingsAct = addAct("saveas.png", SLOT(exportAppSettings()));
importAppSettingsAct = addAct("open.png", SLOT(importAppSettings()));
- burnConfigAct = addAct("configure.png", SLOT(burnConfig()));
+ radioGetDevicesAct = addAct("configure.png", SLOT(radioGetDevices()));
compareAct = addAct("compare.png", SLOT(compare()), tr("Ctrl+Alt+R"));
updatesAct = addAct("download.png", SLOT(updates()), tr("Ctrl+Alt+D"));
@@ -910,7 +909,6 @@ void MainWindow::createActions()
sdsyncAct = addAct("sdsync.png", SLOT(sdsync()));
logsAct = addAct("logs.png", SLOT(logFile()), tr("Ctrl+Alt+L"));
- burnListAct = addAct("list.png", SLOT(burnList()));
readFlashAct = addAct("read_flash.png", SLOT(readFlash()));
writeFlashAct = addAct("write_flash.png", SLOT(writeFlash()));
writeSettingsAct = addAct("write_eeprom.png", SLOT(writeSettings()));
@@ -1003,8 +1001,8 @@ void MainWindow::createMenus()
radioMenu->addAction(writeFlashAct);
radioMenu->addAction(readFlashAct);
radioMenu->addSeparator();
- radioMenu->addAction(burnConfigAct);
radioMenu->addAction(editSplashAct);
+ radioMenu->addAction(radioGetDevicesAct);
settingsMenu = menuBar()->addMenu("");
settingsMenu->addAction(editAppSettingsAct);
@@ -1090,7 +1088,6 @@ void MainWindow::createToolBars()
radioToolBar->addAction(writeFlashAct);
radioToolBar->addAction(readFlashAct);
radioToolBar->addSeparator();
- radioToolBar->addAction(burnConfigAct);
settingsToolBar = addToolBar("");
settingsToolBar->setObjectName("Settings");
@@ -1577,3 +1574,8 @@ void MainWindow::viewToolsToolbar()
const QSignalBlocker blocker(toolsToolBar);
toolsToolBar->setVisible(viewToolsToolbarAct->isChecked());
}
+
+void MainWindow::radioGetDevices()
+{
+ QMessageBox::information(this, tr("Connected Radios"), getDevicesInfo());
+}
diff --git a/companion/src/mainwindow.h b/companion/src/mainwindow.h
index f90b9ad03..2bc73bb92 100644
--- a/companion/src/mainwindow.h
+++ b/companion/src/mainwindow.h
@@ -94,8 +94,6 @@ class MainWindow : public QMainWindow
void readFlash();
void writeBackup();
void readBackup();
- void burnConfig();
- void burnList();
void sdsync(bool postUpdate = false);
void changelog();
void customizeSplash();
@@ -127,6 +125,8 @@ class MainWindow : public QMainWindow
void viewSettingsToolbar();
void viewToolsToolbar();
+ void radioGetDevices();
+
private:
QAction * addAct(const QString & icon, const char * slot = NULL, const QKeySequence & shortcut = 0, QObject * slotObj = NULL, const char * signal = NULL);
QAction * addActToGroup(QActionGroup * aGroup, const QString & sName, const QString & lName, const char * propName = 0,
@@ -209,8 +209,7 @@ class MainWindow : public QMainWindow
QAction *editSplashAct;
QAction *writeSettingsAct;
QAction *readSettingsAct;
- QAction *burnConfigAct;
- QAction *burnListAct;
+ QAction *radioGetDevicesAct;
QAction *writeFlashAct;
QAction *readFlashAct;
QAction *writeBUToRadioAct;
diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp
index b9fc2c89e..02949f359 100644
--- a/companion/src/mdichild.cpp
+++ b/companion/src/mdichild.cpp
@@ -23,7 +23,6 @@
#include "ui_mdichild.h"
#include "modeledit/modeledit.h"
#include "generaledit/generaledit.h"
-#include "burnconfigdialog.h"
#include "printdialog.h"
#include "helpers.h"
#include "appdata.h"
@@ -1434,11 +1433,6 @@ bool MdiChild::convertStorage(Board::Type from, Board::Type to, bool newFile)
QMessageBox::StandardButtons btns;
QMessageBox::StandardButton dfltBtn;
- if (from == Board::BOARD_X10 && to == Board::BOARD_JUMPER_T16) {
- if (displayT16ImportWarning() == false)
- return false;
- }
-
QString q = tr("Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.
").arg(Boards::getBoardName(to)).arg(Boards::getBoardName(from)).arg(userFriendlyCurrentFile());
if (newFile) {
q.append(tr("Do you wish to continue with the conversion?"));
@@ -1526,7 +1520,7 @@ void MdiChild::writeSettings(StatusDialog * status, bool toRadio) // write to T
QString radioPath;
if (toRadio) {
- radioPath = findMassstoragePath("RADIO", true);
+ radioPath = findMassStoragePath("RADIO", true);
qDebug() << "Searching for SD card, found" << radioPath;
}
else {
diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp
deleted file mode 100644
index 31af88a03..000000000
--- a/companion/src/process_flash.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#include "process_flash.h"
-#include "progresswidget.h"
-#include "eeprominterface.h"
-#include
-#include
-#include
-#include
-#include
-
-#if defined _MSC_VER || !defined __GNUC__
-#include
-#include
-#include
-#define sleep(x) Sleep(x*1000)
-#else
-#include
-#endif
-
-FlashProcess::FlashProcess(const QString & cmd, const QStringList & args, ProgressWidget * progress):
- progress(progress),
- cmd(cmd),
- args(args),
- process(new QProcess(this)),
- hasErrors(false),
- lfuse(0),
- hfuse(0),
- efuse(0),
- flashPhase(READING)
-#if !__GNUC__
- , killTimer(nullptr)
-#endif
-{
- connect(process, SIGNAL(started()),this, SLOT(onStarted()));
- connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyReadStandardOutput()));
- connect(process, SIGNAL(readyReadStandardError()), this, SLOT(onReadyReadStandardError()));
- connect(process, SIGNAL(finished(int)), this, SLOT(onFinished(int)));
-}
-
-FlashProcess::~FlashProcess()
-{
-#if !__GNUC__
- delete killTimer;
-#endif
-}
-
-bool FlashProcess::run()
-{
- if (!QFile::exists(cmd)) {
- QMessageBox::critical(nullptr, CPN_STR_APP_NAME, tr("Executable %1 not found").arg(cmd));
- return false;
- }
-
-#if !__GNUC__
- if (cmd.toLower().contains("sam-ba")) {
- killTimer = new QTimer(this);
- connect(killTimer, SIGNAL(timeout()), this, SLOT(onKillTimerElapsed()));
- killTimer->start(2000);
- }
-#endif
-
- QEventLoop loop;
- connect(this, SIGNAL(finished()), &loop, SLOT(quit()));
- process->start(cmd, args);
- loop.exec();
-
- return true;
-}
-
-void FlashProcess::onStarted()
-{
- progress->lock(true);
- progress->addText(cmd + " " + args.join(" "));
- progress->addSeparator();
-}
-
-#if !__GNUC__
-bool killProcessByName(const char *szProcessToKill)
-{
- QString processToKill{szProcessToKill};
- HANDLE hProcessSnap;
- HANDLE hProcess;
- PROCESSENTRY32 pe32;
-
- hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Takes a snapshot of all the processes
-
- if (hProcessSnap == INVALID_HANDLE_VALUE) {
- return false;
- }
-
- pe32.dwSize = sizeof(PROCESSENTRY32);
-
- if (!Process32First(hProcessSnap, &pe32)) {
- CloseHandle(hProcessSnap);
- return false;
- }
-
- do {
- QString exeFile{pe32.szExeFile};
-
- if (exeFile == processToKill) { // checks if process at current position has the name of to be killed app
- hProcess = OpenProcess(PROCESS_TERMINATE,0, pe32.th32ProcessID); // gets handle to process
- TerminateProcess(hProcess, 0); // Terminate process by handle
- CloseHandle(hProcess); // close the handle
- }
- } while (Process32Next(hProcessSnap, &pe32)); // gets next member of snapshot
-
- CloseHandle(hProcessSnap); // closes the snapshot handle
- return true;
-}
-#endif
-
-void FlashProcess::onKillTimerElapsed()
-{
-#if !__GNUC__
- // trick to accelerate SAM-BA startup
- killProcessByName("tasklist.exe");
-#endif
-}
-
-void FlashProcess::analyseStandardOutput(const QString & text)
-{
- currStdoutLine.append(text);
-
- if (currStdoutLine.contains("size = ")) {
- int pos = currStdoutLine.lastIndexOf("size = ");
- QString temp = currStdoutLine.mid(pos+7);
- pos = temp.lastIndexOf("\n");
- int size = temp.left(pos).toInt();
- progress->setMaximum(size / 2048);
- }
-
- if (currStdoutLine.contains("\n")) {
- int nlPos = currStdoutLine.lastIndexOf("\n");
- currStdoutLine = currStdoutLine.mid(nlPos+1);
- }
-
- if (!currStdoutLine.isEmpty()) {
- if (currStdoutLine.at(0) == QChar('.')) {
- int pos = currStdoutLine.lastIndexOf(".");
- progress->setValue(pos);
- }
- else if (currStdoutLine.startsWith("Starting upload: [")) {
- int pos = (currStdoutLine.lastIndexOf("#") - 19) * 100 / 256;
- progress->setValue(pos);
- }
- }
-
- if (text.contains("Complete ")) {
-#if !__GNUC__
- delete killTimer;
- killTimer = nullptr;
-#endif
- int start = text.indexOf("Complete ");
- int end = text.indexOf("%");
- if (start > 0) {
- start += 9;
- int value = text.mid(start, end - start).toInt();
- progress->setValue(value);
- }
- }
-
- if (text.contains("Upload\t[") || text.contains("Download\t[")) {
- int end = text.indexOf("%");
- if (end > 0) {
- int value = text.mid(end - 3, 3).toInt();
- progress->setValue(value);
- }
- }
-
- if (text.contains(":010000")) {
- // contains fuse info
- QStringList stl = text.split(":01000000");
- foreach (QString t, stl) {
- bool ok = false;
- if (!lfuse) lfuse = t.left(2).toInt(&ok, 16);
- if (!hfuse && !ok) hfuse = t.left(2).toInt(&ok, 16);
- if (!efuse && !ok) efuse = t.left(2).toInt(&ok, 16);
- }
- }
-
- if (text.contains("-E-")) {
- hasErrors = true;
- }
-
- if (text.contains("Cannot open device")) {
- hasErrors = true;
- }
-}
-
-void FlashProcess::analyseStandardError(const QString &text)
-{
- currStderrLine.append(text);
- if (currStderrLine.contains("#")) {
- QString avrflashPhase = currStderrLine.left(1).toLower();
- if (avrflashPhase == "w") {
- flashPhase = WRITING;
- progress->setInfo(tr("Writing..."));
- progress->setValue(2 * currStderrLine.count("#"));
- }
- else if (avrflashPhase == "r") {
- if (flashPhase == READING) {
- progress->setInfo(tr("Reading..."));
- }
- else {
- flashPhase = VERIFYING;
- progress->setInfo(tr("Verifying..."));
- }
- progress->setValue(2 * currStderrLine.count("#"));
- }
- }
-
- if (currStderrLine.contains("\n")) {
- int nlPos = currStderrLine.lastIndexOf("\n");
- currStderrLine = currStderrLine.mid(nlPos+1);
- }
-
- if ((text.contains("-E-") && !text.contains("-E- No receive file name")) ||
- text.contains("No DFU capable USB device found")) {
- hasErrors = true;
- }
-}
-
-void FlashProcess::onReadyReadStandardOutput()
-{
- QString text = QString(process->readAllStandardOutput());
- progress->addText(text);
- analyseStandardOutput(text);
-}
-
-void FlashProcess::onReadyReadStandardError()
-{
- QString text = QString(process->readAllStandardError());
- progress->addText(text);
- analyseStandardError(text);
-}
-
-void FlashProcess::errorWizard()
-{
- QString output = progress->getText();
-
- if (output.contains("avrdude: Expected signature for")) { // wrong signature
- int pos = output.indexOf("avrdude: Device signature = ");
- bool fwexist = false;
- QString DeviceStr = tr("unknown");
- QString FwStr = "";
-
- if (pos > 0) {
- QString DeviceId = output.mid(pos+28, 8);
- if (DeviceId=="0x1e9602") {
- DeviceStr = "Atmega 64";
- FwStr="\n" + tr("ie: OpenTX for 9X board or OpenTX for 9XR board");
- fwexist = true;
- }
- else if (DeviceId=="0x1e9702") {
- DeviceStr = "Atmega 128";
- FwStr="\n" + tr("ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip");
- fwexist = true;
- }
- else if (DeviceId=="0x1e9703") {
- DeviceStr = "Atmega 1280";
- }
- else if (DeviceId=="0x1e9704") {
- DeviceStr = "Atmega 1281";
- }
- else if (DeviceId=="0x1e9801") {
- DeviceStr = "Atmega 2560";
- FwStr="\n" + tr("ie: OpenTX for Gruvin9X board");
- fwexist = true;
- }
- else if (DeviceId=="0x1e9802") {
- DeviceStr = "Atmega 2561";
- }
- }
- if (!fwexist) {
- QMessageBox::warning(nullptr, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease check advanced burn options to set the correct cpu type.").arg(DeviceStr));
- }
- else {
- Firmware *firmware = getCurrentFirmware();
- QMessageBox::warning(nullptr, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease select an appropriate firmware type to program it.").arg(DeviceStr)+FwStr+tr("\nYou are currently using:\n %1").arg(firmware->getName()));
- }
- }
- else if (output.contains("No DFU capable USB device found")){
- QMessageBox::warning(nullptr, "Companion - Tip of the day", tr("Your radio does not seem connected to USB or the driver is not initialized!!!."));
- }
-}
-
-void FlashProcess::onFinished(int code=0)
-{
- progress->addSeparator();
- if (code==1 && cmd.toLower().contains("sam-ba")) {
- code = 0;
- }
- if (code) {
- progress->setInfo(tr("Flashing done (exit code = %1)").arg(code));
- if (cmd.toLower().contains("avrdude") || cmd.toLower().contains("dfu")) {
- errorWizard();
- }
- }
- else if (hasErrors) {
- progress->setInfo(tr("Flashing done with errors"));
- }
- if (lfuse || hfuse || efuse) {
- addReadFuses();
- }
- progress->setValue(progress->maximum());
- progress->lock(false);
- emit finished();
-}
-
-void FlashProcess::addReadFuses()
-{
- progress->addSeparator();
- progress->addText(tr("FUSES: Low=%1 High=%2 Ext=%3").arg(lfuse, 2, 16, QChar('0')).arg(hfuse, 2, 16, QChar('0')).arg(efuse, 2, 16, QChar('0')));
- progress->addSeparator();
-}
diff --git a/companion/src/process_flash.h b/companion/src/process_flash.h
deleted file mode 100644
index 24ea88c4e..000000000
--- a/companion/src/process_flash.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#ifndef _PROCESS_FLASH_H_
-#define _PROCESS_FLASH_H_
-
-#include
-#include
-#include
-
-class ProgressWidget;
-class QProcess;
-class QTimer;
-
-class FlashProcess : public QObject
-{
- Q_OBJECT
-
-public:
- FlashProcess(const QString &cmd, const QStringList &args, ProgressWidget *progress);
- ~FlashProcess();
- bool run();
-
-signals:
- void finished();
-
-protected slots:
- void onStarted();
- void onReadyReadStandardOutput();
- void onReadyReadStandardError();
- void onFinished(int);
- void onKillTimerElapsed();
-
-protected:
- void analyseStandardOutput(const QString &text);
- void analyseStandardError(const QString &text);
- void errorWizard();
- void addReadFuses();
- ProgressWidget * progress;
- const QString cmd;
- const QStringList args;
- QProcess * process;
- bool hasErrors;
- QString currStdoutLine;
- QString currStderrLine;
- unsigned int lfuse;
- unsigned int hfuse;
- unsigned int efuse;
- enum FlashPhase { READING, WRITING, VERIFYING };
- FlashPhase flashPhase;
-#if !__GNUC__
- QTimer *killTimer;
-#endif
-};
-
-#endif // _PROCESS_FLASH_H_
diff --git a/companion/src/progress/CMakeLists.txt b/companion/src/progress/CMakeLists.txt
new file mode 100644
index 000000000..d423147e7
--- /dev/null
+++ b/companion/src/progress/CMakeLists.txt
@@ -0,0 +1,30 @@
+
+project(progress)
+
+set(${PROJECT_NAME}_NAMES
+ progressdialog
+ progresswidget
+)
+
+AddHeadersSources()
+
+qt_wrap_cpp(${PROJECT_NAME}_SRCS
+)
+
+add_library(${PROJECT_NAME}
+ ${${PROJECT_NAME}_HDRS}
+ ${${PROJECT_NAME}_SRCS}
+)
+
+target_link_libraries(${PROJECT_NAME}
+ PRIVATE
+ ${CPN_COMMON_LIB}
+)
+
+target_include_directories(${PROJECT_NAME}
+ PRIVATE
+ "${CMAKE_SOURCE_DIR}"
+ "${CMAKE_CURRENT_BINARY_DIR}"
+ PUBLIC
+ "${CMAKE_CURRENT_LIST_DIR}"
+)
diff --git a/companion/src/progressdialog.cpp b/companion/src/progress/progressdialog.cpp
similarity index 89%
rename from companion/src/progressdialog.cpp
rename to companion/src/progress/progressdialog.cpp
index 02b5b4e94..25da343fe 100644
--- a/companion/src/progressdialog.cpp
+++ b/companion/src/progress/progressdialog.cpp
@@ -26,10 +26,10 @@
#include
ProgressDialog::ProgressDialog(QWidget *parent, const QString &title, const QIcon &icon, bool forceOpen):
-QDialog(parent),
-ui(new Ui::ProgressDialog),
-locked(false),
-keepOpen(false)
+ QDialog(parent),
+ ui(new Ui::ProgressDialog),
+ locked(false),
+ keepOpen(false)
{
ui->setupUi(this);
setWindowTitle(title);
@@ -39,6 +39,7 @@ keepOpen(false)
ui->outputProgress->forceOpen();
}
resize(0, 0);
+ connect(ui->outputProgress, &ProgressWidget::locked, this, &ProgressDialog::on_outputProgress_locked);
show();
}
@@ -64,7 +65,7 @@ void ProgressDialog::on_closeButton_clicked()
void ProgressDialog::on_outputProgress_detailsToggled()
{
- QTimer::singleShot(0, this, SLOT(shrink()));
+ QTimer::singleShot(0, [=]() { adjustSize(); });
}
void ProgressDialog::on_outputProgress_locked(bool lock)
@@ -73,11 +74,6 @@ void ProgressDialog::on_outputProgress_locked(bool lock)
locked = lock;
}
-void ProgressDialog::shrink()
-{
- resize(0, 0);
-}
-
bool ProgressDialog::isEmpty() const
{
return ui->outputProgress->isEmpty();
diff --git a/companion/src/progressdialog.h b/companion/src/progress/progressdialog.h
similarity index 98%
rename from companion/src/progressdialog.h
rename to companion/src/progress/progressdialog.h
index 5633a575d..5bbb77d7c 100644
--- a/companion/src/progressdialog.h
+++ b/companion/src/progress/progressdialog.h
@@ -50,7 +50,6 @@ class ProgressDialog : public QDialog
void on_outputProgress_detailsToggled();
void on_outputProgress_locked(bool);
void on_outputProgress_keepOpen(bool);
- void shrink();
private:
Ui::ProgressDialog *ui;
diff --git a/companion/src/progressdialog.ui b/companion/src/progress/progressdialog.ui
similarity index 100%
rename from companion/src/progressdialog.ui
rename to companion/src/progress/progressdialog.ui
diff --git a/companion/src/progresswidget.cpp b/companion/src/progress/progresswidget.cpp
similarity index 99%
rename from companion/src/progresswidget.cpp
rename to companion/src/progress/progresswidget.cpp
index ecbc6892d..e63b260f0 100644
--- a/companion/src/progresswidget.cpp
+++ b/companion/src/progress/progresswidget.cpp
@@ -52,7 +52,6 @@ ProgressWidget::ProgressWidget(QWidget *parent) :
newFont.setPointSize(9);
#endif
ui->textEdit->setFont(newFont);
-
}
ProgressWidget::~ProgressWidget()
diff --git a/companion/src/progresswidget.h b/companion/src/progress/progresswidget.h
similarity index 100%
rename from companion/src/progresswidget.h
rename to companion/src/progress/progresswidget.h
diff --git a/companion/src/progresswidget.ui b/companion/src/progress/progresswidget.ui
similarity index 100%
rename from companion/src/progresswidget.ui
rename to companion/src/progress/progresswidget.ui
diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp
deleted file mode 100644
index f6026cabc..000000000
--- a/companion/src/radiointerface.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#include "radiointerface.h"
-#include "appdata.h"
-#include "eeprominterface.h"
-#include "process_flash.h"
-#include "radionotfound.h"
-#include "burnconfigdialog.h"
-#include "helpers.h"
-#include "process_copy.h"
-#include "storage.h"
-#include "progresswidget.h"
-
-QString getRadioInterfaceCmd()
-{
- burnConfigDialog bcd;
- Board::Type board = getCurrentBoard();
- if (IS_STM32(board)) {
- return bcd.getDFU();
- }
- else
- return bcd.getSAMBA();
-}
-
-QStringList getDfuArgs(const QString & cmd, const QString & filename)
-{
- QStringList args;
- burnConfigDialog bcd;
- args << bcd.getDFUArgs();
- if (!filename.endsWith(".dfu"))
- args << "--dfuse-address" << "0x08000000";
- if (cmd == "-U")
- args.last().append(":" % QString::number(Boards::getFlashSize(getCurrentBoard())));
- args << "--device" << "0483:df11";
- args << cmd % filename;
- return args;
-}
-
-QStringList getSambaArgs(const QString & tcl)
-{
- QStringList result;
-
- QString tclFilename = generateProcessUniqueTempFileName("temp.tcl");
- if (QFile::exists(tclFilename)) {
- qunlink(tclFilename);
- }
- QFile tclFile(tclFilename);
- if (!tclFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
- QMessageBox::warning(NULL, CPN_STR_TTL_ERROR,
- QCoreApplication::translate("RadioInterface", "Cannot write file %1:\n%2.").arg(tclFilename).arg(tclFile.errorString()));
- return result;
- }
-
- QTextStream outputStream(&tclFile);
- outputStream << tcl;
-
- burnConfigDialog bcd;
- result << bcd.getSambaPort() << bcd.getArmMCU() << tclFilename ;
- return result;
-}
-
-QStringList getReadEEpromCmd(const QString & filename)
-{
- QStringList result;
- if (!IS_STM32(getCurrentBoard())) {
- result = getSambaArgs(QString("SERIALFLASH::Init 0\n") + "receive_file {SerialFlash AT25} \"" + filename + "\" 0x0 0x80000 0\n");
- }
- return result;
-}
-
-QStringList getWriteEEpromCmd(const QString & filename)
-{
- Board::Type board = getCurrentBoard();
- if (IS_STM32(board)) {
- // impossible
- return QStringList();
- }
- else {
- return getSambaArgs(QString("SERIALFLASH::Init 0\n") + "send_file {SerialFlash AT25} \"" + filename + "\" 0x0 0\n");
- }
-}
-
-QStringList getWriteFirmwareArgs(const QString & filename)
-{
- Board::Type board = getCurrentBoard();
- if (IS_STM32(board)) {
- return getDfuArgs("-D", filename);
- }
- else {
- return getSambaArgs(QString("send_file {Flash} \"") + filename + "\" 0x400000 0\n" + "FLASH::ScriptGPNMV 2\n");
- }
-}
-
-QStringList getReadFirmwareArgs(const QString & filename)
-{
- Board::Type board = getCurrentBoard();
- if (IS_STM32(board)) {
- return getDfuArgs("-U", filename);
- }
- else {
- return getSambaArgs(QString("receive_file {Flash} \"") + filename + "\" 0x400000 0x80000 0\n");
- }
-}
-
-bool readFirmware(const QString & filename, ProgressWidget * progress)
-{
- bool result = false;
-
- QFile file(filename);
- if (file.exists() && !file.remove()) {
- QMessageBox::warning(NULL, CPN_STR_TTL_ERROR,
- QCoreApplication::translate("RadioInterface", "Could not delete temporary file: %1").arg(filename));
- return false;
- }
-
- QString path = findMassstoragePath("FIRMWARE.BIN");
- if (!path.isEmpty()) {
- qDebug() << "readFirmware: reading" << path << "into" << filename;
- CopyProcess copyProcess(path, filename, progress);
- result = copyProcess.run();
- }
-
- if (!result) {
- qDebug() << "readFirmware: reading" << filename << "with" << getRadioInterfaceCmd() << getReadFirmwareArgs(filename);
- FlashProcess flashProcess(getRadioInterfaceCmd(), getReadFirmwareArgs(filename), progress);
- result = flashProcess.run();
- }
-
- if (!QFileInfo(filename).exists()) {
- result = false;
- }
-
- return result;
-}
-
-bool writeFirmware(const QString & filename, ProgressWidget * progress)
-{
- QString path = findMassstoragePath("FIRMWARE.BIN");
- if (!path.isEmpty()) {
- qDebug() << "writeFirmware: writing" << path << "from" << filename;
- CopyProcess copyProcess(filename, path, progress);
- return copyProcess.run();
- }
-
- qDebug() << "writeFirmware: writing" << filename << "with" << getRadioInterfaceCmd() << getWriteFirmwareArgs(filename);
- FlashProcess flashProcess(getRadioInterfaceCmd(), getWriteFirmwareArgs(filename), progress);
- return flashProcess.run();
-}
-
-bool readSettings(const QString & filename, ProgressWidget * progress)
-{
- Board::Type board = getCurrentBoard();
-
- QFile file(filename);
- if (file.exists() && !file.remove()) {
- QMessageBox::warning(NULL, CPN_STR_TTL_ERROR,
- QCoreApplication::translate("RadioInterface", "Could not delete temporary file: %1").arg(filename));
- return false;
- }
-
- if (Boards::getCapability(board, Board::HasSDCard))
- return readSettingsSDCard(filename, progress);
- else
- return readSettingsEeprom(filename, progress);
-}
-
-bool readSettingsSDCard(const QString & filename, ProgressWidget * progress, bool fromRadio)
-{
- QString radioPath;
-
- if (fromRadio) {
- radioPath = findMassstoragePath("RADIO", true, progress);
- qDebug() << "Searching for SD card, found" << radioPath;
- }
- else {
- radioPath = g.currentProfile().sdPath();
- if (!QFile::exists(radioPath % "/RADIO"))
- radioPath.clear();
- }
-
- if (radioPath.isEmpty()) {
- QMessageBox::critical(progress, CPN_STR_TTL_ERROR,
- QCoreApplication::translate("RadioInterface", "Unable to find SD card!"));
- return false;
- }
-
- RadioData radioData;
- Storage inputStorage(radioPath);
- if (!inputStorage.load(radioData)) {
- QString errorMsg = inputStorage.error();
- if (errorMsg.isEmpty()) {
- errorMsg = QCoreApplication::translate("RadioInterface", "Failed to read Models and Settings from") % radioPath;
- }
- QMessageBox::critical(progress, CPN_STR_TTL_ERROR, errorMsg);
- return false;
- }
- Storage outputStorage(filename);
- if (!outputStorage.write(radioData)) {
- QMessageBox::critical(progress, CPN_STR_TTL_ERROR, QCoreApplication::translate("RadioInterface", "Failed to write Models and Setting file") % " " % filename);
- return false;
- }
-
- if (getCurrentBoard() == Board::BOARD_JUMPER_T16 && inputStorage.getBoard() == Board::BOARD_X10) {
- if (displayT16ImportWarning() == false)
- return false;
- }
-
- return QFileInfo(filename).exists();
-}
-
-
-bool readSettingsEeprom(const QString & filename, ProgressWidget * progress)
-{
- Board::Type board = getCurrentBoard();
-
- QString path = findMassstoragePath("EEPROM.BIN");
- if (path.isEmpty()) {
- // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :(
- path = findMassstoragePath("TARANIS.BIN");
- }
- if (path.isEmpty()) {
- // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :(
- path = findMassstoragePath("ERSKY9X.BIN");
- }
- if (path.isEmpty()) {
- RadioNotFoundDialog dialog(progress);
- dialog.exec();
- return false;
- }
- CopyProcess copyProcess(path, filename, progress);
- if (!copyProcess.run()) {
- return false;
- }
-
-
- if (!IS_STM32(board)) {
- FlashProcess flashProcess(getRadioInterfaceCmd(), getReadEEpromCmd(filename), progress);
- if (!flashProcess.run()) {
- return false;
- }
- }
-
- return QFileInfo(filename).exists();
-}
-
-bool writeSettings(const QString & filename, ProgressWidget * progress)
-{
- Board::Type board = getCurrentBoard();
-
- QString path = findMassstoragePath("EEPROM.BIN");
- if (path.isEmpty()) {
- // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :(
- path = findMassstoragePath("TARANIS.BIN");
- }
- if (path.isEmpty()) {
- // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :(
- path = findMassstoragePath("ERSKY9X.BIN");
- }
- if (!path.isEmpty()) {
- CopyProcess copyProcess(filename, path, progress);
- return copyProcess.run();
- }
-
- if (!IS_TARANIS(board)) {
- FlashProcess flashProcess(getRadioInterfaceCmd(), getWriteEEpromCmd(filename), progress);
- return flashProcess.run();
- }
-
- RadioNotFoundDialog dialog(progress);
- dialog.exec();
-
- return false;
-}
-
-QString findMassstoragePath(const QString & filename, bool onlyPath, ProgressWidget *progress)
-{
- QString foundPath;
- QString foundProbefile;
- int found = 0;
-
- QRegularExpression fstypeRe("^(v?fat|msdos|lifs)", QRegularExpression::CaseInsensitiveOption); // Linux: "vfat"; macOS: "msdos" or "lifs"; Win: "FAT32"
-
- foreach(const QStorageInfo & si, QStorageInfo::mountedVolumes()) {
- //qDebug() << si.rootPath() << si.name() << si.device() << si.displayName() << si.fileSystemType() << si.isReady() << si.bytesTotal() << si.blockSize();
- if (!si.isReady() || si.isReadOnly() || !QString(si.fileSystemType()).contains(fstypeRe))
- continue;
-
- QString temppath = si.rootPath();
- QString probefile = temppath % "/" % filename;
- qDebug() << "Searching for" << probefile;
-
- if (QFile::exists(probefile)) {
- found++;
- foundPath = temppath;
- foundProbefile = probefile;
- qDebug() << probefile << "found";
- }
- }
-
- if (found == 1)
- return onlyPath ? foundPath : foundProbefile;
- else if (found > 1) {
- QMessageBox::critical(progress, CPN_STR_TTL_ERROR, filename % " " % QCoreApplication::translate("RadioInterface", "found in multiple locations"));
- }
-
- return QString();
-}
diff --git a/companion/src/radiointerface.h b/companion/src/radiointerface.h
deleted file mode 100644
index 4b930df9c..000000000
--- a/companion/src/radiointerface.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#pragma once
-
-#include
-#include
-
-class ProgressWidget;
-
-QString getRadioInterfaceCmd();
-
-QString findMassstoragePath(const QString &filename, bool onlyPath = false, ProgressWidget *progress = nullptr);
-
-QStringList getSambaArgs(const QString &tcl);
-QStringList getDfuArgs(const QString &cmd, const QString &filename);
-
-QStringList getReadEEpromCmd(const QString &filename);
-QStringList getWriteEEpromCmd(const QString &filename);
-QStringList getReadFirmwareArgs(const QString &filename);
-QStringList getWriteFirmwareArgs(const QString &filename);
-
-bool readFirmware(const QString &filename, ProgressWidget *progress);
-bool writeFirmware(const QString &filename, ProgressWidget *progress);
-bool readSettings(const QString &filename, ProgressWidget *progress);
-bool readSettingsSDCard(const QString &filename, ProgressWidget *progress, bool fromRadio = true);
-bool readSettingsEeprom(const QString &filename, ProgressWidget *progress);
-bool writeSettings(const QString &filename, ProgressWidget *progress);
diff --git a/companion/src/radionotfound.cpp b/companion/src/radionotfound.cpp
deleted file mode 100644
index 3ad0ad4cc..000000000
--- a/companion/src/radionotfound.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#include "radionotfound.h"
-#include "ui_radionotfound.h"
-
-RadioNotFoundDialog::RadioNotFoundDialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::RadioNotFoundDialog)
-{
- ui->setupUi(this);
-}
-
-RadioNotFoundDialog::~RadioNotFoundDialog()
-{
- delete ui;
-}
-
-void RadioNotFoundDialog::on_OK_clicked()
-{
- accept();
-}
diff --git a/companion/src/radionotfound.h b/companion/src/radionotfound.h
deleted file mode 100644
index fb0042f34..000000000
--- a/companion/src/radionotfound.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-#ifndef _RADIONOTFOUND_H_
-#define _RADIONOTFOUND_H_
-
-#include
-
-namespace Ui {
- class RadioNotFoundDialog;
-}
-
-class RadioNotFoundDialog : public QDialog
-{
- Q_OBJECT
-public:
- explicit RadioNotFoundDialog(QWidget *parent = 0);
- ~RadioNotFoundDialog();
-private:
- Ui::RadioNotFoundDialog *ui;
-private slots:
- void on_OK_clicked();
-};
-
-#endif // _RADIONOTFOUND_H_
diff --git a/companion/src/radionotfound.ui b/companion/src/radionotfound.ui
deleted file mode 100644
index 5282ad743..000000000
--- a/companion/src/radionotfound.ui
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
- RadioNotFoundDialog
-
-
-
- 0
- 0
- 367
- 350
-
-
-
-
- 0
- 0
-
-
-
-
- 367
- 350
-
-
-
-
- 367
- 350
-
-
-
- No Radio Found
-
-
- -
-
-
-
-
-
- <html><head/><body><p>No Radio was found!</p><p>Make sure that you hold the lower trim buttons towards the center while you turn it on.</p><p>Then connect the USB wire.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Note: if you have a Taranis that has not had the firmware upgraded to 2.0 then this version of Companion will not work.</span></p></body></html>
-
-
- Qt::RichText
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- QFrame::Box
-
-
-
-
-
- :/images/taranison.png
-
-
-
-
-
- -
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- OK
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
-
-
-
-
-
-
diff --git a/companion/src/splash.h b/companion/src/splash.h
deleted file mode 100644
index b2a0bfe02..000000000
--- a/companion/src/splash.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) EdgeTX
- *
- * Based on code named
- * opentx - https://github.com/opentx/opentx
- * th9x - http://code.google.com/p/th9x
- * er9x - http://code.google.com/p/er9x
- * gruvin9x - http://code.google.com/p/gruvin9x
- *
- * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
- *
- * 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.
- */
-
-const unsigned char gr9x_splash[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x08, 0x04, 0x04, 0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xc4, 0x04, 0x04, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0xfc, 0x04, 0x04, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xfe, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xf0, 0x10, 0x10, 0xe0, 0x10, 0x10, 0xe0, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xfc, 0x10, 0x00, 0xf0, 0x20, 0x10, 0x00, 0x10, 0xe0, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0xc4, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xf0, 0x20, 0x10, 0x00, 0xf4, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0x30, 0x50, 0x90, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xbf, 0x80, 0x80, 0x80, 0xbf, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x88, 0x09, 0x09, 0x08, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x81, 0xf0, 0x18, 0x19, 0xf0, 0x80, 0x01, 0x00, 0x00, 0x01, 0x01, 0x21, 0x20, 0x20, 0x21, 0x20, 0x21, 0x20, 0x20, 0x20, 0x20, 0x24, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0xe1, 0x21, 0x21, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x20, 0x21, 0x21, 0x21, 0x20, 0x81, 0xc1, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x37, 0x47, 0x87, 0x87, 0x87, 0x97, 0x97, 0x07, 0x5f, 0xdf, 0xdf, 0xdf, 0xde, 0xd8, 0x80, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x00, 0x80, 0x40, 0x3f, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x58, 0x48, 0x4c, 0x4c, 0x47, 0x47, 0x44, 0x46, 0x42, 0x43, 0xff, 0x00, 0x00, 0xff, 0x43, 0x42, 0x46, 0x44, 0x47, 0x47, 0x4c, 0x4c, 0x48, 0x58, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb0, 0x18, 0x0c, 0x04, 0x06, 0x87, 0x8f, 0xbf, 0xee, 0xfe, 0xf6, 0x7e, 0x3c, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0e, 0x1f, 0x39, 0x60, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x0e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x8e, 0xce, 0xee, 0xfc, 0xf9, 0x73, 0x27, 0x0f, 0x1f, 0x3f, 0x7e, 0xfc, 0xf9, 0xf1, 0xf1, 0xf9, 0xfc, 0x3e, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x7f, 0x00, 0x00, 0x7f, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0x80, 0x88, 0x10, 0x10, 0x1d, 0x17, 0x11, 0x11, 0x13, 0x13, 0x13, 0x13, 0x11, 0x17, 0x1d, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0x7c, 0x3e, 0x1f, 0x0f, 0x07, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0xe0, 0x20, 0x20, 0x00, 0xe0, 0x00, 0x80, 0x40, 0x20, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0xc1, 0x40, 0x40, 0xfc, 0x3f, 0x7b, 0xb1, 0xe0, 0xae, 0xa8, 0xea, 0xee, 0xa1, 0x7b, 0x7f, 0xfc, 0x40, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0f, 0x0f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x0f, 0x0e, 0x0c, 0x00, 0x08, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0xff, 0x95, 0x80, 0xb2, 0x82, 0xfa, 0xaa, 0xfa, 0x82, 0xf2, 0x90, 0x95, 0xff, 0x38, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xb0, 0x74, 0xf6, 0x77, 0x77, 0xf7, 0x77, 0xf7, 0x77, 0xf7, 0x77, 0xf7, 0x74, 0xf6, 0x77, 0xf7, 0x77, 0xf6, 0x34, 0xb0, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x28, 0x2c, 0x24, 0x2f, 0x3f, 0x36, 0x07, 0x36, 0x1f, 0x0e, 0x1f, 0x36, 0x07, 0x36, 0x3f, 0x2f, 0x24, 0x2c, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc1, 0xc0, 0x41, 0x41, 0x40, 0xc1, 0xc0, 0x41, 0x40, 0x41, 0xc0, 0xc1, 0x40, 0xc1, 0xc1, 0xc1, 0xc0, 0x41, 0xc0, 0xc1, 0x00, 0x00,
- 0x00, 0x00, 0x7f, 0x11, 0x11, 0x0e, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x07, 0x18, 0x0c, 0x03, 0x0e, 0x18, 0x07, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x1f, 0x02, 0x01, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x0e, 0x11, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x11, 0x11, 0x0e, 0x00, 0x01, 0x4e, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x7f, 0x11, 0x11, 0x0e, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x1f, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x13, 0x15, 0x19, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x0f, 0x10, 0x10, 0x1f, 0x00, 0x1f, 0x02, 0x01, 0x0e, 0x11, 0x11, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x2f, 0x2f, 0x2b, 0x32, 0x3f, 0x20, 0x3b, 0x3b, 0x3c, 0x3f, 0x20, 0x2f, 0x2f, 0x3f, 0x26, 0x2b, 0x2c, 0x3f, 0x00, 0x00,
-};
-
-const unsigned char gr9xv4_splash[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x08, 0x04, 0x04, 0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xc4, 0x04, 0x04, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0xfc, 0x04, 0x04, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xfe, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xf0, 0x10, 0x10, 0xe0, 0x10, 0x10, 0xe0, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xfc, 0x10, 0x00, 0xf0, 0x20, 0x10, 0x00, 0x10, 0xe0, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0xc4, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0xf0, 0x20, 0x10, 0x00, 0xf4, 0x00, 0xe0, 0x50, 0x50, 0x60, 0x00, 0x30, 0x50, 0x90, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xbf, 0x80, 0x80, 0x80, 0xbf, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x88, 0x09, 0x09, 0x08, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x81, 0xf0, 0x18, 0x19, 0xf0, 0x80, 0x01, 0x00, 0x00, 0x01, 0x01, 0x21, 0x20, 0x20, 0x21, 0x20, 0x21, 0x20, 0x20, 0x20, 0x20, 0x24, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0xe1, 0x21, 0x21, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x20, 0x21, 0x20, 0x20, 0x20, 0x21, 0x20, 0x20, 0x21, 0x21, 0x21, 0x20, 0x81, 0xc1, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x37, 0x47, 0x87, 0x87, 0x87, 0x97, 0x97, 0x07, 0x5f, 0xdf, 0xdf, 0xdf, 0xde, 0xd8, 0x80, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x00, 0x80, 0x40, 0x3f, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x58, 0x48, 0x4c, 0x4c, 0x47, 0x47, 0x44, 0x46, 0x42, 0x43, 0xff, 0x00, 0x00, 0xff, 0x43, 0x42, 0x46, 0x44, 0x47, 0x47, 0x4c, 0x4c, 0x48, 0x58, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb0, 0x18, 0x0c, 0x04, 0x06, 0x87, 0x8f, 0xbf, 0xee, 0xfe, 0xf6, 0x7e, 0x3c, 0x1c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0e, 0x1f, 0x39, 0x60, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x0e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x8e, 0xce, 0xee, 0xfc, 0xf9, 0x73, 0x27, 0x0f, 0x1f, 0x3f, 0x7e, 0xfc, 0xf9, 0xf1, 0xf1, 0xf9, 0xfc, 0x3e, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x7f, 0x00, 0x00, 0x7f, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0x80, 0x88, 0x10, 0x10, 0x1d, 0x17, 0x11, 0x11, 0x13, 0x13, 0x13, 0x13, 0x11, 0x17, 0x1d, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0x7c, 0x3e, 0x1f, 0x0f, 0x07, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7c, 0xf8, 0x80, 0x80, 0xf8, 0x7c, 0x0c, 0x00, 0xe0, 0xf0, 0xdc, 0xce, 0xc3, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0xc1, 0x40, 0x40, 0xfc, 0x3f, 0x7b, 0xb1, 0xe0, 0xae, 0xa8, 0xea, 0xee, 0xa1, 0x7b, 0x7f, 0xfc, 0x40, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x0f, 0x0f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x0f, 0x0e, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0xff, 0x95, 0x80, 0xb2, 0x82, 0xfa, 0xaa, 0xfa, 0x82, 0xf2, 0x90, 0x95, 0xff, 0x38, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xb0, 0x74, 0xf6, 0x77, 0x77, 0xf7, 0x77, 0xf7, 0x77, 0xf7, 0x77, 0xf7, 0x74, 0xf6, 0x77, 0xf7, 0x77, 0xf6, 0x34, 0xb0, 0x10, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x28, 0x2c, 0x24, 0x2f, 0x3f, 0x36, 0x07, 0x36, 0x1f, 0x0e, 0x1f, 0x36, 0x07, 0x36, 0x3f, 0x2f, 0x24, 0x2c, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc1, 0xc0, 0x41, 0x41, 0x40, 0xc1, 0xc0, 0x41, 0x40, 0x41, 0xc0, 0xc1, 0x40, 0xc1, 0xc1, 0xc1, 0xc0, 0x41, 0xc0, 0xc1, 0x00, 0x00,
- 0x00, 0x00, 0x7f, 0x11, 0x11, 0x0e, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x07, 0x18, 0x0c, 0x03, 0x0e, 0x18, 0x07, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x1f, 0x02, 0x01, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x0e, 0x11, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x11, 0x11, 0x0e, 0x00, 0x01, 0x4e, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x7f, 0x11, 0x11, 0x0e, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x1f, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x13, 0x15, 0x19, 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x00, 0x0f, 0x10, 0x10, 0x1f, 0x00, 0x1f, 0x02, 0x01, 0x0e, 0x11, 0x11, 0x00, 0x0e, 0x15, 0x15, 0x16, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x2f, 0x2f, 0x2b, 0x32, 0x3f, 0x20, 0x3b, 0x3b, 0x3c, 0x3f, 0x20, 0x2f, 0x2f, 0x3f, 0x26, 0x2b, 0x2c, 0x3f, 0x00, 0x00,
-};
-
-const unsigned char er9x_splash[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf8, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xe0, 0xc0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf8, 0xff, 0xff, 0x9f, 0x87, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x03, 0x83, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xc3, 0xe3, 0x73, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x1f, 0x1f, 0x0f, 0x07, 0x83, 0xc3, 0xe1, 0xe1, 0xe0, 0xe0, 0xc0, 0x00, 0x0e, 0x1f, 0x3f, 0x7f, 0x7f, 0xff, 0xf3, 0xe0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x0f, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00,
- 0x00, 0x80, 0xf0, 0xfe, 0xff, 0xff, 0xc7, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0x01, 0xc1, 0xf0, 0xfe, 0xff, 0x3f, 0x0f, 0x07, 0x0f, 0x0d, 0x0d, 0x0d, 0x1d, 0x19, 0x19, 0x19, 0x19, 0x31, 0x31, 0x31, 0x31, 0x71, 0x61, 0x61, 0x61, 0xe1, 0xc1, 0xc1, 0xc1, 0x81, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x17, 0x0f, 0x03, 0x81, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x07, 0x0e, 0x1e, 0x1c, 0x38, 0x70, 0xe0, 0xf0, 0xf8, 0xfe, 0xff, 0xff, 0x7f, 0x1f, 0x0f, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf8, 0xfc, 0xfc, 0xfe, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf8, 0xfe, 0xff, 0xff, 0x7f, 0x1f, 0x0f, 0x1f, 0x3d, 0x7c, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0x78, 0xde, 0x27, 0x13, 0x09, 0x0e, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0f, 0x7f, 0xff, 0xfc, 0x78, 0x78, 0xf8, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x38, 0x1e, 0x0f, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0x1f, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xfc, 0xff, 0x7f, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x07, 0x0e, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-const unsigned char opentx_splash[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x08,0x04,0x04,0x84,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xc4,0x04,0x04,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbf,0x80,0x80,0x80,0xbf,0x80,0x80,0x80,0x80,0x00,0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x88,0x09,0x09,0x08,0xf0,0x00,0x00,0x00,0x01,0x01,0x01,0x7f,0x01,0x01,0x01,0x01,0x00,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x00,0x7f,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x00,0x7f,0x01,0x06,0x0c,0x10,0x10,0x0c,0x06,0x01,0x7f,0x00,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x01,0x01,0x01,0x7f,0x01,0x01,0x01,0x01,0x00,0x00,0x7f,0x09,0x09,0x09,0x09,0x19,0x29,0x4e,0x00,0x01,0x03,0x06,0x0c,0x78,0x0c,0x06,0x03,0x01,0x00,0x00,
- 0x00,0x00,0xf8,0xfe,0xff,0xff,0xff,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x37,0x47,0x87,0x87,0x87,0x97,0x97,0x07,0x5f,0xdf,0xdf,0xdf,0xde,0xd8,0x80,0x10,0x10,0x10,0x10,0x10,0x0f,0x00,0x80,0x40,0x3f,0x80,0xc0,0xe0,0xe0,0xe0,0x60,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xd0,0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x10,0x10,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x90,0x90,0xe0,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x10,0x10,0x00,0x60,0xd0,0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x01,0x07,0x07,0x0f,0x0f,0x0f,0x0e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0e,0x0e,0x0e,0x0e,0x0e,0x8e,0xce,0xee,0xfc,0xf9,0x73,0x27,0x0f,0x1f,0x3f,0x7e,0xfc,0xf9,0xf1,0xf1,0xf9,0xfc,0x3e,0x1f,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x1e,0x0e,0x0e,0x0f,0x07,0x07,0x03,0x03,0x01,0x80,0xc0,0xe0,0xf0,0xf8,0x7c,0x3e,0x1f,0x0f,0x07,0x07,0x0f,0x1f,0x3f,0x7e,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x4a,0x4a,0x4a,0x4a,0x4a,0x7c,0x00,0x02,0x06,0x0c,0x70,0x08,0x04,0x02,0x02,0x00,0x00,0x00,0x00,0x1c,0x22,0x41,0x41,0x49,0x49,0x49,0x3a,0x18,0x00,0x00,0x7e,0x12,0x12,0x12,0x12,0x32,0x4c,0x00,0x00,0x3e,0x40,0x40,0x40,0x40,0x40,0x3e,0x00,0x02,0x0c,0x18,0x60,0x60,0x30,0x0c,0x02,0x00,0x7e,0x00,0x00,0x7e,0x02,0x0c,0x18,0x30,0x40,0x7e,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xe0,0x10,0x10,0x10,0xe0,0x00,0x00,0xc0,0x80,0x40,0x80,0x00,0x00,0x80,0x40,0x40,0x80,0x00,0x00,0xcc,0x8e,0x4f,0x8f,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x60,0x90,0x90,0x10,0x00,0x00,0x00,0x80,0x41,0x43,0x87,0x0f,0x0f,0xcf,0x0e,0x0c,0xc0,0x00,0x00,0xc0,0x80,0x40,0xc0,0x00,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x80,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x3f,0x04,0x08,0x07,0x00,0x00,0x07,0x09,0xc9,0x49,0x40,0x40,0x8f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x09,0x06,0x00,0x00,0x07,0x08,0x08,0x07,0x00,0x00,0x07,0x08,0x04,0x0f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x40,0x07,0x08,0x08,0x08,0x00,0x00,0x07,0x09,0x09,0x09,0x00,0x00,0x00,0xc8,0x00,0x00,0x08,0xc0,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x3f,0x04,0x04,0x04,0x03,0x00,0x00,0x1e,0x21,0x21,0x1e,0x00,0x07,0x38,0x0e,0x0e,0x38,0x07,0x00,0x1e,0x25,0x25,0x26,0x00,0x00,0x3f,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x3f,0x00,0x00,0x3f,0x02,0x01,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x3c,0x03,0x00,0x00,0x00,0x1e,0x21,0x21,0x1e,0x00,0x00,0x1f,0x20,0x10,0x3f,0x00,0x3f,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x02,0x02,0x3f,0x00,0x00,0x19,0x25,0x15,0x1e,0x20,0x00,0x3f,0x02,0x01,0x3e,0x00,0x1e,0x21,0x12,0x3f,0x00,0x00,0x22,0x25,0x29,0x11,0x00,
-};
-
-const unsigned char opentxtaranis_splash[] = {
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0x7f,0x3f,0x3f,0x7f,0x1f,0x3f,0x3f,0x1f,0x1f,0x0f,0x0f,0x1f,0x1f,0x07,0x0f,0x0f,0x07,0x0f,0x0f,0x07,0x07,0x03,0x07,0x07,0x03,0x03,0x03,0x07,0x07,0x03,0x07,0x03,0x83,0x07,0x83,0x03,0x03,0x03,0x03,0x83,0x03,0x03,0x03,0x83,0x83,0x07,0x83,0x03,0x07,0x03,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x03,0x07,0x07,0x07,0x0f,0x0f,0x07,0x1f,0x07,0x0f,0x0f,0x1f,0x0f,0x0f,0x1f,0x1f,0x3f,0x3f,0x1f,0x7f,0x3f,0x3f,0x7f,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0xc3,0xc3,0xc3,0x83,0x83,0xc3,0x83,0x83,0x03,0x83,0x87,0x03,0x07,0x03,0x07,0x03,0x07,0x03,0x03,0x07,0x07,0x0f,0x07,0x07,0x1f,0x0f,0x07,0x0f,0x0f,0x2f,0x1f,0x1f,0x3f,0x7f,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x43,0x03,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0x83,0x83,0x83,0xc3,0x83,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x0b,0x07,0x03,0x07,0x0f,0x07,0x1f,0x0f,0x1f,0x1f,0x1f,0x3f,0xbf,0xbf,0x7f,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x03,0xff,0xff,0xff,0xff,0xfb,0x07,0xf7,0xf7,0xff,0x0f,0xcf,0xdf,0xdf,0x3f,0xdf,0xbf,0xbf,0x7f,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xfb,0xff,0xff,0xf3,0xf3,0xf3,0xfb,0xf3,0xd3,0xe3,0xe3,0xc3,0x83,0x83,0xc3,0x83,0x03,0x83,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x0b,0x03,0x07,0x3f,0x0f,0x0f,0x1f,0xff,0x3f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0x7f,0xff,0x5f,0x1f,0x1f,0x3f,0x17,0x07,0x07,0x0f,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x83,0x43,0x83,0x83,0xe3,0xe3,0xe3,0xc3,0xe3,0xeb,0xf3,0xf3,0xfb,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x09,0x7b,0x87,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x38,0x74,0xf8,0xfc,0xfc,0xfc,0xfe,0xff,0xfe,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xfc,0xfc,0xfc,0xfe,0xf0,0x38,0x74,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x4f,0x09,0x7b,0x87,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x1f,0x0f,0x1f,0x17,0x0e,0x07,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0xc0,0xc0,0x80,0xe0,0xc8,0xef,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x07,0x07,0x07,0x0f,0x07,0x07,0x07,0x0f,0x07,0x07,0x07,0x0f,0x07,0x07,0x07,0x0f,0x07,0x07,0x07,0x0f,0x07,0x0f,0x0f,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0xf8,0xf0,0xd0,0xd0,0xe0,0xe0,0xa0,0x80,0x80,0xc0,0x80,0x00,0x80,0x00,0x01,0x01,0x01,0x00,0x05,0x03,0x01,0x03,0x03,0x07,0x0f,0x07,0x0f,0x0f,0x0f,0x1f,0x5f,0x5f,0x3f,0x3f,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xfe,0xfe,0xff,0x01,0xfb,0xf9,0xfb,0x07,0xfb,0xf7,0xf7,0x0f,0xef,0xff,0xef,0x1f,0x5f,0xdf,0x7f,0xbf,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfe,0xfc,0xfe,0xf8,0xfc,0xfc,0xf8,0xe0,0xe8,0xf0,0xf0,0xc0,0xc0,0xc0,0xe0,0xc0,0x40,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0x07,0x03,0x03,0x07,0x02,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0xa0,0xc0,0x80,0xc0,0xc0,0xe0,0xf0,0xe0,0xf8,0xf0,0xf0,0xf8,0xfe,0xfa,0xfc,0xfc,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xfa,0xf4,0xfc,0xf8,0xf8,0xe0,0xe0,0xf0,0xc0,0xe0,0xe0,0xc0,0x80,0x80,0x80,0xc0,0x00,0x00,0x80,0x80,0x00,0x01,0x80,0x00,0x01,0x03,0x03,0x01,0x07,0x03,0x07,0x03,0x07,0x03,0x07,0x07,0x0f,0x07,0x0f,0x07,0x07,0x07,0x07,0x0f,0x07,0x07,0x07,0x0f,0x0f,0x07,0x0f,0x07,0x07,0x03,0x07,0x07,0x07,0x03,0x07,0x03,0x01,0x03,0x03,0x01,0x00,0x01,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xc0,0xc0,0xe0,0xe0,0xc0,0xf8,0xe0,0xe0,0xf0,0xfa,0xf4,0xfc,0xf8,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xfc,0xfe,0xfc,0xfc,0xfc,0xfe,0xfc,0xfc,0xfc,0xfe,0xfc,0xfc,0xfc,0xfe,0xfc,0xfc,0xfc,0xfe,0xfe,0xfe,0xfc,0xfe,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x0f,0x0f,0x0f,0x1f,0x0f,0x0f,0x0f,0x1f,0x0f,0x0f,0x0f,0x1f,0x0f,0x0f,0x0f,0x1f,0x0f,0x0f,0x0f,0x1f,0x0f,0x0f,0x0f,0x1f,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xfe,0xfc,0xfe,0xf4,0xfc,0xfc,0xf8,0xe8,0xe8,0xf0,0xf0,0xc0,0xc0,0xc0,0xe0,0x00,0x80,0xc0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x7f,0x7f,0x7f,0x80,0x3f,0xff,0xbf,0xc0,0xcf,0xcf,0xef,0xf0,0xef,0xf7,0xf7,0xf8,0xff,0xff,0xfb,0xfc,0xfe,0xfc,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x7f,0x7f,0x1f,0x3f,0x1f,0x3f,0x1f,0x0f,0x1f,0x0f,0x03,0x0b,0x07,0x07,0x01,0x01,0x01,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xc0,0xc0,0xe0,0x00,0xc0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x01,0x01,0x03,0x03,0x03,0x07,0x07,0x17,0x0f,0x0f,0x1f,0x3f,0x3f,0x1f,0xff,0x7f,0x3f,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x1f,0xff,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xee,0xff,0x1f,0xee,0xee,0xfe,0x1f,0xee,0xee,0xff,0x1e,0xee,0xef,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xef,0xfe,0x1e,0xee,0xee,0xff,0x1e,0xee,0xee,0xfe,0x1f,0xef,0xee,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xee,0xee,0xfe,0x1f,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xee,0xee,0xfe,0x1f,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xef,0xef,0xff,0x1f,0xee,0xef,0xfe,0x1f,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xee,0xee,0xfe,0x1e,0xfe,0x0e,0x1e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xe0,0xff,0xff,0xe7,0xe7,0xf7,0xf8,0xf7,0xfb,0xfb,0xfc,0xff,0xff,0xfd,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0x7f,0x1f,0x5f,0x3f,0x3f,0x0f,0x0f,0x0f,0x1f,0x03,0x07,0x0f,0x07,0x07,0x03,0x01,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0xc0,0xc0,0xf0,0xf0,0xe0,0xf4,0xf4,0xf8,0xf8,0xfc,0xff,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xf8,0xfe,0xf8,0xfc,0xe8,0xe8,0xf0,0xf0,0xa0,0xc0,0xe0,0xc0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x01,0x01,0x03,0x0f,0x0b,0x07,0x07,0x1f,0x1f,0x1f,0x0f,0x5f,0x1f,0x3f,0x3f,0xff,0x7f,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
-};
-
-const unsigned char ersky9x_splash[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0xF8,0xF8,0xFC,0xFC,0xFC,0xF8,0xF8,0xF8,0xF0,0x40,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,0xE0,0xE0,0xF0,0xF0,0xF0,0xE0,0xC0,0x00,
- 0x00,0x00,0x00,0x00,0xC0,0xF8,0xFF,0xFF,0x9F,0x87,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x03,0x83,0x80,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0xC3,0xE3,0x73,0x3F,0x1F,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x1F,0x1F,0x0F,0x07,0x83,0xC3,0xE1,0xE1,0xE0,0xE0,0xC0,0x00,0x0E,0x1F,0x3F,0x7F,0x7F,0xFF,0xF3,0xE0,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x0F,0x03,0x01,0x01,0x01,0x00,0x00,
- 0x00,0x80,0xF0,0xFE,0xFF,0xFF,0xC7,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0x01,0xC1,0xF0,0xFE,0xFF,0x3F,0x0F,0x07,0x0F,0x0D,0x0D,0x0D,0x1D,0x19,0x19,0x19,0x19,0x31,0x31,0x31,0x31,0x71,0x61,0x61,0x61,0xE1,0xC1,0xC1,0xC1,0x81,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFC,0xFF,0xFF,0xFF,0xFF,0x2F,0x17,0x0F,0x03,0x81,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x07,0x07,0x0E,0x1E,0x1C,0x38,0x70,0xE0,0xF0,0xF8,0xFE,0xFF,0xFF,0x7F,0x1F,0x0F,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x7E,0xE7,0xC3,0xC3,0xC3,0xC3,0xC7,0x8E,0x0C,0x00,0x00,0xFF,0xFF,0xC0,0xE0,0xF0,0x38,0x1C,0x0E,0x07,0x03,0x00,0x00,0x3F,0x7F,0xE0,0xC0,0x80,0x80,0xC0,0xE0,0x7F,0x3F,0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xF8,0xFC,0xFC,0xFE,0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF8,0xFE,0xFF,0xFF,0x7F,0x1F,0x0F,0x1F,0x3D,0x7C,0xF8,0xF8,0xF0,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x1C,0x38,0x30,0x30,0x30,0x30,0x39,0x1F,0x0F,0x00,0x00,0x3F,0x3F,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0x3F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x03,0x07,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0xE0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0x78,0xDE,0x27,0x13,0x09,0x0E,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x7F,0xFF,0xFC,0x78,0x78,0xF8,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFE,0xFF,0xFF,0xFF,0xFF,0x3F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x38,0x1E,0x0F,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x01,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x00,0x0F,0x0F,0x00,0x0F,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x08,0x0F,0x0F,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0xBF,0xFF,0xFF,0xFF,0x1F,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFC,0xFF,0x7F,0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1C,0x07,0x0E,0x0F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-};
diff --git a/companion/src/storage/appdata.cpp b/companion/src/storage/appdata.cpp
index 931381b5b..0f4b0a5e3 100644
--- a/companion/src/storage/appdata.cpp
+++ b/companion/src/storage/appdata.cpp
@@ -335,7 +335,6 @@ void Profile::resetFwVariables()
CompStoreObj::resetProperty(this, name);
}
-
// ** ComponentAssetData class********************
ComponentAssetData::ComponentAssetData() : CompStoreObj(), index(-1)
@@ -727,6 +726,14 @@ void AppData::convertSettings(QSettings & settings)
}
}
+ if (savedMajMin < 0x300) {
+ // 3.0 CloudBuild copy filter changed to cater for uf2
+ qInfo().noquote() << "Deleting CloudBuild settings to force refresh";
+ static const QString path = QStringLiteral("Components/component6");
+ if (settings.contains(path))
+ settings.remove(path);
+ }
+
if (removeUnused)
clearUnusedSettings(settings);
diff --git a/companion/src/storage/appdata.h b/companion/src/storage/appdata.h
index 119dd8169..1ca124a17 100644
--- a/companion/src/storage/appdata.h
+++ b/companion/src/storage/appdata.h
@@ -53,7 +53,7 @@
#define APP_COMPANION QStringLiteral("EdgeTX Companion")
#define APP_SIMULATOR QStringLiteral("EdgeTX Simulator")
-//! Default location for EdgeTX-related user documents (settigns, logs, etc)
+//! Default location for EdgeTX-related user documents (settings, logs, etc)
#define CPN_DOCUMENTS_LOCATION QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) % "/" % COMPANY
//! Location for settings backup files. TODO: make option or remember last location.
#define CPN_SETTINGS_BACKUP_DIR CPN_DOCUMENTS_LOCATION % "/backup"
@@ -97,10 +97,10 @@
T m_name; // Member variable.
\endcode
- If you only use this macro (w/out a \p PROPERTY*() macro) then you need to provide the getter, setter, and reset functions yourself. The initializer functoin is optional.
+ If you only use this macro (w/out a \p PROPERTY*() macro) then you need to provide the getter, setter, and reset functions yourself. The initializer function is optional.
Those function names must match the expected signatures as defined in the \e Q_PROPERTY() macro.
- \param TYPE The data type (T).
+ \param TYPE The data type (T).
\param NAME Name of the property.
\param KEY Settings key name, a const string. Can be the same as \a NAME.
\param DFLT Default value, must be compatible with \a TYPE.
@@ -185,7 +185,7 @@
/*!
- \brief CompStoreObj manages staic meta data on member properties (extending Qt's own property system) and provides utility functions for subclasses.
+ \brief CompStoreObj manages static meta data on member properties (extending Qt's own property system) and provides utility functions for subclasses.
The extension is essentially used to provide some "integration" with \e QSettings by providing storage path/key mappings to properties.
It also adds ability to access property default values, auto-initialization from saved settings (with fallback to default), and provides change notification signals.
@@ -467,6 +467,7 @@ class Profile: public CompStoreObj
Q_OBJECT
public:
Profile & operator=(const Profile & rhs);
+ QString getVariantFromType() const { return fwType().section("-", 1, 1); }
public slots:
bool existsOnDisk();
@@ -756,18 +757,7 @@ class AppData: public CompStoreObj
PROPERTYQBA (mdiWinGeo)
PROPERTYQBA (mdiWinState)
PROPERTYQBA (compareWinGeo)
-
- PROPERTYSTR3(armMcu, "arm_mcu", QStringLiteral("at91sam3s4-9x"))
- PROPERTYSTR2(avrArguments, "avr_arguments")
- PROPERTYSTR2(avrPort, "avr_port")
- PROPERTYSTR2(avrdudeLocation, "avrdudeLocation")
- PROPERTYSTR3(dfuArguments, "dfu_arguments", QStringLiteral("-a 0"))
- PROPERTYSTR2(dfuLocation, "dfu_location")
- PROPERTYSTR2(sambaLocation, "samba_location")
- PROPERTYSTR3(sambaPort, "samba_port", QStringLiteral("\\USBserial\\COM23"))
-
PROPERTYSTR2(libDir, "libraryPath")
-
PROPERTYSTR3(backupDir, "backupPath", CPN_DOCUMENTS_LOCATION % "/backups")
PROPERTYSTR3(eepromDir, "lastDir", CPN_DOCUMENTS_LOCATION % "/eeproms")
PROPERTYSTR3(flashDir, "lastFlashDir", CPN_DOCUMENTS_LOCATION % "/flash")
@@ -789,13 +779,10 @@ class AppData: public CompStoreObj
PROPERTYSTR (locale)
PROPERTYSTR (gePath)
- PROPERTYSTRD(mcu, QStringLiteral("m64"))
- PROPERTYSTRD(programmer, QStringLiteral("usbasp"))
PROPERTY(NewModelAction, newModelAction, MODEL_ACT_WIZARD)
PROPERTY4(int, embedSplashes, "embedded_splashes", 0)
- PROPERTY4(int, fwServerFails, "fwserver", 0)
PROPERTY4(int, iconSize, "icon_size", 2)
PROPERTY4(int, historySize, "history_size", 10)
PROPERTY (int, generalEditTab, 0)
diff --git a/companion/src/storage/firmwareinterface.cpp b/companion/src/storage/firmwareinterface.cpp
index c096fb6e2..b3974fa3b 100644
--- a/companion/src/storage/firmwareinterface.cpp
+++ b/companion/src/storage/firmwareinterface.cpp
@@ -20,7 +20,6 @@
*/
#include "hexinterface.h"
-#include "splash.h"
#include "firmwareinterface.h"
#include "helpers.h"
#include "storage.h"
@@ -85,14 +84,18 @@ public:
{
while(pos 0) {
- flavour = seekLabel(FW_MARK);
+ type = (flash.startsWith("UF2\n") ? FIRMWARE_TYPE_UF2 : FIRMWARE_TYPE_BIN);
+ flavour = seekLabel(FW_MARK).remove("edgetx-");
version = seekLabel(VERS_MARK);
+
if (version.startsWith("opentx-")) {
// old version format
int index = version.lastIndexOf('-');
flavour = version.mid(0, index);
version = version.mid(index + 1);
}
+
date = seekLabel(DATE_MARK);
time = seekLabel(TIME_MARK);
eepromId = seekLabel(EEPR_MARK);
@@ -200,8 +203,7 @@ FirmwareInterface::FirmwareInterface(const QString & filename, QDialog* parentDi
QStringList list = eepromId.split('-');
eepromVersion = list[0].toInt();
eepromVariant = list[1].toInt();
- }
- else {
+ } else {
eepromVersion = eepromId.toInt();
}
@@ -215,16 +217,20 @@ QString FirmwareInterface::seekString(const QString & string)
QString result = "";
int start = flash.indexOf(string.toUtf8());
+
if (start > 0) {
start += string.length();
int end = -1;
- for (int i=start; i 0) {
result = flash.mid(start, (end - start)).trimmed();
}
@@ -236,51 +242,44 @@ QString FirmwareInterface::seekString(const QString & string)
QString FirmwareInterface::seekLabel(const QString & label)
{
QString result = seekString(label + "\037\033:");
+
if (result.isEmpty()) {
result = seekString(label + "\037\075:"); // This is for Horus
}
+
if (!result.isEmpty()) {
return result;
}
- return seekString(label + ":");
-}
-QString FirmwareInterface::getFlavour() const
-{
- if (flavour == "opentx-taranis-x9e")
- return "opentx-x9e";
- else if (flavour == "opentx-x9dp" || flavour == "opentx-taranis-plus")
- return "opentx-x9d+";
- else if (flavour == "opentx-taranis")
- return "opentx-x9d";
- else if (flavour == "opentx-horus")
- return "opentx-x12s";
- else
- return flavour;
+ return seekString(label + ":");
}
bool FirmwareInterface::isHardwareCompatible(const FirmwareInterface &previousFirmware) const
{
QString newFlavour = getFlavour();
+
if (newFlavour.isEmpty()) {
return true;
}
+
QString previousFlavour = previousFirmware.getFlavour();
+
if (previousFlavour.isEmpty()) {
return true;
}
+
return (newFlavour == previousFlavour);
}
bool FirmwareInterface::seekSplash(QByteArray splash)
{
int start = flash.indexOf(splash);
- if (start>0) {
+
+ if (start > 0) {
splashOffset = start;
splashSize = splash.size();
return true;
- }
- else {
+ } else {
return false;
}
}
@@ -288,20 +287,23 @@ bool FirmwareInterface::seekSplash(QByteArray splash)
bool FirmwareInterface::seekSplash(QByteArray sps, QByteArray spe, int size)
{
int start = 0;
- while (start>=0) {
+
+ while (start >= 0) {
start = flash.indexOf(sps, start+1);
+
if (start>0) {
int end = start + sps.size() + size;
+
if (end == flash.indexOf(spe, end)) {
splashOffset = start + sps.size();
splashSize = end - start - sps.size();
return true;
- }
- else {
+ } else {
qDebug() << flash.indexOf(spe, start) << end << sps.size() << spe;
}
}
}
+
return false;
}
@@ -317,30 +319,7 @@ void FirmwareInterface::seekSplash()
splashOffset = 0;
splashWidth = SPLASH_WIDTH;
splashHeight = SPLASH_HEIGHT;
- splash_format = QImage::Format_Mono;
-
- if (seekSplash(QByteArray((const char *)gr9x_splash, sizeof(gr9x_splash))) || seekSplash(QByteArray((const char *)gr9xv4_splash, sizeof(gr9xv4_splash)))) {
- return;
- }
-
- if (seekSplash(QByteArray((const char *)er9x_splash, sizeof(er9x_splash)))) {
- return;
- }
-
- if (seekSplash(QByteArray((const char *)opentx_splash, sizeof(opentx_splash)))) {
- return;
- }
-
- if (seekSplash(QByteArray((const char *)opentxtaranis_splash, sizeof(opentxtaranis_splash)))) {
- splashWidth = SPLASHX9D_WIDTH;
- splashHeight = SPLASHX9D_HEIGHT;
- splash_format = QImage::Format_Indexed8;
- return;
- }
-
- if (seekSplash(QByteArray((const char *)ersky9x_splash, sizeof(ersky9x_splash)))) {
- return;
- }
+ splashFormat = QImage::Format_Mono;
if (seekSplash(QByteArray(ETX_SPS_9X, ETX_SPS_SIZE), QByteArray(ETX_SPE, ETX_SPE_SIZE), 1024)) {
return;
@@ -349,18 +328,9 @@ void FirmwareInterface::seekSplash()
if (seekSplash(QByteArray(ETX_SPS_TARANIS, ETX_SPS_SIZE), QByteArray(ETX_SPE, ETX_SPE_SIZE), RLE_SPLASH_MAX_SIZE)) {
splashWidth = SPLASHX9D_WIDTH;
splashHeight = SPLASHX9D_HEIGHT;
- splash_format = QImage::Format_Indexed8;
+ splashFormat = QImage::Format_Indexed8;
return;
}
-
- if (seekSplash(QByteArray(ERSKY9X_SPS, sizeof(ERSKY9X_SPS)), QByteArray(ERSKY9X_SPE, sizeof(ERSKY9X_SPE)), 1030)) {
- return;
- }
-
- if (seekSplash(QByteArray(ERSPLASH_MARKER, sizeof(ERSPLASH_MARKER)))) {
- splashOffset += sizeof(ERSPLASH_MARKER);
- splashSize = sizeof(er9x_splash);
- }
}
bool FirmwareInterface::setSplash(const QImage & newsplash)
@@ -372,36 +342,38 @@ bool FirmwareInterface::setSplash(const QImage & newsplash)
uint8_t b[SPLASH_SIZE_MAX] = {0};
QColor color;
QByteArray splash;
- if (splash_format == QImage::Format_Indexed8) {
- for (unsigned int y=0; y RLE_SPLASH_MAX_SIZE){
- if(parentDialog)
+ if (splashSize > RLE_SPLASH_MAX_SIZE){
+ if (parentDialog)
QMessageBox::critical(parentDialog, CPN_STR_TTL_ERROR, QObject::tr("Compressed image size exceeds reserved space."));
return false;
}
}
- }
- else {
+ } else {
QColor black = QColor(0,0,0);
QImage blackNwhite = newsplash.convertToFormat(QImage::Format_MonoLSB);
- for (uint y=0; y data;
data.resize(splashWidth * splashHeight);
RleBitmap img((uint8_t*)flash.data() + splashOffset - 2, 0);
img.to(&data[0], data.size());
+
if (splashOffset > 0) {
for (unsigned int y=0; y> 4) : (byte & 0x0F);
@@ -454,6 +428,7 @@ QImage FirmwareInterface::getSplash()
if (splashOffset > 0) {
for (unsigned int y=0; y> 4) : (byte & 0x0F);
@@ -498,24 +473,12 @@ unsigned int FirmwareInterface::save(const QString & filename)
memcpy(binflash, flash.constData(), flashSize);
QFile file(filename);
- int fileType = getStorageType(filename);
+ if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
+ free(binflash);
+ return -1;
+ }
- if (fileType == STORAGE_TYPE_HEX) {
- if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) { //reading HEX TEXT file
- free(binflash);
- return -1;
- }
- QTextStream outputStream(&file);
- HexInterface hex=HexInterface(outputStream);
- hex.save(binflash, flashSize);
- }
- else {
- if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) { //reading HEX TEXT file
- free(binflash);
- return -1;
- }
- file.write((char*)binflash, flashSize);
- }
+ file.write((char*)binflash, flashSize);
file.close();
diff --git a/companion/src/storage/firmwareinterface.h b/companion/src/storage/firmwareinterface.h
index a6380e586..1b72446b6 100644
--- a/companion/src/storage/firmwareinterface.h
+++ b/companion/src/storage/firmwareinterface.h
@@ -19,8 +19,7 @@
* GNU General Public License for more details.
*/
-#ifndef _FIRMWAREINTERFACE_H_
-#define _FIRMWAREINTERFACE_H_
+#pragma once
#include
#include
@@ -46,11 +45,19 @@ class FirmwareInterface
Q_DECLARE_TR_FUNCTIONS("FirmwareInterface")
public:
- FirmwareInterface(const QString & filename, QDialog* parentDialog = nullptr);
+ enum FirmwareType{
+ FIRMWARE_TYPE_BIN,
+ FIRMWARE_TYPE_UF2
+ };
+
+ explicit FirmwareInterface(const QString &filename, QDialog* parent = nullptr);
+ explicit FirmwareInterface(const QByteArray &flashData, QDialog* parent = nullptr);
+
inline QString getDate() { return date; }
inline QString getTime() { return time; }
- int getSize() { return flashSize; }
- QString getFlavour() const;
+ inline const QByteArray& getFlash() { return flash; }
+ inline int getSize() { return flashSize; }
+ inline QString getFlavour() const { return flavour; }
bool isHardwareCompatible(const FirmwareInterface &previousFirmware) const;
inline QString getVersion() { return version; }
inline int getEEpromVersion() { return eepromVersion; }
@@ -64,31 +71,34 @@ class FirmwareInterface
QImage::Format getSplashFormat();
unsigned int save(const QString & fileName);
bool isValid();
+ FirmwareType getType() { return type; }
+ const QString typeFileExtn() const { return (type == FIRMWARE_TYPE_UF2 ? "uf2" : "bin"); }
private:
QDialog* parentDialog;
QByteArray flash;
- uint flashSize;
- QString seekString(const QString & string);
- QString seekLabel(const QString & label);
- void seekSplash();
- bool seekSplash(QByteArray sps, QByteArray spe, int size);
- bool seekSplash(QByteArray splash);
+ uint flashSize = 0;
QString filename;
QString date;
QString time;
QString flavour;
QString version;
QString eepromId;
- int eepromVersion;
- int eepromVariant;
+ int eepromVersion = 0;
+ int eepromVariant = 0;
QByteArray splash;
- uint splashOffset;
- uint splashSize;
- uint splashWidth;
- uint splashHeight;
- QImage::Format splash_format;
- bool isValidFlag;
-};
+ uint splashOffset = 0;
+ uint splashSize = 0;
+ uint splashWidth = 0;
+ uint splashHeight = 0;
+ QImage::Format splashFormat;
+ bool isValidFlag = false;
+ FirmwareType type;
-#endif // _FIRMWAREINTERFACE_H_
+ void initFlash(const QByteArray& flashData);
+ QString seekString(const QString & string);
+ QString seekLabel(const QString & label);
+ void seekSplash();
+ bool seekSplash(QByteArray sps, QByteArray spe, int size);
+ bool seekSplash(QByteArray splash);
+};
diff --git a/companion/src/thirdparty/qcustomplot/qcustomplot.cpp b/companion/src/thirdparty/qcustomplot/qcustomplot.cpp
index f3f1c47af..3ad01bae9 100644
--- a/companion/src/thirdparty/qcustomplot/qcustomplot.cpp
+++ b/companion/src/thirdparty/qcustomplot/qcustomplot.cpp
@@ -32173,9 +32173,8 @@ QCPPolarAxisRadial::SelectablePart QCPPolarAxisRadial::getPartAt(const QPointF &
return spTickLabels;
else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint()))
return spAxisLabel;
- else
- return spNone;
- */
+ else */
+ return spNone;
}
/* inherits documentation from base class */
@@ -32994,8 +32993,10 @@ QCPPolarAxisAngular::SelectablePart QCPPolarAxisAngular::getPartAt(const QPointF
return spTickLabels;
else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint()))
return spAxisLabel;
- else */
+ else
return spNone;
+ */
+ return spNone; // until TODO fix
}
/* inherits documentation from base class */
diff --git a/companion/src/updates/CMakeLists.txt b/companion/src/updates/CMakeLists.txt
index cce0e8258..d7c8362b3 100644
--- a/companion/src/updates/CMakeLists.txt
+++ b/companion/src/updates/CMakeLists.txt
@@ -50,6 +50,7 @@ add_library(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
PRIVATE
${CPN_COMMON_LIB}
+ ${RS_DFU_LIBRARIES}
)
target_include_directories(${PROJECT_NAME}
@@ -58,4 +59,5 @@ target_include_directories(${PROJECT_NAME}
"${CMAKE_CURRENT_BINARY_DIR}"
PUBLIC
"${CMAKE_CURRENT_LIST_DIR}"
+ "${RS_DFU_INCLUDE_DIRS}"
)
diff --git a/companion/src/updates/updatecloudbuild.cpp b/companion/src/updates/updatecloudbuild.cpp
index 6398b619c..c2cc18c7b 100644
--- a/companion/src/updates/updatecloudbuild.cpp
+++ b/companion/src/updates/updatecloudbuild.cpp
@@ -24,11 +24,14 @@
#include "appdata.h"
#include "eeprominterface.h"
#include "flashfirmwaredialog.h"
+#include "firmwareinterface.h"
+#include "radiointerface.h"
// these must match text strings in server response
constexpr char CLOUD_BUILD_WAITING[] {"WAITING_FOR_BUILD"};
constexpr char CLOUD_BUILD_IN_PROGRESS[] {"BUILD_IN_PROGRESS"};
constexpr char CLOUD_BUILD_SUCCESS[] {"BUILD_SUCCESS"};
+constexpr char CLOUD_BUILD_ERROR[] {"BUILD_ERROR"};
UpdateCloudBuild::UpdateCloudBuild(QWidget * parent) :
UpdateInterface(parent, CID_CloudBuild, tr("CloudBuild"), Repo::REPO_TYPE_BUILD,
@@ -75,6 +78,8 @@ int UpdateCloudBuild::cloudStatusToInt(const QString status)
return STATUS_IN_PROGRESS;
else if (status == QString(CLOUD_BUILD_SUCCESS))
return STATUS_SUCCESS;
+ else if (status == QString(CLOUD_BUILD_ERROR))
+ return STATUS_ERROR;
else
return STATUS_UNKNOWN;
}
@@ -95,7 +100,7 @@ void UpdateCloudBuild::assetSettingsInit()
cad.filter("%FWFLAVOUR%");
cad.destSubDir("FIRMWARE");
cad.copyFilterType(UpdateParameters::UFT_Pattern);
- cad.copyFilter("^%FWFLAVOUR%-%LANGUAGE%.*-%RELEASE%\\.bin$");
+ cad.copyFilter("^%FWFLAVOUR%-%LANGUAGE%.*-%RELEASE%\\.(bin|uf2)$");
cad.maxExpected(1);
qDebug() << "Asset settings initialised";
@@ -210,6 +215,22 @@ int UpdateCloudBuild::asyncInstall()
int ret = QMessageBox::question(status()->progress(), CPN_STR_APP_NAME, tr("Write the updated firmware to the radio now ?"), QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes) {
+ QString extn(QFileInfo(destPath).suffix().toLower());
+ QString bootmodes;
+ if (dfuFileExtensions().contains(extn))
+ bootmodes.append("DFU");
+
+ if (uf2FileExtensions().contains(extn)) {
+ if (!bootmodes.isEmpty()) {
+ bootmodes.append(tr(" or "));
+ }
+ bootmodes.append("UF2");
+ }
+
+ QMessageBox::warning(status()->progress(), tr("Write Firmware to Radio"),
+ tr("Before continuing, ensure the radio is connected and booted in %1 mode(s)")
+ .arg(bootmodes));
+
FlashFirmwareDialog *dlg = new FlashFirmwareDialog(this);
dlg->exec();
dlg->deleteLater();
@@ -398,6 +419,44 @@ void UpdateCloudBuild::cleanup()
m_eventLoop.quit();
}
+bool UpdateCloudBuild::downloadFlaggedAsset(const int row)
+{
+ if (!UpdateInterface::downloadFlaggedAsset(row))
+ return false;
+
+ // rename downloaded firmware file based on the file contents
+ // flashing processes use the file extension to decide on
+ // the flashing mode i.e. DFU or UF2
+ QString path = QString("%1/A%2/%3").arg(downloadDir()).arg(repo()->assets()->id()).arg(repo()->assets()->downloadName());
+ status()->reportProgress(tr("Renaming: %1").arg(path), QtDebugMsg);
+
+ FirmwareInterface firmware(path);
+ if (firmware.isValid()) {
+ QFileInfo fi(path);
+ QString newfname = QString("%1/%2.%3").arg(fi.absoluteDir().path()).arg(fi.completeBaseName()).arg(firmware.typeFileExtn());
+
+ if (QFileInfo::exists(newfname) && !QFile(newfname).remove()) {
+ status()->reportProgress(tr("Unable to delete: %1").arg(newfname), QtCriticalMsg);
+ return false;
+ }
+
+ QFile fw(path);
+ if (!fw.rename(newfname)) {
+ status()->reportProgress(tr("Unable to rename %1 to %2").arg(fw.fileName()).arg(newfname), QtCriticalMsg);
+ return false;
+ }
+
+ QFileInfo newfi(fw);
+ repo()->assets()->setDownloadName(newfi.fileName());
+ status()->reportProgress(tr("Renamed: %1").arg(newfi.fileName()), QtInfoMsg);
+ } else {
+ status()->reportProgress(tr("%1 is not a valid firmware file").arg(path), QtCriticalMsg);
+ return false;
+ }
+
+ return true;
+}
+
bool UpdateCloudBuild::getStatus()
{
m_jobStatus = STATUS_UNKNOWN;
@@ -438,8 +497,9 @@ bool UpdateCloudBuild::objectExists(const QJsonObject & parent, const QString ch
bool UpdateCloudBuild::setAssetDownload()
{
- // this format MUST align with the asset copy filter
- QString name = QString("%1-%2%3-%4.bin").arg(m_radio).arg(params()->language.toLower()).arg(m_buildFlags/* has a leading hyphen*/).arg(repo()->releases()->name());
+ // Note: this format MUST align with the asset copy filter
+ // the file is renamed post download to amend the extension
+ QString name = QString("%1-%2%3-%4.tmp").arg(m_radio).arg(params()->language.toLower()).arg(m_buildFlags/* has a leading hyphen*/).arg(repo()->releases()->name());
repo()->assets()->setDownloadName(name.toLower());
@@ -454,6 +514,7 @@ bool UpdateCloudBuild::setAssetDownload()
if (artifacts[i].isObject()) {
const QJsonObject &artifact = artifacts[i].toObject();
if (stringExists(artifact, "slug") && artifact.value("slug").toString() == "firmware") {
+ //qDebug() << artifact;
if (stringExists(artifact, "download_url")) {
repo()->assets()->setDownloadUrl(artifact.value("download_url").toString());
}
diff --git a/companion/src/updates/updatecloudbuild.h b/companion/src/updates/updatecloudbuild.h
index ea783be5f..c772497ee 100644
--- a/companion/src/updates/updatecloudbuild.h
+++ b/companion/src/updates/updatecloudbuild.h
@@ -49,6 +49,7 @@ class UpdateCloudBuild: public UpdateInterface
int asyncInstall() override;
void assetSettingsInit() override;
bool buildFlaggedAsset(const int row) override;
+ bool downloadFlaggedAsset(const int row) override;
private slots:
void cancel();
diff --git a/companion/src/updates/updatefirmware.cpp b/companion/src/updates/updatefirmware.cpp
index 5215a1b0a..b7cd2c9b6 100644
--- a/companion/src/updates/updatefirmware.cpp
+++ b/companion/src/updates/updatefirmware.cpp
@@ -21,6 +21,7 @@
#include "updatefirmware.h"
#include "flashfirmwaredialog.h"
+#include "radiointerface.h"
UpdateFirmware::UpdateFirmware(QWidget * parent) :
UpdateInterface(parent, CID_Firmware, tr("Firmware"), Repo::REPO_TYPE_GITHUB,
@@ -46,7 +47,7 @@ void UpdateFirmware::assetSettingsInit()
cad.maxExpected(1);
cad.destSubDir("FIRMWARE");
cad.copyFilterType(UpdateParameters::UFT_Pattern);
- cad.copyFilter("^%FWFLAVOUR%-.*\\.bin$");
+ cad.copyFilter("^%FWFLAVOUR%-.*\\.(bin|uf2)$");
qDebug() << "Asset settings initialised";
}
@@ -106,6 +107,22 @@ int UpdateFirmware::asyncInstall()
int ret = QMessageBox::question(status()->progress(), CPN_STR_APP_NAME, tr("Write the updated firmware to the radio now ?"), QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes) {
+ QString extn(QFileInfo(destPath).suffix().toLower());
+ QString bootmodes;
+ if (dfuFileExtensions().contains(extn))
+ bootmodes.append("DFU");
+
+ if (uf2FileExtensions().contains(extn)) {
+ if (!bootmodes.isEmpty()) {
+ bootmodes.append(tr(" or "));
+ }
+ bootmodes.append("UF2");
+ }
+
+ QMessageBox::warning(status()->progress(), tr("Write Firmware to Radio"),
+ tr("Before continuing, ensure the radio is connected and booted in %1 mode(s)")
+ .arg(bootmodes));
+
FlashFirmwareDialog *dlg = new FlashFirmwareDialog(this);
dlg->exec();
dlg->deleteLater();
diff --git a/companion/src/updates/updatenetwork.cpp b/companion/src/updates/updatenetwork.cpp
index cd7fb41c7..d024104f2 100644
--- a/companion/src/updates/updatenetwork.cpp
+++ b/companion/src/updates/updatenetwork.cpp
@@ -62,15 +62,20 @@ void UpdateNetwork::cleanup()
void UpdateNetwork::connectReplyCommon()
{
- connect(m_reply, QOverload::of(&QNetworkReply::errorOccurred), [=] (QNetworkReply::NetworkError code) {
+ connect(m_reply, QOverload::of(&QNetworkReply::errorOccurred), [&](QNetworkReply::NetworkError code) {
m_success = false;
m_status->reportProgress(tr("Network error has occurred. Error code: %1").arg(code), QtCriticalMsg);
});
- connect(m_reply, &QNetworkReply::sslErrors, [=]() {
+ connect(m_reply, &QNetworkReply::sslErrors, [&]() {
m_success = false;
m_status->reportProgress(tr("Ssl library version: %1").arg(QSslSocket::sslLibraryVersionString()), QtCriticalMsg);
});
+
+ connect(m_reply, &QNetworkReply::redirected, [&](const QUrl &url) {
+ m_finalUrl = url;
+ //qDebug() << "final url:" << m_finalUrl;
+ });
}
void UpdateNetwork::convertBufferToJson(QJsonDocument * json)
@@ -299,8 +304,10 @@ void UpdateNetwork::onGetFinished(QNetworkReply * reply, DownloadDataType type)
if (type == DDT_GitHub_SaveToFile || type == DDT_Build_SaveToFile)
m_file->remove();
}
- else
+ else {
m_success = true;
+ m_status->reportProgress(tr("Download complete"), QtDebugMsg);
+ }
if (type == DDT_GitHub_SaveToFile || type == DDT_Build_SaveToFile) {
delete m_file;
diff --git a/companion/src/updates/updatenetwork.h b/companion/src/updates/updatenetwork.h
index 4a9183a16..e56ea3d47 100644
--- a/companion/src/updates/updatenetwork.h
+++ b/companion/src/updates/updatenetwork.h
@@ -71,6 +71,8 @@ class UpdateNetwork : public QObject
static QString downloadDataTypeToString(const DownloadDataType val);
+ QUrl getFinalUrl() const { return m_finalUrl; }
+
private slots:
void onGetFinished(QNetworkReply * reply, DownloadDataType ddt);
void onPostFinished();
@@ -85,6 +87,7 @@ class UpdateNetwork : public QObject
QByteArray *m_buffer;
QFile *m_file;
QUrl m_url;
+ QUrl m_finalUrl;
bool m_success;
QEventLoop m_eventLoop;
QTimer m_timer;
diff --git a/companion/targets/linux/45-companion-taranis.rules b/companion/targets/linux/45-companion-taranis.rules
deleted file mode 100644
index c46bd1641..000000000
--- a/companion/targets/linux/45-companion-taranis.rules
+++ /dev/null
@@ -1 +0,0 @@
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666"
diff --git a/companion/targets/linux/45-usbasp.rules b/companion/targets/linux/45-usbasp.rules
deleted file mode 100644
index 05b8f09a3..000000000
--- a/companion/targets/linux/45-usbasp.rules
+++ /dev/null
@@ -1 +0,0 @@
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05dc", MODE="0666"