1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

qTox v1.2.1 bugfix release

Windows:
- Fixes some Windows updater edge cases.
- The windows updater learned to fetch updates over HTTPS
- New profiles now check for updates by default, this can of course
  still be disabled in the settings.
- The taskbar icon on Windows is now properly loaded and in high quality
All:
- Changed the behavior when clicking on the tray icon
- Some translations update
This commit is contained in:
tux3 2015-12-12 18:37:56 +01:00
commit a4af80fbcc
No known key found for this signature in database
GPG Key ID: 7E086DD661263264
7 changed files with 180 additions and 51 deletions

View File

@ -8,8 +8,8 @@ qTox [![Build Status](https://travis-ci.org/tux3/qTox.svg)](https://travis-ci.or
---- ----
* **Windows**: * **Windows**:
- [**64 bit download**](https://build.tox.chat/view/Clients/job/qTox_build_windows_x86-64_release/lastSuccessfulBuild/artifact/qTox_build_windows_x86-64_release.zip) - [**64 bit download**](https://build.tox.chat/view/qtox/job/qTox_pkg_windows_x86-64_stable_release/lastSuccessfulBuild/artifact/setup-qtox.exe)
- [**32 bit download** (for older hardware)](https://build.tox.chat/view/Clients/job/qTox_build_windows_x86_release/lastSuccessfulBuild/artifact/qTox_build_windows_x86_release.zip) - [**32 bit download**](https://build.tox.chat/view/qtox/job/qTox_pkg_windows_x86_stable_release/lastSuccessfulBuild/artifact/setup-qtox.exe)
* **Linux**: * **Linux**:
- [**64 bit download**](https://build.tox.chat/view/Clients/job/qTox_build_linux_x86-64_release/lastSuccessfulBuild/artifact/qTox_build_linux_x86-64_release.tar.xz) - [**64 bit download**](https://build.tox.chat/view/Clients/job/qTox_build_linux_x86-64_release/lastSuccessfulBuild/artifact/qTox_build_linux_x86-64_release.tar.xz)
- [**32 bit download**](https://build.tox.chat/view/Clients/job/qTox_build_linux_x86_release/lastSuccessfulBuild/artifact/qTox_build_linux_x86_release.tar.xz) - [**32 bit download**](https://build.tox.chat/view/Clients/job/qTox_build_linux_x86_release/lastSuccessfulBuild/artifact/qTox_build_linux_x86_release.tar.xz)

View File

@ -142,8 +142,8 @@ contains(DEFINES, QTOX_PLATFORM_EXT) {
win32 { win32 {
RC_FILE = windows/qtox.rc RC_FILE = windows/qtox.rc
LIBS += -L$$PWD/libs/lib -ltoxav -ltoxcore -ltoxencryptsave -ltoxdns -lsodium -lvpx -lpthread LIBS += -L$$PWD/libs/lib -ltoxav -ltoxcore -ltoxencryptsave -ltoxdns -lsodium -lvpx -lpthread
LIBS += -L$$PWD/libs/lib -lavformat -lavdevice -lavcodec -lavutil -lswscale -lOpenAL32 -lopus LIBS += -L$$PWD/libs/lib -lavdevice -lavformat -lavcodec -lavutil -lswscale -lOpenAL32 -lopus
LIBS += -lopengl32 -lole32 -loleaut32 -lvfw32 -lws2_32 -liphlpapi -lz -luuid LIBS += -lopengl32 -lole32 -loleaut32 -lvfw32 -lws2_32 -liphlpapi -lgdi32 -lshlwapi -luuid
LIBS += -lqrencode LIBS += -lqrencode
LIBS += -lstrmiids # For DirectShow LIBS += -lstrmiids # For DirectShow
contains(DEFINES, QTOX_FILTER_AUDIO) { contains(DEFINES, QTOX_FILTER_AUDIO) {

View File

@ -47,7 +47,7 @@ const QString AutoUpdater::platform = "win64";
const QString AutoUpdater::platform = "win32"; const QString AutoUpdater::platform = "win32";
#endif #endif
const QString AutoUpdater::updaterBin = "qtox-updater.exe"; const QString AutoUpdater::updaterBin = "qtox-updater.exe";
const QString AutoUpdater::updateServer = "http://45.79.166.124"; const QString AutoUpdater::updateServer = "https://qtox-win.pkg.tox.chat";
unsigned char AutoUpdater::key[crypto_sign_PUBLICKEYBYTES] = unsigned char AutoUpdater::key[crypto_sign_PUBLICKEYBYTES] =
{ {
@ -86,6 +86,9 @@ bool AutoUpdater::isUpdateAvailable()
if (isDownloadingUpdate) if (isDownloadingUpdate)
return false; return false;
if (!QFile::exists(updaterBin))
return false;
QByteArray updateFlist = getUpdateFlist(); QByteArray updateFlist = getUpdateFlist();
QList<UpdateFileMeta> diff = genUpdateDiff(parseFlist(updateFlist)); QList<UpdateFileMeta> diff = genUpdateDiff(parseFlist(updateFlist));
return !diff.isEmpty(); return !diff.isEmpty();
@ -100,6 +103,9 @@ AutoUpdater::VersionInfo AutoUpdater::getUpdateVersion()
if (platform.isEmpty()) if (platform.isEmpty())
return versionInfo; return versionInfo;
if (abortFlag)
return versionInfo;
QNetworkAccessManager *manager = new QNetworkAccessManager; QNetworkAccessManager *manager = new QNetworkAccessManager;
QNetworkReply* reply = manager->get(QNetworkRequest(QUrl(checkURI))); QNetworkReply* reply = manager->get(QNetworkRequest(QUrl(checkURI)));
while (!reply->isFinished()) while (!reply->isFinished())
@ -531,6 +537,8 @@ void AutoUpdater::checkUpdatesAsyncInteractiveWorker()
QDateTime::fromMSecsSinceEpoch(newVersion.timestamp*1000).toString()); QDateTime::fromMSecsSinceEpoch(newVersion.timestamp*1000).toString());
if (abortFlag)
return;
if (GUI::askQuestion(QObject::tr("Update", "The title of a message box"), if (GUI::askQuestion(QObject::tr("Update", "The title of a message box"),
contentText, true, false)) contentText, true, false))

View File

@ -165,7 +165,7 @@ void Settings::loadGlobal()
currentProfileId = makeProfileId(currentProfile); currentProfileId = makeProfileId(currentProfile);
} }
autoAwayTime = s.value("autoAwayTime", 10).toInt(); autoAwayTime = s.value("autoAwayTime", 10).toInt();
checkUpdates = s.value("checkUpdates", false).toBool(); checkUpdates = s.value("checkUpdates", true).toBool();
showWindow = s.value("showWindow", true).toBool(); showWindow = s.value("showWindow", true).toBool();
showInFront = s.value("showInFront", false).toBool(); showInFront = s.value("showInFront", false).toBool();
notifySound = s.value("notifySound", true).toBool(); notifySound = s.value("notifySound", true).toBool();

View File

@ -38,7 +38,7 @@ SystemTrayIcon::SystemTrayIcon()
{ {
qDebug() << "Using Unity backend"; qDebug() << "Using Unity backend";
gtk_init(nullptr, nullptr); gtk_init(nullptr, nullptr);
QString settingsDir = Settings::getSettingsDirPath(); QString settingsDir = Settings::getInstance().getSettingsDirPath();
QFile iconFile(settingsDir+"/icon.png"); QFile iconFile(settingsDir+"/icon.png");
if (iconFile.open(QIODevice::Truncate | QIODevice::WriteOnly)) if (iconFile.open(QIODevice::Truncate | QIODevice::WriteOnly))
{ {
@ -108,7 +108,7 @@ QString SystemTrayIcon::extractIconToFile(QIcon icon, QString name)
(void) icon; (void) icon;
(void) name; (void) name;
#ifdef ENABLE_SYSTRAY_UNITY_BACKEND #ifdef ENABLE_SYSTRAY_UNITY_BACKEND
iconPath = Settings::getSettingsDirPath()+"/"+name+".png"; iconPath = Settings::getInstance().getSettingsDirPath()+"/"+name+".png";
QSize iconSize = icon.actualSize(QSize{64,64}); QSize iconSize = icon.actualSize(QSize{64,64});
icon.pixmap(iconSize).save(iconPath); icon.pixmap(iconSize).save(iconPath);
#endif #endif

View File

@ -741,52 +741,31 @@ void Widget::confirmExecutableOpen(const QFileInfo &file)
void Widget::onIconClick(QSystemTrayIcon::ActivationReason reason) void Widget::onIconClick(QSystemTrayIcon::ActivationReason reason)
{ {
switch (reason) if (reason == QSystemTrayIcon::Trigger)
{ {
case QSystemTrayIcon::Trigger: if (isHidden() || isMinimized())
{ {
if (isHidden()) if (wasMaximized)
{ showMaximized();
show();
activateWindow();
if (wasMaximized)
showMaximized();
else
showNormal();
}
else if (isMinimized())
{
forceShow();
activateWindow();
if (wasMaximized)
showMaximized();
else
showNormal();
}
else else
{ showNormal();
wasMaximized = isMaximized();
if (Settings::getInstance().getMinimizeToTray())
hide();
else
showMinimized();
}
break; activateWindow();
} }
case QSystemTrayIcon::MiddleClick: else if (!isActiveWindow())
{
activateWindow();
}
else
{
wasMaximized = isMaximized(); wasMaximized = isMaximized();
if (Settings::getInstance().getMinimizeToTray()) hide();
hide(); }
else }
showMinimized(); else if (reason == QSystemTrayIcon::Unknown)
break; {
case QSystemTrayIcon::Unknown: if (isHidden())
if (isHidden()) forceShow();
forceShow();
break;
default:
break;
} }
} }

148
translations/it.ts vendored
View File

@ -121,6 +121,148 @@ Può capitare che la tua connessione ad internet non sia abbastanza veloce per g
qualità video elevate, questo può causare problemi con le chiamate video.</translation> qualità video elevate, questo può causare problemi con le chiamate video.</translation>
</message> </message>
</context> </context>
<context>
<name>AboutForm</name>
<message>
<source>About</source>
<translation>About</translation>
</message>
<message>
<source>Qt version:</source>
<translation>Versione Qt:</translation>
</message>
</context>
<context>
<name>AboutSettings</name>
<message>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
<source>Version</source>
<translation>Versione</translation>
</message>
<message>
<source>You are using a qTox nightly build.</source>
<translation>Stai utilizzando la versione nightly build di qTox.</translation>
</message>
<message>
<source>Commit hash: &lt;a href=&quot;https://github.com/tux3/qTox/commit/$GIT_VERSION&quot;&gt;$GIT_VERSION&lt;/a&gt;</source>
<translation>Commit hash: &lt;a href=&quot;https://github.com/tux3/qTox/commit/$GIT_VERSION&quot;&gt;$GIT_VERSION&lt;/a&gt;</translation>
</message>
<message>
<source>toxcore version: $TOXCOREVERSION</source>
<translation>Versione toxcore: $TOXCOREVERSION</translation>
</message>
<message>
<source>Qt version:</source>
<translation>Versione Qt:</translation>
</message>
<message>
<source>License</source>
<translation>Licenza</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Oxygen-Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;; color:#000000;&quot;&gt;Copyright © 2014-2015 by The qTox Project&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;qTox is a Qt-based graphical interface for Tox.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;;&quot;&gt;qTox is libre software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;;&quot;&gt;qTox 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. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;You should have received a copy of the GNU General Public License along with this program. If not, see &lt;/span&gt;&lt;a href=&quot;https://www.gnu.org/copyleft/gpl.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;; text-decoration: underline; color:#007af4;&quot;&gt;https://www.gnu.org/copyleft/gpl.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Oxygen-Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;; color:#000000;&quot;&gt;Copyright © 2014-2015 by The qTox Project&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;qTox è un'interfaccia grafica per Tox basato su Qt.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;;&quot;&gt;qTox è un software libero: è possibile ridistribuirlo o modificarlo secondo i termini della GNU General Public License come pubblicata dalla Free Software Foundation, o la versione 3 della licenza o (a tua scelta) qualsiasi versione successiva.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Sans Serif&apos;;&quot;&gt;qTox è distribuito nella speranza che sia utile, ma senza alcuna garanzia; senza neppure la garanzia implicita di commerciabilità o idoneità per uno scopo particolare. Vedi la GNU General Public License per maggiori dettagli. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;Dovresti aver ricevuto una copia della GNU General Public License insieme a questo programma. In caso contrario, vedere &lt;/span&gt;&lt;a href=&quot;https://www.gnu.org/copyleft/gpl.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;; text-decoration: underline; color:#007af4;&quot;&gt;https://www.gnu.org/copyleft/gpl.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Ubuntu&apos;;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Authors</source>
<translation>Autori</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Original author: &lt;a href=&quot;https://github.com/tux3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;tux3&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;See a full list of &lt;a href=&quot;https://github.com/tux3/qTox/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;contributors&lt;/span&gt;&lt;/a&gt; at Github&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Autore originale : &lt;a href=&quot;https://github.com/tux3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;tux3&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Guarda la lista completa degli &lt;a href=&quot;https://github.com/tux3/qTox/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;sviluppatori&lt;/span&gt;&lt;/a&gt; su Github&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Known Issues</source>
<translation>Problemi Noti</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A list of all known issues may be found at our &lt;a href=&quot;https://github.com/tux3/qTox/issues&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;bug-tracker&lt;/span&gt;&lt;/a&gt; at Github. If you discover a bug or security vulnerability within qTox, please report it according to the guidelines in our &lt;a href=&quot;https://github.com/tux3/qTox/wiki/Writing-Useful-Bug-Reports&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Writing Useful Bug Reports&lt;/span&gt;&lt;/a&gt; wiki article.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Un elenco di tutti i problemi noti può essere trovato presso il nostro &lt;a href=&quot;https://github.com/tux3/qTox/issues&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;bug-tracker&lt;/span&gt;&lt;/a&gt; su Github. Se si trova un bug o una vulnerabilità all'interno di qTox, si prega di segnalarlo secondo le linee guida nel nostro &lt;a href=&quot;https://github.com/tux3/qTox/wiki/Writing-Useful-Bug-Reports&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Writing Useful Bug Reports&lt;/span&gt;&lt;/a&gt; articolo di wiki.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>AboutUser</name>
<message>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>username</source>
<translation>Nome profilo</translation>
</message>
<message>
<source>status message</source>
<translation>messagggio di stato</translation>
</message>
<message>
<source>Public key:</source>
<translation>Chiave pubblica:</translation>
</message>
<message>
<source>Used aliases:</source>
<translation>Soprannomi usati:</translation>
</message>
<message>
<source>HISTORY OF ALIASES</source>
<translation>Cronologia dei soprannomi</translation>
</message>
<message>
<source>Default directory to save files:</source>
<translation>Cartella predefinita per salvare i file:</translation>
</message>
<message>
<source>Auto accept for this contact is disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto accept files</source>
<translation>Accetta automaticamente i file</translation>
</message>
<message>
<source>Remove history (operation can not be undone!)</source>
<translation>Rimuovi la cronologia (questa operazione non può essere cancellata!)</translation>
</message>
<message>
<source>Notes</source>
<translation>Note</translation>
</message>
<message>
<source>You can save comment about this contact here.</source>
<translation>È possibile salvare un commento su questo contatto qui.</translation>
</message>
<message>
<source>Choose an auto accept directory</source>
<comment>popup title</comment>
<translation type="unfinished">Scegliere una cartella dove accettare automaticamente i file</translation>
</message>
<message>
<source>History removed</source>
<translation>Cronologia rimossa</translation>
</message>
<message>
<source>Chat history with %1 removed!</source>
<translation>Cronologia chat con %1 rimossa!</translation>
</message>
</context>
<context> <context>
<name>AddFriendForm</name> <name>AddFriendForm</name>
<message> <message>
@ -1545,7 +1687,7 @@ password:</translation>
<location filename="../src/widget/loginscreen.cpp" line="126"/> <location filename="../src/widget/loginscreen.cpp" line="126"/>
<source>The passwords you&apos;ve entered are different. <source>The passwords you&apos;ve entered are different.
Please make sure to enter same password twice.</source> Please make sure to enter same password twice.</source>
<translation>Le passwords che hai inserito sono diverse. <translation>Le password che hai inserito sono diverse.
Assicurati di inserire la stessa password due volte.</translation> Assicurati di inserire la stessa password due volte.</translation>
</message> </message>
<message> <message>
@ -2009,7 +2151,7 @@ Permettimi di aggiungerti alla mia lista contatti.</translation>
<message> <message>
<location filename="../src/widget/form/setpassworddialog.cpp" line="36"/> <location filename="../src/widget/form/setpassworddialog.cpp" line="36"/>
<source>The passwords don&apos;t match.</source> <source>The passwords don&apos;t match.</source>
<translation>Le passwords non corrispondono.</translation> <translation>Le password non corrispondono.</translation>
</message> </message>
<message> <message>
<location filename="../src/widget/form/setpassworddialog.cpp" line="60"/> <location filename="../src/widget/form/setpassworddialog.cpp" line="60"/>
@ -2019,7 +2161,7 @@ Permettimi di aggiungerti alla mia lista contatti.</translation>
<message> <message>
<location filename="../src/widget/form/setpassworddialog.cpp" line="65"/> <location filename="../src/widget/form/setpassworddialog.cpp" line="65"/>
<source>The password doesn&apos;t match.</source> <source>The password doesn&apos;t match.</source>
<translation>Le passwords non corrispondono.</translation> <translation>Le password non corrispondono.</translation>
</message> </message>
</context> </context>
<context> <context>