summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Huber <johu@gentoo.org>2012-10-04 07:25:15 +0000
committerJohannes Huber <johu@gentoo.org>2012-10-04 07:25:15 +0000
commitbf4f7bfa5a1f7333fdaad9106b9d912c79a0c97a (patch)
tree5fedbdf8b48d1d52f3ab8c0b15caa085816cfe39 /kde-base
parentMaintenance release. Remove buggy 3.21.51 (diff)
downloadhistorical-bf4f7bfa5a1f7333fdaad9106b9d912c79a0c97a.tar.gz
historical-bf4f7bfa5a1f7333fdaad9106b9d912c79a0c97a.tar.bz2
historical-bf4f7bfa5a1f7333fdaad9106b9d912c79a0c97a.zip
Revision bump backports upstream patches to fix bug #435112. Remove unused patches.
Package-Manager: portage-2.2.0_alpha134/cvs/Linux x86_64
Diffstat (limited to 'kde-base')
-rw-r--r--kde-base/nepomuk-core/ChangeLog13
-rw-r--r--kde-base/nepomuk-core/Manifest22
-rw-r--r--kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-infinite-loop.patch21
-rw-r--r--kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-memleak.patch105
-rw-r--r--kde-base/nepomuk-core/files/nepomuk-core-4.9.2-dirwatch-null.patch44
-rw-r--r--kde-base/nepomuk-core/files/nepomuk-core-4.9.2-kinotify-delete.patch25
-rw-r--r--kde-base/nepomuk-core/nepomuk-core-4.9.2-r1.ebuild (renamed from kde-base/nepomuk-core/nepomuk-core-4.9.2.ebuild)7
7 files changed, 98 insertions, 139 deletions
diff --git a/kde-base/nepomuk-core/ChangeLog b/kde-base/nepomuk-core/ChangeLog
index 7eccb3b5d671..9a6b83e48351 100644
--- a/kde-base/nepomuk-core/ChangeLog
+++ b/kde-base/nepomuk-core/ChangeLog
@@ -1,6 +1,17 @@
# ChangeLog for kde-base/nepomuk-core
# Copyright 1999-2012 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/kde-base/nepomuk-core/ChangeLog,v 1.10 2012/10/02 18:11:48 johu Exp $
+# $Header: /var/cvsroot/gentoo-x86/kde-base/nepomuk-core/ChangeLog,v 1.11 2012/10/04 07:25:15 johu Exp $
+
+*nepomuk-core-4.9.2-r1 (04 Oct 2012)
+
+ 04 Oct 2012; Johannes Huber <johu@gentoo.org>
+ +files/nepomuk-core-4.9.2-dirwatch-null.patch,
+ +files/nepomuk-core-4.9.2-kinotify-delete.patch,
+ +nepomuk-core-4.9.2-r1.ebuild,
+ -files/nepomuk-core-4.9.0-kinotify-infinite-loop.patch,
+ -files/nepomuk-core-4.9.0-kinotify-memleak.patch, -nepomuk-core-4.9.2.ebuild:
+ Revision bump backports upstream patches to fix bug #435112. Remove unused
+ patches.
*nepomuk-core-4.9.2 (02 Oct 2012)
diff --git a/kde-base/nepomuk-core/Manifest b/kde-base/nepomuk-core/Manifest
index c86d735c4b96..949f0536c04d 100644
--- a/kde-base/nepomuk-core/Manifest
+++ b/kde-base/nepomuk-core/Manifest
@@ -1,23 +1,23 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
-AUX nepomuk-core-4.9.0-kinotify-infinite-loop.patch 636 SHA256 9a46d4a4686f186ee53fea8b29e311ddf7ea92ce010bf48f809b14eed2b81dba SHA512 23a177591f3db56b27df269d129d4aa57f5112bcefe8a56d63f61b4af8bf8811cbdf1cb01a964037c73f694fc74195b56246457f36439595345a204fd38d6fed WHIRLPOOL fa84c10acd65aeae73a9d01f394c7f590ae7730dd3341d71d99416363f3335eacf0cdd9b810c2d682e6ae683338be71b3627c845c1e6ef763c912b9b7e8e49b6
-AUX nepomuk-core-4.9.0-kinotify-memleak.patch 3686 SHA256 d7dfc92fcf9cb4ec42cd38555dd3aec03a300216f4697ee85e05354617a6a416 SHA512 84a40d7aa9c1cfa4f1294dfcdd2ec62def8fb0ac6e5699147b3d0ba0554c7116a4467cfe9cb397c409e6bb62cf284189bdf5ed98cc50c48514bc867c871833cd WHIRLPOOL ede513228fdb3d3f3a0beb3f2254bd89d4bdddc52c63839a2b493ef6b715ca71de33b9ec0401c2949251f51990005abcc9b1cc3fac9ef379c09a91e6f2e626b4
AUX nepomuk-core-4.9.1-gcc44.patch 1238 SHA256 e0f595a7ec93f47a9f6cc5c7f1e2b3bd5c8369383d07d040eb97399fae6a6a0c SHA512 3cb8603e0b52fb8c8078f40020ec6d58542939a1665035e1917cb5b3cd30699c888efa3ce957db150ae7520058dac4e16050cecdf640ef77eeaf2edc13dd9ed5 WHIRLPOOL b10a0f12f240c3759e792c2ba02c648cdd2387897f721c2bc2033fc6700044cf82a56c33ab246d60ce980f0a63f9499b51210dedad0033e88d929ff95ad07b62
+AUX nepomuk-core-4.9.2-dirwatch-null.patch 1544 SHA256 90acad728c75ec7e7e7db63ab370c5161fe373c7971270b52467568658bb6641 SHA512 fafb2d33c47a96feb325b6e6cc6248c01c604af03830fe08adb68e96d7a52e69eab7ab4cee4abeca398deee4cee1a13eb4bf45124ec97c4f4a71f3ac99a178bd WHIRLPOOL b84a2621a4ef6c5905f08f49c20629c60d270c2e24abe3011f6909dec923ff153429606f437cdede04f0db1dc25ef7f68e75e3ea3157fd6c798f1a340cb57de4
+AUX nepomuk-core-4.9.2-kinotify-delete.patch 939 SHA256 1be1643dff6747cc5d4fb8994e96100ef5419d02fd5e651e448714e97efdc331 SHA512 38587b24e2c5dcd44a7417a881edf5ad401bd7322e5aabd2398e137b9f30bbd6753f91be7416ebbc7e9be649b43065351b7e5e15ecfac6698bbfdfc2dcc2c391 WHIRLPOOL 701ffac6900b8e5d4db66f250fd2f1cf5e89763069fa19451d7b360caca1d1f4ed438eab0391801951c28ddca938f93984122f65f8b042bbbd1d8538e40f619f
DIST nepomuk-core-4.9.1.tar.xz 374272 SHA256 f08059432c7aeeaa2cc530cc22ff73ac9cf63269bbd64fd46120b99a950be5da SHA512 8651c0b8bdcaa7c1c91defeb46b0699733c07bf618a289907de1371b6ba8d5cc6a69efc5e26c5ef30a1d00c1c27d68febe39b101b2355f7eaeabd16094aaa02a WHIRLPOOL 934173778831734360fa1c79429d49898cb313acd9fdbd0bd56a93630ba8a4d0fa275a0b2c9b287489d1d6bec6fac1d1df0bcf8ba00da049c89ca5f18a28a6b2
DIST nepomuk-core-4.9.2.tar.xz 379284 SHA256 41c9c4704d7c851e3400b829e7296a014c8e121a2cb9f44adbbf3e2a9c046709 SHA512 a573f60e9cf1e965af9848e9c2090734e4d65c85dfca00e95efc366c12b283bcc6e098a2c8d24d58b37fa34f5f23ce163e3af336b5fdc89c5f139ddd189f8196 WHIRLPOOL 473fd2dd45bfc5a3f9cf77569e03ce0cdf17b995e14f5971d9fb481bff3846a969116ccad502cb448b138b120bb1d98401201e5d4f5171cfa7aa9ddbaea5f754
EBUILD nepomuk-core-4.9.1.ebuild 596 SHA256 4e9439b73447d3e95e5a94b24f11a5f93eddd8fba49edb4976a9feaec0c45304 SHA512 66ff1b3787daf9459da653714565d5e1847c44c8fdda3c3d1b7892a53a76e111bd4c5ad78c2560b6b95bc8604ebe9be47584995c52d63e21f585b469c603e2c2 WHIRLPOOL 676ac6f32ed597feea4ac01a6ecba84a96dc61bf3732373bc14ff7c6bbb99acfad7b20a9380c0cdc87accfa808e8260d7ca3f4ab4d32d4de60e59260e3b585d3
-EBUILD nepomuk-core-4.9.2.ebuild 548 SHA256 e04f0963d1e3f110dfbf241af3e3fd7c2a25923e9fed8abc09ae8e05165fdeae SHA512 cbeb1ef0da63db5f4aa4af4522f71474dc84fd45d14f72bf41be41a9ec96eaed4cd900b2a3c315dab8d134465370176861e5233b46c79a86e43c815ef5f305f6 WHIRLPOOL df9a3adc375a6cd7b1345e0c67430de6e7524d058938132fb9f4cb34bb96a29ada17824b320c9e7f58304ae533aecb1574c70f2e4ac0db3f169b94618637b550
-MISC ChangeLog 1995 SHA256 b55416983c549285170d0acf0499d30274a3f5f0f46906b086917cd6220c86e5 SHA512 e7344c9229e3d384ade2a3c04575de5f0fd5f546e64838d34e20168c1b60dff91a80f4bb782bb7d86c1fe8f9e1c55d315a8c019f8e7ce27f79e577abfc0e226c WHIRLPOOL 8559a0805829347e2c5a6daccf73d4fc9ffe44666190bf467bd4723751085ab9e9baa98a3d62fa116ae1e7cd44076af1b900bef09b55851f32a353a047e85404
+EBUILD nepomuk-core-4.9.2-r1.ebuild 646 SHA256 226740c5a0607195a1c8999e6b6425b10e68c70fcd9f0265dec6e7e282a4f893 SHA512 fd7a4b545ddf606b75111e7e9c2441c616a43b7c5d08ec5eb8180fada16bce9cb70c46c2a1ae76a3c4ffcbd137a633c23346a4a14389b9d16037aff554d5cd82 WHIRLPOOL ef41d14d460cbe15095115f7c056d0cfa2f810679822f828107d0588bf0f7d8dd816b0c2cb2eaaa3d5b57c60c280363067aed0e4a5bf1dec2a890280715eef6f
+MISC ChangeLog 2441 SHA256 a0b17e29460d66eddc6a30e39d3ab3c5e68bebbb31674d5a37288a29d08b9a92 SHA512 0976c9c7a76c03bc9644c1ddb0d8a2f3a0eea7c5783f340b290328afd9da7834e47a3c2f715dd08fd1d194497d4fd61afeca50c23c371684bdb4310e85ba57fd WHIRLPOOL 07eabe23fcba90a34925c7a78bc1abc1c11ab73e2720298a8ebe245c0b6afe2092912fd35db7923933df7d1820947268c4184438ec25bc9684e704b5d16c6b64
MISC metadata.xml 156 SHA256 2f4da28506b9d4185f320f67a6191d30c7a921217ed4447ed46ea0bc4aefc79a SHA512 0dcd7cfb246c4518ed1653cb06f5d2c7220ea90160a4b1a1da43edf5124b76d7104fe35a545178b6b3df19f5f3a3eb3f31ac1b4d169e3ca90d78be3e20e58b05 WHIRLPOOL df162e3d521df7decdd84d980e4bc71531bb8e05486c07102c554b529c10a1fb3374dda79d56b13bc037a2d230b4b8ff25702c7a1b86d703a24e8bfe7fe57642
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
-iQEcBAEBCAAGBQJQay8JAAoJEO+t9ga+3I3ayDYIAMq6RdMHei8iLWklKPCzk2SA
-7X5FkOCvkQyoRzwQKd5fQ3gJkbKsjMMMhlOx4KV7UQCFb6amJGuZQSDrvs5OPhtr
-eflDLuN7WSYc1I0YwBkojqvSj1er0hUae1h3DLwpB/fVT+9AH3e3T/DK1gC3FYr/
-dR50wXmmH5dhBQaiKvQ1lsZMZbhIT1834dFGOGf5VhqsEoWpgmjhJ3dDHLRhTU0D
-bB5k7vbQIFactC5qIwMwg87kdu0MUOXceydvJDc89Q11ssbezunGh3CVuIQCHbDL
-Pgu+pwjf/CvBCtb+UDq4+7X3wUewKSyKnV2sjx6mte6pd17we/k0tlrR0Tt8h0A=
-=BnNG
+iQEcBAEBCAAGBQJQbTngAAoJEO+t9ga+3I3axxUH/jiR32SgNh/WoJWcGVE0CzlD
+mjl1J6tufsGWoALtf1o/983FMjuS/+Tf830ZfneUDAmMnRfnen96zQZfebLZ9Hyu
+cWYHQakcz+4QG6uNw5u5YDZrocCuz18xNFk1Ag+pjDFKGXKvOkQ5nvu0tEh/Y+1X
+rXlhd5nQmRd+ksgpixGO/EzVSt/2KLnq5JNiDl7LbkTTt1CMxK9LNy+cP6NAmpvl
+oBIg39L0Pa1YgpE3wjVUnW+sjdOwYfkQNxFy7TuPRZp6YwNEIcAl/XAHpWyjtxVf
+yidvFCmWI0DApovFreG+/lxcHIxjJo5C0fezbiGutynNwIG2Iryv5WRhyNfxIPg=
+=lhs7
-----END PGP SIGNATURE-----
diff --git a/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-infinite-loop.patch b/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-infinite-loop.patch
deleted file mode 100644
index 95554867c498..000000000000
--- a/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-infinite-loop.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-commit 7322b28f46969adb721daecf5a7fb67b8e0c6ae4
-Author: Vishesh Handa <me@vhanda.in>
-Date: Wed Aug 8 14:33:02 2012 +0530
-
- Break out of kinotify's _k_addWatches loop
-
- Didn't test the patch out after making a super trivial change in the
- review request. Stupid Stupid me!
-
-diff --git a/services/filewatch/kinotify.cpp b/services/filewatch/kinotify.cpp
-index 47eb8ed..509abff 100644
---- a/services/filewatch/kinotify.cpp
-+++ b/services/filewatch/kinotify.cpp
-@@ -152,6 +152,7 @@ public:
- }
- else {
- delete dirIterators.dequeue();
-+ break;
- }
- }
-
diff --git a/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-memleak.patch b/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-memleak.patch
deleted file mode 100644
index 806f6c924ef5..000000000000
--- a/kde-base/nepomuk-core/files/nepomuk-core-4.9.0-kinotify-memleak.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-commit a81f05034baef438eacd346fcbc97dd818a0b5bf
-Author: Vishesh Handa <me@vhanda.in>
-Date: Mon Aug 6 15:01:14 2012 +0530
-
- kinotify: Do not store the paths to be added
-
- kinotify used a QQueue<QByteArray> to store all the directories which
- need to be added. Since we use QDirIterator, each path is presented as a
- QString which is then encoded to its QByteArray (QFile::encodeName).
- This results in *large* chunks of memory being allocated, and then
- slowly being deallocated.
-
- Instead, we now use a QDirIterator, and do not store all the directories
- which need to be added, we simply iterate over them. This way we do not
- allocate large amounts of memory.
-
- There is a large performance improvement as well. On my system, with
- 38829 directories, adding all the watches now takes only about 10 seconds,
- instead of about 65.
-
- Patch possible due to massif output provided by Jure Repinc <jlp@holodeck1.com>.
- Thanks a lot.
-
- tldr: Use DFS instead of BFS -> Less memory consumption
-
- BUG: 304476
- REVIEW: 105892
- DIGEST: Fix massive memory leak in Nepomuk File Monitoring Service
-
-diff --git a/services/filewatch/kinotify.cpp b/services/filewatch/kinotify.cpp
-index e8843c8..47eb8ed 100644
---- a/services/filewatch/kinotify.cpp
-+++ b/services/filewatch/kinotify.cpp
-@@ -79,8 +79,8 @@ public:
- QHash<int, QByteArray> watchPathHash;
- QHash<QByteArray, int> pathWatchHash;
-
-- /// queue of paths to install watches for
-- QQueue<QByteArray> pathsToWatch;
-+ /// A list of all the current dirIterators
-+ QQueue<QDirIterator*> dirIterators;
-
- unsigned char eventBuffer[EVENT_BUFFER_SIZE];
-
-@@ -136,20 +136,6 @@ public:
- }
- }
-
-- bool addWatchesRecursively( const QByteArray& path )
-- {
-- if ( !addWatch( path ) )
-- return false;
--
-- const QString stringPath = QFile::decodeName(path);
-- QDirIterator iter( stringPath, QDir::Dirs | QDir::NoDotAndDotDot );
-- while( iter.hasNext() ) {
-- pathsToWatch.enqueue( QFile::encodeName(iter.next()) );
-- }
--
-- return true;
-- }
--
- void removeWatch( int wd ) {
- kDebug() << wd << watchPathHash[wd];
- pathWatchHash.remove( watchPathHash.take( wd ) );
-@@ -159,19 +145,20 @@ public:
- void _k_addWatches() {
- // add the next batch of paths
- for ( int i = 0; i < 100; ++i ) {
-- if ( pathsToWatch.isEmpty() ||
-- !addWatchesRecursively( pathsToWatch.dequeue() ) ) {
-- return;
-+ QDirIterator* it = dirIterators.front();
-+ if( it->hasNext() ) {
-+ it->next();
-+ addWatch( QFile::encodeName(it->filePath()) );
-+ }
-+ else {
-+ delete dirIterators.dequeue();
- }
- }
-
- // asyncroneously add the next batch
-- if ( !pathsToWatch.isEmpty() ) {
-+ if ( !dirIterators.isEmpty() ) {
- QMetaObject::invokeMethod( q, "_k_addWatches", Qt::QueuedConnection );
- }
-- else {
-- kDebug() << "All watches installed";
-- }
- }
-
- private:
-@@ -245,7 +232,10 @@ bool KInotify::addWatch( const QString& path, WatchEvents mode, WatchFlags flags
-
- d->mode = mode;
- d->flags = flags;
-- d->pathsToWatch.append( QFile::encodeName( path ) );
-+ d->addWatch( QFile::encodeName(path) );
-+ QDirIterator* iter = new QDirIterator( path, QDir::Dirs | QDir::NoDotAndDotDot,
-+ QDirIterator::Subdirectories );
-+ d->dirIterators.append( iter );
- d->_k_addWatches();
- return true;
- }
diff --git a/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-dirwatch-null.patch b/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-dirwatch-null.patch
new file mode 100644
index 000000000000..fb08140536bf
--- /dev/null
+++ b/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-dirwatch-null.patch
@@ -0,0 +1,44 @@
+commit 32b44881dda4f243932c59c11bf39c91f30c224b
+Author: Dan Vrátil <dvratil@redhat.com>
+Date: Wed Oct 3 13:27:22 2012 +0200
+
+ Add null-crash guards for m_dirWatch to FileWatch
+
+ BUG: 307388
+
+diff --git a/services/filewatch/nepomukfilewatch.cpp b/services/filewatch/nepomukfilewatch.cpp
+index 94db504..83045da 100644
+--- a/services/filewatch/nepomukfilewatch.cpp
++++ b/services/filewatch/nepomukfilewatch.cpp
+@@ -114,6 +114,7 @@ namespace {
+
+ Nepomuk2::FileWatch::FileWatch( QObject* parent, const QList<QVariant>& )
+ : Service( parent )
++ , m_dirWatch( 0 )
+ {
+ // Create the configuration instance singleton (for thread-safety)
+ // ==============================================================
+@@ -324,8 +325,10 @@ void Nepomuk2::FileWatch::slotInotifyWatchUserLimitReached()
+ {
+ // we do it the brutal way for now hoping with new kernels and defaults this will never happen
+ // Delete the KInotify and switch to KDirNotify dbus signals
+- m_dirWatch->deleteLater();
+- m_dirWatch = 0;
++ if( m_dirWatch ) {
++ m_dirWatch->deleteLater();
++ m_dirWatch = 0;
++ }
+ connectToKDirWatch();
+ }
+ #endif
+@@ -413,7 +416,9 @@ void Nepomuk2::FileWatch::slotDeviceMounted(const Nepomuk2::RemovableMediaCache:
+ void Nepomuk2::FileWatch::slotDeviceTeardownRequested(const Nepomuk2::RemovableMediaCache::Entry* entry )
+ {
+ #ifdef BUILD_KINOTIFY
+- m_dirWatch->removeWatch( entry->mountPath() );
++ if( m_dirWatch ) {
++ m_dirWatch->removeWatch( entry->mountPath() );
++ }
+ #endif
+ }
+
diff --git a/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-kinotify-delete.patch b/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-kinotify-delete.patch
new file mode 100644
index 000000000000..a683c133b336
--- /dev/null
+++ b/kde-base/nepomuk-core/files/nepomuk-core-4.9.2-kinotify-delete.patch
@@ -0,0 +1,25 @@
+commit 804e54f83ade8a377d392d350981ead07f60a9d3
+Author: David Faure <faure@kde.org>
+Date: Tue Oct 2 20:27:03 2012 +0200
+
+ Fix crash when watchUserLimitReached() leads to deleting the KInotify instance
+
+ ... which emitted the signal. So don't use a direct delete.
+
+ BUG: 307388
+ FIXED-IN: 4.9.3
+
+diff --git a/services/filewatch/nepomukfilewatch.cpp b/services/filewatch/nepomukfilewatch.cpp
+index 9fd5d9c..94db504 100644
+--- a/services/filewatch/nepomukfilewatch.cpp
++++ b/services/filewatch/nepomukfilewatch.cpp
+@@ -323,7 +323,8 @@ void Nepomuk2::FileWatch::connectToKDirWatch()
+ void Nepomuk2::FileWatch::slotInotifyWatchUserLimitReached()
+ {
+ // we do it the brutal way for now hoping with new kernels and defaults this will never happen
+- delete m_dirWatch;
++ // Delete the KInotify and switch to KDirNotify dbus signals
++ m_dirWatch->deleteLater();
+ m_dirWatch = 0;
+ connectToKDirWatch();
+ }
diff --git a/kde-base/nepomuk-core/nepomuk-core-4.9.2.ebuild b/kde-base/nepomuk-core/nepomuk-core-4.9.2-r1.ebuild
index 75d33a4b53dc..ded05864b4fa 100644
--- a/kde-base/nepomuk-core/nepomuk-core-4.9.2.ebuild
+++ b/kde-base/nepomuk-core/nepomuk-core-4.9.2-r1.ebuild
@@ -1,6 +1,6 @@
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/kde-base/nepomuk-core/nepomuk-core-4.9.2.ebuild,v 1.1 2012/10/02 18:11:48 johu Exp $
+# $Header: /var/cvsroot/gentoo-x86/kde-base/nepomuk-core/nepomuk-core-4.9.2-r1.ebuild,v 1.1 2012/10/04 07:25:15 johu Exp $
EAPI=4
@@ -20,3 +20,8 @@ add_blocker nepomuk '<4.8.80'
RESTRICT="test"
# bug 392989
+
+PATCHES=(
+ "${FILESDIR}/${P}-kinotify-delete.patch"
+ "${FILESDIR}/${P}-dirwatch-null.patch"
+)