Skip to content

Commit e8b90c3

Browse files
committedSep 25, 2017
Fix clazy allocating unneeded temporary container warnings
1 parent fd9bcd6 commit e8b90c3

25 files changed

+127
-120
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11795,9 +11795,10 @@ void QgisApp::onTaskCompleteShowNotify( long taskId, int status )
1179511795

1179611796
void QgisApp::onTransactionGroupsChanged()
1179711797
{
11798-
Q_FOREACH ( QgsTransactionGroup *tg, QgsProject::instance()->transactionGroups().values() )
11798+
const auto groups = QgsProject::instance()->transactionGroups();
11799+
for ( auto it = groups.constBegin(); it != groups.constEnd(); ++it )
1179911800
{
11800-
connect( tg, &QgsTransactionGroup::commitError, this, &QgisApp::transactionGroupCommitError, Qt::UniqueConnection );
11801+
connect( it.value(), &QgsTransactionGroup::commitError, this, &QgisApp::transactionGroupCommitError, Qt::UniqueConnection );
1180111802
}
1180211803
}
1180311804

‎src/app/qgssnappinglayertreemodel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,9 @@ void QgsSnappingLayerTreeModel::onSnappingSettingsChanged()
232232
{
233233
const QHash<QgsVectorLayer *, QgsSnappingConfig::IndividualLayerSettings> oldSettings = mIndividualLayerSettings;
234234

235-
Q_FOREACH ( QgsVectorLayer *vl, oldSettings.keys() )
235+
for ( auto it = oldSettings.constBegin(); it != oldSettings.constEnd(); ++it )
236236
{
237-
if ( !mProject->snappingConfig().individualLayerSettings().contains( vl ) )
237+
if ( !mProject->snappingConfig().individualLayerSettings().contains( it.key() ) )
238238
{
239239
beginResetModel();
240240
mIndividualLayerSettings = mProject->snappingConfig().individualLayerSettings();

‎src/core/qgsdatasourceuri.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -606,12 +606,9 @@ QString QgsDataSourceUri::uri( bool expandAuthConfig ) const
606606
QByteArray QgsDataSourceUri::encodedUri() const
607607
{
608608
QUrl url;
609-
Q_FOREACH ( const QString &key, mParams.uniqueKeys() )
609+
for ( auto it = mParams.constBegin(); it != mParams.constEnd(); ++it )
610610
{
611-
Q_FOREACH ( const QString &value, mParams.values( key ) )
612-
{
613-
url.addQueryItem( key, value );
614-
}
611+
url.addQueryItem( it.key(), it.value() );
615612
}
616613
return url.encodedQuery();
617614
}

‎src/core/qgsmaplayermodel.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,10 @@ void QgsMapLayerModel::setItemsCheckable( bool checkable )
5252

5353
void QgsMapLayerModel::checkAll( Qt::CheckState checkState )
5454
{
55-
Q_FOREACH ( const QString &key, mLayersChecked.keys() )
55+
QMap<QString, Qt::CheckState>::iterator i = mLayersChecked.begin();
56+
for ( ; i != mLayersChecked.end(); ++i )
5657
{
57-
mLayersChecked[key] = checkState;
58+
*i = checkState;
5859
}
5960
emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ) );
6061
}

‎src/core/qgsproject.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1932,9 +1932,11 @@ bool QgsProject::evaluateDefaultValues() const
19321932

19331933
void QgsProject::setEvaluateDefaultValues( bool evaluateDefaultValues )
19341934
{
1935-
Q_FOREACH ( QgsMapLayer *layer, mapLayers().values() )
1935+
const QMap<QString, QgsMapLayer *> layers = mapLayers();
1936+
QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
1937+
for ( ; layerIt != layers.constEnd(); ++layerIt )
19361938
{
1937-
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
1939+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layerIt.value() );
19381940
if ( vl )
19391941
{
19401942
vl->dataProvider()->setProviderProperty( QgsVectorDataProvider::EvaluateDefaultValues, evaluateDefaultValues );
@@ -2284,9 +2286,10 @@ void QgsProject::setTrustLayerMetadata( bool trust )
22842286
{
22852287
mTrustLayerMetadata = trust;
22862288

2287-
Q_FOREACH ( QgsMapLayer *layer, mapLayers().values() )
2289+
auto layers = mapLayers();
2290+
for ( auto it = layers.constBegin(); it != layers.constEnd(); ++it )
22882291
{
2289-
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
2292+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( it.value() );
22902293
if ( vl )
22912294
{
22922295
vl->setReadExtentFromXml( trust );

‎src/core/qgssnappingconfig.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,13 @@ void QgsSnappingConfig::writeProject( QDomDocument &doc )
354354
snapSettingsElem.setAttribute( QStringLiteral( "intersection-snapping" ), QString::number( mIntersectionSnapping ) );
355355

356356
QDomElement ilsElement = doc.createElement( QStringLiteral( "individual-layer-settings" ) );
357-
Q_FOREACH ( QgsVectorLayer *vl, mIndividualLayerSettings.keys() )
357+
QHash<QgsVectorLayer *, IndividualLayerSettings>::const_iterator layerIt = mIndividualLayerSettings.constBegin();
358+
for ( ; layerIt != mIndividualLayerSettings.constEnd(); ++layerIt )
358359
{
359-
IndividualLayerSettings setting = mIndividualLayerSettings.value( vl );
360+
const IndividualLayerSettings &setting = layerIt.value();
360361

361362
QDomElement layerElement = doc.createElement( QStringLiteral( "layer-setting" ) );
362-
layerElement.setAttribute( QStringLiteral( "id" ), vl->id() );
363+
layerElement.setAttribute( QStringLiteral( "id" ), layerIt.key()->id() );
363364
layerElement.setAttribute( QStringLiteral( "enabled" ), QString::number( setting.enabled() ) );
364365
layerElement.setAttribute( QStringLiteral( "type" ), ( int )setting.type() );
365366
layerElement.setAttribute( QStringLiteral( "tolerance" ), setting.tolerance() );

‎src/core/qgsvectorlayer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,10 @@ QgsVectorLayer *QgsVectorLayer::clone() const
256256
layer->setDefaultValueExpression( i, defaultValueExpression( i ) );
257257

258258
QMap< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength> constraints = fieldConstraintsAndStrength( i );
259-
Q_FOREACH ( QgsFieldConstraints::Constraint c, constraints.keys() )
259+
auto constraintIt = constraints.constBegin();
260+
for ( ; constraintIt != constraints.constEnd(); ++ constraintIt )
260261
{
261-
layer->setFieldConstraint( i, c, constraints.value( c ) );
262+
layer->setFieldConstraint( i, constraintIt.key(), constraintIt.value() );
262263
}
263264

264265
if ( fields().fieldOrigin( i ) == QgsFields::OriginExpression )

‎src/gui/qgsexpressionbuilderwidget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,9 @@ void QgsExpressionBuilderWidget::loadFieldNames( const QgsFields &fields )
316316
void QgsExpressionBuilderWidget::loadFieldsAndValues( const QMap<QString, QStringList> &fieldValues )
317317
{
318318
QgsFields fields;
319-
Q_FOREACH ( const QString &fieldName, fieldValues.keys() )
319+
for ( auto it = fieldValues.constBegin(); it != fieldValues.constEnd(); ++it )
320320
{
321-
fields.append( QgsField( fieldName ) );
321+
fields.append( QgsField( it.key() ) );
322322
}
323323
loadFieldNames( fields );
324324
mFieldValues = fieldValues;

‎src/gui/qgsmaptoolidentify.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -559,16 +559,16 @@ bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, Qg
559559
QgsGeometry geometry;
560560
if ( format == QgsRaster::IdentifyFormatValue )
561561
{
562-
Q_FOREACH ( int bandNo, values.keys() )
562+
for ( auto it = values.constBegin(); it != values.constEnd(); ++it )
563563
{
564564
QString valueString;
565-
if ( values.value( bandNo ).isNull() )
565+
if ( it.value().isNull() )
566566
{
567567
valueString = tr( "no data" );
568568
}
569569
else
570570
{
571-
QVariant value( values.value( bandNo ) );
571+
QVariant value( it.value() );
572572
// The cast is legit. Quoting QT doc :
573573
// "Although this function is declared as returning QVariant::Type,
574574
// the return value should be interpreted as QMetaType::Type"
@@ -581,16 +581,16 @@ bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, Qg
581581
valueString = QgsRasterBlock::printValue( value.toDouble() );
582582
}
583583
}
584-
attributes.insert( dprovider->generateBandName( bandNo ), valueString );
584+
attributes.insert( dprovider->generateBandName( it.key() ), valueString );
585585
}
586586
QString label = layer->name();
587587
results->append( IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
588588
}
589589
else if ( format == QgsRaster::IdentifyFormatFeature )
590590
{
591-
Q_FOREACH ( int i, values.keys() )
591+
for ( auto it = values.constBegin(); it != values.constEnd(); ++it )
592592
{
593-
QVariant value = values.value( i );
593+
QVariant value = it.value();
594594
if ( value.type() == QVariant::Bool && !value.toBool() )
595595
{
596596
// sublayer not visible or not queryable
@@ -601,7 +601,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, Qg
601601
{
602602
// error
603603
// TODO: better error reporting
604-
QString label = layer->subLayers().value( i );
604+
QString label = layer->subLayers().value( it.key() );
605605
attributes.clear();
606606
attributes.insert( tr( "Error" ), value.toString() );
607607

@@ -610,7 +610,7 @@ bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, Qg
610610
}
611611

612612
// list of feature stores for a single sublayer
613-
const QgsFeatureStoreList featureStoreList = values.value( i ).value<QgsFeatureStoreList>();
613+
const QgsFeatureStoreList featureStoreList = it.value().value<QgsFeatureStoreList>();
614614

615615
for ( const QgsFeatureStore &featureStore : featureStoreList )
616616
{
@@ -649,13 +649,13 @@ bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, Qg
649649
else // text or html
650650
{
651651
QgsDebugMsg( QString( "%1 HTML or text values" ).arg( values.size() ) );
652-
Q_FOREACH ( int bandNo, values.keys() )
652+
for ( auto it = values.constBegin(); it != values.constEnd(); ++it )
653653
{
654-
QString value = values.value( bandNo ).toString();
654+
QString value = it.value().toString();
655655
attributes.clear();
656656
attributes.insert( QLatin1String( "" ), value );
657657

658-
QString label = layer->subLayers().value( bandNo );
658+
QString label = layer->subLayers().value( it.key() );
659659
results->append( IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
660660
}
661661
}

‎src/gui/qgsrasterpyramidsoptionswidget.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ void QgsRasterPyramidsOptionsWidget::updateUi()
8989
}
9090
else
9191
{
92-
Q_FOREACH ( int i, mOverviewCheckBoxes.keys() )
93-
mOverviewCheckBoxes[ i ]->setChecked( false );
92+
for ( auto it = mOverviewCheckBoxes.constBegin(); it != mOverviewCheckBoxes.constEnd(); ++it )
93+
it.value()->setChecked( false );
9494
}
9595
tmpStr = mySettings.value( prefix + "overviewList", "" ).toString();
9696
Q_FOREACH ( const QString &lev, tmpStr.split( ' ', QString::SkipEmptyParts ) )
@@ -134,10 +134,10 @@ void QgsRasterPyramidsOptionsWidget::apply()
134134

135135
// overview list
136136
tmpStr = QLatin1String( "" );
137-
Q_FOREACH ( int i, mOverviewCheckBoxes.keys() )
137+
for ( auto it = mOverviewCheckBoxes.constBegin(); it != mOverviewCheckBoxes.constEnd(); ++it )
138138
{
139-
if ( mOverviewCheckBoxes[ i ]->isChecked() )
140-
tmpStr += QString::number( i ) + ' ';
139+
if ( it.value()->isChecked() )
140+
tmpStr += QString::number( it.key() ) + ' ';
141141
}
142142
mySettings.setValue( prefix + "overviewList", tmpStr.trimmed() );
143143

@@ -146,16 +146,16 @@ void QgsRasterPyramidsOptionsWidget::apply()
146146

147147
void QgsRasterPyramidsOptionsWidget::checkAllLevels( bool checked )
148148
{
149-
Q_FOREACH ( int i, mOverviewCheckBoxes.keys() )
150-
mOverviewCheckBoxes[ i ]->setChecked( checked );
149+
for ( auto it = mOverviewCheckBoxes.constBegin(); it != mOverviewCheckBoxes.constEnd(); ++it )
150+
it.value()->setChecked( checked );
151151
}
152152

153153
void QgsRasterPyramidsOptionsWidget::on_cbxPyramidsLevelsCustom_toggled( bool toggled )
154154
{
155155
// if toggled, disable checkboxes and enable line edit
156156
lePyramidsLevels->setEnabled( toggled );
157-
Q_FOREACH ( int i, mOverviewCheckBoxes.keys() )
158-
mOverviewCheckBoxes[ i ]->setEnabled( ! toggled );
157+
for ( auto it = mOverviewCheckBoxes.constBegin(); it != mOverviewCheckBoxes.constEnd(); ++it )
158+
it.value()->setEnabled( ! toggled );
159159
setOverviewList();
160160
}
161161

@@ -205,10 +205,10 @@ void QgsRasterPyramidsOptionsWidget::setOverviewList()
205205
}
206206
else
207207
{
208-
Q_FOREACH ( int i, mOverviewCheckBoxes.keys() )
208+
for ( auto it = mOverviewCheckBoxes.constBegin(); it != mOverviewCheckBoxes.constEnd(); ++it )
209209
{
210-
if ( mOverviewCheckBoxes[ i ]->isChecked() )
211-
mOverviewList << i;
210+
if ( it.value()->isChecked() )
211+
mOverviewList << it.key();
212212
}
213213
}
214214

‎src/gui/qgsrelationeditorwidget.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,10 @@ void QgsRelationEditorWidget::setRelations( const QgsRelation &relation, const Q
207207

208208
mToggleEditingButton->setVisible( true );
209209

210-
Q_FOREACH ( QgsTransactionGroup *tg, QgsProject::instance()->transactionGroups().values() )
210+
const auto transactionGroups = QgsProject::instance()->transactionGroups();
211+
for ( auto it = transactionGroups.constBegin(); it != transactionGroups.constEnd(); ++it )
211212
{
212-
if ( tg->layers().contains( mRelation.referencingLayer() ) )
213+
if ( it.value()->layers().contains( mRelation.referencingLayer() ) )
213214
{
214215
mToggleEditingButton->setVisible( false );
215216
mSaveEditsButton->setVisible( false );

‎src/gui/symbology/qgsrulebasedrendererwidget.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -863,10 +863,11 @@ QVariant QgsRuleBasedRendererModel::data( const QModelIndex &index, int role ) c
863863
if ( mFeatureCountMap[rule].duplicateCount > 0 )
864864
{
865865
QString tip = QStringLiteral( "<p style='margin:0px;'><ul>" );
866-
Q_FOREACH ( QgsRuleBasedRenderer::Rule *duplicateRule, mFeatureCountMap[rule].duplicateCountMap.keys() )
866+
const auto duplicateMap = mFeatureCountMap[rule].duplicateCountMap;
867+
for ( auto it = duplicateMap.constBegin(); it != duplicateMap.constEnd(); ++it )
867868
{
868-
QString label = duplicateRule->label().replace( '&', QLatin1String( "&amp;" ) ).replace( '>', QLatin1String( "&gt;" ) ).replace( '<', QLatin1String( "&lt;" ) );
869-
tip += tr( "<li><nobr>%1 features also in rule %2</nobr></li>" ).arg( mFeatureCountMap[rule].duplicateCountMap[duplicateRule] ).arg( label );
869+
QString label = it.key()->label().replace( '&', QLatin1String( "&amp;" ) ).replace( '>', QLatin1String( "&gt;" ) ).replace( '<', QLatin1String( "&lt;" ) );
870+
tip += tr( "<li><nobr>%1 features also in rule %2</nobr></li>" ).arg( it.value() ).arg( label );
870871
}
871872
tip += QLatin1String( "</ul>" );
872873
return tip;

‎src/gui/symbology/qgsrulebasedrendererwidget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ struct QgsRuleBasedRendererCount SIP_SKIP
3333
int count; // number of features
3434
int duplicateCount; // number of features present also in other rule(s)
3535
// map of feature counts in other rules
36-
QMap<QgsRuleBasedRenderer::Rule *, int> duplicateCountMap;
36+
QHash<QgsRuleBasedRenderer::Rule *, int> duplicateCountMap;
3737
};
3838

3939
/** \ingroup gui

‎src/gui/symbology/qgssmartgroupeditordialog.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,8 @@ void QgsSmartGroupEditorDialog::setConditionMap( const QgsSmartConditionMap &map
156156
constraints << QStringLiteral( "tag" ) << QStringLiteral( "name" ) << QStringLiteral( "!tag" ) << QStringLiteral( "!name" );
157157

158158
// clear any defaults
159-
Q_FOREACH ( int id, mConditionMap.keys() )
160-
{
161-
QgsSmartGroupCondition *cond = mConditionMap.take( id );
162-
delete cond;
163-
}
159+
qDeleteAll( mConditionMap );
160+
mConditionMap.clear();
164161

165162
//set the constraints
166163
Q_FOREACH ( const QString &constr, constraints )

‎src/providers/arcgisrest/qgsamsprovider.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,16 @@ static inline QString dumpVariantMap( const QVariantMap &variantMap, const QStri
221221
{
222222
result += QStringLiteral( "<tr><td class=\"glossy\" colspan=\"2\">%1</td></tr>" ).arg( title );
223223
}
224-
foreach ( const QString &key, variantMap.keys() )
224+
for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it )
225225
{
226-
QVariantMap childMap = variantMap[key].toMap();
226+
QVariantMap childMap = it.value().toMap();
227227
if ( childMap.isEmpty() )
228228
{
229-
result += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( key, variantMap[key].toString() );
229+
result += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( it.key(), it.value().toString() );
230230
}
231231
else
232232
{
233-
result += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( key, dumpVariantMap( childMap ) );
233+
result += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( it.key(), dumpVariantMap( childMap ) );
234234
}
235235
}
236236
result += QLatin1String( "</table>" );
@@ -399,12 +399,12 @@ QgsRasterIdentifyResult QgsAmsProvider::identify( const QgsPointXY &point, QgsRa
399399
{
400400
foreach ( const QVariant &result, queryResults )
401401
{
402-
QVariantMap resultMap = result.toMap();
402+
const QVariantMap resultMap = result.toMap();
403403
QVariantMap attributesMap = resultMap[QStringLiteral( "attributes" )].toMap();
404404
QString valueStr;
405-
foreach ( const QString &attribute, attributesMap.keys() )
405+
for ( auto it = attributesMap.constBegin(); it != attributesMap.constEnd(); ++it )
406406
{
407-
valueStr += QStringLiteral( "%1 = %2\n" ).arg( attribute, attributesMap[attribute].toString() );
407+
valueStr += QStringLiteral( "%1 = %2\n" ).arg( it.key(), it.value().toString() );
408408
}
409409
entries.insert( entries.size(), valueStr );
410410
}
@@ -413,15 +413,15 @@ QgsRasterIdentifyResult QgsAmsProvider::identify( const QgsPointXY &point, QgsRa
413413
{
414414
foreach ( const QVariant &result, queryResults )
415415
{
416-
QVariantMap resultMap = result.toMap();
416+
const QVariantMap resultMap = result.toMap();
417417

418418
QgsFields fields;
419-
QVariantMap attributesMap = resultMap[QStringLiteral( "attributes" )].toMap();
419+
const QVariantMap attributesMap = resultMap[QStringLiteral( "attributes" )].toMap();
420420
QgsAttributes featureAttributes;
421-
foreach ( const QString &attribute, attributesMap.keys() )
421+
for ( auto it = attributesMap.constBegin(); it != attributesMap.constEnd(); ++it )
422422
{
423-
fields.append( QgsField( attribute, QVariant::String, QStringLiteral( "string" ) ) );
424-
featureAttributes.append( attributesMap[attribute].toString() );
423+
fields.append( QgsField( it.key(), QVariant::String, QStringLiteral( "string" ) ) );
424+
featureAttributes.append( it.value().toString() );
425425
}
426426
QgsCoordinateReferenceSystem crs;
427427
QgsAbstractGeometry *geometry = QgsArcGisRestUtils::parseEsriGeoJSON( resultMap[QStringLiteral( "geometry" )].toMap(), resultMap[QStringLiteral( "geometryType" )].toString(), false, false, &crs );

‎src/providers/grass/qgis.v.in.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -444,14 +444,14 @@ int main( int argc, char **argv )
444444

445445
int centroidsCount = centroids.size();
446446
count = 0;
447-
Q_FOREACH ( const QgsFeature &centroid, centroids.values() )
447+
for ( auto it = centroids.constBegin(); it != centroids.constEnd(); ++it )
448448
{
449-
QgsPointXY point = centroid.geometry().asPoint();
449+
QgsPointXY point = it.value().geometry().asPoint();
450450

451-
if ( centroid.attributes().size() > 0 )
451+
if ( it.value().attributes().size() > 0 )
452452
{
453453
Vect_reset_cats( cats );
454-
Q_FOREACH ( const QVariant &attribute, centroid.attributes() )
454+
Q_FOREACH ( const QVariant &attribute, it.value().attributes() )
455455
{
456456
Vect_cat_set( cats, 1, attribute.toInt() );
457457
}

0 commit comments

Comments
 (0)