Package: qgis Version: 0.6.0-2 Severity: important I just tried to extract some points from a postgis database into a shape file, and then tried to load this shape file int qgis. qgis crashed.
I believe the problem was that the generated shape file didn't have any features included, only the coordinate points. I generated it using this command line: % pgsql2shp -g center_point pere "select center_point from postal_codes \ where postal_code in (select postcode from nuug_member_list \ where ZUsrMedlemstatusNo is not null);" Preparing table for user query... Done. Initializing... Done. Dumping: XX [80 rows]. % Notice how only one column is selected. If I select two columns (for example center_point,postal_code), I avoid the crash problem. The resulting shape files look like this: % file _* __pgsql2shp_tmp_table.dbf: DBase 3 data file (no records) __pgsql2shp_tmp_table.shp: ESRI Shapefile version 1000 length 1170 type Point __pgsql2shp_tmp_table.shx: ESRI Shapefile version 1000 length 370 type Point % When loading this file in qgis, it crashes with the following gdb backtrace: Feature count: ERROR 1: Attempt to read shape with feature id (0) out of available range. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 16384 (LWP 6929)] 0x40948344 in OGRShapeLayer::GetNextFeature () from /usr/lib/libgdal.so.1 (gdb) bt #0 0x40948344 in OGRShapeLayer::GetNextFeature () from /usr/lib/libgdal.so.1 #1 0x40933898 in OGRLayer::GetFeatureCount () from /usr/lib/libgdal.so.1 #2 0x409485c4 in OGRShapeLayer::GetFeatureCount () from /usr/lib/libgdal.so.1 #3 0x41fb0b1c in QgsShapeFileProvider::select () from /usr/lib/qgis/ogrprovider.so #4 0x08142086 in QgsVectorLayer::draw () #5 0x080ed8f6 in QgsMapCanvas::render () #6 0x0809fc17 in QgisApp::addLayer () #7 0x0809ef6f in QgisApp::addLayer () #8 0x081b1a55 in QgisAppBase::qt_invoke () #9 0x08158032 in QgisApp::qt_invoke () #10 0x4029871c in QObject::activate_signal () from /usr/lib/libqt-mt.so.3 #11 0x40298544 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3 #12 0x405f7dab in QAction::activated () from /usr/lib/libqt-mt.so.3 #13 0x405f7fff in QAction::qt_emit () from /usr/lib/libqt-mt.so.3 #14 0x40298751 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3 #15 0x40298544 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3 #16 0x405de82e in QButton::clicked () from /usr/lib/libqt-mt.so.3 #17 0x4032af94 in QButton::mouseReleaseEvent () from /usr/lib/libqt-mt.so.3 #18 0x402ceb37 in QWidget::event () from /usr/lib/libqt-mt.so.3 #19 0x4023be1f in QApplication::internalNotify () from /usr/lib/libqt-mt.so.3 #20 0x4023b514 in QApplication::notify () from /usr/lib/libqt-mt.so.3 #21 0x401d05b0 in QETWidget::translateMouseEvent () from /usr/lib/libqt-mt.so.3 #22 0x401ce23e in QApplication::x11ProcessEvent () from /usr/lib/libqt-mt.so.3 #23 0x401e5254 in QEventLoop::processEvents () from /usr/lib/libqt-mt.so.3 #24 0x4024e1d8 in QEventLoop::enterLoop () from /usr/lib/libqt-mt.so.3 #25 0x4024e088 in QEventLoop::exec () from /usr/lib/libqt-mt.so.3 #26 0x4023c071 in QApplication::exec () from /usr/lib/libqt-mt.so.3 #27 0x08095ddb in main () (gdb) This is the messages when running qgis under valgrind while loading the problematic file. % valgrind qgis ==6930== Memcheck, a memory error detector for x86-linux. ==6930== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al. ==6930== Using valgrind-2.4.0, a program supervision framework for x86-linux. ==6930== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al. ==6930== For more details, rerun with: -v ==6930== ==6930== Syscall param writev(vector[...]) points to uninitialised byte(s) ==6930== at 0x1CE1395E: (within /lib/libc-2.3.2.so) ==6930== by 0x1D00EEBF: (within /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1D00FA8E: _X11TransWritev (in /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1CFF0186: _XSend (in /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1CFE5683: (within /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1CFE5DCA: XPutImage (in /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1BAE1D78: QPixmap::convertFromImage(QImage const&, int) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB9E897: QPixmap::convertFromImage(QImage const&, QPixmap::ColorMode) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB9D9F7: QPixmap::QPixmap(char const**) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x8162055: QgisAppBase::QgisAppBase(QWidget*, char const*, unsigned) (in /usr/bin/qgis) ==6930== by 0x809880B: QgisApp::QgisApp(QWidget*, char const*, unsigned) (in /usr/bin/qgis) ==6930== by 0x8095B2C: main (in /usr/bin/qgis) ==6930== Address 0x1D2F850F is 223 bytes inside a block of size 2048 alloc'd ==6930== at 0x1B904F75: calloc (vg_replace_malloc.c:175) ==6930== by 0x1CFE109C: XOpenDisplay (in /usr/X11R6/lib/libX11.so.6.2) ==6930== by 0x1BABF449: qt_init_internal(int*, char**, _XDisplay*, unsigned long, unsigned long) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BAC00D7: qt_init(int*, char**, QApplication::Type) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB2B144: QApplication::construct(int&, char**, QApplication::Type) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB2AF13: QApplication::QApplication(int&, char**, bool) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x8095981: main (in /usr/bin/qgis) Loaded /usr/lib/qgis/copyrightlabelplugin.so Loaded /usr/lib/qgis/delimitedtextplugin.so Loaded /usr/lib/qgis/delimitedtextprovider.so Loaded /usr/lib/qgis/gpsimporterplugin.so Loaded /usr/lib/qgis/gpxprovider.so Loaded /usr/lib/qgis/gridmakerplugin.so Loaded /usr/lib/qgis/libScaleBarplugin.so Loaded /usr/lib/qgis/northarrowplugin.so Loaded /usr/lib/qgis/ogrprovider.so Loaded /usr/lib/qgis/pggeoprocessingplugin.so Loaded /usr/lib/qgis/postgresprovider.so Loaded /usr/lib/qgis/spitplugin.so ESRI Shapefiles (*.shp *.SHP);; ESRI Shapefiles (*.shp *.SHP);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ESRI Shapefiles (*.shp *.SHP);;Spatial Data Transfer Standard (*catd.ddf *CATD.DDF);;MapInfo (*.mif *.tab *.MIF *.TAB);; ==6930== ==6930== Conditional jump or move depends on uninitialised value(s) ==6930== at 0x80A5B68: QgisApp::currentLayerChanged(QListViewItem*) (in /usr/bin/qgis) ==6930== by 0x8157AE5: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BEDD7FC: QListView::currentChanged(QListViewItem*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815B973: QgsLegend::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815CA67: QgsMapCanvas::addedLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80ECEBB: QgsMapCanvas::addLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x815CBE2: QgsMapCanvas::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C695: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815E125: QgsMapLayerRegistry::layerWasAdded(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80F58CA: QgsMapLayerRegistry::addMapLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== ==6930== Conditional jump or move depends on uninitialised value(s) ==6930== at 0x80A5B7B: QgisApp::currentLayerChanged(QListViewItem*) (in /usr/bin/qgis) ==6930== by 0x8157AE5: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BEDD7FC: QListView::currentChanged(QListViewItem*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815B973: QgsLegend::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815CA67: QgsMapCanvas::addedLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80ECEBB: QgsMapCanvas::addLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x815CBE2: QgsMapCanvas::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C695: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815E125: QgsMapLayerRegistry::layerWasAdded(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80F58CA: QgsMapLayerRegistry::addMapLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== ==6930== Conditional jump or move depends on uninitialised value(s) ==6930== at 0x80A5A5B: QgisApp::currentLayerChanged(QListViewItem*) (in /usr/bin/qgis) ==6930== by 0x8157AE5: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BEDD7FC: QListView::currentChanged(QListViewItem*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815B973: QgsLegend::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815CA67: QgsMapCanvas::addedLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80ECEBB: QgsMapCanvas::addLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x815CBE2: QgsMapCanvas::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C695: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815E125: QgsMapLayerRegistry::layerWasAdded(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80F58CA: QgsMapLayerRegistry::addMapLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== ==6930== Conditional jump or move depends on uninitialised value(s) ==6930== at 0x80A5A5D: QgisApp::currentLayerChanged(QListViewItem*) (in /usr/bin/qgis) ==6930== by 0x8157AE5: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BEDD7FC: QListView::currentChanged(QListViewItem*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815B973: QgsLegend::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815CA67: QgsMapCanvas::addedLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80ECEBB: QgsMapCanvas::addLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x815CBE2: QgsMapCanvas::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C695: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815E125: QgsMapLayerRegistry::layerWasAdded(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80F58CA: QgsMapLayerRegistry::addMapLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== ==6930== Conditional jump or move depends on uninitialised value(s) ==6930== at 0x80A5A62: QgisApp::currentLayerChanged(QListViewItem*) (in /usr/bin/qgis) ==6930== by 0x8157AE5: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BEDD7FC: QListView::currentChanged(QListViewItem*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815B973: QgsLegend::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815CA67: QgsMapCanvas::addedLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80ECEBB: QgsMapCanvas::addLayer(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x815CBE2: QgsMapCanvas::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C695: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x815E125: QgsMapLayerRegistry::layerWasAdded(QgsMapLayer*) (in /usr/bin/qgis) ==6930== by 0x80F58CA: QgsMapLayerRegistry::addMapLayer(QgsMapLayer*) (in /usr/bin/qgis) Selection rectangle is 4.617236 57.734262, 19.691483 70.296134 Setting spatial filter using POLYGON (( 4.617236 57.734262, 4.617236 70.296134, 19.691483 70.296134, 19.691483 57.734262, 4.617236 57.734262)) Feature count: ERROR 1: Attempt to read shape with feature id (0) out of available range. ==6930== ==6930== Invalid read of size 4 ==6930== at 0x1C23D344: OGRShapeLayer::GetNextFeature() (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1C228897: OGRLayer::GetFeatureCount(int) (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1C23D5C3: OGRShapeLayer::GetFeatureCount(int) (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1DFF3B1B: QgsShapeFileProvider::select(QgsRect*, bool) (in /usr/lib/qgis/ogrprovider.so) ==6930== by 0x8142085: QgsVectorLayer::draw(QPainter*, QgsRect*, QgsCoordinateTransform*, QPaintDevice*) (in /usr/bin/qgis) ==6930== by 0x80ED8F5: QgsMapCanvas::render(QPaintDevice*) (in /usr/bin/qgis) ==6930== by 0x809FC16: QgisApp::addLayer(QStringList const&) (in /usr/bin/qgis) ==6930== by 0x809EF6E: QgisApp::addLayer() (in /usr/bin/qgis) ==6930== by 0x81B1A54: QgisAppBase::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x8158031: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB8C543: QObject::activate_signal(int) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== Address 0xC is not stack'd, malloc'd or (recently) free'd ==6930== ==6930== Process terminating with default action of signal 11 (SIGSEGV) ==6930== Access not within mapped region at address 0xC ==6930== at 0x1C23D344: OGRShapeLayer::GetNextFeature() (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1C228897: OGRLayer::GetFeatureCount(int) (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1C23D5C3: OGRShapeLayer::GetFeatureCount(int) (in /usr/lib/libgdal.so.1.7.0) ==6930== by 0x1DFF3B1B: QgsShapeFileProvider::select(QgsRect*, bool) (in /usr/lib/qgis/ogrprovider.so) ==6930== by 0x8142085: QgsVectorLayer::draw(QPainter*, QgsRect*, QgsCoordinateTransform*, QPaintDevice*) (in /usr/bin/qgis) ==6930== by 0x80ED8F5: QgsMapCanvas::render(QPaintDevice*) (in /usr/bin/qgis) ==6930== by 0x809FC16: QgisApp::addLayer(QStringList const&) (in /usr/bin/qgis) ==6930== by 0x809EF6E: QgisApp::addLayer() (in /usr/bin/qgis) ==6930== by 0x81B1A54: QgisAppBase::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x8158031: QgisApp::qt_invoke(int, QUObject*) (in /usr/bin/qgis) ==6930== by 0x1BB8C71B: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== by 0x1BB8C543: QObject::activate_signal(int) (in /usr/lib/libqt-mt.so.3.3.4) ==6930== ==6930== ERROR SUMMARY: 24 errors from 7 contexts (suppressed: 250 from 4) ==6930== malloc/free: in use at exit: 770274 bytes in 19936 blocks. ==6930== malloc/free: 350537 allocs, 330601 frees, 11067951 bytes allocated. ==6930== For counts of detected errors, rerun with: -v ==6930== searching for pointers to 19936 not-freed blocks. ==6930== checked 5224352 bytes. ==6930== ==6930== LEAK SUMMARY: ==6930== definitely lost: 5740 bytes in 110 blocks. ==6930== possibly lost: 1344 bytes in 1 blocks. ==6930== still reachable: 763190 bytes in 19825 blocks. ==6930== suppressed: 0 bytes in 0 blocks. ==6930== Use --leak-check=full to see details of leaked memory. Segmentation fault % The problematic shape file is available on request. -- System Information: Debian Release: 3.1 APT prefers testing APT policy: (500, 'testing'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.4.27-2-686 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages qgis depends on: ii libc6 2.3.2.ds1-21 GNU C Library: Shared libraries an ii libcfitsio2 2.510-1 shared library for I/O with FITS f ii libgcc1 1:3.4.3-12 GCC support library ii libgdal1 1.2.6-1 Geospatial Data Abstraction Librar ii libgeos2 2.1.1-2 Geometry engine for Geographic Inf ii libhdf4g 4.1r4-18.1 The Hierarchical Data Format libra ii libjasper-1.701-1 1.701.0-2 The JasPer JPEG-2000 runtime libra ii libjpeg62 6b-9 The Independent JPEG Group's JPEG ii libltdl3 1.5.6-6 A system independent dlopen wrappe ii libpng12-0 1.2.8rel-1 PNG library - runtime ii libpq3 7.4.7-6 PostgreSQL C client library ii libqt3c102-mt 3:3.3.4-3 Qt GUI Library (Threaded runtime v ii libstdc++5 1:3.3.5-12 The GNU Standard C++ Library v3 ii libtiff4 3.7.2-2 Tag Image File Format (TIFF) libra ii libungif4g 4.1.3-2 shared library for GIF images (run ii libxerces26 2.6.0-3 Validating XML parser library for ii netcdfg3 3.5.0-7.1 An interface for scientific data a ii unixodbc 2.2.4-11 ODBC tools libraries ii zlib1g 1:1.2.2-4 compression library - runtime -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]